history from an indexer on our infra, through the relay #23

Closed
opened 2026-09-15 12:38:26 +00:00 by grenade · 1 comment
Owner

Parent: #3

Scope

The wallet does not scan blocks. Define the history query the wallet needs (transfers in and out, reversible schedule/cancel/execute, wormhole exits, per account, paginated by block) and serve it from our infrastructure: either blackbeard.observer's database through a new /v1 route, or a small wallet-api relay crate in this workspace that fronts it. The wallet caches results locally in SQLite so history is readable offline.

Operator decision to record here before starting

Observer route or relay crate. The relay is needed anyway for swaps (#7) and ramps (#8); the question is whether history joins it or stays with the observer.

Acceptance

An account's history in the wallet matches what explorer.quantus.com shows for the same account, and loads from cache with the network down.

Depends on

Chain profiles. Parallel with the transfer child.

Parent: #3 ## Scope The wallet does not scan blocks. Define the history query the wallet needs (transfers in and out, reversible schedule/cancel/execute, wormhole exits, per account, paginated by block) and serve it from our infrastructure: either blackbeard.observer's database through a new `/v1` route, or a small `wallet-api` relay crate in this workspace that fronts it. The wallet caches results locally in SQLite so history is readable offline. ## Operator decision to record here before starting Observer route or relay crate. The relay is needed anyway for swaps (#7) and ramps (#8); the question is whether history joins it or stays with the observer. ## Acceptance An account's history in the wallet matches what explorer.quantus.com shows for the same account, and loads from cache with the network down. ## Depends on Chain profiles. Parallel with the transfer child.
grenade added the child label 2026-09-15 12:39:07 +00:00
Author
Owner

Decision taken as a working default (overturn here if wrong): history comes from the observer, not a relay.

Why: blackbeard.observer already indexes every chain the wallet has a profile for (quantus, planck; heisenberg too) and already serves GET /v1/chains/{chain}/accounts/{address} with the account's merged event and extrinsic activity, keyset-paginated by before_height, before_source, before_index, 100 rows a page, CORS open for GET, behind the same nginx on oolon the node endpoints will use. Transfers in and out, reversible schedule/cancel/execute and wormhole exits are all rows in that feed with the addresses already mapped to SS58. So the wallet reads that route through a HistorySource port in wallet-core with an observer adapter in wallet-data, filters the rows it cares about, and caches them in SQLite under the data directory so history reads with the network down.

What this leaves for later, on the observer side: a dedicated transfers-only route (accounts/{address}/transfers) that filters on the server and pages by height alone. The existing GIN and (chain, height desc, event_index desc) indexes already serve it; it is an optimisation, not a prerequisite, and it ships as a Rust change alone (no asset or deploy change).

The relay crate stays reserved for swaps (#7) and ramps (#8), where the wallet needs something that is not a public read.

Profiles gain an indexer URL (https://blackbeard.observer/v1/chains/quantus, …/planck); the dev profile has none, and the history screen says so rather than pretending.

**Decision taken as a working default (overturn here if wrong): history comes from the observer, not a relay.** Why: blackbeard.observer already indexes every chain the wallet has a profile for (quantus, planck; heisenberg too) and already serves `GET /v1/chains/{chain}/accounts/{address}` with the account's merged event and extrinsic activity, keyset-paginated by `before_height`, `before_source`, `before_index`, 100 rows a page, CORS open for GET, behind the same nginx on oolon the node endpoints will use. Transfers in and out, reversible schedule/cancel/execute and wormhole exits are all rows in that feed with the addresses already mapped to SS58. So the wallet reads that route through a `HistorySource` port in `wallet-core` with an observer adapter in `wallet-data`, filters the rows it cares about, and caches them in SQLite under the data directory so history reads with the network down. What this leaves for later, on the observer side: a dedicated transfers-only route (`accounts/{address}/transfers`) that filters on the server and pages by height alone. The existing GIN and `(chain, height desc, event_index desc)` indexes already serve it; it is an optimisation, not a prerequisite, and it ships as a Rust change alone (no asset or deploy change). The relay crate stays reserved for swaps (#7) and ramps (#8), where the wallet needs something that is not a public read. Profiles gain an `indexer` URL (`https://blackbeard.observer/v1/chains/quantus`, `…/planck`); the dev profile has none, and the history screen says so rather than pretending.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: blackbeard/wallet#23