Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
34 changes: 18 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down
37 changes: 27 additions & 10 deletions docs/USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

---

Expand Down Expand Up @@ -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://<name>.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).
Expand All @@ -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://<name>.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,"**
Expand Down Expand Up @@ -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,
Expand All @@ -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.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "frost-app",
"private": true,
"version": "0.1.0",
"version": "0.2.0-rc.1",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
Loading