diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d0e9cba --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,59 @@ +# Changelog + +All notable changes to Cyze are recorded here. Versions follow +[semantic versioning](https://semver.org); pre-1.0 minor bumps may include +breaking changes. Cyze is beta, unaudited software (see the README). + +## [0.2.0-rc.1] — 2026-08-16 + +First release candidate for the **Ironwood (NU6.3)** feature wave. Still targets +release-candidate Zcash libraries; test on testnet first. + +### Added +- **Ironwood (NU6.3) wallet.** Post-NU6.3 sends build **V6 transactions**; + balances read the Ironwood pool. Any legacy Orchard funds are surfaced only + when present, with a one-tap sweep into Ironwood. +- **Pipelined sync — now the standard driver.** Overlaps block download with CPU + trial-decryption and streams blocks straight from the network to the scanner, + hiding network latency behind scanning (biggest win on high-latency links). +- **Tailscale serve hosting.** Coordinators can publish the embedded `frostd` to + their tailnet at a stable `*.ts.net` address with automatic, publicly-trusted + TLS (tailnet-only, not public), with in-app **Get Tailscale** / **Sign in** + helpers — alongside the existing Cloudflare tunnel, Direct, and NGINX options. +- **Active-wallet model.** The app works on one wallet at a time; a **Zcash → + Wallets** switcher selects the active group and stops syncing the previous one. +- **In-app Diagnostics log** (Wallet Settings) — captures the app's runtime logs + for easy copy/share while troubleshooting; in-memory only. + +### Changed +- **Ironwood-first wallet UX.** The headline total is the Ironwood balance; the + always-on Orchard/Ironwood pool split is gone, and user-facing "Orchard" + wording was removed in favor of Ironwood / neutral terms. +- **Calmer mainnet UX.** Removed the passive "you are on mainnet" banners and the + network-switch modal; the wallet page now shows a small **Mainnet/Testnet** + pill, and a mainnet send keeps one slim confirmation before broadcasting. +- Trimmed verbose in-app copy; DKG wizard section titles are now bold headings. +- Bumped the Zcash crate cohort to the latest Ironwood release candidates + (`zcash_client_backend` 0.24.0-rc.7, `zcash_client_sqlite` 0.22.0-rc.8, with + `zcash_protocol` 0.10.4, `pczt` 0.9.3, `orchard` 0.15.5). + +### Fixed +- Wallet setup could sit on "Setting up the group's view-only wallet…" forever + with nothing in the logs. Setup now logs each step and **times out** its + lightwalletd RPCs, and a failed wallet-status read surfaces an error with a + Retry instead of a permanent spinner. +- Syncing against a **pre-Ironwood testnet** lightwalletd no longer aborts: the + driver skips the unsupported Ironwood subtree-roots request and keeps going. +- "database is locked" during overlapping syncs — syncs are serialized behind an + app-wide gate so a restart can't race a cancelled sync's open connection. + +### Removed +- The experimental pipelined-sync toggle (pipelined is now the only path) and, + with it, the stock `zcash_client_backend::sync::run` path and its on-disk + block cache. + +## [0.1.0] + +Initial pre-release: threshold DKG and signing over `frostd`, envelope-encrypted +keystore with a one-time recovery code, embedded server with Cloudflare-tunnel +exposure, and the first Zcash wallet support. diff --git a/README.md b/README.md index 6ce42a6..5b53e51 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,15 @@ authorize any spend. - **Threshold signing** — coordinate a signing session (the coordinator can also be a signer), or participate through an inbox with an explicit review/approve step before your signature share is produced. -- **Zcash wallet (Ironwood-ready)** — for RedPallas (Orchard) groups: sync from a - lightwalletd server, view **per-pool shielded balances** — the sealed legacy - **Orchard** pool and the post-NU6.3 **Ironwood** pool — receive to a rotating - group address (with QR), and **send** — each spend is authorized by a live - FROST signing ceremony among the group. After the **Ironwood (NU6.3)** upgrade, - sends build **V6 transactions** with pool-aware Orchard/Ironwood spend - authorization, and a one-click **Orchard → Ironwood migration** sweeps the - sealed legacy pool across the turnstile. Includes on-chain and local - transaction/message history. +- **Zcash wallet (Ironwood)** — for RedPallas groups: sync from a lightwalletd + server with a pipelined light-client scanner, view the group's **Ironwood + shielded balance**, receive to a rotating group address (with QR), and **send** — + each spend is authorized by a live FROST signing ceremony among the group. Sends + build **V6 transactions** post-NU6.3. Any legacy **Orchard** funds are surfaced + only when present, with a one-tap sweep into Ironwood. The app focuses on **one + active wallet at a time** — selecting a group makes it the sole wallet the app + syncs and acts on. Includes on-chain and local transaction/message history, and + an in-app diagnostics log for troubleshooting. - **Coinholder voting** — cast a Zcash coinholder-poll vote from a group: paste the poll's published ballot, answer, and the vote is delivered as a shielded memo (Vote Cast Memo v1) to the poll's reception address through the same FROST @@ -47,14 +47,16 @@ authorize any spend. for you to confirm before signing (the resolver is external, never an authorization). - **Server hosting** — run the `frostd` coordination server embedded - (auto-generated, pinned self-signed TLS), expose it to off-LAN peers through a - built-in **Cloudflare tunnel** (public HTTPS URL, no port-forwarding), or point - at any external `frostd`. + (auto-generated, pinned self-signed TLS), and expose it to off-LAN peers either + through a built-in **Cloudflare tunnel** (public HTTPS URL, no port-forwarding) + or over **Tailscale** (a stable `*.ts.net` tailnet address with automatic, + publicly-trusted TLS — tailnet-only, not public), or point at any external + `frostd`. - **Contacts & groups** — a per-group view with public key material, named participants, receive addresses, and share-repair guidance. Supports both frost-tools ciphersuites: **Ed25519** (generic signing) and -**RedPallas** (re-randomized FROST for Zcash Orchard spend authorization). +**RedPallas** (re-randomized FROST for Zcash shielded spend authorization). ## Security model @@ -148,9 +150,9 @@ drives the full Tauri command layer (`cargo test -p frost-app --test smoke`). ## Layout - `src-tauri/core` — `frost-app-core`: keystore, frostd transport (pinned-cert - TLS), DKG/signing ceremony engines, the Zcash wallet/PCZT send path (Orchard + - Ironwood), coinholder-poll voting (`voting.rs`), and ZcashNames resolution - (`zns.rs`). No Tauri dependency. + TLS), DKG/signing ceremony engines, the Zcash wallet/PCZT send path (Ironwood, + plus legacy Orchard) and pipelined sync driver, coinholder-poll voting + (`voting.rs`), and ZcashNames resolution (`zns.rs`). No Tauri dependency. - `src-tauri/src` — Tauri adapter: commands, event forwarding, sidecar lifecycle. - `src/` — React + TypeScript frontend. - `scripts/PINNED_REV` — the frost-tools revision used for both the diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 4cdd0bd..deab5a1 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -61,9 +61,9 @@ Cyze is a desktop wallet for Zcash where **no one person holds the private key** A group jointly controls the funds using [FROST](https://frost.zfnd.org/) threshold signatures: a configurable quorum (e.g. 2 of 3) must cooperate to authorize any spend. It handles the full lifecycle — distributed key generation, -a shared Orchard wallet (sync, receive, balances, history), and threshold-signed -sending where each participant explicitly reviews and approves the transaction -before their signature share is produced. +a shared Zcash (Ironwood) wallet (sync, receive, balances, history), and +threshold-signed sending where each participant explicitly reviews and approves +the transaction before their signature share is produced. --- @@ -118,11 +118,18 @@ the others connect. Go to **Session Configuration**. 1. **Start the embedded server.** It binds to loopback on your machine. 2. Choose how remote participants reach it: - - **Cloudflare Tunnel** *(recommended for remote testing)* — click **Open + - **Cloudflare Tunnel** *(quickest for remote testing)* — click **Open public tunnel** to get a public `https://…trycloudflare.com` URL with valid TLS. Share that URL with participants. **Note:** the URL is disposable — a new one is generated every time you restart the tunnel, so always share the current one. + - **Tailscale** *(recommended for a stable link)* — if you and your + participants are on the same tailnet, click **Publish to tailnet** to serve + the embedded server at a stable `https://.ts.net` address with + automatic, publicly-trusted TLS. The URL is **reusable across launches** (no + cert-trust step), and access stays **tailnet-only** — not public. If + Tailscale isn't installed or signed in, the tab offers **Get Tailscale** / + **Sign in** to get there. - **Direct URL / IP** — for participants on your LAN or reachable by IP. Share the URL, the certificate **fingerprint**, and the self-signed **certificate** (participants must trust it once). @@ -131,8 +138,8 @@ the others connect. Go to **Session Configuration**. ### As a participant 1. In **Connect to the coordinator's server**, paste the URL the coordinator gave - you. It looks like `https://frost.example.com`, `https://203.0.113.7:2744`, or - `https://…trycloudflare.com`. + you. It looks like `https://frost.example.com`, `https://203.0.113.7:2744`, + `https://…trycloudflare.com`, or a Tailscale `https://.ts.net`. 2. Click **Test connection** — a success message confirms the server, its TLS trust, and latency. 3. For a Direct-URL (self-signed) server, expand **"Trust its certificate,"** @@ -216,10 +223,11 @@ balance and history update (use **Sync Now** on the Wallet page if needed). Network and light-client endpoint are set on the **Wallet Settings** page. -**Network.** Cyze defaults to **Mainnet**; a persistent banner and confirmation -dialog make the active network unmissable. Switch to **Testnet** to test with -faucet funds, and back to Mainnet when ready. Balances, addresses, and history -are kept entirely separate per network. +**Network.** Cyze defaults to **Mainnet**. The active network is shown as a small +**Mainnet / Testnet** label on the wallet page, and a real mainnet send asks for +one confirmation before it broadcasts. Switch to **Testnet** to test with faucet +funds, and back to Mainnet when ready. Balances, addresses, and history are kept +entirely separate per network. **lightwalletd endpoint.** Each network offers a **preset** public endpoint (`zec.rocks` on mainnet, `testnet.zec.rocks` on testnet). To use your own node, @@ -231,3 +239,12 @@ confirms whether the server actually responded. looks stalled, press **Sync Now** — it restarts the sync from scratch and refreshes every panel (balances, pending/settled, notes, and history). +**Active wallet.** With more than one group, Cyze works on **one wallet at a +time**. Use **Zcash → Wallets** to switch between groups; selecting one makes it +the active wallet, and the app stops syncing the previous one so all processing +stays focused on your choice. + +**Diagnostics log.** Wallet Settings has a **Diagnostics log** card that captures +what the app logs while running (sync steps, errors). Use **Copy all** to grab it +for troubleshooting; it's in memory only and clears on restart. + diff --git a/package.json b/package.json index 28c8b35..9fc9d42 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frost-app", "private": true, - "version": "0.1.0", + "version": "0.2.0-rc.1", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 40c3e29..c1443f0 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1597,7 +1597,7 @@ dependencies = [ [[package]] name = "frost-app" -version = "0.1.0" +version = "0.2.0-rc.1" dependencies = [ "dirs 5.0.1", "frost-app-core", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 0607dd8..1d15454 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [package] name = "frost-app" -version = "0.1.0" +version = "0.2.0-rc.1" edition = "2021" license = "MIT OR Apache-2.0" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ea46bd3..4e45515 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Cyze", - "version": "0.1.0", + "version": "0.2.0-rc.1", "identifier": "org.frostapp.companion", "build": { "beforeDevCommand": "npm run dev",