Review of Spark's trust model

Unilateral-exit readiness

Spark's current mainnet CLI is a package generator, not a complete recovery workflow

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

1 sourceEvidence reviewed through July 14, 2026

What the evidence shows

Technical and product details

  1. Documented behavior

    The unilateralexit command begins with live wallet.getLeaves(), constructs a coordinator client, and asks the user for raw external UTXO information. 1

    Supporting material shown on this page

    Spark CLI unilateralexit implementationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    3842                walletInternals.config.getCoordinatorAddress(),
    3843              );
    3844
    3845            const feeBumpChains = await constructUnilateralExitFeeBumpPackages(
    3846              hexStrings, // Use all selected leaves
    3847              utxos,
    3848              { satPerVbyte: feeRate },
  2. Technical details

    In normal/mainnet mode it prints raw transactions and unsigned CPFP PSBTs, tells the user to sign them, and instructs manual root-to-leaf parent/child submission. 1

    Supporting material shown on this page

    Spark CLI unilateralexit implementationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    3842                walletInternals.config.getCoordinatorAddress(),
    3843              );
    3844
    3845            const feeBumpChains = await constructUnilateralExitFeeBumpPackages(
    3846              hexStrings, // Use all selected leaves
    3847              utxos,
    3848              { satPerVbyte: feeRate },
  3. Missing operations

    The command contains no complete mainnet broadcaster, durable resume engine, real-time timelock monitor, or final sweep workflow. 1

    Supporting material shown on this page

    Spark CLI unilateralexit implementationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    3842                walletInternals.config.getCoordinatorAddress(),
    3843              );
    3844
    3845            const feeBumpChains = await constructUnilateralExitFeeBumpPackages(
    3846              hexStrings, // Use all selected leaves
    3847              utxos,
    3848              { satPerVbyte: feeRate },
  4. Product consequence

    Even the reference command leaves the safety-critical multi-day execution to an expert using external Bitcoin tooling. 1

    Supporting material shown on this page

    Spark CLI unilateralexit implementationPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    3842                walletInternals.config.getCoordinatorAddress(),
    3843              );
    3844
    3845            const feeBumpChains = await constructUnilateralExitFeeBumpPackages(
    3846              hexStrings, // Use all selected leaves
    3847              utxos,
    3848              { satPerVbyte: feeRate },

Scope control

What this does not establish

  • This describes the cited Spark CLI command, not every possible exit tool. Separate software can automate broadcasting, persistence, timelock monitoring, and sweeping once complete state and fee funds exist. 1

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

Spark CLI unilateralexit implementation

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

Open original source

How sources, absence findings, and limitations were evaluated