Skip to content

Update for Zallet v0.1.0-beta.2 (Ironwood / NU6.3) - #1

Open
nullcopy wants to merge 10 commits into
mainfrom
update/zallet-0.1.0-beta.2
Open

Update for Zallet v0.1.0-beta.2 (Ironwood / NU6.3)#1
nullcopy wants to merge 10 commits into
mainfrom
update/zallet-0.1.0-beta.2

Conversation

@nullcopy

@nullcopy nullcopy commented Aug 5, 2026

Copy link
Copy Markdown
Owner

What changed

Compatibility fixes

  • Model the beta.2 z_getbalances shape: transparent: {regular, coinbase} and the new ironwood pool, with updated wire-shape fixture tests mirroring Zallet's own reference JSON.
  • Treat sync-lock errors (-10 catching up, -2 reorg recovery) like the existing -28 "still syncing" state; read the new getwalletstatus.locked field (optional — absent on beta.2, present on later versions) and pre-check it before submitting a send.
  • Collect finished send operations via z_getoperationresult so they don't accumulate in the bounded queue; treat an empty status response as a lost operation and stop polling with a clear message.

Ironwood / ZIP 318 UX

  • Ironwood column in the Balances view.
  • A notice flagging at-risk funds remaining in the sealed Orchard pool, per ZIP 318's guidance that wallets surface this.
  • Privacy-policy send rejections get a hint explaining that spending sealed Orchard funds crosses into Ironwood and requires AllowRevealedAmounts or weaker.

Send flow modernization

  • Sends now use z_sendfromaccount (new in beta.2): spends from the account UUID directly (removing the "resolve the account to its first unified address" workaround) with an explicit fund-source selector (Orchard + Ironwood / Sapling / Transparent). The call is synchronous through proving and broadcast, so it runs on a spawned task polled from the tick handler; the UI stays responsive and reports broadcast txids directly.
  • z_sendmany is kept only for ZIP 320 (TEX) recipients, which need two transactions the PCZT pipeline can't express.

Quality of life

  • Cookie-file authentication (--cookie-file / cookie_file), using the .cookie credential Zallet writes into its data directory on each startup — no more manual add-rpc-user setup for local use.
  • New zallet-tui check subcommand: diffs the server's rpc.discover schema against the 14 RPC methods the TUI uses and exits nonzero on a miss. A cheap probe for the next surface change, given Zallet's RPC is still pre-1.0 and moving.
  • Transaction detail pane prefers the new RFC 3339 block_datetime (raw timestamp fallback for older servers); z_listtransactions failures are shown in the view instead of silently rendering an empty history.
  • README fixes: example RPC port (28232 vs the built-in default 8232) and mismatched auth username; new Compatibility section.

nullcopy and others added 10 commits August 5, 2026 12:48
Zallet splits each account's transparent balance into regular and coinbase
buckets ({"regular": {...}, "coinbase": {...}}), which the old flat
category-map model failed to deserialize — any account holding transparent
funds broke the entire Balances view. Model the split explicitly and sum
both buckets into the Transparent column.

Add the Ironwood shielded pool (introduced by NU6.3, active on mainnet
since 2026-07-28) as a first-class balance field and Balances column.
Funds received at Orchard receivers land in Ironwood post-activation, so
without it new funds were invisible in the per-pool columns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
CI lints with -D warnings; stable clippy now flags this pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
Newer Zallet gates balance and spend RPCs behind a global sync lock while
the wallet catches up to the tip (-10 ClientInInitialDownload) or recovers
from a reorg (-2 ForbiddenBySafeMode). Fold both into the existing
InWarmup (-28) handling so startup shows the Balances view's syncing
state instead of an error toast on every refresh tick.

Read the new getwalletstatus `locked` field (absent up to v0.1.0-beta.2)
and pre-check it before submitting a send: not every spend method is
sync-gated server-side, so the client refuses early with a clear message.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
Zallet now bounds its async operation queue (rpc.async_operation_limit,
default 1000): finished-but-uncollected operations are evicted oldest
first, and the queue is in-memory only. Two consequences for a client
that only ever polled z_getoperationstatus:

- An evicted or restart-lost opid returns an empty status array, which
  previously kept polling forever. Treat it as a lost operation: stop
  polling and direct the user to the Transactions view.
- Finished operations were never collected, making every send a future
  eviction candidate. Collect each terminal operation once via
  z_getoperationresult so the queue stays clear.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
ZIP 318 expects wallet UIs to surface at-risk Orchard balances: since
NU6.3 the pool is sealed, so spendable Orchard funds can only move into
the account's own Ironwood pool, and the crossing amount is public. Show
a notice under the Balances table whenever such funds exist.

When the wallet rejects a send for privacy-policy reasons (its message
names the 'privacyPolicy' parameter), append a hint mapping that to the
TUI's Privacy policy field and explaining the Orchard-to-Ironwood
crossing — under the stricter beta.2 semantics, FullPrivacy sends that
used to work now commonly fail exactly this way.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
Replace the z_sendmany-based send path with the z_sendfromaccount RPC
added in Zallet v0.1.0-beta.2. It spends from the account UUID directly,
removing the fragile "resolve the account to its first unified address"
workaround, and takes an explicit fund source, which the form now offers
as a selector (Orchard + Ironwood / Sapling / Transparent). Each source
is isolating, and "orchard" spans the Ironwood pool — the lever by which
sealed Orchard funds migrate.

The call is synchronous through proving and broadcast (potentially tens
of seconds), so it runs on a spawned task and the tick handler collects
the outcome; the UI stays responsive and reports the broadcast txids
directly, with no operation polling.

z_sendmany remains only for ZIP 320 (TEX) recipients, which need two
transactions that the PCZT pipeline behind z_sendfromaccount cannot
express; those still use the async-operation path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
z_listtransactions now reports block_datetime as an RFC 3339 string;
prefer it in the detail pane over the raw Unix timestamp (kept as a
fallback for older servers).

Failures of the (still experimental) method were silently swallowed by
clearing the list, which would have masked exactly the kind of shape
change this release brought. Sync-lock errors still present as an empty
list, but any other failure is now displayed in the view.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
Zallet writes a fresh .cookie file (__cookie__:<password>) into its data
directory on every startup. A new --cookie-file flag / cookie_file config
key reads credentials from it, avoiding the manual add-rpc-user setup for
local use. The file is re-read on each connection attempt since the
credential rotates per wallet start. Explicit --rpc-user credentials take
precedence over the cookie; the cookie takes precedence over [[auth]].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
zallet-tui check queries the server's OpenRPC schema (rpc.discover) and
reports any RPC method the TUI uses that the server does not expose,
exiting nonzero when something is missing. Zallet's RPC surface is still
pre-1.0 and moving — this branch exists because it moved — so a cheap,
scriptable probe catches the next rename or removal explicitly instead
of as a silent runtime failure.

The connection flags are now clap global args so they can be given after
the subcommand (zallet-tui check --rpc-url ...).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
Fix the README's example RPC port (28232 vs the built-in default 8232)
and mismatched auth username, document cookie-file auth and the check
subcommand, and add a Compatibility section covering the targeted Zallet
version and the NU6.3/Ironwood implications for users.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hw5NbYbNzHJ37N3FhK9kHr
@nullcopy
nullcopy force-pushed the update/zallet-0.1.0-beta.2 branch from 61dea5e to ed8b7d9 Compare August 5, 2026 18:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant