### Terms and Conditions
- [x] I agree to the [Grant Agreement](https://9ba4718…c-5c73-47c3-a024-4fc4e5278803.usrfiles.com/ugd/9ba471_f81ef4e4b5f040038350270590eb2e42.pdf) terms if funded
- [x] I agree to [Provide KYC information](https://9ba4718c-5c73-47c3-a024-4fc4e5278803.usrfiles.com/ugd/9ba471_7d9e73d16b584a61bae92282b208efc4.pdf) if funded above $50,000 USD
- [x] I agree to disclose conflicts of interest
- [x] I agree to adhere to the [Code of Conduct](https://forum.zcashcommunity.com/t/zcg-code-of-conduct/41787) and [Communication Guidelines](https://forum.zcashcommunity.com/t/zcg-communication-guidelines/44284)
- [x] I understand all milestone deliverables will be validated and accepted by their intended users or their representatives, who will confirm that the deliverables meet the required quality, functionality, and usability for each user story.
- [x] I agree that for any new open-source software, I will create a `CONTRIBUTING.md` file that reflects the high standards of Zcash development, using the [`librustzcash` style guides](https://github.com/zcash/librustzcash/blob/main/CONTRIBUTING.md#styleguides) as a primary reference.
- [x] I understand when contributing to existing Zcash code, I am required to adhere to the project specific contribution guidelines, paying close attention to any [merge](https://github.com/zcash/librustzcash/blob/main/CONTRIBUTING.md#merge-workflow), [branch](https://github.com/zcash/librustzcash/blob/main/CONTRIBUTING.md#branch-history), [pull request](https://github.com/zcash/librustzcash/blob/main/CONTRIBUTING.md#pull-request-review), and [commit](https://github.com/zcash/librustzcash/blob/main/CONTRIBUTING.md#commit-messages) guidelines as exemplified in the `librustzcash` repository.
- [x] I agree to post request details on the [Community Forum](https://forum.zcashcommunity.com/c/grants/33)
- [x] I understand it is my responsibility to post a link to this issue on the [Zcash Community Forums](https://forum.zcashcommunity.com/c/grants/33) after this application has been submitted so the community can give input. I understand this is required in order for ZCG to discuss and vote on this grant application.
### Application Owners (@Octocat, @Octocat1)
@AngelCastilloB
### Organization Name
Biglup Labs
### How did you learn about Zcash Community Grants
While researching how to bring more blockchains to the SeedSigner device I saw that "Zcash hardware wallet support" is explicitly listed under What We're Ready To Fund on the ZCG website, this proposal is a direct answer to that item.
### Requested Grant Amount (USD)
$65,000
### Category
Wallets
### Project Lead
```project-lead.yaml
Name: Angel Castillo (GitHub: AngelCastilloB)
Role: Project lead and sole developer
Background: I am Wallet engineer at IOG, I work on the Lace wallet and maintain several open source crypto libraries, including cardano-js-sdk and Biglup/cardano-c. Relevant to this proposal: I built and shipped Cardano SeedSigner (https://github.com/Biglup/cardano-seedsigner), a fork of the bitcoin SeedSigner project adapted for Cardano (Funded by Catalyst, Cardano's grants platform), with signed reproducible firmware images and a working integration with the Lace wallet. So I have already done this exact kind of port once, end to end, for another chain.
Responsibilities: All project execution, signing core and device application development, Zodl and pczt crate upstream PRs, testing and reproducible release pipeline, documentation, milestone delivery and monthly progress updates, ZCG communication
```
### Additional Team Members
```team-members.yaml
None, this is a solo project. I scoped the milestones carefully to what I know I can deliver.
```
### Project Summary
Bring the SeedSigner model to Zcash. SeedSigner is one of the most trusted and widely used DIY signing devices in the bitcoin ecosystem, with years of active releases and a large community of builders: an open source, air-gapped signer you assemble yourself from generic off the shelf parts (raspberry pi zero 1.3, LCD, camera, ~$35 total, buyable with cash anywhere, nobody in the supply chain can know what they are for).
This project brings that proven model to Zcash, signing Ironwood and legacy Orchard PCZTs (ZIP 374) with keys that never touch an online computer. The pi zero 1.3 has no wifi or bluetooth silicon at all, seeds live only in RAM, all communication is animated QR in both directions, and the entire stack is open source and reproducible. There is no purchase record linking your identity to crypto ownership because there is no vendor to buy from. And unlike MCU based signers, is a full computer with 512MB of RAM, so there is no transaction size ceiling and hardware impossible features elsewhere (Sapling, large migration batches).
The device speaks the same open QR protocol Zodl already uses for Keystone and works with current Zodl releases from day one (via a compatibility mode, documented below, until the proper wallet side change I will contribute gets merged). And because the protocol is open, any other wallet can adopt it with the same change.
### Project Description
Every hardware wallet available for shielded Zcash today is a vendor device. They are all good projects and this proposal is not meant to replace any of them, is a different trust model. With a vendor device you trust the vendor's supply chain, their closed components, and you create a shipping record when you buy one. For a privacy coin that record matters more than for any other chain.
SeedSigner is the answer bitcoin found for this: one of the most trusted DIY signers in that ecosystem (1,250+ GitHub stars, active releases), you build it yourself from off the shelf parts, a raspberry pi zero, a small LCD and a camera module, around $35 total. These are completely generic components, sold in any electronics store, used in thousands of hobby projects, you can buy them with cash anywhere in the world and no one in the supply chain, can know what they are for. And the whole stack is reproducible so you can verify what you are running instead of trusting a factory.
There is also a practical advantage: the pi zero is a full computer with 512MB of RAM, while vendor signers run on MCUs with a few hundred kilobytes.
Architecture wise this is PCZT (ZIP 374). The host wallet builds the transaction and the halo2 proofs, the device holds only the spending keys, independently recomputes the ZIP 244 sighash on-device from the transaction data itself (it never accepts a hash from the host), verifies what it is about to sign, shows recipients, amounts and fee on the trusted screen, and produces the redpallas spend authorization signatures.
I ran a small experiment on the real hardware. https://github.com/Biglup/libzcash-signer it parses a PCZT, derives orchard keys via zip32, recomputes the sighash on device, signs, and verifies its own signature against the randomized verification key. Numbers from an actual raspberry pi zero rev 1.3 (BCM2835, 512MB), 20 iterations: 67ms median to parse, 676ms to derive + sighash + sign + verify a 2 action transaction, 1.2MB peak memory. Around 0.34s per action, so a 16 action transaction signs in about 5 seconds and there is no transaction size ceiling.
### Proposed Problem
- Every hardware signing option for shielded ZEC requires trusting a vendor: their supply chain, their closed components, and a purchase record that links your identity to crypto ownership.
- Constrained MCU devices have hard transaction size ceilings.
- Hardware self custody has a price barrier, shielded capable vendor devices retail at $100-150 plus shipping.
### Proposed Solution
A Zcash SeedSigner. It speaks PCZT over the same UR QR protocol Zodl already implements, works with current Zodl releases from day one (compatibility mode, see Upstream Merge Opportunities), recomputes the sighash on device and shows the user exactly what they are signing. There is no vendor anywhere in the picture, and is not tied to a single wallet either.
### Solution Format
Open source software, MIT licensed, in public GitHub repositories from day one:
- The Zcash SeedSigner device application (fork of SeedSigner)
- Reproducible OS image build pipeline with signed releases
- Test vectors, benchmark harness and documentation
- Upstream PRs to zodl-android/zodl-ios and the pczt crate (detailed below)
### Dependencies
- The published pczt, orchard and zip32 crates from librustzcash (the core pins exact versions and tracks upstream releases). ZIP 374 is still a draft, tho at this point four vendors build on it and the v6/Ironwood rules are already in the spec, I track changes as part of the work.
- keystone-sdk-rust ur-registry crate (MIT, audited by Least Authority) for the zcash UR types, reused as is.
- SeedSigner upstream project for the device application base.
- For full Zodl interop, one small upstream change in Zodl (see Upstream Merge Opportunities and Implementation Risks).
### Technical Approach
The device side is a fork of SeedSigner (python application on a minimal linux booting 100% from RAM) with the Zcash signing core as a Rust library behind an FFI boundary, cross compiled for ARMv6 (the static cross build already works, the repo has the build script and the benchmarks were produced with it). The flow:
1. Pairing: the device derives the UFVK and displays it as a zcash-accounts UR (type 49201), the wallet scans it and imports a watch only account.
2. Signing request: the wallet builds the transaction, redacts the PCZT and displays it as an animated zcash-pczt UR (49204). The device scans it with the camera.
3. On device verification: the device recomputes the ZIP 244 sighash from the parsed transaction data (never accepts a host supplied hash), recomputes and displays recipients, amounts, fee and change on the trusted screen, and rejects PCZTs carrying dummy_sk values per the ZIP 374 Signer role requirements.
4. Signing: zip32 derivation from the seed (which lives only in RAM and is wiped on power off), redpallas spend auth signatures for Ironwood and legacy Orchard actions, transparent inputs via secp256k1. Every produced signature is verified against the randomized verification key before leaving the device.
5. Return: the signed PCZT goes back as an animated UR, the wallet merges the signatures, generates proofs, finalizes and broadcasts.
Sapling spends are out of scope initially, but on this hardware it can come as a follow up.
The UR container types are version agnostic (the PCZT serialization carries its own version), so Ironwood v6 transactions need no new transport types.
### Upstream Merge Opportunities
- Zodl vendor keyed signer stamp (zodl-android + zodl-ios). Zodl currently gates signed PCZT acceptance on a keystone:fw_version stamp in the PCZT proprietary fields (a firmware minimum check). I will propose and implement a vendor keyed policy so each signer stamps its own key (seedsigner:fw_version for this project) against a per vendor minimum table. Is a small change and I plan to open the PR early in the project. Until that PR is merged, the device ships with a Zodl compatibility mode so it is usable with current Zodl releases from day one. Every signed PCZT always carries the seedsigner:fw_version stamp, and with compatibility mode on it additionally carries a keystone:fw_version stamp that satisfies Zodl's current check, the signed PCZT remains attributable to this device on inspection, the mode is removed the moment the upstream change lands.
- pczt crate: ZIP 374 says "Signers MUST reject PCZTs that contain dummy_sk values", but the reference Signer role does not enforce this (checked against librustzcash main as of this application, the only dummy_sk handling in the signer module is in its tests). I plan to upstream the enforcement.
- QR transport documentation: the zcash UR types exist only as code in keystone-sdk-rust. I will write up the wire format as a documented spec (potentially a ZIP draft if there is appetite) so the transport stops being a single vendor convention.
### Hardware/Software Costs (USD)
0$
### Hardware/Software Justification
I already own the target hardware (multiple pi zero 1.3 boards, displays, cameras). No hardware line.
### Service Costs (USD)
$15,000
### Service Costs Justification
Independent third party security audit of the signing core and device integration (sighash recomputation, key derivation, clear signing display correctness, RNG usage in signature randomization). Itemized as its own milestone (M5) deliberately so ZCG can approve it, defer it, or coordinate the auditor selection (Least Authority audited Keystone's Zcash stack and would be a natural fit).
### Compensation Costs (USD)
$50,000
### Compensation Costs Justification
Engineering across milestones 1 to 4 (~8 months, the dates are deliberately conservative, payment is gated on deliverables not dates and I will post monthly progress updates regardless): Ironwood signing and mainnet derivation in the core, FFI bridge and cross compilation, UR/QR transport integration, the SeedSigner device port with clean signing UI, Zodl interop including the upstream PRs, reproducible image pipeline with signed releases, tests, vectors and documentation.
### Total Budget (USD)
$65,000
### Previous Funding
No
### Previous Funding Details
_No response_
### Other Funding Sources
No
### Other Funding Sources Details
_No response_
### Implementation Risks
- Zodl interop gate. Zodl refuses signed PCZTs without a Keystone firmware stamp. Day one usability is covered by the compatibility mode described above, and the proper fix is the vendor keyed stamp PR, which I believe is a small, reviewable change that improves their own architecture.
- Clear signing correctness. Misdisplaying an amount or recipient is the catastrophic failure mode for any signer. Mitigations: recompute everything from PCZT data on device (never trust host supplied display strings), bit exact tests against the upstream pczt Signer role outputs, and the M5 external audit explicitly covers display correctness.
- Spec drift. ZIP 374 is still a draft and the pczt crate is pre 1.0. Mitigation: pinned versions, tracking upstream, and the fact that Keystone, Hito, ELLIPAL and Ledger are all building on the same spec makes breaking changes progressively less likely.
### Potential Side Effects
Small, the Zodl vendor stamp PR and the transport spec lower the integration cost for every future signer.
### Success Metrics
- A Zodl wallet completing a full pair, send and receive cycle against the device on mainnet, for Ironwood, legacy Orchard migration spends and transparent.
- Signed reproducible OS image releases that a third party can rebuild bit for bit.
- The three upstream contributions submitted (Zodl PR, pczt crate PR, transport spec).
- Community adoption signals: builds reported by users.
- External audit report published with findings addressed (if M5 is approved).
### Startup Funding (USD)
$0
### Startup Funding Justification
Not needed, the PoC hardware and development environment already exist.
### Milestone Details
```milestones.yaml
- Milestone: 1 Ironwood signing in the core.
Amount (USD): $10,000
Expected Completion Date: 2026-12-15
Deliverables: libzcash-signer signs Ironwood pool (v6) actions in addition to legacy Orchard, mainnet key derivation (coin type 133) with account selection, updated benchmarks on the pi zero 1.3, test vectors for both pools published.
Acceptance: a v6 PCZT with Ironwood actions signed on the physical device, signatures verify against the randomized verification keys, benchmark report published.
- Milestone: 2 device port and QR roundtrip.
Amount (USD): $18,000
Expected Completion Date: 2027-02-28
Deliverables: SeedSigner fork with the Rust core behind FFI (ARMv6), animated UR QR in both directions (zcash-accounts pairing export, zcash-pczt receive and return), seed entry/restore compatible with Zodl seed phrases.
Acceptance: full scan, sign, return roundtrip on the physical device with a redacted PCZT, demo video published.
- Milestone: 3 clear signing and wallet interop.
Amount (USD): $15,000
Expected Completion Date: 2027-04-30
Deliverables: on device display of recipients, amounts, fee and change recomputed from PCZT data (UFVK based change detection), dummy_sk rejection surfaced in UX, the Zodl vendor keyed stamp PRs submitted (android + iOS), the pczt crate dummy_sk enforcement PR submitted.
Acceptance: end to end mainnet transaction initiated from Zodl, with every displayed field independently recomputed on device, bit exact sighash tests against the upstream Signer role passing.
- Milestone: 4 reproducible releases and docs.
Amount (USD): $7,000
Expected Completion Date: 2027-05-31
Deliverables: reproducible OS image build pipeline, signed releases, build and verification documentation, user guide (assembly, flashing, verification, usage), the QR transport spec write up published.
Acceptance: a third party following the docs reproduces the image bit for bit, release v1.0 published.
- Milestone: 5 external security audit
Amount (USD): $15,000
Expected Completion Date: 2027-07-31
Deliverables: third party audit of the signing core and device integration, findings addressed, report published.
Acceptance: published report, all critical and high findings resolved.
```
### Supporting Documents
```files.yaml
- Concept thread with community feedback: https://forum.zcashcommunity.com/t/feedback-wanted-a-diy-open-source-air-gapped-signer-for-shielded-zec-seedsigner-model/56927
- Signing core with on device benchmarks: https://github.com/Biglup/libzcash-signer
- Previous shipped work, same model on another chain: https://github.com/Biglup/cardano-seedsigner
- Bitcoin SeedSigner (upstream base): https://github.com/SeedSigner/seedsigner
- ZIP 374: https://zips.z.cash/zip-0374
```