Milestone 4 · Protocol
Nuvex maintainers
What Milestone 4 actually added
The programs already stored a request, the node that fulfilled it, and the proof. Reading those accounts meant talking to a cluster. Milestone 4 adds an off-chain copy so an operator can list them. The copy lives in nuvex-services. The programs did not change, and no fee started moving.
- The indexer polls getProgramAccounts and decodes request, node, registry, protocol and VrfResult layouts.
- It writes PostgreSQL, or a JSON snapshot when NUVEX_READ_MODEL_PATH is set.
- GET /v1/requests, /v1/nodes and /v1/network return that store. An empty list is a 200.
- The console reads NEXT_PUBLIC_API_URL. nuvex network reads NUVEX_API_URL.
What it refuses to do
start exits 2 unless an RPC URL, at least one program id, and a place to write are set. The API returns 503 when neither DATABASE_URL nor a snapshot path is set. Jobs and models stay 501. Price medians are a later request, not part of this copy. GET /health still returns authority: none.
“The indexer can copy those accounts into PostgreSQL and the read API can serve them. That copy is not protocol truth.”
A missing indexed row is not proof the account is absent on chain. The indexer only reports accounts it observed. Finality stays on the account the program wrote.
How to read it
Apply the SQL in nuvex-services/indexer/prisma/migrations before pointing the API at Postgres. Program ids and the RPC URL stay in the environment. They are not defaults in source.
nuvex network
# NUVEX_API_URL is unset. The CLI does not invent network status.
# With the API configured, the same command prints GET /v1/network.
# That body is a count of indexed rows, not a latency and not a result.Illustration panels on the site stay labelled. Indexed tables appear only when the API URL is set. Fees stay unset until ADR 0005 names basis points, and nothing in this milestone deploys to mainnet.

