### 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)
@raycre8-g
### Organization Name
Kuvarpay Limited
### How did you learn about Zcash Community Grants
We were encouraged by squirrel in the ZecHub community to apply after demonstrating our Zcash work at ZecHub Hackathon 3.0, including ZecAuth and the ZecWallet prototype.
### Requested Grant Amount (USD)
$20,000
### Category
Infrastructure
### Project Lead
```project-lead.yaml
Name: Aderemi Azeez
Role: Project Lead / Founder, Kuvarpay Limited
Background: Full-stack engineer and fintech founder building crypto and payment infrastructure for African markets. He previously built KuvarPay, a crypto payment gateway, and RaySwap, a multi-chain exchange. For ZecHub Hackathon 3.0 he created ZecAuth, a Zcash wallet-to-application authorization protocol with ZIP-32-derived RedPallas signatures, and ZecWallet, the bare React Native prototype that Kestrel is built from.
Responsibilities:
- Project delivery and technical leadership
- Kestrel architecture and WalletConnect integration
- Shared-spec implementation and extension proposals
- Coordination with Noir Wallet on the shared Zcash WalletConnect spec
- Integration guide, lessons-learned report, and ZCG reporting
```
### Additional Team Members
```team-members.yaml
- Name: Abdulhammed Abdulazeez
Role: Mobile Engineer (iOS / Android)
Background: Mobile engineer trained at African Leadership University and co-founder of Zidify, with experience building cross-platform fintech applications. He currently works on the ZecWallet prototype that will become Kestrel.
Responsibilities:
- Kestrel iOS (Swift + ZcashLightClientKit) and Android (Kotlin + Zcash Android SDK)
- SDK 4.x upgrade, native bridges, Ironwood and ZIP-318 migration
- Wallet UX, approval screens, PIN, biometrics, automatic locking
- App Store and Google Play releases
- Name: Abdulazeez Jubril Kolawole
Role: Backend / Infrastructure Engineer
Background: Software engineer and KuvarPay COO with experience in fintech APIs, blockchain infrastructure, and production systems. He built Z3 Launcher for ZecHub Hackathon 3.0, a Go-based deployment and management system for Zebra, Zaino, and Zallet.
Responsibilities:
- Reusable React Native WalletConnect module: packaging, tests, npm release
- Reference dApp and its hosting
- Light-client endpoints, CI, crash monitoring, test environments
```
### Project Summary
Kestrel is an open-source, self-custodial Zcash wallet for iOS and Android that will be the first native mobile implementation of the shared Zcash WalletConnect standard funded under grant #391. It ships with a reusable wallet-side module and an integration guide so other mobile Zcash wallets can add WalletConnect without building it from scratch.
### Project Description
Kestrel builds on two things the Zcash ecosystem already has: WalletConnect as the transport and session layer, and the Zcash WalletConnect specification that Noir Wallet published in September 2026 under ZCG grant #391. Noir's work defines the shared standard and ships it in a browser wallet. Kestrel brings the same standard to native iOS and Android, and packages the wallet side as an open-source module so other mobile wallets do not have to build it again.
This application replaces our earlier proposal #421, which the committee declined at its September 28, 2026 meeting. We have acted on each point the committee raised:
- Artkor recommended WalletConnect over a custom integration layer, and said he would rather fund documentation, implementation guides, and practical feedback that make integration easier for the next teams. Kestrel now uses WalletConnect and Noir's shared spec in place of our own ZecAuth transport, and the integration guide and a lessons-learned report are funded deliverables.
- Gguy, Zerodartz, and Paul found the earlier proposal too specific to one wallet and one service. The reusable module and the spec contributions in this proposal are built to be used by other wallets, not only by Kestrel.
- Hanh saw the earlier proposal as funding our own business. KuvarSend, fiat ramps, and every company-specific component have been removed. No deliverable depends on a Kuvarpay commercial product.
From ZecAuth we keep the experience of designing scoped, per-capability consent for shielded Zcash. We contribute it as proposals to the shared spec instead of as a separate protocol.
### Proposed Problem
1. Zcash mobile users cannot use WalletConnect.
WalletConnect is the standard way wallets connect to web applications on most major chains. For Zcash, a shared namespace and method specification now exists (grant #391), and Noir is implementing it in a browser wallet. No mobile wallet offers WalletConnect for Zcash today; we checked the source of Zodl (iOS and Android) and Zingo mobile and found no WalletConnect dependency. Most Zcash users hold ZEC on their phones, so dApps that adopt the standard still cannot reach them.
2. Every mobile wallet would have to build the same integration.
Adding WalletConnect to a Zcash wallet means pairing, session handling, a permission manager, approval screens, and mapping requests onto the Zcash SDK. Without a reusable implementation, each wallet team repeats this work and makes its own privacy decisions.
3. Some privacy questions in the shared spec are still open.
Noir's v1 spec deliberately defers balance and transaction-history methods, and it allows but does not require a different address per application. There is also a format constraint: CAIP-10 limits an account address to 128 characters, while a Unified Address with Orchard, Sapling, and transparent receivers is about 213 characters. Only an Orchard-only Unified Address (about 106 characters) fits. These questions affect every wallet that implements the standard and are best settled once, in the shared spec.
### Proposed Solution
Over twelve weeks we will deliver four things.
1. Kestrel for iOS and Android
A production self-custodial Zcash wallet, built from our ZecWallet prototype and upgraded to the current Zcash mobile SDKs (4.x) with NU6.3 support:
- Wallet creation and restoration, with seed storage in iOS Keychain and Android Keystore
- Shielded send and receive, Unified Addresses, balances, and transaction history
- Ironwood support and the ZIP-318 Orchard to Ironwood migration flow
- PIN, optional biometrics, and automatic locking
- WalletConnect pairing by QR code and deep link, session review, approval, persistence, and disconnection
2. Native mobile implementation of the shared Zcash WalletConnect spec
Kestrel implements Noir's published v1 spec as written, so a dApp built for the standard works with Kestrel without changes:
- zcash_requestAccounts and zcash_getAccounts, returning only the address the user authorizes for that application
- zcash_sendTransaction: the application sends a payment intent, and Kestrel builds, displays, signs, and broadcasts the transaction on the device
- zcash_accountsChanged and zcash_chainChanged events
- Chain identifiers zcash:mainnet and zcash:testnet
Kestrel gives each connected application its own fresh Orchard-only Unified Address, so applications cannot link a user across sites and the account identifier fits the CAIP-10 length limit. We will not implement zcash_signTransaction; we agree with the spec's reasoning that letting an application construct shielded transactions leaks note-selection metadata.
3. Reusable wallet-side module
An MIT-licensed React Native module containing the WalletConnect session handling, the Zcash method handlers, the permission manager, and reference approval screens. React Native wallets such as Zingo mobile can adopt it directly. Native Swift and Kotlin wallets such as Zodl can follow the same structure using the integration guide.
4. Spec contributions, an integration guide, and a lessons-learned report
- Written extension proposals submitted to the shared spec: zcash_getBalance and zcash_getTransaction with explicit per-request consent; the per-application address strategy; and the CAIP-10 account format
- A candidate scheme for the optional zcash_signMessage method, based on the ZIP-32-derived RedPallas signatures we built and tested for ZecAuth
- A draft zcash entry for the ChainAgnostic namespaces registry, prepared with Noir
- A public integration guide for mobile wallet teams, and a lessons-learned report covering what was difficult, the SDK gaps we hit, and what would make the next integration easier
### Solution Format
Software and documentation, all public and MIT-licensed:
- Kestrel repository with reproducible build instructions
- Kestrel iOS and Android release builds, plus App Store and Google Play submissions
- Reusable React Native WalletConnect module for Zcash, published to npm with tests
- Open-source reference dApp built with standard Reown AppKit against the shared spec
- Spec extension proposals and a draft namespace registry entry
- Mobile wallet integration guide
- Lessons-learned report
- Independent security review findings and remediation status
- Mainnet demonstration video and final ZCG report
### Dependencies
Technical: Zcash Swift wallet SDK 4.x (ZcashLightClientKit, github.com/zcash/zcash-swift-wallet-sdk), Zcash Android wallet SDK 4.x (github.com/zcash/zcash-android-wallet-sdk), Reown WalletKit (the WalletConnect wallet SDK) and AppKit for the reference dApp, React Native (bare), Zaino/lightwalletd light-client endpoints, Apple and Google developer platforms.
Specification: the Zcash WalletConnect Technical Architecture and Protocol Specification published by Noir Wallet under grant #391. Kestrel implements its v1 as published.
Collaboration: we will coordinate with Noir Wallet on spec extension proposals and the namespace registry entry. Their acceptance of our proposals is not required to complete this grant, and no other ZCG grantee is required for delivery. WalletGuide listing depends on WalletConnect's review timeline; our acceptance criteria require submission, not approval.
### Technical Approach
Wallet architecture
Bare React Native with native modules: Swift over ZcashLightClientKit on iOS and Kotlin over the Zcash Android SDK on Android. Seed material is generated and kept on the device in iOS Keychain or Android Keystore. Sensitive actions require fresh authentication.
WalletConnect layer
Kestrel uses Reown WalletKit for pairing (QR code and wc: deep links), session proposals, requests, updates, and disconnection. Requests pass through four parts, following the layering in the shared spec:
- Session layer (WalletKit): receives proposals and requests
- Permission manager: checks every request against the approved application, chain, account, and method; anything not approved is rejected before the wallet core is touched
- Zcash method handlers: map each spec method onto SDK calls
- Wallet core: builds, proves, signs, and broadcasts on the device
Private keys and viewing keys never pass through WalletConnect.
Accounts and addresses
On a new session, Kestrel derives a fresh Orchard-only Unified Address for that application with getCustomUnifiedAddress, which both 4.0.0 SDKs expose, and returns it as the CAIP-10 account (zcash:mainnet:<address>). The address is about 106 characters, within CAIP-10's 128-character limit. Different applications receive different addresses.
Payments
zcash_sendTransaction carries a payment intent (recipient, amount, memo), mapped to ZIP-321 where applicable. Kestrel creates a ZIP-317 fee proposal through the SDK, shows the requesting app, recipient, amount, fee, memo, and network, and only builds and broadcasts after the user approves. The result (txid or a structured rejection) is returned to the application.
Consent
The approval screen lists each requested method with a plain-language description of what it reveals. WalletConnect requires a wallet to approve every method a dApp marks as required, so only optional methods can be declined individually; the integration guide recommends that dApps request sensitive methods as optional.
Reusable module
The session layer, permission manager, method handlers, and approval screens are packaged as a React Native module with no dependency on Kestrel's app code, published to npm with unit tests and a sample integration.
Licensing: all new code is MIT-licensed, and each new repository includes a CONTRIBUTING.md following the librustzcash style guides.
### Upstream Merge Opportunities
We do not plan to fork or modify any Zcash repository. Kestrel uses the released Zcash mobile SDKs as dependencies.
Contributions we plan to make upstream:
- Shared Zcash WalletConnect spec (Noir Wallet): extension proposals for zcash_getBalance, zcash_getTransaction, per-application addresses, the CAIP-10 account format, and a zcash_signMessage candidate scheme. These benefit every wallet implementing the standard.
- ChainAgnostic namespaces registry: a draft zcash namespace entry, prepared with Noir so the ecosystem submits one entry, not two.
- Zcash Swift and Android wallet SDKs: issues and fixes for any bugs, missing interfaces, or documentation gaps we hit, filed following each repository's contribution guidelines.
Upstream review and merge timelines will not block completion of this grant.
### Open Source License
MIT
### Hardware/Software Costs (USD)
$0
### Hardware/Software Justification
No purchases are needed. Kuvarpay provides development machines, Apple Developer and Google Play Console accounts, code-signing infrastructure, and iOS and Android test devices as an in-kind contribution.
### Service Costs (USD)
$5,000
### Service Costs Justification
| Item | Cost |
| -- | -- |
| Independent security review | $3,000 |
| Zaino / light-client infrastructure | $1,000 |
| CI and crash monitoring | $600 |
| Reference dApp hosting, TLS, and test infrastructure | $400 |
| Total | $5,000 |
Independent security review ($3,000): a focused external review of WalletConnect session handling, permission enforcement, per-application address handling, payment approval, key storage, and sensitive-action authentication.
Zaino / light-client infrastructure ($1,000): project endpoints and monitoring for testnet development and mainnet validation.
CI and crash monitoring ($600): automated builds and tests for the app and module, release validation, crash diagnostics.
Reference dApp hosting ($400): public hosting and TLS for the reference dApp used in acceptance testing and the mainnet demo.
### Compensation Costs (USD)
$15,000
### Compensation Costs Justification
| Team member | Role | Compensation |
| -- | -- | -- |
| Aderemi Azeez | Project Lead / Protocol and Full-Stack | $5,000 |
| Abdulhammed Abdulazeez | Mobile Engineering (iOS / Android) | $5,000 |
| Abdulazeez Jubril Kolawole | Backend / Infrastructure | $5,000 |
| Total | | $15,000 |
Each team member is compensated $5,000 for twelve weeks of part-time work, about $417 per week. The grant funds the Zcash-specific engineering; Kuvarpay contributes additional engineering capacity and existing equipment.
### Total Budget (USD)
$20,000
### Previous Funding
No
### Previous Funding Details
_No response_
### Other Funding Sources
No
### Other Funding Sources Details
_No response_
### Implementation Risks
1. Shared spec changes
Risk: Noir's spec is a v1 draft and may change during the project.
Mitigation: we implement v1 as published and track changes with Noir. The module keeps the spec mapping in one layer, so updates stay small.
2. Required versus optional methods
Risk: WalletConnect requires wallets to approve every method a dApp marks as required, so users can only decline optional methods.
Mitigation: Kestrel shows every requested method before approval, and the integration guide recommends that dApps request sensitive methods as optional.
3. SDK upgrade
Risk: the ZecWallet prototype runs on Zcash mobile SDK 2.5.2, and the current releases are 4.0.0 on iOS and Android. The 4.0.0 notes also say migration-proposal failures are not yet classified.
Mitigation: the upgrade happens in the startup phase, before feature work. Kestrel handles migration errors generically and reports gaps upstream.
4. WalletGuide listing
Risk: listing depends on WalletConnect's review timeline.
Mitigation: we submit during Milestone 2, and acceptance requires submission evidence, not approval.
5. Noir reference application timing
Risk: Noir's reference application may not be public when we need it for interoperability testing.
Mitigation: our acceptance testing uses our own reference dApp built with standard Reown AppKit against the published spec, plus Noir's application when it is available.
6. App store review
Risk: Apple or Google review may run past the project timeline.
Mitigation: submissions begin early, and signed builds with submission evidence satisfy acceptance.
### Potential Side Effects
Address correlation: a connected application learns the address the user authorizes. Kestrel limits this by giving each application its own fresh address, so applications cannot link a user's sessions to each other.
Misleading payment requests: a malicious application may request a payment the user did not intend. Kestrel shows the requesting app, recipient, amount, fee, and memo, and nothing is sent without explicit approval.
Wallet fingerprinting: applications may learn which wallet a user runs, as with any WalletConnect wallet.
Relay dependency: WalletConnect sessions depend on the WalletConnect relay. Normal wallet use (send, receive, shield, migrate) does not, and keeps working if the relay is unavailable.
### Success Metrics
Grant deliverables (required):
- Kestrel completes the shared-spec connect and payment flow with the reference dApp on mainnet, on iOS and Android
- Each connected application receives a different address
- The reusable module is on npm, documented, and passing tests in CI
- Spec extension proposals are public and submitted to the spec maintainers
- The integration guide and lessons-learned report are public
- The security review and remediation status are public
- App Store, Google Play, and WalletGuide submissions are completed
Ecosystem metrics (tracked, not promised):
We will report other wallet teams evaluating or adopting the module, dApps connecting to Kestrel, which of our spec proposals are adopted, Kestrel installs, and crash-free sessions.
### Startup Funding (USD)
$3,000
### Startup Funding Justification
The startup amount lets the SDK upgrade, infrastructure setup, and security-review scoping begin immediately. Dates assume a December 1, 2026 start; if approval comes later, each milestone date shifts while the twelve-week schedule stays the same.
| Item | Amount |
| -- | -- |
| Engineering: upgrade the ZecWallet prototype to Zcash mobile SDK 4.x, rename it to Kestrel, set up repositories | $1,500 |
| Infrastructure: light-client endpoints, CI, test environment, Reown project setup | $700 |
| Security review: reviewer scoping and engagement | $800 |
| Total | $3,000 |
The $3,000 is part of the $20,000 total. The remaining $17,000 is tied to the three milestones ($5,500 + $5,500 + $6,000).
### Milestone Details
```milestones.yaml
- Milestone: 1
Amount (USD): 5500
Expected Completion Date: 2026-12-29
User Stories:
- "As a Zcash user, I want to create or restore a self-custodial wallet on my iPhone or Android phone, so that I can hold and spend shielded ZEC without trusting a third party."
- "As a Zcash user, I want to scan a WalletConnect QR code or tap a connection link and see which app is connecting and what it is asking for, so that I only connect to apps I trust."
- "As a dApp developer, I want my app built for the shared Zcash WalletConnect spec to pair with a mobile wallet, so that I can reach Zcash users on their phones."
Deliverables:
- Kestrel repository (MIT) with reproducible build instructions and CONTRIBUTING.md
- Kestrel on Zcash mobile SDK 4.x for iOS and Android, with NU6.3 support
- Wallet creation, restoration, sync, Unified Addresses, shielded send and receive, transaction history
- Seed storage in iOS Keychain and Android Keystore; PIN, optional biometrics, automatic locking
- Reown WalletKit integration: QR and deep link pairing, session proposal review, approve, reject, persistence across restarts, disconnection
- Testnet builds for iOS and Android
Acceptance Criteria: A reviewer can build Kestrel from the repository, create and restore a testnet wallet, receive and send shielded ZEC, and pair Kestrel with a test dApp by QR code and by deep link on iOS and Android. The session screen shows the app's name, domain, and requested methods. Approve and reject both work, and an approved session survives an app restart and can be disconnected from either side.
- Milestone: 2
Amount (USD): 5500
Expected Completion Date: 2027-01-26
User Stories:
- "As a Zcash user, I want each connected app to see only an address created for that app, so that different apps cannot link my activity together."
- "As a Zcash user, I want to review the recipient, amount, fee, and memo of every payment request before anything is sent, so that an app cannot move my funds without my approval."
- "As a mobile wallet developer, I want a reusable open-source WalletConnect module for Zcash, so that I can add WalletConnect to my wallet without building it from scratch."
- "As a Zcash user with Orchard funds, I want a guided Orchard to Ironwood migration, so that my funds move to the new pool with the privacy trade-offs explained."
Deliverables:
- Shared-spec v1 methods in Kestrel: zcash_requestAccounts, zcash_getAccounts, zcash_sendTransaction, and the zcash_accountsChanged and zcash_chainChanged events
- A fresh Orchard-only Unified Address for each connected application, used as its CAIP-10 account
- Payment review screen with on-device build, sign, and broadcast, returning the txid or a structured rejection to the app
- Reusable React Native WalletConnect module (MIT), published to npm with documentation and tests
- Open-source reference dApp built with standard Reown AppKit against the shared spec
- ZIP-318 Orchard to Ironwood migration flow in Kestrel
- Spec proposals for per-application addresses and the CAIP-10 account format, shared with Noir Wallet
- WalletGuide listing submitted for Kestrel
Acceptance Criteria: On testnet, the reference dApp connects to Kestrel, receives an address created for it, and sends a payment request that the user reviews and approves; the dApp receives the txid. A second app receives a different address. If Noir's reference application is public, the same flow is shown working with it. The module installs from npm and its tests pass in CI. A testnet wallet holding Orchard funds completes the ZIP-318 migration flow.
- Milestone: 3
Amount (USD): 6000
Expected Completion Date: 2027-02-23
User Stories:
- "As a Zcash user, I want to install Kestrel from the App Store or Google Play, so that I can use it without building it myself."
- "As the Zcash community, I want an independent security review with published findings, so that I can judge whether Kestrel is safe to use with real funds."
- "As the next wallet team adding WalletConnect, I want an integration guide and an honest account of what was hard, so that my integration takes less time."
- "As a maintainer of the shared Zcash WalletConnect spec, I want concrete proposals for the open privacy questions, so that every wallet can settle them the same way."
Deliverables:
- Independent security review of session handling, permission enforcement, address handling, payment approval, and key storage, with findings and remediation status published
- Mainnet release builds for iOS and Android; App Store and Google Play submissions
- Mobile wallet integration guide
- Lessons-learned report
- Spec proposals for zcash_getBalance and zcash_getTransaction consent, and a zcash_signMessage candidate scheme, submitted to the shared spec
- Draft zcash namespace registry entry prepared with Noir Wallet
- Mainnet demonstration video and final ZCG report
Acceptance Criteria: The security review is complete, and every critical finding within our control is fixed or documented as a release blocker. Release builds are public and store submissions are evidenced (store approval is outside our control). The guide, report, and spec proposals are public, and the proposals are submitted to the spec maintainers. A recorded mainnet demo shows the reference dApp connecting to Kestrel, receiving an address created for it, and completing a payment request the user approves.
```
### Supporting Documents
```files.yaml
- ZecAuth (ZecHub Hackathon 3.0): https://github.com/ZecHub/zechub/tree/main/Hackathon/2026/ZecAuth
Our wallet-to-application authorization protocol, including the ZecWallet React Native prototype that Kestrel is built from
- Z3 Launcher (ZecHub Hackathon 3.0): https://github.com/ZecHub/zechub/tree/main/Hackathon/2026/Z3Launcher
Deployment and management system for Zebra, Zaino, and Zallet, built by Abdulazeez Jubril Kolawole
- Zcash WalletConnect Integration, grant #391: https://github.com/ZcashCommunityGrants/zcashcommunitygrants/issues/391
The approved grant whose published spec Kestrel implements
- Previous application, #421: https://github.com/ZcashCommunityGrants/zcashcommunitygrants/issues/421
Declined September 28, 2026; this application acts on that feedback
```