Review of Spark's trust model

Wallet implementation review

Consumer-wallet unilateral-exit support

This dated review defines what counted as a complete in-app operatorless exit and explains what was found across eight consumer-wallet products.

Result and boundary

At the named snapshots, no complete in-app workflow satisfying all eight stages was found in the reviewed public source, published binary, or public product surfaces.

It does not establish: This audit is limited to the named public sources and published artifacts. It cannot rule out obfuscated functionality, later releases, unavailable code, or separately engineered tools.

8
products reviewed
0
complete in-app flows found
8
required workflow stages

What counted as a complete flow

  1. acquire current leaf and ancestor state
  2. select and provide cpfp fee inputs
  3. construct and sign parent child packages
  4. broadcast packages in required root to leaf order
  5. persist and resume progress across restarts
  6. wait for relative timelock maturity
  7. broadcast refunds
  8. construct sign and broadcast final sweeps

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.

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

Keyword search was used to locate candidate code. Findings were then classified against the eight-stage definition. A zero-result search is not treated as proof by itself.

Workflow-discovery pattern: (unilateral[ _-]?exit|recovery[ _-]?bundle|emergency[ _-]?exit|prepare_unilateral_exit|constructUnilateralExit|buildUnilateralExit|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

For Club Orange, 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.

For Wallet of Satoshi and Bringin, the review is limited to public documentation, source availability, release records, and disclosed product procedures. It is not a source-code absence claim.

Download the complete review data.

Method limits

Reviewed products

Product-by-product findings

public mobile source

Blink

Version reviewed: 3f3108998b1db6bf55823284e932ff6313eea496

The tracked app backup and restore paths center on the mnemonic; no complete recovery-bundle export and operatorless execution workflow was found. Blink's separate recovery repository labels mobile integration a proposed boundary.

What was examined

  • tracked application source
  • Breez Spark dependency declaration
  • cloud and credential backup
  • cloud and manual restore

Partial capabilities found

  • mnemonic backup and restore
  • ordinary Breez Spark wallet operations

Limits

  • The separate Blink command-line recovery project is not treated as an in-app mobile workflow.
  • A later Blink release could add the proposed integration.

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

public android and ios source

Primal

Version reviewed: c16997628c51 · 91787a1209bd

No source-visible recovery-bundle handling or complete operatorless package-broadcast, monitoring, refund, and sweep UI flow was found in either pinned application.

What was examined

  • tracked Android and iOS application source
  • Breez Spark integration and dependency declaration
  • Primal iOS declaration of the compiled PrimalShared.xcframework dependency
  • 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

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.2.0 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

public mobile source

Cake Wallet

Version reviewed: bff9b2fa9648b22c2fcc84062caba58861e9d24f

No recovery-bundle handling or complete unilateral-exit product flow was found at the pinned snapshot. Breez's public mobile exit API targeted for this dependency generation had not shipped.

What was examined

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

Partial capabilities found

  • mnemonic or seed initialization
  • Spark, Lightning, and cooperative Bitcoin-address payments

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 · github.com · Original source · blog.cakewallet.com

public mobile source

Blitz Wallet

Version reviewed: 173298bae4cb650fde4681ee7398d2e651bfbdae

The pre-release adds a meaningful exit-state exporter, but the app does not itself fund CPFP children, construct and broadcast the full sequence, persist confirmation progress, wait through timelocks, broadcast refunds, or sweep final outputs.

What was examined

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

Partial capabilities found

  • best-effort online refresh of eligible leaf ancestry
  • spark.unilateral-exit-bundle.v1 export through the device share sheet
  • links to external Blink and Spark recovery documentation

Limits

  • Bundle export is a real prerequisite and is not characterized as useless.
  • The audited pre-release can be extended with an in-app executor later.

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

public android and ios source

Radar

Version reviewed: 8ca3e2b147fa · 661a39cce1b9

Neither pinned app exposed current-exit-state export or the complete CPFP, ordered package, durable monitoring, timelock, refund, and sweep 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

published android apk

Club Orange

Version reviewed: v4.1.8 · 2b362ffbf251…

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.1.8 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

Wallet of Satoshi

Version reviewed: Public record checked 2026-07-13

No published consumer procedure was found for exporting current exit state and executing the complete operatorless workflow. Because the app is closed source, this is a public-verifiability and documented-product finding only.

What was examined

  • Disclosure Document 1.22 updated 2026-07-01
  • official website recovery material
  • Google Play product record
  • publicly available consumer exit instructions

Partial capabilities found

  • published description of unilateral exit as a permissionless alternative
  • seed-backup and ordinary wallet-restore guidance

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

public documentation and source availability

Bringin

Version reviewed: Public record checked 2026-07-13

Bringin's public organization did not contain the mobile application, and the reviewed launch and product material supplied no operational procedure for the eight-stage workflow. This does not test private application code.

What was examined

  • 2026-06-17 v2 launch article
  • public GitHub organization
  • mobile app-store product records
  • publicly available consumer exit instructions

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.

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