Update for Zallet v0.1.0-beta.2 (Ironwood / NU6.3) - #1
Open
nullcopy wants to merge 10 commits into
Open
Conversation
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
force-pushed
the
update/zallet-0.1.0-beta.2
branch
from
August 5, 2026 18:39
61dea5e to
ed8b7d9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Compatibility fixes
z_getbalancesshape:transparent: {regular, coinbase}and the newironwoodpool, with updated wire-shape fixture tests mirroring Zallet's own reference JSON.-10catching up,-2reorg recovery) like the existing-28"still syncing" state; read the newgetwalletstatus.lockedfield (optional — absent on beta.2, present on later versions) and pre-check it before submitting a send.z_getoperationresultso 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
AllowRevealedAmountsor weaker.Send flow modernization
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_sendmanyis kept only for ZIP 320 (TEX) recipients, which need two transactions the PCZT pipeline can't express.Quality of life
--cookie-file/cookie_file), using the.cookiecredential Zallet writes into its data directory on each startup — no more manualadd-rpc-usersetup for local use.zallet-tui checksubcommand: diffs the server'srpc.discoverschema 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.block_datetime(raw timestamp fallback for older servers);z_listtransactionsfailures are shown in the view instead of silently rendering an empty history.