Privacy, control, and safety
Spark gives the Lightspark-only SSP interface cross-wallet privacy bypasses
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. 1234
What the evidence shows
Technical and product details
- Documented behavior
The current Operator repository defines a build-tagged
SparkSspInternalServiceas a “Lightspark-only SSP coordination surface.” Its IP-restricted methods include cross-wallet node, transfer, static-address, tree-snapshot, and node-detail queries. 1Supporting material shown on this page
Lightspark-only SSP interfacePinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 6 pbssp "github.com/lightsparkdev/spark/proto/spark_ssp_internal" 7) 8 9// SparkSspInternalService is the Lightspark-only SSP coordination surface. 10// Every method is IP-protected; subsets either accept anonymous callers (legacy "ops" RPCs) or require a session token 11// (newer flows that go through the same sspcore client used by external partners). 12func init() { - Documented behavior
Transfer and node-query handlers skip ordinary wallet- privacy checks when invoked with the SSP flag. A pinned Spark commit says the static-address endpoint likewise passes
isSSP=trueso the SSP can keep reading addresses across wallets after the public privacy filter is enabled. 234Supporting material shown on this page
SSP transfer privacy bypassPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 2208 hasReadAccess, err := NewWalletSettingHandler(h.config).HasReadAccessToWallet(ctx, *walletIdentityPubkey) 2209 if err != nil { 2210 return nil, fmt.Errorf("failed to check if viewer has read access to wallet %s: %w", walletIdentityPubkey, err) 2211 } 2212 if !hasReadAccess { 2213 return &pb.QueryTransfersResponse{ 2214 Offset: -1,SSP node-query privacy bypassPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 74 return nil, errors.InvalidArgumentMalformedKey(fmt.Errorf("failed to parse owner identity public key: %w", err)) 75 } 76 if !isSSP { 77 hasReadAccess, err := NewWalletSettingHandler(h.config).HasReadAccessToWallet(ctx, ownerIdentityPubKey) 78 if err != nil { 79 return nil, fmt.Errorf("failed to check if privacy is enabled for owner: %w", err) 80 }static-address bypass commitCode commit · github.com · checked 2026-07-14
Interpretation
Why this matters for Spark's trust model
Spark privacy mode is not provider-blind. The Lightspark-only SSP interface has explicit, purpose-built routes around the privacy filters applied to ordinary public callers. 1234
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
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.
Lightspark-only SSP interface
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
SSP transfer privacy bypass
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
SSP node-query privacy bypass
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
static-address bypass commit
Code commit · github.com · Pinned or archival · checked 2026-07-14
How sources, absence findings, and limitations were evaluated