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 topicPlain-English editorial summary
Spark wallets present themselves as non-custodial, trust-minimized, and privacy-oriented. They promote themselves as easier alternatives to fully self-custodial Lightning, Liquid, and Ark wallets. They use the premise of “unilateral exit” to justify the tradeoffs of this centralized service. However, as this research demonstrates, the “unilateral exit” is in effect a farce—and the tradeoffs are indeed very severe. We conclude that, for all intents and purposes, Spark is indistinguishable from a traditional custodial wallet arrangement.
The protocol contains a technically real exit path, but using it requires current recovery state, external fee funds, specialized tooling, ordered package broadcasts, and extended monitoring. The four research topics separate these documented mechanics from the editorial judgment summarized here.
Editorial disclaimer: This research is presented as an unbiased and factual review of public evidence. This homepage summary and the expanded note below—and only these sections—state an opinionated conclusion about Spark. The remainder of the publication reports evidence, methodology, limitations, and bounded conclusions without editorial opinion.
The case in plain English
Spark may be “non-custodial” under a narrow technical definition: the wallet holds key material and the protocol contains a path that can eventually move coins without asking an Operator to sign again. That description leaves out nearly everything that determines whether an ordinary person actually controls their money.
A normal Spark wallet identifies itself to every Operator with the same durable wallet identity. The reviewed transfer paths give every Operator the participants and transaction records, not merely an unreadable fragment of a signature. In the reviewed Lightning flow, every Operator receives the full invoice, amount, direction, payment hash, and affected wallet identities. The default hosted service can attach that same identity to Lightning requests and exact Bitcoin withdrawal destinations.
Changing apps or rotating a deposit address does not create a new identity. Public participation can expose complete transfers, and the reviewed public interfaces can reveal exact holdings and raw Bitcoin transaction material for wallets in public mode. Spark may hide activity from casual blockchain observers, but it replaces public-chain visibility with visibility inside a small service network. That is a different privacy model—not privacy from the parties operating the system. Review the privacy evidence.
The published design names three Operators, but the ordinary software path does not behave like a neutral market of independent providers. The reviewed SDKs fix Lightspark's SO0 as the default coordinator without automatic failover, and both expose the same Lightspark hosted service by default. Integrators can change those defaults, but users of finished wallet products generally receive the configuration chosen for them.
The signing threshold is two of three. Under this review's stated threat model, Lightspark and Flashnet coordination is treated as a core assumption, so those two roles form an effective quorum without Breez. That is not proof that they have colluded or share keys. It is the security assumption users must evaluate: the advertised three-party structure offers little comfort if two closely connected roles can act together. Review the quorum analysis.
The Operator code contains a wallet-specific refusal control—a kill switch keyed to the wallet's durable identity. Relevant state-changing operations check it, including transfers, claims, cooperative exits, deposit operations, renewal, and privileged service paths. The control can preserve read access while refusing the actions needed to move money, and one reviewed provider can update it live and selectively.
The public evidence does not show that every Operator has enabled this control in production or that it has been used against a particular customer. It does show that selective censorship is a designed and tested capability, not an outside speculation. Concentration at the default coordinator and hosted Lightning service creates additional places where ordinary payments can be delayed or refused even before a network-wide block is considered. Review the censorship evidence.
The marketing version sounds simple: if Spark disappears, broadcast a pre-signed transaction and recover the bitcoin. The documented procedure is nothing like that. A mnemonic does not contain the wallet's current leaves or their transaction ancestry. The wallet must preserve a fresh, complete exit-state backup while Operators are still available and update it whenever the wallet changes. If the outage arrives first, the seed alone cannot reconstruct what needs to be broadcast.
Even with that state, the user needs separate on-chain bitcoin to pay fees, software that can build and sign parent-and-child transaction packages, a package-relay-capable Bitcoin service, exact root-to-leaf ordering, confirmation monitoring, retry and resume logic, relative-timelock calculations, and later sweep transactions to a separately verified address. The operation can span days or weeks and must survive app termination, provider failures, fee changes, stale transactions, and chain reorganizations.
Our sanitized mainnet case began with approximately 100,000 sats. Ordinary wallet use produced more than 30 leaves and a full plan exceeding 900 Bitcoin transactions. Economic triage meant deliberately abandoning part of the balance; even the selected recovery needed roughly three dozen ordered packages, separate fee funding, long waits, and final sweeps. After more than two dozen packages had confirmed, the coins still had not reached a destination. Read the complete case study.
Software could automate these steps, including software running on a phone. But none of the eleven reviewed consumer-wallet surfaces provided the complete flow. A hypothetical future recovery system is not a recovery feature available to today's user. Calling the exit “available at any time” while leaving the user to build an incident-response system is, in practical consumer terms, a farce. Review the wallet implementations.
There is a real technical distinction between holding every signing key and depending on a threshold protocol. That distinction does not settle the consumer question. Control over money means being able to access it, move it, and recover it when the normal service refuses or disappears. If the app cannot perform the independent recovery, if the seed cannot reconstruct the required state, and if spending normally depends on a small set of identifiable operators and hosted services, then the user does not possess practical, independent control.
That is why “non-custodial” may be technically defensible yet deeply doubtful in context. It describes the key arrangement while omitting the operational reality. For the ordinary mobile user—not a protocol engineer with a current recovery bundle, external fee coins, custom tooling, a reliable Bitcoin package relay, and days to supervise the process—Spark behaves like a custodial wallet: private operators can observe activity, normal use depends on centralized infrastructure, transactions can be refused, and the advertised escape hatch is not actually delivered by the product.
The bottom line: Spark moves custody risk around rather than making it disappear. Its marketing emphasizes the cryptographic possibility of eventual escape. The evidence shows that privacy, availability, censorship resistance, and usable recovery remain concentrated in systems the user does not control.
Mainnet unilateral-exit case study
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 unfinished final sweeps.
Published mainnet defaults
The roles an ordinary wallet is configured to use, according to the reviewed SDK defaults.
| Role | Entity | Reviewed default |
|---|---|---|
| Signing Operator 0 and coordinator | Lightspark | SO0 is fixed as coordinator without automatic failover |
| Signing Operator 1 | Flashnet | One member of the published two-of-three threshold |
| Signing Operator 2 | Breez | One member of the published two-of-three threshold |
| Default hosted Lightning service | Lightspark | Both reviewed SDKs expose the same hosted service by default |
Source-backed protocol review
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.
Research navigation
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
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 topicIdentity, metadata, and public visibility
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 topicRecovery requirements and wallet support
The documented operatorless-exit procedure, its state and fee prerequisites, and what eleven reviewed consumer-wallet surfaces exposed.
5 evidence groups · 25 supporting records
Open topicHosted routing, settlement order, and recovery
How the reviewed default SSP paths handle invoices, send ordering, receive validation, and conditional retained-key risk.
3 evidence groups · 4 supporting records
Open topicArgument summary
Each claim synthesizes several related evidence records where appropriate. The topic pages show the supporting facts and the boundary on the conclusion.
Principal claim · Centralization
Lightspark SO0 is the fixed default coordinator without automatic failover, and both reviewed SDKs expose the same single Lightspark SSP by default. Both choices are configurable rather than protocol-exclusive.
2 evidence records · 7 distinct sources
Review the evidence groupPrincipal claim · Centralization
TM-1 treats Lightspark and Flashnet as a likely coordinating pair. Together they form the published quorum without Breez; Blitz also gives Flashnet the exact Spark wallet identity used on the Operator network. A conflicting historical spend still additionally requires retained matching shares.
3 evidence records · 15 distinct sources
Review the evidence groupPrincipal claim · Centralization
The reviewed gate is keyed by wallet identity, preserves reads, and is enforced across several protocol operations. Each Operator controls its own value, and production activation is not public.
4 evidence records · 17 distinct sources
Review the evidence groupPrincipal claim · Privacy
Reviewed paths replicate participant pseudonyms, transfer records, and full Lightning invoices to Operators while threshold cryptography divides the relevant secret shares.
3 evidence records · 18 distinct sources
Review the evidence groupPrincipal claim · Privacy
The same seed preserves the Operator pseudonym across compatible wallets; SSP, public-participant, cloud-sync, and diagnostic paths add deterministic joins or additional copies. Joinability does not by itself prove actual aggregation or misuse.
8 evidence records · 32 distinct sources
Review the evidence groupPrincipal claim · The exit
The documented path needs complete leaf and ancestor material acquired before an all-Operator outage, and that backup must track relevant wallet mutations.
5 evidence records · 12 distinct sources
Review the evidence groupPrincipal claim · The exit
It requires package construction, external fee funding, ordered submission, persisted progress, timelock handling, and final sweeps—not merely one emergency broadcast.
5 evidence records · 11 distinct sources
Review the evidence groupPrincipal claim · The exit
A seed preserves signing authority, but the reviewed mobile products do not give an ordinary user the state, fee funding, package relay, monitoring, and sweep workflow needed when all Operators refuse or disappear. In that failure case their availability is operationally custodial.
9 evidence records · 50 distinct sources
Review the evidence groupPrincipal claim · Lightning swaps
The send path locks selected leaves before requesting payment; the receive path validates the inbound transfer before preimage-share release. The reviewed checks and recovery branches bound the service risk.
2 evidence records · 4 distinct sources
Review the evidence groupPrincipal claim · Lightning swaps
The protocol contains deletion controls, but users cannot independently attest to server-side deletion. The public record does not show that those controls failed or that historical shares were retained.
1 evidence record · 5 distinct sources
Review the evidence groupComplete evidence index
Use this index to inspect individual claims and sources. The topic pages provide the more persuasive grouped reading order.
Showing all records
Operators, hosted services, and refusal controls
How the published Operator set, coordinator, hosted SSP, wallet gate, and adjacent compliance systems shape default-path control. Open the topic overview.
Centralization
The reviewed Spark and Breez SDK snapshots each configure three Operators with a 2-of-3 threshold but select Lightspark SO0 by fixed identifier or index. No automatic coordinator rotation or failover was found in either snapshot; integrators can supply custom configurations. [3 sources]
Centralization
Spark permits multiple SSPs and Lightspark announced that Breez would operate one. The reviewed current Spark and Breez default configurations nevertheless identify the same single Lightspark SSP URL and identity. [4 sources]
Centralization
The published mainnet SDK inherits a two-of-three Operator threshold. Because the user side combines with any two Operator shares, one honest or nonparticipating Operator cannot by itself prevent two matching retained shares from satisfying the Operator quorum. [4 sources]
Centralization
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]
Centralization
Blitz initializes an auto-authenticated Flashnet client around its ordinary Spark wallet, while Flashnet authentication uses that wallet's exact Spark identity. Under TM-1, Lightspark and Flashnet records are therefore directly joinable by pseudonym rather than only by timing inference. [4 sources]
Centralization
The reviewed Operator snapshot defines a per-wallet, per-Operator control named as a wallet kill switch and keyed by the wallet identity public key. Relevant state-changing handlers enforce it while read-only calls remain available; a network-wide freeze requires configuring every Operator. [2 sources]
Centralization
When the wallet gate fires, the affected client receives the same PermissionDenied response and message used for a session-identity mismatch. Tests enforce that external indistinguishability; internal logs, metrics, and error codes retain the actual reason. [3 sources]
Centralization
The receiver-side task applies the wallet gate before completing pending transfers, expressly including SSP-funded incoming transfers. The source covers a freeze set after transfer creation but before task pickup. This establishes code behavior, not a known production compliance block. [1 source]
Centralization
Spark's reviewed V2 preimage-share consensus path applies the wallet gate to the affected user even when an SSP, LNURL provider, or another hosted actor makes the call. The source says each Operator checks the identity during the Prepare phase. [1 source]
Centralization
Public Spark code applies the wallet gate to cooperative exits, ordinary and static deposit-address operations, deposit-tree creation, leaf renewal, transfer claims, and privileged token broadcasting. Privileged broadcaster authorization expressly does not bypass the target wallet's gate. [8 sources]
Centralization
When Spark's Kubernetes knob provider is enabled, Operators watch a ConfigMap for live changes. An integration test freezes one wallet while preserving reads, leaves a second wallet unaffected, and restores the first wallet when the value is cleared; public evidence does not establish production activation. [3 sources]
Centralization
Grid's common account schema permits the EMBEDDED_WALLET type and FROZEN status to appear together. EMBEDDED_WALLET is Spark-backed; FROZEN is defined as unable to send or receive and may follow compliance or fraud signals. The record is a schema capability, not an observed freeze. [4 sources]
Centralization
The pinned Operator policy defines a Lightspark-only SSP coordination surface. Nineteen operational methods use an anonymous application policy behind an internal IP restriction; newer SSP flows additionally require a session. This identifies a privileged network security boundary, not public access or misuse. [1 source]
Centralization
Lightspark describes Grid Global Accounts as running on Spark wallets. In the same product presentation, it says Lightspark handles identity verification, sanctions screening, risk review, and corridor compliance for the regulated movement layer. [1 source]
Centralization
Lightspark's published Grid agreement template assigns Lightspark responsibility for end-user KYC, KYB, AML, and sanctions screening. It also assigns Lightspark control over its onboarding, verification, transaction-execution, suspension, and termination decisions. [1 source]
Centralization
Lightspark's published Grid agreement template permits it to refuse, delay, reverse, or freeze a Grid transaction because of law, suspected illegal activity, sanctions-screening results, or other identified risk. This is direct Grid evidence; it does not establish the enforcement path for ordinary non-Grid Spark users. [2 sources]
Centralization
Lightspark's sanctions explainer describes sender and receiver address checks when a transaction begins and immediate blocking when a match occurs. Its Grid description says compliance checks are integrated into transactions, including Bitcoin reward payments. [2 sources]
Centralization
Lightspark's official Connect SDK exposes screenNode for sanctions screening of a Lightning node using a configured provider token. The same SDK names Chainalysis, and archived official documentation describes screening a recipient node public key. This does not establish mandatory screening or Spark SSP use. [3 sources]
Centralization
Spark identifies Flashnet as one of its three Operators. Flashnet's published service terms exclude sanctioned users and state that its compliance policies may result in transaction rejection, service restriction, or fund freezing within Flashnet's application services. [2 sources]
Identity, metadata, and public visibility
What Operators, the default SSP, public interfaces, and counterparties can learn from the reviewed transfer and payment paths. Open the topic overview.
Privacy
Spark's reviewed V3 transfer paths distribute participant identities and transfer records to every configured Operator. Operators outside a signing subset still persist the transfer rows, so threshold signing does not make transfer metadata Operator-blind. [4 sources]
Privacy
A normal wallet authenticates the same durable identity to every Operator and queries each for that identity's leaves. Operator code can associate that pseudonym with connection metadata; structured request logging, when enabled, can also record request bodies and client details. [8 sources]
Privacy
Spark distributes the complete Lightning invoice, payment hash, amount, fee, direction, and wallet identities to every Operator while dividing only the cryptographic shares. Each Operator stores the original invoice beside the affected Spark identity. [6 sources]
Privacy
Spark defines an IP-restricted, Lightspark-only SSP interface for cross-wallet node, transfer, static-address, and tree queries. Reviewed handlers and a pinned commit explicitly bypass ordinary wallet-privacy checks for SSP calls. [4 sources]
Privacy
Spark grants public transfer access when any sender or receiver is readable, and its test suite preserves full participant detail in that case. Because outgoing Lightning leaves go to one fixed, publicly indexed SSP identity, this is a concrete privacy limitation rather than a hypothetical two-wallet edge case. [6 sources]
Privacy
The default wallet authenticates Lightspark's SSP with the same identity signer used at the Operator layer. The SSP model attaches that identity to request history containing full Lightning invoices and exact cooperative-exit Bitcoin destinations, creating a deterministic join key. [9 sources]
Privacy
Spark describes static-address rotation as useful for privacy, but the implementation archives the old address and creates its replacement under the same immutable owner identity. That linkage is retained and distributed across the Operator set. [4 sources]
Privacy
Breez derives the Spark identity deterministically from the seed, network, and account. Restoring a compatible wallet with the same inputs preserves the Operator-side pseudonym, so changing apps or deposit addresses is not a privacy reset. [1 source]
Privacy
Breez real-time sync encrypts record values but uses deterministic SHA-256 identifiers for four metadata record types. A party that already knows the underlying payment ID can test for its record, while exit state is excluded and requires a separate backup. [3 sources]
Privacy
Spark expressly excludes tokens from privacy mode, permits anonymous token queries with no wallet filter, and paginates the complete token-transaction table. Returned records expose owner public keys, exact amounts, outputs, status, and timestamps. [6 sources]
Privacy
For a publicly readable wallet, Spark's unauthenticated client can calculate its exact available balance and enumerate leaves. Returned records include ownership keys, tree relationships, exact values, timestamps, and multiple raw Bitcoin transaction fields. [4 sources]
Privacy
Breez emits complete Payment debug objects at INFO. Blink forwards SDK INFO and WARN lines to Crashlytics logging, while Cake appends SDK logs to a plaintext file, creating diagnostic copies with different retention and access paths. [3 sources]
Recovery requirements and wallet support
The documented operatorless-exit procedure, its state and fee prerequisites, and what eleven reviewed consumer-wallet surfaces exposed. Open the topic overview.
The exit
Blink's published case study states that a seed cannot rediscover current leaves after Operators are offline. Its documented procedure requires complete, current, validated leaf and ancestor state, represented by a recovery bundle saved while Operators are reachable; with that state, the seed still supplies signing authority. [2 sources]
The exit
Breez 0.23 now durably stores the exit tree and supports state export, correcting the earlier default-persistence gap. Reviewed wallets pinned to 0.22 or earlier do not inherit that capability until they upgrade, collect and protect the state, and integrate a recovery workflow. [4 sources]
The exit
Spark exit state can change when leaves are created, transferred, split, renewed, claimed, or spent. Blink's proposed mobile design therefore refreshes its recovery state after balance-changing events; a mnemonic backup made once cannot encode later tree mutations. [1 source]
The exit
Blink's first documented mainnet recovery bundle omitted a legacy root required for offline construction. The tool initially failed without Operator access and was changed to fetch missing roots explicitly and reject open chains before producing a corrected bundle. [2 sources]
The exit
Breez 0.19.0's exit walker omitted the SplitLocked state used by renewed leaves and could leave out a required parent. Breez 0.23 includes SplitLocked and a regression test, so this is a historical affected-version finding rather than a current-SDK defect. [3 sources]
The exit
Spark's current CLI begins with live leaf discovery and requests external fee UTXO data. In normal mainnet mode it emits transactions and unsigned CPFP PSBTs with manual ordering instructions, but lacks a complete durable broadcast, resume, timelock-monitoring, and sweep workflow. [1 source]
The exit
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]
The exit
Blink's published 100,000-sat wallet contained 22 leaves and 253 root-to-leaf package steps. When all packages were first submitted together, 252 were rejected because the transaction graph could not enter the mempool in that form. [1 source]
The exit
Blink's documented workflow advances packages confirmation by confirmation, pauses for CSV refund timelocks, and later requires separate sweeps. Under the documented standard-mempool relay path, automation can resume and parallelize independent leaf chains, but it cannot remove within-chain confirmation ordering or the CSV timelock. [3 sources]
The exit
The documented independent exit requires external on-chain fee funding before the Spark value becomes spendable on chain. A third party could sponsor the UTXO, but doing so replaces the user's funding requirement with a service dependency. [4 sources]
The exit
Blink’s exit mechanics separate the amount eventually swept from the Spark wallet, leaf value excluded by economic triage, and independent on-chain bitcoin spent on CPFP and funding transactions. A destination amount is therefore not the same measure as net economic recovery. [3 sources]
The exit
In Blink's 100,000-sat case, 18 of 22 leaves holding 9,888 sats cost more to recover than their value at 1 sat/vB. Only four leaves holding 90,112 sats were selected for the documented attempt. [1 source]
The exit
Normal Spark use can split and re-split wallet state into multiple leaves, each with an independently sequenced exit chain. The workload of an emergency exit therefore depends on the wallet’s tree history as well as its displayed balance. [3 sources]
The exit
Blink's published method evaluates each leaf against the CPFP cost of its full exit chain plus final sweep. As fee rates rise, costs rise while leaf value does not, so additional leaves can fall below the economic threshold. This is an economic limit, not a cryptographic one. [3 sources]
The exit
Breez documents that its default leaf optimization leans toward routine payment convenience over unilateral-exit value. More small leaves can mean more fee-bearing exit paths and more value abandoned as uneconomical dust, though wallets can configure the tradeoff. [1 source]
The exit
The reviewed snapshots and public interfaces for Blink, Primal, Cake, Blitz, Radar, Flash, Agicash, Layerz, Club Orange, Wallet of Satoshi, and Bringin exposed no complete in-app sequence for preserving current exit state, supplying CPFP funds, ordered broadcasting, durable resume, timelock handling, and final sweeping. Closed-source findings are limited to public claims and observed interfaces. [14 sources]
The exit
Breez 0.23 exposes mobile-facing prepare, construct, export, and import operations, correcting the earlier API gap. Its own guide says the SDK never broadcasts, leaving the wallet to provide fee funding, package relay, durable multi-day monitoring, retries, timelocks, and sweeping. [3 sources]
The exit
Cake Wallet describes unilateral exit as publishing a pre-signed transaction. In the reviewed Cake snapshot, the pinned Breez version had not shipped its public mobile exit API and no complete recovery-bundle or unilateral-exit product flow was found. [5 sources]
The exit
Club Orange's published 4.3.3 Android artifact bundled Breez Spark's lower-level unilateral-exit primitives, but its 46 exported BreezSdk method names contained no unilateral-exit or recovery operation and the targeted DEX search found no corresponding user-flow strings. [3 sources]
The exit
Blitz's separate recovery site describes recovery without third parties, but its implementation restores a Spark wallet through live services and calls cooperative withdrawal. It does not construct or broadcast unilateral-exit packages. [3 sources]
The exit
Across Primal, Radar, Wallet of Satoshi, and Bringin, public control or recovery claims were not matched in the reviewed surfaces by a demonstrated complete user-operated exit. Closed-source findings are limited to published claims, instructions, and observed interfaces rather than unseen implementation code. [18 sources]
The exit
Blink's current UI calls the account non-custodial, says only the user can access funds, and presents the seed as recovery. The same source says unilateral-exit conflicts belong to flows the app never starts, leaving outage availability operationally dependent on external services. [3 sources]
The exit
Reviewed wallets advertise full control or non-custodial recovery, but a mnemonic supplies keys—not the current exit graph, fee UTXO, package relay, multi-day recovery state machine, or sweep. Their demonstrated mobile self-custody stops short of independent outage recovery. [5 sources]
The exit
Blitz materially improves recovery by caching and exporting complete leaf and ancestor state for offline use. It still sends execution to separate developer tooling rather than funding, broadcasting, monitoring, refunding, and sweeping inside the wallet. [3 sources]
The exit
Blink's Weekly Brief said the exit used only the seed with no Operators online and that 89,668 sats reached the destination. Its linked case study requires previously saved recovery state and records the selected exits as still awaiting refund maturity and final sweeping. [4 sources]
Hosted routing, settlement order, and recovery
How the reviewed default SSP paths handle invoices, send ordering, receive validation, and conditional retained-key risk. Open the topic overview.
Lightning swaps
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]
Lightning swaps
In the pinned JavaScript SDK's regular Lightning-send path, selected leaves are prepared for the configured SSP and locked at the Operator layer before the wallet asks that SSP to pay the invoice. The ordering engages protocol recovery if the hosted request fails; it does not show loss, misconduct, or absence of recourse. [2 sources]
Lightning swaps
The pinned receive handler checks receiver identity, invoice data, refund destinations, transaction structure, duplicates, and signatures before an Operator releases its preimage share. Operators therefore enforce the inbound exchange, while the same checks protect the receiver and do not establish custodial control. [2 sources]
Lightning swaps
Spark's own research calls deletion of historical Operator shares an unverifiable operational promise. The implementation contains real ephemeral-storage and cleanup controls, but it permits brief version coexistence, best-effort deletion, and a documented legacy main-database fallback. [5 sources]