Project Summary
Implement multi-store support for the plugin and replace the RPC layer with a GraphQL backend using Zkool directly.
Project Description
Rearchitect the plugin to use the Zkool GraphQL API directly instead of the legacy RPC API, together with full multi-store support, removing the need to configure the wallet from an administrator account. This should reduce the long-term maintenance cost of the plugin given that redundant logic will be dropped.
Implement integration and cheatmode testing to allow for faster testing and development. Better support for using agentic workflows. A merchant wiki will be created to help merchants decide on what solution best fits their needs including guidance for repurposing existing Bitcoin/Monero RPC integrations to support Zcash (i.e. using zecd/zcash-wallet-rpc).
Proposed Problem
zcash-walletd is no longer actively maintained.
BTCPayServer merchants using third-party hosting are unable to use the plugin. This limits adoption.
Proposed Solution
Moving fully to the Zkool GraphQL API in the plugin instead of reimplementing the zcash-walletd RPC API using the Zkool crate will make the plugin more stable and easier to maintain going forward, dropping the legacy API.
More details at:
opened 01:40AM - 21 Aug 26 UTC
### 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)
@macintoshhelper
### Organization Name
1337bytes
### How did you learn about Zcash Community Grants
Previously received grants from ZCG.
### Requested Grant Amount (USD)
$16,800
### Category
Non-Wallet Applications
### Project Lead
```project-lead.yaml
Name: 1337bytes
Role: Lead Developer / Project Lead
Background:
1337bytes is a Software Engineer with 8 years’ professional experience working in web and app development. Extensive expertise in building full-stack apps, design systems and server management; most experienced with JavaScript and Java, familiar with the Rust ecosystem and has experience with Python. Founder of open-source organisation [Elemental Design: Elemental Design System](https://github.com/elemental-design), [Elemental Zcash: Zcash Design System](https://github.com/elemental-zcash) and [Elemental Pay: Open-source Cryptocurrency Payment Processing Apps and Utilities](https://github.com/elemental-pay).
Maintainer of the `btcpay-zcash` plugin.
Responsibilities: Development, project coordination and delivery
```
### Additional Team Members
```team-members.yaml
N/A
```
### Project Summary
Implement multi-store support for the plugin and replace the RPC layer with a GraphQL backend using Zkool directly.
### Project Description
Rearchitect the plugin to use the Zkool GraphQL API directly instead of the legacy RPC API, together with full multi-store support, removing the need to configure the wallet from an administrator account. This should reduce the long-term maintenance cost of the plugin given that redundant logic will be dropped.
Implement integration and cheatmode testing to allow for faster testing and development. Better support for using agentic workflows. A merchant wiki will be created to help merchants decide on what solution best fits their needs including guidance for repurposing existing Bitcoin/Monero RPC integrations to support Zcash (i.e. using `zecd`/`zcash-wallet-rpc`).
### Proposed Problem
`zcash-walletd` is no longer actively maintained.
BTCPayServer merchants using third-party hosting are unable to use the plugin. This limits adoption.
### Proposed Solution
Moving fully to the Zkool GraphQL API in the plugin instead of reimplementing the `zcash-walletd` RPC API using the Zkool crate will make the plugin more stable and easier to maintain going forward, dropping the legacy API.
### Solution Format
The main deliverables of this project will be:
- Updated plugin source code on GitHub: `btcpay-zcash/btcpayserver-zcash-plugin`
- Integration testing in CI
- Updated plugin with 0conf and multi-account support
- Merchant wiki on GitHub/site
### Dependencies
Upstream merge to `btcpayserver-docker`.
### Technical Approach
The BTCPayServer plugin is written in .NET. Docker Compose is used to test and deploy the application. Changes will be published to GitHub and builds to Docker Hub. Plugin build published to BTCPayServer plugin server.
### Upstream Merge Opportunities
No contributions directly to Zcash repositories/codebases.
Will fork and submit contributions to these repositories:
https://github.com/btcpay-zcash/btcpayserver-zcash-plugin
https://github.com/btcpayserver/btcpayserver-docker
### Hardware/Software Costs (USD)
$0
### Hardware/Software Justification
N/A
### Service Costs (USD)
$0
### Service Costs Justification
N/A
### Compensation Costs (USD)
$16,800
### Compensation Costs Justification
(21 hours a week) * ($100 / hr) * (4 weeks) = $8,400
8400 * 2 = 16800
($8,400) * (~2 months) = $16,800
Total: $16,800
### Total Budget (USD)
$16,800
### Previous Funding
Yes
### Previous Funding Details
0conf RPC API for BTCPay plugin: https://github.com/ZcashCommunityGrants/zcashcommunitygrants/issues/269
BTCPayServer Zcash Plugin upgrade for 2.1: https://forum.zcashcommunity.com/t/upgrade-btcpayserver-zcash-plugin-for-2-1/50800
Upgraded the BTCPay Zcash plugin for BTCPayServer 2.1 and have been maintaining it since. Merchant adoption has gone up considerably since this.
Elemental ZEC: https://forum.zcashcommunity.com/t/elemental-zec-ui-component-kit-and-payment-processor/40110
Developed Elemental Zcash, an open-source design system and component library for Zcash apps. As part of this, I created an experimental [Zingo Node.js library](https://github.com/elemental-zcash/zingo-node) – a JSON RPC interface for creating payment invoices and authenticating via Zcash memos, together with Elemental Pay, a set of open-source cryptocurrency payment processing apps and utilities.
After this grant, I contributed to Free2Z.
### Other Funding Sources
No
### Other Funding Sources Details
_No response_
### Implementation Risks
Multi-store code should be reviewed and audited for security before used in shared BTCPayServer hosts.
### Potential Side Effects
Merchant communication required re the upgrade path.
### Success Metrics
Increased merchant uptake after multi-store support.
### Startup Funding (USD)
$0
### Startup Funding Justification
N/A
### Milestone Details
```milestones.yaml
- Milestone: 1
Amount (USD): $8,400
Expected Completion Date: 2026-09-28
User Stories:
- As a merchant, I can create multiple stores with separate Zcash wallets in BTCPayServer, so that I can use one instance for multiple locations/sites
- As a customer, I can pay using ZEC in stores that use third party BTCPayServer hosts
Deliverables:
- Alpha preview released for testing of multi-store BTCPay plugin with GraphQL support
- Code on GitHub repo
- Milestone: 2
Amount (USD): $8,400
Expected Completion Date: 2026-10-28
User Stories:
- As a merchant, I would like to know the best options for accepting multiple cryptocurrencies as a business, so that I can better serve privacy minded customers
- As a BTCPay host, I would like to offer ZEC support to stores, so that they don’t have to host their own BTCPayServer instance
- As a user, I’d like to have a fast and stable experience when paying using ZEC on a BTCPayServer store.
Deliverables:
- Public stable release of multi-store BTCPay plugin with GraphQL support
- Extract Zkool GraphQL C# client into reusable library
- Cashcow CheatMode extension for testing
- CI integration testing for the BTCPay plugin with regtest
- Zcash merchant wiki – document Bitcoin/Monero compatible RPC daemons: `zecd`, `zec-wallet-rpc` and the BTCPayServer plugin
```
### Supporting Documents
```files.yaml
```
5 Likes
For context:
But moving forward, this plugin is getting messier. For context, @vaspholdings , when the plugin was originally written, there was no light wallet server (we only had zcashd). I wrote a small lightwallet server (zcash-walletd) and adapted the Monero plugin (which is single-store). Then BTCPayServer dev decided to kick out all altcoins from the main codebase into plugins. They defined an API (single & multistore). Now we have a few lightwallet options: Zkool/GraphQL, zecd (zcashd). Regardless of which one is used, there is no good reason for zcash-walletd anymore. IMO, we should leverage the multistore API and make the Zcash plugin directly multistore, 0conf and talk to either zkool or zecd. Instead, we are keeping the obsolete plugin design and trying to unravel it in an external server.
This application aims to address these concerns re the current state of the plugin by integrating the Zkool GraphQL API directly into the C# plugin and switching fully to the multi-store API.
Progress so far on GitHub: Multi-Store and GraphQL Client by macintoshhelper · Pull Request #13 · btcpay-zcash/btcpayserver-zcash-plugin · GitHub
This expands on the 0conf support from the previously funded grant. Around half the work is already completed for the GraphQL port: multi-store account creation, invoice creation, address generation, 0conf and payment confirmation are working locally. A wallet agnostic backend makes adding zecd support relatively straight forward also.
I am currently working on the integrated testing architecture.
I would not like the work on zcash-wallet-rpc to go unused/wasted and the idea of the Zcash Merchant Wiki is to document how a merchant using the Monero RPC can add drop-in support for Zcash with zcash-wallet-rpc.
Example of the wallet backend agnostic C# interface:
// `zecd`/`zcash-wallet-rpc` RPC interface (WIP)
public async Task<WalletAddress> CreateAddressAsync(long accountIndex, string label, CancellationToken cancellationToken = default)
{
var response = await _walletRpcClient.SendCommandAsync<CreateAddressRequest, CreateAddressResponse>(
"create_address",
new CreateAddressRequest
{
AccountIndex = accountIndex,
Label = label
},
cancellationToken);
return new WalletAddress
{
Address = response.Address,
AddressIndex = response.AddressIndex,
UnifiedAddress = response.Address
};
}
// GraphQL interface
public async Task<WalletAddress> CreateAddressAsync(long accountIndex, string label, CancellationToken cancellationToken = default)
{
var accountId = await ResolveGraphQlAccountIdAsync(accountIndex, cancellationToken);
return await CreateOrGetAddressAsync(accountId, cancellationToken);
}
// Different class:
ReserveAddress = s => walletBackend.CreateAddressAsync(accountIndex, $"btcpay invoice #{s}"),
LLM disclaimer:
I am making manual use of Sonnet 5 prompts to aid with certain tasks.
GitHub Copilot agent with Sonnet 5 was used for creating an initial non-working prototype of the refactor
I am responsible for every line of code merged and thoroughly check and understand all code generated by LLMs.
4 Likes
ZCG
August 31, 2026, 1:17pm
3
@1337bytes at the most recent meeting, ZCG voted to approve this proposal. Congratulations!
To keep the community informed, ZCG requests that you provide monthly updates via the forum in this thread.
Please check your forum inbox for a direct message from FPF with important next steps, including a link to the Milestone Payment Request Form and your unique validation code for submitting payment requests.
1 Like