Build & operate
Indexing without an archive node
Historical accounting comes from events. Current prices and contract state come from latest-state reads.
What the indexer reads
Ponder follows factory, router, hook, and token events from the verified deployment start block. It records assets, pools, trades, fee payments, holdings, bonding completion, and buyback history. Ponder handles transactional writes and chain-reorganization rollback.
Historical balances and fee totals are derived from those events. Current pool prices and bonding progress use latest-state contract calls. The shared RPC transport rejects historical-state selectors; the keeper uses latest and pending where needed.
A normal node is sufficient if it retains the required historical logs, headers, and receipts. A node that has pruned those records cannot replay the history on its own. Keep a database backup or use a log provider with that history; buying archive-state access is not a substitute for missing logs.
Accounting checks
- Initialize supply from AssetCreated, then subtract Transfer-to-zero burns exactly once.
- Add the buyback fee to that token’s queue and subtract only actual quoteSpent from BuybackExecuted.
- Keep creator-wallet receipts separate from buyback allocations.
- Use the FiatEx router event for its trades; only add the hook event as a separate trade for external routers.
- Reject incomplete histories that would create a negative holding, supply, or buyback queue.
Operate one writer per schema
Production uses PostgreSQL and ponder start. Do not run a second indexer against the same schema. For local parallel checks, use a separate schema and a separate PGlite directory.
Changing contract events or Ponder’s application identity can require a fresh schema and replay. Preserve the old schema, release, and manifest. Check row counts and accounting before switching clients; never fix a compatibility error by dropping the previous data.
With the current inactive manifest, there are no FiatEx contract events to index. A ready process proves that the service can start, not that it has processed real launches.
