Seedelf-Wallet

Chunk 13 plan: staking and voting delegation

Why: on 2026-09-24 the user settled what the wallet is: a Cardano wallet with private payments built in, more like Lace, not a stealth wallet you keep beside another one. Users shouldn’t need a second wallet for the Cardano side. Chunk 12 added Send from the Cardano account; this chunk adds staking and voting delegation. Branch web-wallet/staking, from seedelf-web-wallet once chunk 12 is merged. It’s big, so it may split into 13a (the core and staking) and 13b (voting, spending rewards, the new positioning), one PR each.

Status (2026-09-24)

Built in one PR on web-wallet/staking, not split into 13a and 13b: every item in Scope below. Not done: the live preprod run, which needs the user’s go-ahead (node e2e/live/run.mjs staking, then withdraw-rewards and unstake once rewards arrive).

Where it went differently from the plan:

Checked on preprod without spending anything (tests/fixtures/probe-staking.mjs): every kind of staking transaction for the public 12-word account decodes on the node’s Conway decoder (Ogmios evaluateTransaction answers []), and an account-paid mint with its 57.475311 ₳ of rewards riding along passes the real Seedelf policy (72,835 memory, 21,396,008 steps, the same as without).

Start here

  1. git fetch origin && git checkout -b web-wallet/staking origin/seedelf-web-wallet
  2. Read this plan, then chunk 12’s handoff note in roadmap.md.
  3. Build and test (from extension/): npm run build && npm test && npm run e2e.
  4. Record the fixtures below from preprod before writing the worker.

Decided with the user

Question Decision
Stealth wallet beside another, or a full wallet? A full Cardano wallet with Seedelf built in. The README, privacy.md and the store listing say it (the user resubmits the listing).
Several pools per account? One pool per account. Lace 2.4 dropped multi-pool too.
Governance Delegation only: Always abstain, Always no confidence, or a DRep. No voting on proposals, no registering as a DRep.
Rewards Spent automatically when the account spends (a withdrawal rides along in a send, move-in or account-paid mint), with a Settings switch to turn that off and withdraw by hand from the Staking page.
Rewards on Home account_info joins the balance reading (one more request), so the Cardano tab always shows the pool and the rewards.
Choosing a DRep The two pinned choices, or paste a DRep ID (its name from its metadata). A browsable list is a follow-up, below.

What Lace does, and what we keep

From _reference/lace (2.4.0): a staking page per account with the pool’s stats and warnings (retiring, saturated, pledge not met, no DRep); a pool browser with search (ticker, name, ID) and sorts (saturation, cost, margin, pledge, stake, blocks); pool details → review (the key deposit, the fee) → sign. The first delegation is two certificates (registration, then pool delegation); a vote delegation can ride in the same transaction. De-registering withdraws all rewards and returns the deposit in one transaction, and is disabled while rewards are locked for lack of a DRep. Governance has its own tab: Abstain and No Confidence pinned at the top, then DReps by name. Lace warns “Rewards locked. Delegate your voting rights to a DRep…”.

Left out: return estimates (ROS) and rankings, reward charts, delegation history, promoted pools and DReps, fiat, hardware wallets.

Scope

1. Core (seedelf-core/src/build.rs)

2. WebAssembly

3. Worker

4. UI

5. Koios requests

As built:

When Requests
A balance reading 4 (was 3): account_info joins, alongside. The first of a session with a pool also asks its pool_info for the ticker, unless the pool list on the device has it
Opening Staking 1: pool_info for the current pool
Browsing pools 3 on preprod (559 live pools: pool_list, totals, epoch_params), 5 on mainnet (2,891), then none for a day
A pool’s details 1: pool_info
A DRep by ID 2: drep_info and drep_metadata
Any staking build 4: account_addresses, credential_utxos, account_info, epoch_params
A send, move-in or mint spending rewards 1 more: account_info

6. Tests and fixtures

7. Docs

README, privacy.md and flows.md (a Staking section); architecture.md (certificates, the requests); the store listing (“A Cardano wallet with private payments built in”), for the user to resubmit.

Follow-ups, not this chunk