Seedelf-Wallet

Chunk 28 · The public Activity’s blind spots

O7: the public Activity listed by stake address (account_txs) while the balance reads by payment key (credential_utxos), so a transaction touching only an enterprise address of the account, or its key under someone else’s stake key, was counted and spent but never listed, nor in the CSV. And a Lovejoin mix from the public account listed its deposit and every mix as plain Sent, since an account transaction’s kind came only from the private history (chunk 16’s Not done).

Status: ✅ built 2026-10-11 on web-wallet/activity-blind-spots, from main after #299. One PR: the plan, the build and the docs together, so this file went straight to the archive. What still holds is in the design docs: flows.md (Activity’s Cardano account), architecture.md (Activity), privacy.md (When the wallet reads), and the data layer’s README. The privacy policy is unchanged: Activity sends the server the account’s keys, which the balance reading already sends, and the policy’s Your addresses, balances and transactions covers both.

1 · List by payment key, as the balance counts

credential_txs replaces account_txs in Activity. Koios’s credential_txs takes payment credentials and answers in account_txs’s shape, with the same order, offset and limit, and _after_block_height (checked on preprod, 2026-10-11). Activity asks it about the account’s payment keys in range, the ones the last balance reading asked credential_utxos about (AccountAddresses.keys): every transaction that made or spent an output under one of them, whatever the address’s staking part. That’s exactly what the balance counts.

2 · Name a public mix from the transaction itself

From the chain, not from records. A chain’s record (ChainRecord) goes about an hour after its mix ends, and a restore has none. But a mix’s transactions say what they are: Lovejoin’s mix_box script (NETWORKS[network].lovejoin.mixBox) is among their inputs or outputs, and tx_info gives every input’s and output’s payment credential. So describe names them, with no request and no record, after a restore too, and for mixes sent before this change:

The account Boxes in its inputs Boxes in its outputs Kind Title
paid no yes lovejoin-deposit Into Lovejoin (the deposit, or a seed)
paid yes yes lovejoin-round Lovejoin mix (one of a chain’s mixes)
is paid yes no lovejoin-withdraw Back from Lovejoin (a box spent into the account: its own, withdrawn through another app with the same phrase, or one someone paid from their own box, which the chain can’t tell apart)

Cost

  Requests
A page, up to 75 keys 1 credential_txs and 1 tx_info, as before
Each further 75 keys 1 more credential_txs a page, and a catch-up
Opening it again (the catch-up) 1 credential_txs a group, from 100 blocks under the newest block read since 1.5.0’s release review (C33), and tx_info only for transactions it finds that aren’t listed
Naming a Lovejoin transaction none

Tests

Left for later