Hi all! I’ve been following the ecosystem and the LCWG side for a while, and I recall the Flutter SDK gap coming up on one of the LCWG calls, @pacu, I think it was you who flagged it; correct me if I’m misremembering. So this might be of interest.
How it started: I’m building yet another decentralised messenger - the thousand-and-first, I know - and I wanted users to be able to send ZEC to each other. So I went looking for a straightforward way to do shielded ZEC in Flutter, and there basically wasn’t one. Zodl is excellent, but it’s a wallet app built on the native SDKs - on android and iOS. If your app is Flutter, there’s nothing to embed. So I built the wallet into the messenger, then pulled it out as a standalone SDK - partly because it clearly wanted to be one, partly so nobody else has to rediscover this hole the way I did.
Background, briefly: about two decades building and shipping products across information security, blockchain analytics, and decentralised systems. Some of those years were spent on the analytics side - the business of extracting signal from transparent chains - which is a big part of why I ended up building on the one chain designed to make that hard
It’s three packages (MIT/Apache-2.0, all of it):
- zec_wallet - the core Dart SDK: a WalletHandle API over a rust engine (librustzcash - zcash_client_backend / zcash_client_sqlite), with the native library bundled inside the Dart package rather than published as separate crates. Unified addresses, shielded send/receive (Orchard + Sapling), lightwalletd sync. The headline rule: seeds and spending keys never enter Dart - Dart sees addresses, balances, statuses, and typed errors. That boundary is enforced by CI policy tests, not by good intentions.
- zec_wallet_ui - a drop-in Flutter UI: onboarding, backup, the full wallet surface, send/receive/shield/swap, 16 locales. It ships no native code of its own - platform concerns go through host seams.
- zec_wallet_ui_platform - the optional native companion: Android FLAG_SECURE, iOS privacy cover and backup exclusion. Hosts that want full control simply omit it.
Both layers come with a complete example wallet app (boot, theming, routing — the whole integration path), and the messenger consumes the identical package surface: the host maps its theme, wires a session seam, and implements zero wallet logic of its own.
Where it sits relative to existing work, since dart tooling isn’t a blank slate:
The approach is deliberately the opposite of a pure-dart protocol port. sapling-crypto and orchard are used as-is, so the consensus- and proof-critical code stays in the audited upstream rather than being reimplemented in Dart. That sidesteps the proof-generation performance problem a pure-Dart port runs into, and means nothing has to be hand-synced when the protocol moves. The cost is the honest one: a heavier native build per platform and an FFI surface to maintain. So the trade-offs line up as pure-dart (simpler, more portable) vs. native-per-platform like the official Kotlin/Swift SDKs (fast, but two codebases) vs. this -aiming for audited-upstream parity and cross-platform from a single codebase.
Status: the SDK currently lives as a self-contained package set inside the messenger’s monorepo (zero messenger dependencies, that boundary is CI-enforced too). Core and UI carry around 2,300 tests. The money paths have been proven on mainnet with real ZEC: shielded sends including ZIP-320 two-step (TEX) transactions, a force-kill mid-send that recovered to exactly one pair on-chain, an offline send queue, and detection plus recovery sweeps of funds landing on already-used ephemeral addresses - all verified on-chain. Total losses across the exercise: transaction fees, which I’m told is how it’s supposed to work. It runs on-device on Android and iOS, including StrongBox / Secure Enclave-backed key custody. I’m extracting it into a standalone repo for public release and will post the link in this thread; happy to give committee members access to the pre-release tree in the meantime.
What a grant would cover - the SDK was built to be embedded from day one, and it already has two consumers: the messenger it grew out of, and the example app that doubles as the reference integration. But both are mine, and “designed for embedding” and “picked up cold by someone who isn’t the author” are very different claims. That’s the gap:
- A clean-room reference integration: a fresh app built strictly against the published packages on a clean machine, the exact path a third-party dev takes, plus the API, docs, and packaging fixes that surfaces
- CI and publication to pub.dev, including prebuilt native binaries per platform, so a flutter developer never needs a Rust toolchain
- Docs, examples, a semver contract, and native-speaker review of the 15 non-English locales.
- External security review and remediation
- A maintenance commitment for a defined period
Before I write a full application: does this look like a fit for ZCG, and is the reference-integration-plus-security-review framing the right shape, or would you draw the scope somewhere else? The wishlist mentions shielded wallets for smartphones and network-layer privacy for light-client SDKs, which is what pointed me here
Thanks for reading