Review of Spark's trust model

Privacy, control, and safety

Lightspark's default SSP binds payment destinations to the same wallet identity used with Operators

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

9 sourcesEvidence reviewed through July 14, 2026

What the evidence shows

Technical and product details

  1. Documented behavior

    The wallet constructs its Operator services and SSP client from the same signer configuration. Both authentication flows present and sign with the wallet identity key. 123

    Supporting material shown on this page

    wallet constructs the SSP clientPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    296      this.config,
    297      this.connectionManager,
    298      this.signingService,
    299      this.logging,
    300    );
    301    this.sspClient = new SspClient(this.config, { logging: this.logging });
    302    this.swapService = new SwapService(
    Operator identity authenticationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    461              });
    462              const protectedChallenge = challengeResp.protectedChallenge;
    463              const challenge = protectedChallenge?.challenge;
    464
    465              if (!challenge) {
    466                throw new SparkAuthenticationError(
    467                  "Invalid challenge response",
    SSP identity authenticationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    686    const promise = (async (): Promise<void> => {
    687      const MAX_ATTEMPTS = 3;
    688      let lastErr: Error | undefined;
    689
    690      /* React Native can cause some outgoing requests to be paused which can result
    691         in challenges expiring, so we'll retry any authentication failures: */
    692      for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
  2. Documented behavior

    The public SSP schema connects a SparkWalletUser identity public key to paginated user-request history. Lightning-send records contain the complete BOLT11 invoice; cooperative-exit requests contain the exact Bitcoin withdrawal address and selected leaf IDs. 4567

    Supporting material shown on this page

    SSP wallet identity and request historyPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    1202  """The identity public key of the user."""
    1203  identity_public_key: PublicKey!
    1204
    1205  """The user requests."""
    1206  user_requests(first: Int = null, after: String = null, types: [SparkUserRequestType!] = null, statuses: [SparkUserRequestStatus!] = null, networks: [BitcoinNetwork!] = null): SparkWalletUserToUserRequestsConnection!
    1207}
    SSP Lightning-invoice recordPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    781  network: BitcoinNetwork!
    782
    783  """A computed version of the status of this user request."""
    784  request_status: SparkUserRequestStatus
    785
    786  """The lightning invoice user requested to pay."""
    787  encoded_invoice: String!
    SSP cooperative-exit recordPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    311  """The network the lightning send request is on."""
    312  network: BitcoinNetwork!
    313
    314  """A computed version of the status of this user request."""
    315  request_status: SparkUserRequestStatus
    SSP cooperative-exit inputPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    990input RequestCoopExitInput {
    991  leaf_external_ids: [UUID!]!
    992  withdrawal_address: String!
    993  exit_speed: ExitSpeed!
    994  withdraw_all: Boolean! = true
  3. Documented behavior

    The published mainnet default sends SSP requests to api.lightspark.com and names Lightspark SO0 as the fixed coordinator. 89

    Supporting material shown on this page

    default mainnet SSP endpointPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    11const SSP_IDENTITY_PUBLIC_KEYS = {
    12  LOCAL: "028c094a432d46a0ac95349d792c2e3730bd60c29188db716f56a99e39b95338b4",
    13  REGTEST: {
    14    PROD: "022bf283544b16c0622daecb79422007d167eca6ce9f0c98c0c49833b1f7170bfe",
    15  },
    16  MAINNET: {
    17    PROD: "023e33e2920326f64ea31058d44777442d97d7d5cbfcf54e3060bc1695e5261c93",
    default mainnet SSP and coordinatorPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    324    baseUrl: getSspUrl("REGTEST"),
    325    identityPublicKey: getSspIdentityPublicKey("REGTEST"),
    326  },
    327};
    328
    329const MAINNET_WALLET_CONFIG: Required<ConfigOptions> = {
    330  ...BASE_CONFIG,

Interpretation

Why this matters for Spark's trust model

Lightspark does not need probabilistic blockchain analysis to associate a default wallet's SSP destinations with the Spark pseudonym it presents at the Operator interface. The same deterministic join key exists on both sides. 23456789

This section states the trust-model consequence of the cited evidence. Conditional or inferred claims remain bounded by the next section.

Scope control

What this does not establish

  • This proves default-architecture joinability and the destination-bearing SSP data model. It does not prove that Lightspark joins every dataset, how long records are retained, who can access them, or that a custom deployment cannot use another SSP or coordinator. 1489

Sources and excerpts

Primary sources

The relevant details and available source-code excerpts appear alongside the claims above. This list preserves the complete original-source trail for independent verification.

1

wallet constructs the SSP client

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
2

Operator identity authentication

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
3

SSP identity authentication

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
4

SSP wallet identity and request history

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
5

SSP Lightning-invoice record

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
6

SSP cooperative-exit record

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
7

SSP cooperative-exit input

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
8

default mainnet SSP endpoint

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source
9

default mainnet SSP and coordinator

Pinned source code · github.com · Pinned or archival · checked 2026-07-14

Open original source

How sources, absence findings, and limitations were evaluated