The bankroll

The model registry

In Agent mode the deployer picks a model at launch, and the choice is written on chain so buyers can see what is trading their fees. The registry is small, curated and deliberately does not try to be current.

What is actually on chain#

Very little, on purpose. A Model account holds four fields plus a bump:

FieldTypeNotes
idu16the PDA seed is ["model", id]
nameStringat most 32 bytes
providerStringat most 24 bytes
enabledboolwhether it can be picked at launch right now

There is no price on chain, no context window, no capability flags and no ranking. Pricing changes and the chain is a poor place to keep something that changes, so what is recorded is only the fact a buyer needs to check: which model, which provider, and whether it is currently allowed to be picked. Prices live off chain and are documented on compute costs.

The registry, live#

21 models across 9 providers, all currently enabled, written on mainnet and read back through /models. The registry was written on 2026-09-23 alongside the six origins.

The registry names a model, not a route to it

An entry is an id, a name, a provider and an enabled flag. It is not a credential and not an endpoint: inference is routed through OpenRouter, and what the chain records is the choice a buyer can check, not how the request is made. See compute costs.

Nine providers, eight of which publish a price

The specification describes the registry as eight providers, which is the count of providers with a first-party per-token price. The chain holds nine distinct provider strings, because Meta is in the registry and publishes no per-token price at all. Both statements are true; this page uses the chain's count.

IdModelProvider
1GPT-5.5OpenAI
2GPT-5.1OpenAI
3GPT-5 miniOpenAI
4GPT-4.1OpenAI
5Claude Opus 5Anthropic
6Claude Sonnet 5Anthropic
7Claude Haiku 4.5Anthropic
8Claude Fable 5.1Anthropic
9LlamaMeta
10deepseek-flashDeepSeek
11qwen3.8-maxAlibaba
12kimi-k3Moonshot
13GLM-5.3Zhipu
14MiniMax-M3MiniMax
15Gemini 3.5 FlashGoogle
16Gemini 3.5 Flash-LiteGoogle
17deepseek-v4-proDeepSeek
18qwen3.8-flashAlibaba
19kimi-k2.6Moonshot
20GLM-5.3-FlashZhipu
21MiniMax-M2.7MiniMax

Ids are not grouped by provider because the registry is append-ordered: ids 1 to 16 were written first, and 17 to 21 added later.

GET /models
{
  "source": "chain:Model accounts",
  "items": [
    { "id": 1, "name": "GPT-5.5", "provider": "OpenAI",    "enabled": true, "registeredAt": "2026-09-23T00:08:28.000Z" },
    { "id": 5, "name": "Claude Opus 5", "provider": "Anthropic", "enabled": true, "registeredAt": "2026-09-23T00:08:30.000Z" },
    { "id": 9, "name": "Llama", "provider": "Meta",        "enabled": true, "registeredAt": "2026-09-23T00:08:32.000Z" }
  ]
}

registeredAt is the block time of the transaction that wrote the entry, taken from the indexer, not a field on the account.

How a choice is validated#

When a policy's mode is Agent, init_policy and set_policy both run the same three checks against the supplied Model account:

  1. the account key must equal the PDA derived from ["model", model_id], else ModelNotFound;
  2. its id field must equal model_id, else ModelNotFound;
  3. it must be enabled, else ModelDisabled.

In Passive mode none of this runs: the validator returns immediately and the model account is never read. The accounts struct types it as an Option, so a client signals "none" the standard Anchor way, by passing the program's own id in place of a real account.

A Passive policy still has a model_id field

It is whatever was passed at launch, usually zero, and it means nothing. The API surfaces it honestly as "model": { "id": 0, "name": null, "provider": null, "enabled": null }, which is a field that exists and is not used rather than a lookup that failed.

Curated, and what that costs#

register_model is admin-only. There is no permissionless path to add a model, which means the registry is a curated list and not an open one. The benefit is that a buyer reading model_id on a policy is reading something an admin vouched for. The cost is that a model nobody has registered cannot be picked, however good it is.

The instruction uses init_if_needed, so calling it again with the same id overwrites the entry in place. Name, provider and enabled flag are all replaced. There is no separate update or delete instruction, and no history on chain: the indexer's registeredAt is the only record of when an entry last changed.

It already drifts behind the vendors#

The registry is a snapshot, not a mirror

On the day these entries were written, Anthropic's own pricing page listed Claude Opus 5.5, one release ahead of the registry's Opus 5, and OpenAI listed a gpt-6 family above gpt-5.5. Neither is in the registry. Adding or repricing an entry is a single admin call, but until that call is made the on-chain registry lags the vendors, and it always will.

This matters for how a policy should be read. model_id = 5 means "the entry an admin wrote at id 5", which is currently Claude Opus 5. It does not mean "Anthropic's current flagship", and if the entry is later overwritten, the policy's model_id silently points at the new contents.

Disabling a model#

There is no disable_model instruction. A model is disabled by calling register_model again with the same id and enabled: false.

What disabling does and does not do#

Effect
New launchesblocked. init_policy fails with ModelDisabled.
Existing policies changing their modelblocked. set_policy runs the same check.
Existing policies already pointing at itunaffected. They keep running, and no money path re-reads the model account.
The agent keyunaffected. Disabling a registry entry does not revoke anything; only set_agent and set_paused do that.

So disabling is a gate on new choices, not a kill switch. Stopping a running policy is the guardian's job, described on the safety model.