spark.exposed

Source-backed code review

Review of Spark's trust model

This website examines Spark’s trust model through its published code, SDK configurations, wallet implementations and documented recovery procedures. It brings together findings on operator coordination, transaction refusal, privacy, Lightning service dependencies and unilateral exit, including a wallet-support audit and a mainnet recovery case study.

Each finding links to its sources and, where available, pinned code revisions. The review distinguishes observed results, implementation details and conditional scenarios, records the limits of each claim, and retains evidence that qualifies or challenges the conclusions. Findings apply to the versions and conditions reviewed; public code alone does not establish production settings or operator conduct.

Editorial note

The case against Spark

A wallet should give its owner meaningful control when the people operating the surrounding services become uncooperative. That is the standard by which Spark should be judged. Its operators may refuse payments, impose conditions, disclose records or stop providing service. A serious assessment must examine those possibilities without relying on their goodwill. Our objection to Spark is that too much practical power remains with a small group of service providers, while the user's independent remedy depends on preparation, software and costs that ordinary wallet use does not necessarily provide.

Read the editorial note

The research

Follow the evidence.

Sources, implementation reviews and measured results, with the limits of each finding.

Mainnet unilateral-exit case study

What it took to attempt to exit approximately 100,000 sats

A sanitized real-world recovery record shows how ordinary wallet history expanded into more than 30 leaves and a full plan exceeding 900 Bitcoin transactions. The case study documents the required state, external fee funding, package ordering, economic triage, confirmation waits, and the recovery work outstanding at the original checkpoint. A September 11 update records the later recovery of the five selected leaves and the separate optimized experiment.

Read the updated practical-risk assessment.

Read case study

Published mainnet defaults

Who runs Spark

The roles an ordinary wallet is configured to use, according to the reviewed SDK defaults.

RoleEntityReviewed default
Signing Operator 0 and coordinatorLightsparkSO0 is fixed as coordinator without automatic failover
Signing Operator 1BreezOne member of the published two-of-three threshold
Signing Operator 2FlashnetOne member of the published two-of-three threshold
Default hosted Lightning serviceLightsparkBoth reviewed SDKs expose the same hosted service by default

Source-backed protocol review

Evidence and research index

This publication examines Spark's published defaults, Operator code, hosted-service paths, metadata flows, and documented exit procedure. Ten principal claims summarize the case; 61 supporting records preserve the complete evidence and limits.

10
principal claims
61
evidence records
187
source links

Research navigation

Four views of the trust model

Each topic is organized into principal evidence groups. Direct protocol behavior remains separate from conditional analysis and adjacent ecosystem context.

Operators, hosted services, and refusal controls

Centralization

How the published Operator set, coordinator, hosted SSP, wallet gate, and adjacent compliance systems shape default-path control.

5 evidence groups · 19 supporting records

Open topic

Identity, metadata, and public visibility

Privacy

What Operators, the default SSP, public interfaces, and counterparties can learn from the reviewed transfer and payment paths.

3 evidence groups · 13 supporting records

Open topic

Recovery requirements and wallet support

The exit

The documented operatorless-exit procedure, its state and fee prerequisites, and what twelve reviewed consumer-wallet surfaces exposed.

5 evidence groups · 25 supporting records

Open topic

Hosted routing, settlement order, and recovery

Lightning swaps

How the reviewed default SSP paths handle invoices, send ordering, receive validation, and conditional retained-key risk.

3 evidence groups · 4 supporting records

Open topic

Recovery assessment · 2026-09-11

An escape hatch that must be prepared before you need it

The pessimistic case is practical: a user can lose ordinary access before having the data, economical leaves, Bitcoin fee funds and recovery software needed to leave independently. A valid exit mechanism does not establish that the wallet has delivered usable recovery.

Analysis of pinned public code and one custom mainnet experiment. The optimized exit was still pending at the recorded September 11 checkpoint. These measurements are not a benchmark for every wallet or proof of a production operator outage.

  1. Code-path analysis

    One operator can block the preparation that makes exit practical

    The reviewed consensus flows require every configured operator to prepare, even though signing uses a two-of-three threshold. Optimization relies on a cooperative SSP and on claiming replacement leaves through an all-operator flow. A user already facing refusal cannot assume they can consolidate or renew their way into a better exit.

    Evidence boundary. This applies to fresh preparation in the reviewed flows, not every API version or a failure after the commit decision. Production outage behavior was not tested. A complete presigned exit needs zero operators.

    All-operator selection · Prepare failure and rollback · Claim consensus · Swap and counter-transfer claim

  2. Observed integration failure

    A successful export can still leave the exit unusable

    After the live optimization, two of ten available leaves had incomplete ancestry in the stock SDK export, including the 65,536-sat leaf. Custom parent-ID queries repaired the backup while an operator was reachable. If missing data cannot be obtained during an outage, the seed alone does not supply that transaction history.

    Evidence boundary. This is the pinned SDK result for this wallet. Other saved copies, willing data holders or confirmed ancestors may help; incomplete export does not establish permanent loss. The repaired JSON was about 459 KB, so this is not evidence that mobile storage is infeasible.

    Sanitized mainnet observations and before/after quotes · Best-effort export · Pedigree fetch

  3. Mainnet swap; subsequent planner quote

    Even successful optimization did not make the whole balance economical to exit

    The live swap reduced 38 leaves to 10 without reducing the 89,569-sat balance. At 1 sat/vB, the native profitable selection still excluded eight leaves totaling 7,649 sats, about 8.5% of the balance. The selected principal improved from 65,536 to 81,920 sats, but selection is not receipt of spendable Bitcoin.

    Evidence boundary. The excluded value is not proved lost. Different fees, ancestry or recovery methods can change the result. The selected optimized exit had not completed at the recorded checkpoint.

    Sanitized mainnet observations and before/after quotes · Economic selection

  4. Signed mainnet plan

    The user needs Bitcoin outside Spark to recover Bitcoin inside Spark

    The tested path requires an external Bitcoin fee reserve. The stock funding quote requested 5,228 sats against our 4,976-sat reserve. Custom allocation omitted optional sweep headroom and made the signed plan fit. Its planned fan-out and CPFP fees total 4,335 sats, excluding any later optional sweep. A consumer cannot assume the nominal Spark balance can pay these upfront costs.

    Evidence boundary. These are planned fees at 1 sat/vB, not all confirmed expenditure. A sponsor could supply funding but creates an additional availability dependency. Other presigned exit variants have different economics.

    Sanitized mainnet observations and before/after quotes · Funding construction and headroom

  5. Observed transaction timelocks

    Recovery can mean weeks without the selected money

    The two selected paths retain 1,200 and 3,200 blocks of relative waiting: approximately 8.3 and 22.2 days at ten minutes per block, plus earlier confirmation dependencies. Optimization reduced fragmentation but did not turn the exit into an immediately spendable withdrawal.

    Evidence boundary. Block-time estimates are not deadlines. One replacement shortened its prior 2,400-block wait to 1,200 blocks; this is favorable evidence, but the denomination optimizer does not guarantee favorable replacement history.

    Sanitized mainnet observations and before/after quotes · Optimizer requests denominations

  6. Mainnet observation and SDK failure handling

    Optimization itself temporarily ties up funds

    Available-balance samples were zero for roughly 23 seconds during the 23.7-second swap. The SDK can also defer claiming the counter-transfer after the original swap has begun. A phone losing connectivity must reconcile that pending operation before claiming the money is available or recovery preparation is complete.

    Evidence boundary. Temporary reservation is not theft or loss. An offline smaller-batch simulation preserved 65,536 sats outside the swap; it was not a live concurrent-payment test. Cancellation between rounds does not reverse an already submitted swap.

    Sanitized mainnet observations and before/after quotes · Reservations and cancellation · Deferred counter-transfer claim

  7. Implementation requirement; dated wallet review

    The application must deliver a recovery system, not just expose an SDK call

    A usable phone flow must preserve current recovery state, fund fees, broadcast dependent packages, handle timelocks and conflicting variants, and resume across suspension, restarts and days of confirmations. Our optimized plan contains 29 Bitcoin transactions. The reviewed consumer-wallet surfaces did not demonstrate this complete flow, and our custom desktop tooling does not fill that product gap.

    Evidence boundary. Mobile implementation is possible in principle. SDK primitives and durable storage are meaningful groundwork. The wallet finding is limited to the dated reviewed versions and public surfaces, not every present or future application.

    Dated consumer-wallet review · SDK leaves orchestration to the application · Sanitized mainnet observations and before/after quotes

  8. Conditional stress analysis

    The emergency scenario removes the services used to prepare the favorable result

    Our favorable optimization happened with a working SSP and operators. If refusal starts first, the user must work with existing leaves and whatever valid recovery material was already saved. Higher Bitcoin fees can make additional leaves uneconomical, and service loss may also prevent normal payments. Routine cooperative performance therefore does not measure the cost of recovery during a service failure.

    Evidence boundary. No coordinated outage or mass exit was induced. This analysis does not quantify network-wide congestion, prove permanent loss, or show that operators can veto already valid Bitcoin transactions.

    Economic leaf selection · All-operator preparation · Sanitized mainnet observations and before/after quotes

When operators refuse or go offline

One operator refuses or is offline. Fresh all-operator preparation can fail despite two remaining signing shares. The reviewed end-to-end optimization cannot be assumed available.

Two operators refuse or are offline. Fresh all-operator flows fail and only one signing share remains, below the published threshold. Another SSP does not replace missing operator shares or state.

All three refuse or are offline. A user with complete valid presigned recovery material can still exit through Bitcoin with zero operators. A user missing required data cannot assume the seed can reconstruct it.

An outage does not force an immediate exit: users can wait for restoration. Preparation failures and long waits are not proof of custody or theft. The supported criticism is dependence on advance preparation and an unproven consumer recovery experience.

Evidence that limits this criticism. A real unilateral mechanism exists. Five selected leaves from the earlier mainnet attempt were subsequently found recovered as 72,370 sats; those funds were used in the new experiment. Who broadcast the earlier path is not established, and operator unavailability was not demonstrated on mainnet. The new optimization succeeded, while its subsequent exit remained pending at the recorded checkpoint.

Potential exculpatory factors · Download assessment and sources

Complete evidence index

All 61 supporting records

Use this index to inspect individual claims and sources. The topic pages provide the grouped reading order.

Showing all records

Operators, hosted services, and refusal controls

Centralization

How the published Operator set, coordinator, hosted SSP, wallet gate, and adjacent compliance systems shape default-path control. Open the topic overview.

Centralization

Retained Lightspark and Flashnet keys could sign a conflicting spend of a Lightspark-funded Lightning leaf

In Spark's reference inbound-Lightning flow, the SSP is the former owner of the leaf. Under the published two-of-three configuration, retained matching keys from the Lightspark SSP, Lightspark Operator, and Flashnet Operator would be sufficient to sign a fresh conflicting spend; no evidence shows retention or collusion. [9 sources]

Pinned source code · Official documentation · Blog or announcementRead the analysis

Identity, metadata, and public visibility

Privacy

What Operators, the default SSP, public interfaces, and counterparties can learn from the reviewed transfer and payment paths. Open the topic overview.

Recovery requirements and wallet support

The exit

The documented operatorless-exit procedure, its state and fee prerequisites, and what twelve reviewed consumer-wallet surfaces exposed. Open the topic overview.

The exit

Spark’s FAQ reduces exit to a pre-signed broadcast; its beta manual documents a multi-stage expert procedure

Spark's FAQ says a user can exit at any time by broadcasting a pre-signed transaction. Its dedicated beta manual separately requires Bitcoin Core v29, external L1 UTXOs, economic leaf selection, exact package ordering, mainnet signing and timelock handling, and warns that the wallet is unusable until completion. [4 sources]

Official documentation · Pinned source codeRead the analysis

The exit

Cake describes a one-transaction exit, but its reviewed shipped integration did not expose an exit flow

Cake v6.4.4 and the current source now pin Breez Flutter 0.23.0, so the old SDK-version objection is obsolete. The inspected Lightning adapter still contains no exit-state export or complete operatorless recovery flow. Cake’s article describes a protocol mechanism; it does not explicitly promise an exit button. [5 sources]

Web source · Pinned source code · Reproducible audit manifestRead the analysis

The exit

Across Primal, Radar, Wallet of Satoshi, and Bringin, control claims were not matched by a demonstrated unilateral-exit path

The refreshed public review found no complete in-app recovery flow in Primal or Radar. Primal Android has upgraded its SDK and iOS its compiled shared dependency. Wallet of Satoshi’s newer guidance and Bringin’s public translations still do not supply a complete operator-outage procedure; their app internals remain unverified. [3 sources]

Reproducible audit manifest · Web source · Pinned source codeRead the analysis

The exit

Blitz preserves exit state but exports the actual recovery outside the wallet

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. [4 sources]

Pinned source code · Reproducible audit manifestRead the analysis

Hosted routing, settlement order, and recovery

Lightning swaps

How the reviewed default SSP paths handle invoices, send ordering, receive validation, and conditional retained-key risk. Open the topic overview.

Lightning swaps

The referenced server logic for Spark’s default Lightspark SSP is not publicly accessible

Spark's public repository directs local SSP work to a separate Lightspark Sparkcore path that was not publicly accessible when checked. The public repository exposes the SSP schema, clients, and flow documents, but not the referenced Python handlers or full server-side decision logic. [10 sources]

Pinned source code · Referenced non-public implementation · Blog or announcementRead the analysis