Terms and Conditions
- I agree to the Grant Agreement terms if funded
- I agree to Provide KYC information if funded above $50,000 USD
- I agree to disclose conflicts of interest
- I understand that this grant program is only eligible for completed work, as it is a retroactive grant program. Applications for planned or partially completed work will not be considered. All completed work will be verified and accepted by its intended users or their representatives, who will confirm that the outputs meet the required quality, functionality, and usability before the work is listed as an option for Coinholder voting.
- 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
librustzcashstyle guides as a primary reference. - 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, branch, pull request, and commit guidelines as exemplified in the librustzcash repository.
- I understand all grants are valued in USD but will be disbursed in Shielded ZEC. I acknowledge and accept that disbursement amounts may fluctuate based on the ZEC/USD exchange rate at the time of payment.
Application Owners (@octocat, @octocat1)
@ahdzib-maya
Organization or Individual Name
Maya Protocol
Additional Team Members
- Name: Zlyzol (GitLab @zlyzol, GitHub @zlyzol)
Role: Maya Protocol developer
Background: Author of the two upstream Zcash contributions in this application (librustzcash#1786, Zebra#10224); maintainer of Maya's ZEC signing and reorg-recovery code
Responsibilities: Upstream librustzcash and Zebra work; ZIP 317 fee calculation (mayanode !704); ZEC signing, expiry and reorg-recovery hardening (mayanode !856, !717, !712); UTXO solvency and amount handling (mayanode !724, !772, !698)
- Name: Bitol (GitLab @Bitol)
Role: Maya Protocol developer
Background: Developer of Maya's Bifrost ZEC client
Responsibilities: NU6.2 library stack (mayanode !796); Ironwood inbound observation and shielded fee sign (mayanode !829); upgrade-transition outbound rescheduling (mayanode !818); ZEC signing-height seed at the v1.135.0 activation (mayanode !877); hotfix port and ZEC client cleanup (mayanode !790, !809)
- Name: Kukulkan (GitLab @kukulkan04)
Role: Maya Protocol developer
Background: MAYANode contributor since 2022 (Bifrost, chain clients and daemons)
Responsibilities: NU6.3 Ironwood support (mayanode !816); shielded memo scan retry (mayanode v1.135.0)
How did you learn about the Lockbox: Coinholder Retroactive Grants Program?
We received a grant in the Q1 2026 round (issue #19).
Requested Grant Amount (USD)
$50,000
Category
Integration
Project Summary
Maya Protocol runs live cross-chain swaps with transparent and shielded ZEC. This application covers completed work since our Q1 2026 grant: two upstream contributions to librustzcash and Zebra, NU6.2 and NU6.3 (Ironwood) support on Maya mainnet, the move from zcashd to stock Zebra, and hardening of ZEC threshold signing, reorg recovery and shielded scanning.
Project Description
Our Q1 2026 grant (issue #19) funded shielded ZEC support on Maya, with work completed through February 2026. Since then we kept Maya current with every Zcash network upgrade and put back into upstream the tooling we needed.
This application covers only completed work that is live on Maya mainnet or merged upstream:
- Upstream public goods. Two pull requests by our team, reviewed and merged by the librustzcash and Zebra maintainers. They were not claimed in issue #19.
- Network upgrade support. Maya mainnet followed NU6.2 and NU6.3 (Ironwood) on schedule, so ZEC swaps kept working through both upgrades.
- Zebra migration. With our Zebra pull request merged upstream, Maya moved its nodes to stock Zebra v4.3.1 and retired its own Zebra fork.
- Fee and upgrade-transition fixes needed to run ZEC reliably on mainnet.
- Signing and recovery hardening. ZEC on Maya is signed by validators using threshold signatures (TSS), so every validator has to build the same transaction from its own view of the ZEC chain. Validators now sign from a shared historical height with fixed parameters, recover expired transactions instead of retrying them forever, walk back to the common ancestor after a reorg, and broadcast only transactions they have persisted. Shielded memo scans retry without losing deposits, and deposits whose sender UTXO is bare multisig are rejected so they cannot be credited to the wrong sender.
Work from the independent security audit of our Zcash integration, which was funded separately, is excluded from this application.
Technical Approach (how you did it)
Maya's Zcash support has three parts: a Rust library built on librustzcash (shielded and transparent transaction building, exposed to Go through an FFI layer), the Bifrost ZEC client that observes and signs ZEC transactions with Maya's threshold signing (TSS), and Zebra as the full node.
Upstream:
- librustzcash#1786 adds OP_RETURN outputs and external signature support to the transparent builder. This lets a threshold-signing system like Maya's build a ZEC transaction, sign it outside the library and apply the signatures, using the standard builder.
- Zebra#10224 adds mempool standardness checks matching zcashd (scriptSig size, push-only, standard script types, bare multisig and dust rejection) and a configurable OP_RETURN policy. Together these let Zebra replace zcashd for applications that use OP_RETURN memos.
Maya mainnet:
- NU6.2: moved the ZEC client to the NU6.2 library stack, including the Orchard circuit soundness fix (mayanode v1.131.0).
- NU6.3 Ironwood: zcash_protocol 0.10.0, ZIP 2006 unified address normalization, height-aware consensus branch id selection, rejection of Orchard-only unified addresses where unsupported, Zebra regtest bump (v1.131.0). A follow-up observes Ironwood inbound transactions and corrects the shielded fee sign (v1.132.2).
- Zebra v4.3.1: replaced the Maya Zebra fork with the official release once our upstream change shipped (v1.129.3), plus updated ZEC TypeScript client bindings (v1.129.0).
- ZIP 317: corrected max-gas and fee calculation for ZEC outbounds (v1.131.0).
- Network upgrade transition: a store migration that reschedules ZEC outbounds left stale by the hard-fork chain split, so no user funds were stuck (v1.131.0).
- Signing, expiry and reorg recovery (mayanode !856, v1.135.0): signing attempts are pinned to a shared historical ZEC height and keep their original parameters across retries, so validators build identical signing candidates. Definitive expiry is an explicit terminal outcome followed by recovery, and lifecycle coverage extends to Maya's transparent and shielded transactions.
- Reorg recovery, input selection and broadcast safety (mayanode !717, v1.133.0): Bifrost walks back to the common ancestor within the configured reorg window, keeps confirmed, pending and unknown status distinct so transient RPC failures are not treated as reorg evidence, narrows input-selection differences between validators, and requires a signed transaction to be persisted before it is broadcast.
- Shielded memo scan retry (v1.135.0): a shielded memo scan that hits its trial-decryption limit retries the same height, and completed trials are persisted so each retry spends its budget on new transactions. Deposits are not skipped and per-block work stays bounded.
- Sender validation (v1.135.0, BTC/DASH/ZEC; ZEC share claimed): a sender UTXO must be single-sig. A bare multisig sender UTXO is rejected, because an RPC node may report it as several addresses and the deposit could be attributed to the wrong one.
- Signing-height seed at activation (mayanode !877, v1.135.0): the v1.135.0 store migration seeds the ZEC signing height correctly on a cache-wrapped store, so an outbound scheduled right after activation is not signed against a stale height.
- Zebra duplicate broadcasts (mayanode !712, v1.128.0): Zebra's "already in mempool" and "committed to the best chain" responses are accepted as non-fatal, which stopped a retry loop after the move from zcashd.
- UTXO solvency and amount handling (mayanode !724, !772, v1.131.0; !698, v1.135.0; ZEC share claimed): simplified UTXO selection for the ZEC signer, native-amount checks on ZEC outputs, and one solvency reporter for all chains including ZEC.
- Maintenance (mayanode !790, !809; ZEC portion claimed): mainnet hotfixes ported back to the development branch, and an unused ZEC mempool wrapper removed.
Time Period of Work Completion
May 2025 to October 2026 (upstream PRs May 2025 to January 2026, not claimed in issue #19; Maya mainnet work February 2026 to October 2026)
Total Budget (USD)
$50,000
Budget Breakdown
- Compensation:
- $(USD): 50,000
- Justification: engineering time for the line items below, at the same rate basis as our Q1 2026 grant.
- Upstream librustzcash#1786: $9,000
- Upstream Zebra#10224: $5,000
- NU6.3 Ironwood support: $9,000
- NU6.2 library stack: $4,000
- Zebra v4.3.1 migration: $2,500
- Ironwood inbound observation and fee sign: $2,000
- ZEC TypeScript bindings: $1,500
- ZIP 317 fee calculation: $2,000
- Upgrade-transition outbound rescheduling: $2,000
- ZEC signing, expiry and reorg-recovery stabilization: $5,600
- Reorg recovery, input selection and broadcast safety: $2,800
- Shielded memo scan retry: $1,400
- Reliability fixes (signing-height seed, Zebra duplicate broadcasts, UTXO amount handling, bare-multisig sender check, hotfix port; ZEC share): $2,100
- Unified solvency reporting, ZEC share: $1,100
- Technology/Software:
- $(USD): 0
- Justification: N/A
- Infrastructure/Hosting:
- $(USD): 0
- Justification: N/A (node infrastructure is not claimed)
- Services/Contractors:
- $(USD): 0
- Justification: N/A
- Other:
- $(USD): 0
- Justification: N/A
- Total $(USD): 50,000
Previous Funding
Yes
Previous Funding Details
Q1 2026 round, issue #19 (https://github.com/Financial-Privacy-Foundation/ZcashCoinholderGrantsProgram/issues/19): $45,000, approved and disbursed, for shielded ZEC support on Maya (work through February 2026). This application covers work after that grant's cutoff, plus two upstream pull requests that were not included in it.
Other Funding Sources
Yes
Other Funding Sources Details
An independent security audit of Maya's Zcash integration was funded separately through Zcash Community Grants. All audit remediation work is excluded from this application.
Success Metrics
- Two upstream contributions merged after review by the librustzcash and Zebra maintainers; Zebra#10224 lets any project using OP_RETURN memos run stock Zebra instead of zcashd.
- Maya retired its Zebra fork and runs official Zebra releases.
- Maya mainnet stayed compatible through NU6.2 and NU6.3 Ironwood, and ZEC swaps continued across both upgrades.
- Validators build identical ZEC signing candidates from a shared historical height, and expired transactions are recovered instead of retried indefinitely.
- After a reorg, Bifrost recovers to the common ancestor, and no transaction is broadcast before it is persisted.
- Shielded deposits are no longer skipped when a scan hits its trial-decryption limit.
- ZEC swap volume on Maya, 6 February 2026 to 19 October 2026: about $265M across 831,000 swaps (about 555,000 ZEC), over 199 days of active ZEC trading. Days when Maya or ZEC trading was halted are left out. About $112M (154,000 swaps) moved native ZEC in or out; the remainder are swaps through Maya trade accounts. Source: Maya Midgard
/v2/history/swaps?pool=ZEC.ZEC.
Proof of completion
- Repository/Commit:
- librustzcash#1786 - OP_RETURN and external signature support in the transparent builder (merged 2025-08-14)
- Zebra#10224 - mempool standardness checks and configurable OP_RETURN policy (merged 2026-01-31)
- mayanode !816 - NU6.3 Ironwood support (merged 2026-07-29, v1.131.0)
- mayanode !829 - Ironwood inbound observation and shielded fee sign (merged 2026-08-10, v1.132.2)
- mayanode !796 - NU6.2 library stack (merged 2026-06-09, v1.131.0)
- mayanode !766 - Zebra v4.3.1, Maya fork retired (merged 2026-04-20, v1.129.3)
- mayanode !651 - ZEC TypeScript bindings (merged 2026-03-17, v1.129.0)
- mayanode !704 - ZIP 317 max-gas and fee (merged 2026-07-16, v1.131.0)
- mayanode !818 - reschedule ZEC outbounds after the upgrade chain split (merged 2026-07-20, v1.131.0)
- mayanode !856 - ZEC signing, expiry and reorg recovery (merged 2026-10-07, v1.135.0)
- mayanode !717 - reorg recovery, input selection and broadcast safety (merged 2026-09-18, v1.133.0)
- mayanode cf971443 - v1.135.0 release fixes, including the shielded memo scan retry and the bare-multisig sender check (2026-10-19, v1.135.0)
- mayanode !877 - ZEC signing-height seed on a cache-wrapped store (merged 2026-10-16, v1.135.0)
- mayanode !712 - accept Zebra duplicate and committed broadcast responses (merged 2026-02-13, v1.128.0)
- mayanode !724 and !772 - UTXO solvency and amount handling (merged 2026-07-14 and 07-16, v1.131.0)
- mayanode !698 - unified solvency reporting (merged 2026-10-05, v1.135.0)
- mayanode !790 and !809 - hotfix port and ZEC client cleanup (merged 2026-05-27 and 07-07, v1.129.5 and v1.131.0)
- Deployment/Release:
- mayanode releases - v1.128.0, v1.129.0, v1.129.3, v1.129.5, v1.131.0, v1.132.2, v1.133.0, v1.135.0; Maya mainnet runs v1.135.0
- Other Evidence:
Conflict of Interest Disclosure
None.
Community Forum Posting
- I understand it is my responsibility to post a link to this issue on the Zcash Community Forums after this application has been submitted so the community can give input. I understand this is required in order for the community to discuss and vote on this grant application. Note: If you are unable to post on the forum (for example, due to new user restrictions), please leave a comment below, and we will adjust your posting permissions.