v13.2.5 Highlights:
- Embedded LND v0.21.8-beta
- LDK Node v0.7.1-zeus-rl-0.2.8
- CDK v0.18.3
- New themes: Gilded and Ember
- Further security hardening measures
- Miscellaneous bug fixes
- Miscellaneous UI improvements
Special thanks
We're grateful to have received code and security scans from the following teams and individuals:
- Anthropic
- Opensats' Red Team
- MrHodl
- Renato Garda
Thank you for helping us fortify ZEUS.
What's Changed
- chore(deps): bump qs from 6.16.0 to 6.17.0 by @dependabot[bot] in #5485
- Cashu: send CDK ULong fields to JS as numbers on Android by @kaloudis in #5458
- views: Tools: Keychain Cleanup: show Android wording on Android by @TheSeydiCharyyev in #5442
- deps: bump zod to 4.6.7 and body-parser to 2.4.0 by @kaloudis in #5491
- stores: CashuStore: reset the Nostr backup timestamp per wallet by @kaloudis in #5191
- LDK Node: write the node log at INFO instead of DEBUG by @kaloudis in #5494
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5493
- stores: LSPStore: ignore custom messages without a request id by @kaloudis in #5186
- utils: Bolt11Utils: default expiry to 3600 s when absent by @kaloudis in #5394
- tests: add LocaleUtils tests by @aswin-dev-debug in #5452
- models: Channel: cap the LDK confirmation count at the required depth by @TheSeydiCharyyev in #5440
- Invoice: use the exact msat amount of LND invoices (fixes unpayable sub-sat invoices) by @kaloudis in #5500
- WalletHeader: keep the full header before the session starts (fixes rc1 crash after unlock) by @kaloudis in #5514
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5517
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5519
- Block on-device wallet imports and validate node dirs before delete by @kaloudis in #4891
- lndmobile: refuse fractional sats in on-chain requests by @kaloudis in #5129
- LinkingUtils: skip the iOS launch URL after an in-app restart by @kaloudis in #5133
- stores: CashuStore: only mark tokens the wallet sent as spent by @kaloudis in #5181
- Themes: add Gilded and Ember by @kaloudis in #5520
- views: Cashu: ReceiveEcash: fix the Create Lightning address route by @TheSeydiCharyyev in #5522
- views: Channels: show 'Waiting for peer' for an LDK channel at the required depth by @TheSeydiCharyyev in #5516
- utils: LocaleUtils: replace placeholders literally by @peremunoz in #5498
- Themes: Ember: use #FFA900 for bitcoin, bolt and chain icons by @kaloudis in #5546
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5547
- Screen: stop theme switches from remounting the app by @kaloudis in #5549
- Themes: Gilded, Ember: fill QR codes with the highlight color by @kaloudis in #5550
- locales: use single locale string for LnurlPay comment label by @aswin-dev-debug in #5273
- views: hardcode stealth decoy names to prevent localization mismatch by @aswin-dev-debug in #5406
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5553
- views: Swaps: Refund: don't show the refund private key by @kaloudis in #5198
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5558
- models: CashuToken: add getDate by @kaloudis in #5212
- views: SwapDetails: don't log the swap when it has no ID by @kaloudis in #5155
- locales: use a dedicated string for the Neutrino peers restart hint by @aswin-dev-debug in #5557
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5561
- components: PaymentInFlightNotice: hide on unfocused screens by @kaloudis in #5544
- LndMobile, lnc-rn: tag stream events with a request id by @kaloudis in #5017
- stores: NostrWalletConnectStore: read the old budget before an update by @kaloudis in #5528
- backends: LND, CLNRest: key shared in-flight requests by credential by @kaloudis in #5398
- deps: bump @getalby/sdk from 8.1.1 to 9.0.0 by @ajaysehwal in #5482
- deps: pin js-lnurl's query-string to 9.5.1 by @kaloudis in #5566
- views: CashuToken: warn before contacting a cleartext mint by @kaloudis in #5375
- NWC: delete an inactive wallet's connections when it is deleted by @kaloudis in #5308
- stores: NWC: reserve a fee buffer for pay_invoice on LndHub by @kaloudis in #5338
- backends: CLNRest: send whole-number feerates by @kaloudis in #5120
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5568
- skills: document stream request ids for embedded LND and LNC by @myxmaster in #5569
- views: Cashu: CreateCashuLightningAddress: go back to Receive by @TheSeydiCharyyev in #5552
- locales: use single locale strings instead of lowercasing translated text by @aswin-dev-debug in #5486
- ModalBox: keep bottom sheets below the top inset by @kaloudis in #5488
- stores: refuse to sign the LNURL-auth key derivation phrase by @kaloudis in #5525
- utils: UrlUtils: read the http scheme from the parsed URL by @kaloudis in #5565
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5575
- stores: SwapStore: use the custom host only for its own network by @kaloudis in #5190
- Android: LndMobile: resolve stream command promises once by @kaloudis in #5467
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5578
- stores: isolate and dedupe connectivity reconnect callbacks by @kaloudis in #4952
- views: Swaps: Refund: require an address for the node's network by @kaloudis in #5206
- stores: SwapStore: bound status polls and accept only string statuses by @kaloudis in #5185
- views: keep the typed swap address when the amount keypad opens by @kaloudis in #5347
- stores: InvoicesStore: ignore decode results of superseded payment requests by @kaloudis in #5131
- patches: stop react-native-blob-util resending failed requests on Android by @kaloudis in #5469
- utils: ValidationUtils: accept only digits in isValidPort by @kaloudis in #5203
- LNURL host policy: check every redirect hop by @kaloudis in #4730
- fix(security): apply the LNURL host policy to every fetch, not just pay by @kaloudis in #4714
- tests: LnurlPay: use mockFetchLnurlUrl in the invoice decode tests by @kaloudis in #5603
- feat(recovery): report legacy copies that differ from the live value by @kunalKumar-13 in #5297
- fix: bind ZEUS Pay Cashu redeem to the configured mint by @kaloudis in #4364
- utils: ValidationUtils: check paths in linear time by @TheSeydiCharyyev in #5596
- fix: ZEUS Pay automatic accept for an address created on another install by @shubhamkmr04 in #5606
- stores: CashuStore: test that the mint list leaves out unlisted CDK mints by @kaloudis in #5331
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5581
- components: OnchainFeeInput: treat a failed mempool fee fetch as an error by @aswin-dev-debug in #5602
- stores: InvoicesStore: report address generation failures instead of hanging by @kaloudis in #5018
- views: LightningAddress: CashuPayment: show only a string mint_url by @TheSeydiCharyyev in #5543
- fix(nwc): publish NIP-47 payment notifications by @ajaysehwal in #4347
- NFC: read tag records by type and past the first; open ecash tokens in Receive by @kaloudis in #5554
- stores: FeeStore: test getOnchainFeesviaMempool failure paths by @aswin-dev-debug in #5609
- React Native 0.88.1 and iOS UIScene lifecycle by @kaloudis in #4902
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5624
- NFC: stop reading CDF records by @kaloudis in #5629
- deps: bump JS-only and lint packages from the #5623 group by @kaloudis in #5635
- utils: LocaleUtils: single-pass regex substitution by @peremunoz in #5626
- Channels: don't offer a second open when a timed out open may have gone through by @kaloudis in #4963
- deps: bump native packages from the #5623 group with no Zeus-facing change by @kaloudis in #5655
- deps: bump react-navigation to 7.21 from the #5623 group by @kaloudis in #5657
- deps: bump nostr-tools to 2.25.5 and bc-ur-registry to 0.8.1 by @kaloudis in #5659
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5662
- deps: bump gesture-handler, screens, safe-area-context and image-picker by @kaloudis in #5663
- ci: ignore readable-stream majors and all pod-install updates by @kaloudis in #5671
- deps: bump @noble/hashes to 1.8.0 and import .js subpaths by @kaloudis in #5669
- test: pin hashing vectors for the @noble/hashes 2.x bump by @kaloudis in #5674
- deps: bump @noble/hashes to 2.4.0 by @kaloudis in #5675
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5677
- refactor: route hashing through HashingUtils and pin its outputs by @kaloudis in #5676
- tools: add a regtest device-test rig by @kaloudis in #5445
- chore(deps): bump the minor-and-patch group with 2 updates by @dependabot[bot] in #5673
- ci: stop ignoring readable-stream majors by @kaloudis in #5682
- deps: remove @types/uuid by @kaloudis in #5683
- deps: bump @react-native-vector-icons to 14.0.0 in lockstep by @kaloudis in #5687
- chore(deps): bump humanize-duration from 3.35.0 to 3.35.1 in the minor-and-patch group by @dependabot[bot] in #5684
- android: cap the size of mint HTTP responses read by CashuDevKitModule by @kaloudis in #5344
- views: Tools, Seed: treat a channel export without isSqlite as Bolt by @kaloudis in #5201
- utils: LndMobileUtils: fail when LND start retries run out by @kaloudis in #5219
- utils: only sign ZEUS Pay and Olympus auth challenges that are 128 hex chars by @kaloudis in #5350
- ci: ignore @babel/runtime majors until React Native moves to Babel 8 by @kaloudis in #5691
- deps: bump react-native-system-navigation-bar to 3.0.1 by @kaloudis in #5688
- stores: ChannelsStore: open batch channels one at a time by @kaloudis in #5642
- backends: LND, CLNRest: don't follow redirects on node requests by @kaloudis in #5529
- views: Swaps: handle a failed mempool fee fetch by @aswin-dev-debug in #5625
- stores: LightningAddressStore: check the paid list from status by @TheSeydiCharyyev in #5620
- stores: NostrWalletConnect: stop pay_invoice from paying after a wallet switch by @kaloudis in #5353
- stores: AlertStore: alert when the Mempool instance is unreachable by @aswin-dev-debug in #5707
- stores: CashuStore: clear cdkInitialized in reset by @kaloudis in #5633
- LayerBalances: alert on LNURL errors instead of dropping them by @kaloudis in #4553
- stores: TransactionsStore: don't mark errored payments complete by @kaloudis in #5630
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5714
- models: Invoice: sort unpaid NWC invoices by their creation time by @ajaysehwal in #5611
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5716
- android: make NWC Stop Service stop answering requests by @kaloudis in #5377
- fix(security): hash app-lock verifiers and stop keychain backup migration by @kaloudis in #4384
- views: Settings: Privacy: clear the mempool alert on instance change by @aswin-dev-debug in #5717
- stores: CashuStore: run melt reconcile once at a time and keep settled records by @kaloudis in #5689
- stores: NWC: ignore expired and late pay requests by @kaloudis in #5339
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5720
- chore(deps): bump the minor-and-patch group across 1 directory with 6 updates by @dependabot[bot] in #5718
- deps: bump bitcoinjs-lib to 6.1.10 by @kaloudis in #5721
- chore(deps): bump fast-xml-parser from 5.8.0 to 5.12.0 by @dependabot[bot] in #5722
- deps: lnc-rn: bump fast-xml-parser from 5.7.0 to 5.12.0 by @kaloudis in #5723
- stores: NostrWalletConnectStore: run initializeService once at a time by @kaloudis in #5638
- fix(nwc): list_transactions reconciles pending make_invoice activities by @ajaysehwal in #5610
- fix(nwc): skip replayed request events by id before handlers by @ajaysehwal in #4410
- stores: TransactionsStore: drop late results of earlier payments by @kaloudis in #5632
- stores: NostrWalletConnectStore: close relay services on reset by @kaloudis in #5639
- models: Payment: read LNbits' negative fees as positive by @kaloudis in #5702
- Embedded LND: v0.21.8-beta-zeus by @kaloudis in #5729
- LDK Node: v0.7.1-zeus-rl-0.2.8 by @kaloudis in #5724
- stores: FeeStore: guard against stale getOnchainFeesviaMempool responses by @aswin-dev-debug in #5730
- stores: NostrWalletConnectStore: drop superseded subscribes by @kaloudis in #5646
- views: Wallet: keep a restored wallet's recovery pending per wallet by @kaloudis in #5387
- stores: TransactionsStore: reset payment state behind graph sync prompt by @kaloudis in #5358
- views: Wallet: reuse a just-built node only for its own wallet by @kaloudis in #5382
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5738
- stores: ChannelsStore: drop superseded streamed open results by @kaloudis in #5658
- stores: CashuStore: record multimint parts that may still settle as in flight by @kaloudis in #5640
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5743
- cashu: recover CDK operations an app kill left unfinished by @kaloudis in #5487
- backends: filter LND activity by date by @Wajid-0ne in #4666
- views: Swaps: reset feeRateLookupDone and don't clobber a user-edited fee by @aswin-dev-debug in #5741
- views: block back navigation and repeat payment during multi-mint payment by @kaloudis in #5346
- Settings: list Gilded and Ember last in the theme picker by @kaloudis in #5752
- stores: stop the Cashu offline-token sweep when the wallet is switched by @kaloudis in #5332
- On-chain send: unknown outcome after any transport failure, not only a timeout by @kaloudis in #5472
- backends: LightningNodeConnect: only report the watched invoice paid by @kaloudis in #5229
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5753
- utils: OnchainTransactionUtils: read on-chain history forwards on SQL lnd by @kaloudis in #5679
- views: Wallet: start backups when Olympus has no backup to recover by @kaloudis in #5225
- Complete lookupPayment across capable backends and use it for the NWC pending refresh by @kaloudis in #4495
- views: SendingLightning: donate only after this screen's payment by @kaloudis in #5365
- skills: fix YAML frontmatter in SKILL.md descriptions by @kaloudis in #5756
- [Transifex] Updates for project ZEUS by @transifex-integration[bot] in #5755
- Payments: keep the node's failure message on CLN, LDK Node and NWC by @kaloudis in #5758
- App lock: keep the lock when the verifier migration fails or a downgrade wrote a new PIN by @kaloudis in #5757
- SwipeButton: size the swipe from the measured track by @kaloudis in #5761
New Contributors
- @peremunoz made their first contribution in #5498
Full Changelog: v13.2.4...v13.2.5-rc1
Verifying the Release
In order to verify the release, you'll need to have gpg or gpg2 installed on your system. Once you've obtained a copy (and hopefully verified that as well), you'll first need to import the keys that have signed this release if you haven't done so already:
gpg --keyserver hkps://keys.openpgp.org --recv-keys 96C225207F2137E278C31CF7AAC48DE8AB8DEE84
Once you have his PGP key you can verify the release (assuming manifest-v13.2.5-rc1.txt and manifest-v13.2.5-rc1.txt.sig are in the current directory) with:
gpg --verify manifest-v13.2.5-rc1.txt.sig manifest-v13.2.5-rc1.txt
You should see the following if the verification was successful:
gpg: Signature made Sat Nov 14 10:51:38 2026 EST
gpg: using RSA key 96C225207F2137E278C31CF7AAC48DE8AB8DEE84
gpg: issuer "zeusln@tutanota.com"
gpg: Good signature from "Zeus LN <zeusln@tutanota.com>"
gpg: aka "ZEUS Support <support@zeusln.com>"
gpg: aka "ZEUS Security <security@zeusln.com>"
That will verify the signature on the main manifest page which ensures integrity and authenticity of the binaries you've downloaded locally. Next, depending on your operating system you should then re-calculate the sha256 sum of the binary, and compare that with the following hashes:
cat manifest-v13.2.5-rc1.txt
One can use the shasum -a 256 <file name here> tool in order to re-compute the sha256 hash of the target binary for your operating system. The produced hash should be compared with the hashes listed above and they should match exactly.
Android fingerprint
Users verifying the release on an Android device can check against the key fingerprint below using AppVerifier. This fingerprint can also be found on our website here.
SHA1: 32:06:3C:97:96:38:0D:99:EE:4A:CB:B8:1E:2A:6F:27:FD:66:8E:C1
SHA256: 2A:F8:E2:0A:C9:44:57:67:CB:D4:4E:D8:4D:BB:FC:33:C6:C9:82:48:89:7C:4F:84:3C:42:C2:76:5C:4A:D3:BA
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3