spark.exposed

Wallet implementation review · checked 2026-09-11

Consumer-wallet unilateral-exit support

A fresh review of 12 consumer-wallet products, with merchant and beta comparisons and a broader directory of Spark-listed wallets.

Unilateral exit possible in the wallet?

A Yes means a complete in-app operatorless recovery flow. A No means none was found in the reviewed implementation. Bundle export alone is a partial capability. This does not classify recovery using separate software as impossible.

✓ Yes · × No flow found · — Unverified. Closed-source and unreviewed products receive no Yes/No verdict. The grid covers the named audits and Spark’s public directory, not every private or unlisted integration.

Wallet recovery support · checked 2026-09-11
WalletYesNo
Reviewed products and comparison implementations
AgicashApplication source reviewed×
BitBoxAppUnreleased mobile beta×
BlinkApplication source reviewed×
Blitz WalletBundle export; external execution×
BringinPublic records only · unverified
Cake WalletApplication source reviewed×
Club OrangePublished APK surface×
FinitoExperimental business software×
FlashApplication source reviewed×
Layerz WalletApplication source reviewed×
PaykyMerchant wallet×
PrimalApplication source reviewed×
RadarApplication source reviewed×
Stacker NewsApplication source reviewed×
Wallet of SatoshiPublic records only · unverified
Additional Spark directory listings · implementation not audited
BitBitSpark directory listing · implementation unverified
BitrequestSpark directory listing · implementation unverified
BreadSpark directory listing · implementation unverified
BuhoSpark directory listing · implementation unverified
Coinsnap POS WalletSpark directory listing · implementation unverified
DeblockSpark directory listing · implementation unverified
DFXSpark directory listing · implementation unverified
EntaSpark directory listing · implementation unverified
Gem WalletSpark directory listing · implementation unverified
GuapSpark directory listing · implementation unverified
LolliSpark directory listing · implementation unverified
Open WalletSpark directory listing · implementation unverified
OSMOSpark directory listing · implementation unverified
RumbleSpark directory listing · implementation unverified
satGoSpark directory listing · implementation unverified
Sound HSASpark directory listing · implementation unverified
SparksatSpark directory listing · implementation unverified
Split LoyaltySpark directory listing · implementation unverified
Tether WalletSpark directory listing · implementation unverified
TheyaSpark directory listing · implementation unverified
UGLYCASHSpark directory listing · implementation unverified
XverseSpark directory listing · implementation unverified

The additional 22 names come from Spark’s ecosystem directory. A listing does not establish that a Spark integration has shipped; these entries are outside the audit’s denominator.

Result and boundary

No complete in-app operatorless recovery workflow was found in the twelve reviewed product surfaces at the named September 11 snapshots. This combines nine source reviews, one APK surface review and two documentation reviews; the latter two do not establish absence inside the applications.

It does not establish: This is not a claim that unilateral exit is impossible, that every Spark wallet was audited, or that uninspected private code lacks recovery. Separate tools can recover with adequate current state and funding. No funded wallet runtime or outage exit was performed in this review.

12
products reviewed
0
complete in-app flows found
8
stages in reviewed checklist

What counted as a complete flow

A complete flow ends with confirmed, spendable Bitcoin under the user’s control. The listed stages apply where the selected recovery route needs them; a further sweep is optional when the refund already produces usable wallet-controlled outputs. SDK helpers can implement substantial parts of these stages. The audited question is whether the application connects them into a usable recovery workflow.

  1. preserve current leaf and ancestor state before an outage
  2. provide required fee funding for the selected recovery path
  3. construct and sign the applicable recovery transactions
  4. broadcast transactions and packages in valid dependency order
  5. persist and resume progress across restarts
  6. track confirmations and relative timelocks
  7. broadcast mature refunds
  8. confirm spendable wallet controlled bitcoin and sweep only if needed

Mnemonic backup, cooperative withdrawal, bundle export alone, lower-level SDK primitives, and protocol documentation were treated as partial capabilities—not as a complete consumer workflow.

What changed in this review

What the SDK now provides

The current SDK constructs and signs the exit including the sweep, exports/imports durable exit state, and checks confirmations and timelocks to identify ready transactions. Applications must preserve responses, supply funding, broadcast packages and schedule/resume the workflow. These SDK helpers reduce the work required; they do not establish a shipping wallet UI.

SDK source · SDK source · SDK source

How the products were reviewed

Public application code and documented product surfaces were examined alongside one published Android binary. Manual review separated ordinary payments, cooperative withdrawals, seed restoration, and partial recovery features from a complete operatorless-exit workflow.

Technical reproduction details

Counts are discovery results in the pinned extracted archives, not standalone proof that a complete flow is absent.

Exit-term pattern: unilateral[ _-]?(exit|withdraw(al)?)|recovery[ _-]?(package|bundle)|exit[ _-]?(package|bundle)|aggregate[ _-]?exit

Search located candidates for manual review. Primal’s event handler, Blitz’s exporter, ordinary deposit refunds, and BitBoxApp’s vendored SDK API were classified separately. Search counts alone are not proof of absence.

Workflow-discovery pattern: unilateral|emergency.{0,20}(exit|withdraw)|export.{0,24}(leav|recover|state)|constructUnilateral|prepare_unilateral|submitpackage|cpfp|timelock.{0,40}sweep|refund.{0,40}sweep

  • wallet backup and restore surfaces
  • Spark or Breez SDK adapters and pinned dependency versions
  • settings, recovery, receive, send, and withdrawal entry points
  • candidate matches returned by the discovery search
  • release notes and first-party recovery instructions
  • latest GitHub release metadata; separate release-source checks for Blitz 0.7.15, Cake 6.4.4, Primal Android 3.5.27 and Flash 0.7.1

For Club Orange 4.3.7, the published APK was hashed, its DEX files and arm64 Breez Spark binding were extracted, exported UniFFI metadata was enumerated, and targeted DEX and native-string searches were run.

Wallet of Satoshi is reviewed through public disclosures and recovery instructions. Bringin additionally publishes translation files, which were inspected as UI wording rather than executable application source. Neither product received a private-code or runtime binary audit.

Download the complete review data.

Method limits

Primary review set

Product-by-product findings

The headline count includes public consumer-wallet products and clearly labeled public developer-preview wallets. Closed-source conclusions remain limited to what can be verified from public material.

public android and ios source · checked 2026-09-11

Primal

Version reviewed: 36939db97213 · a8de89fead83

Dependency: Android: Breez KMP 0.23.1. iOS: PrimalShared binary package 0.3.2.

Android 3.5.27 (September 3) release source and current default branch were reviewed; dependency and Spark service/event-handler files are identical. No iOS GitHub release was listed.

Primal Android now pins Breez 0.23.1 and receives the UnilateralExitStateChanged event, which the inspected handler forwards to its SDK event stream and logs. No application call to initiate, export or execute an exit was found. The iOS wallet still exposes seed-based restore through an opaque PrimalShared 0.3.2 binary dependency; its public UI did not expose a complete operatorless flow.

What was examined

  • tracked Android and iOS application source
  • Breez Spark integration and dependency declaration
  • Primal iOS declaration of compiled PrimalShared.xcframework 0.3.2
  • seed backup and restore UI
  • wallet settings and transaction entry points

Partial capabilities found

  • seed backup and live-network wallet restore
  • ordinary Breez Spark wallet operations
  • Android SDK 0.23.1 upgrade and exit-state event handling; no matching application recovery command found

Limits

  • The result is bounded to the two pinned public repositories and does not test an unpublished build.
  • Primal iOS pins a compiled PrimalShared.xcframework 0.3.2 dependency whose internals are not present in the public application tree; the finding is therefore source-visible app and UI scope, not a full transitive-binary audit.
  • Seed restore while Spark services are available is not evidence of outage recovery.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

public mobile source · checked 2026-09-11

Cake Wallet

Version reviewed: bfae2191b046d37b427ba19dabc4399ba24ff799

Dependency: Breez Flutter 0.23.0

Cake v6.4.4 (September 4) release source and current default branch were reviewed. The Lightning adapter and SDK declaration are identical.

Cake v6.4.4 and the current source pin Breez Flutter 0.23.0. The earlier statement that this wallet still used 0.14.0 is obsolete. The reviewed Lightning adapter calls ordinary SDK payments and deposit refunds, but no current exit-state export or complete operatorless recovery workflow was found.

What was examined

  • tracked application source
  • LightningWallet adapter
  • Breez Spark Flutter 0.23.0 dependency
  • backup, restore, send, receive, and withdrawal entry points

Partial capabilities found

  • mnemonic or seed initialization
  • Spark, Lightning, and cooperative Bitcoin-address payments
  • upgraded Breez 0.23.0 dependency with SDK exit construction and state export/import capabilities

Limits

  • The public Cake article describes a protocol-level response to an attack; it does not expressly claim that the audited UI contains an exit button.
  • The result is limited to the pinned Cake tree and its pinned dependency.

Original source · github.com · Original source · github.com · Original source · blog.cakewallet.com · Original source · github.com · Original source · github.com

public mobile source · checked 2026-09-11

Blitz Wallet

Version reviewed: 8182853ef996e191a1aa01a8fd66bf9e8cf8c92d

Dependency: Spark JavaScript SDK declared ^0.8.8

Stable Android v0.7.15 (September 7) release source and current default branch were reviewed. The inspected exporter, leaf store and Spark adapter are identical. No binary runtime exit was performed.

Stable Android v0.7.15 contains the recovery-bundle exporter previously described as pre-release. It refreshes available state and can export cached leaves and ancestors when the live fetch fails. Its export excludes every leaf below 16,348 sats and records the omitted total. The recovery link opens external Blink tooling; no complete in-app broadcast-and-resume executor was found.

What was examined

  • tracked application source
  • Spark leaf and ancestor storage
  • unilateral-exit bundle export
  • recovery instructions and execution entry points

Partial capabilities found

  • incremental local leaf and ancestor caching with retryable pending state
  • best-effort online refresh before export, with cached-state fallback when the leaf fetch fails
  • spark.unilateral-exit-bundle.v1 export through the device share sheet
  • separate totals for leaves excluded below the application’s 16,348-sat threshold
  • external Blink recovery tooling and Spark documentation links

Limits

  • Export is a useful implemented prerequisite. It does not by itself execute an exit or prove the cached graph is complete and current.
  • The 16,348-sat threshold is hard-coded application policy, not a universal protocol or Bitcoin consensus minimum. Actual economics depend on path and fee rate.
  • A nonempty ancestor cache is not a per-leaf completeness proof. The exporter can fall back to old cached state when live queries fail; missing state cannot be reconstructed by a seed alone.
  • The release source was inspected; the published Android binary was not executed in an operator-outage test.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

public android and ios source · checked 2026-09-11

Radar

Version reviewed: 71df2f1e8805 · 1846c0c5cfaa

Dependency: Android and iOS: Breez 0.18.0

Both public repository heads are unchanged since the previous review. Latest listed Android GitHub release: v1.0.5 (July 9). Source heads and release labels are not treated as identical binaries.

The unchanged Android and iOS source heads expose seed backup and ordinary Spark payments. Neither source-visible interface supplied current exit-state export and an operatorless broadcast, confirmation and restart-recovery workflow.

What was examined

  • tracked Android and iOS application source
  • Breez Spark 0.18.0 dependency records
  • seed recovery UI
  • wallet send, receive, backup, and settings entry points

Partial capabilities found

  • seed backup and live-network restoration in a Spark-compatible wallet
  • ordinary Breez Spark wallet operations

Limits

  • The result is bounded to the two pinned public repositories.
  • The Radar iOS codeload archive did not contain the Breez FFI binary or Pods submodule; its result is limited to the application's source-visible integration and UI, not a full transitive-binary audit.
  • The audit does not assert that a future mobile implementation is impossible.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

public mobile source and direct release · checked 2026-09-11

Flash

Version reviewed: c0f7c9eccf5233c840e60a8b45153bb52fc4021b

Dependency: Breez React Native 0.22.3

Android and iOS v0.7.1 GitHub releases (August 31) are marked pre-release and resolve to the same commit. That release source and the newer default branch have identical Spark adapter and dependency files.

Flash has upgraded from Breez 0.13.6 to 0.22.3. Its reviewed adapter and recovery screens still provide ordinary payments, deposit refunds and mnemonic import; no current exit-state export or complete operatorless broadcast-and-resume flow was found.

What was examined

  • tracked React Native application source
  • Android/iOS v0.7.1 release metadata and release source
  • Breez Spark React Native 0.22.3 dependency
  • recovery-phrase backup and import
  • Spark send, receive, and Bitcoin-address payment entry points

Partial capabilities found

  • recovery-phrase backup and import
  • ordinary Spark, Lightning, and cooperative Bitcoin-address payments
  • user-facing statement that the BTC wallet is non-custodial

Limits

  • The result is bounded to the pinned public source and does not test a privately distributed build.
  • Recovery-phrase import while Spark services cooperate is not the operatorless recovery workflow.
  • GitHub pre-release publication does not establish availability to every Play Store or App Store user.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

public web wallet source · checked 2026-09-11

Agicash

Version reviewed: 887bdc480b554bd5f3a994002259bcce533ed703

Dependency: @agicash/breez-sdk-spark 0.23.0-1

Current public default-branch source reviewed. The repository’s listed screenshot artifact is not a wallet release, and the deployed web build was not matched to this commit.

Agicash now pins its Breez package at 0.23.0-1, replacing the older audited 0.13.5-1 dependency. The inspected account, payment and settings code contains no exit-state export or complete operatorless recovery interface. The dependency upgrade alone does not establish app integration of those capabilities.

What was examined

  • tracked web-wallet and shared wallet-SDK source
  • Agicash Breez Spark 0.23.0-1 dependency
  • Spark account, send, receive, authentication, and storage paths
  • public web-wallet source; deployment-to-commit mapping not verified

Partial capabilities found

  • mnemonic-derived Spark accounts
  • Spark send and receive
  • client-side encryption of wallet data stored through hosted services

Limits

  • This is a static review of the pinned public source plus the public web surface, not a funded runtime exit test.
  • Hosted authentication and encrypted storage behavior is described only to identify the reviewed product architecture; it is not treated as proof of custody.

Original source · github.com · Original source · github.com · Original source · agi.cash · Original source · github.com · Original source · github.com

public multiplatform source and developer preview release · checked 2026-09-11

Layerz Wallet

Version reviewed: f25a0c28050235a20cacd8ecc20b2da289e66771

Dependency: Spark JavaScript SDK 0.8.6

Latest listed GitHub release remains v1.6.0 (July 20). This review inspects the newer default-branch source; it does not claim that those commits are in the published binaries.

Layerz implements a polished flow named Spark Exit, but its own types specify that the SDK withdraw call is followed by the SSP signing and broadcasting the L1 transaction. It is a cooperative withdrawal, not the defined operatorless exit workflow.

What was examined

  • tracked mobile, browser-extension, desktop, and shared wallet source
  • v1.6.0 release metadata; source reviewed separately from binaries
  • Spark SDK 0.8.6 dependency
  • Spark Exit transfer service and confirmation UI
  • wallet backup and restore surfaces

Partial capabilities found

  • fee-quoted and resumable cooperative Spark withdrawal
  • persistent tracking of the SSP cooperative-exit request
  • ordinary Spark wallet operations across several interfaces

Limits

  • Layerz labels itself a developer preview, so it is not represented as a mature production wallet.
  • The zero canonical-term count is not the basis for classification; the manually reviewed implementation explicitly identifies an SSP cooperative-exit request.
  • A later Layerz release could add a separate unilateral executor.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

published android apk · checked 2026-09-11

Club Orange

Version reviewed: v4.3.7 · 7f407e4cded6…

Published Android APK v4.3.7 (September 3), downloaded and inspected September 11; SHA-256 and byte count match GitHub release metadata.

No unilateral-exit, exit, or recovery operation appears in the 46 exported BreezSdk method names, and the targeted DEX search found no corresponding user-flow strings. The bundled native library nevertheless contains lower-level unilateral-exit primitives.

What was examined

  • published 4.3.7 Android artifact and GitHub release metadata
  • all five DEX files
  • arm64 Breez Spark native binding
  • exported BreezSdk UniFFI method metadata
  • targeted exit-flow strings

Partial capabilities found

  • the bundled native library contains lower-level unilateral-exit primitives

Published APK result

  • 46 exported BreezSdk methods enumerated
  • 0 exported method names containing unilateral, exit, or recovery
  • 0 targeted DEX exit-flow string matches
  • Lower-level native exit code present: yes

Limits

  • Symbol and string searches cannot prove the absence of obfuscated or indirectly invoked private code.
  • Native primitives establish that the SDK contains lower-level capability; they do not establish an app-facing execution workflow.
  • The finding is limited to the named published artifact and recorded searches; it does not assess later versions.

Original source · github.com

public documentation and source availability · checked 2026-09-11

Wallet of Satoshi

Version reviewed: Public record checked 2026-09-11

Disclosure 1.23 (August 25) and recovery guidance updated August 31, checked September 11. App source and binary behavior were not audited.

The new recovery-phrase article explicitly says a conventional Bitcoin wallet will not recreate the Spark balance and directs users to compatible Spark software. The disclosure still describes permissionless exits, but the reviewed public instructions do not supply an operator-outage procedure for preserving state and executing recovery. In-app exit support remains unverified because the application code and binary were not inspected.

What was examined

  • Disclosure Document 1.23, updated August 25, 2026
  • official self-custody help index, restore instructions and August 31 recovery-phrase explanation
  • Google Play product record

Partial capabilities found

  • published description of unilateral exit as a permissionless alternative
  • seed-backup and ordinary wallet-restore guidance
  • explicit documentation that Spark recovery needs compatible key derivation and software

Limits

  • No source-code absence claim is made.
  • Private application code or a later product release may contain capabilities not documented publicly.
  • The finding is limited to the cited disclosure and publicly accessible product records; it does not assess unavailable application code.

Original source · walletofsatoshi.com · Original source · play.google.com · Original source · support.walletofsatoshi.com · Original source · support.walletofsatoshi.com · Original source · support.walletofsatoshi.com

public documentation and source availability · checked 2026-09-11

Bringin

Version reviewed: Public record checked 2026-09-11

Public documentation, store records and translation source checked September 11; iOS listing shows 2.5.1 dated September 1. No executable mobile application was inspected.

Bringin now publishes mobile UI translations, but not the executable application in its public organization. The reviewed strings describe cloud and twelve-word backups; no operational operatorless-exit procedure was found in those strings or the cited product material. Its public claim of pre-signed exits remains an unverified implementation claim.

What was examined

  • v2 launch article and public product/store records
  • all five repositories listed by the public GitHub organization
  • English recovery, backup and wallet-management strings in bringin_translations at 0f21044064c2996b48e11c2a09239e2bb6695392

Partial capabilities found

  • first-party claim that each wallet ships with pre-signed exits and can leave without Bringin cooperation

Limits

  • No source-code absence claim is made because Bringin does not publish the reviewed mobile-app source.
  • The public-record gap does not prove that a private implementation does not exist.
  • Translation files are evidence of published wording, not proof of runtime behavior or the absence of private recovery code.

Original source · bringin.app · Original source · github.com · Original source · play.google.com · Original source · apps.apple.com · Original source · github.com

public web wallet source · checked 2026-09-11

Stacker News

Version reviewed: 7f87e075ebd59423ae9e5d5a1bbde6720b56d86a

Dependency: Spark JavaScript SDK ^0.8.8

Current source documentation says Spark is available to all users. No GitHub release is listed; the running production build was not matched to the source commit.

The public source now offers Spark to all users, replacing the previously reviewed administrator-only restriction. Its wallet notice explicitly states that this wallet lacks unilateral exit. The reviewed adapter sends ordinary Lightning payments and provides no operatorless recovery executor.

What was examined

  • embedded-wallet onboarding and source-visible availability controls
  • Spark payment adapter, encrypted wallet configuration and mnemonic handling
  • in-wallet custody and unilateral-exit disclosure

Partial capabilities found

  • mnemonic-backed embedded Spark wallet and ordinary Lightning payments
  • explicit in-wallet warning that unilateral exit is absent

Limits

  • The availability statement is verified in source; no logged-in production rollout or runtime exit test was performed.
  • The application’s own custody wording is reported as its disclosure, not adopted as a legal classification.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

Corroborating comparison

Preview, restricted, and merchant surfaces

These products provide relevant evidence about implementation and disclosure, but are kept outside the primary denominator because they are merchant software, experimental projects, unreleased betas, or restricted integrations.

public merchant point-of-sale application · checked 2026-09-11

Payky

Version reviewed: ba0bbf441d0bf585472292073ead47f9e90b3d11

Payky tells users that Spark payments are self-custody and that the keys and sats remain theirs. Its on-chain withdrawal implementation nevertheless returns SparkCoopExitRequestStatus, stores a coopExitRequestId, and calls the SDK's cooperative withdraw operation.

Why it is outside the primary count: Payky is a merchant terminal rather than a general consumer wallet, so it corroborates the disclosure finding without inflating the primary consumer-wallet count.

Original source · github.com · Original source · github.com · Original source · github.com

unreleased mobile-only beta on the public master branch · checked 2026-09-11

BitBoxApp

Version reviewed: e059e57a384cd7dc695936cbc84b386615044fff

The unreleased mobile beta has upgraded to Breez Go 0.23.0, and its vendored binding exposes exit construction and export/import. No corresponding application handler or UI workflow was found. Its disclosure still says the SDK does not support unilateral exit; that SDK claim is stale, although its own app-level exit gap remains.

Why it is outside the primary count: The latest public v4.51.4 release predates the Spark mobile beta, so current master is evidence of an upcoming interface rather than a shipped-wallet result.

Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com · Original source · github.com

experimental self-hosted business-payment application · checked 2026-09-11

Finito

Version reviewed: ae5379b147993220775a7022a4408f4594cce9f3

Finito markets business payments as self-custody and implements Spark invoice send and receive, but the reviewed Spark adapter exposes no on-chain withdrawal or unilateral-exit workflow.

Why it is outside the primary count: The project identifies itself as experimental business software rather than a finished consumer wallet.

Original source · github.com · Original source · github.com

Candidates not counted as implemented consumer wallets