Review of Spark's trust model

Unilateral-exit readiness

Breez 0.19.0 can silently produce an unbroadcastable renewed-leaf package

Breez 0.19.0's exit status walker omitted the SplitLocked state even though Spark renewal handlers create that intermediate parent. The resulting package can omit a required unbroadcast parent; the reviewed correcting pull request remained open. 123

3 sourcesEvidence reviewed through July 14, 2026

What the evidence shows

Technical and product details

  1. Documented behavior

    The shipped EXIT_CHAIN_STATUSES list includes Available, Splitted, and OnChain, but omits SplitLocked. 1

    Supporting material shown on this page

    Breez unilateral-exit sourcePinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    32const EXIT_CHAIN_STATUSES: [TreeNodeStatus; 3] = [
    33    TreeNodeStatus::Available,
    34    TreeNodeStatus::Splitted,
    35    TreeNodeStatus::OnChain,
    36];
  2. Protocol fact

    Spark's renewal handlers create a SplitLocked intermediate parent. 3

    Supporting material shown on this page

    Spark renewal statusPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    393	}
    394
    395	splitNode, err := db.TreeNode.Create().
    396		SetTreeID(tree.ID).
    397		SetNetwork(tree.Network).
    398		SetStatus(st.TreeNodeStatusSplitLocked).
    399		SetOwnerIdentityPubkey(leaf.OwnerIdentityPubkey).
  3. Failure

    The exit walker can stop at that parent without reporting it, leaving the printed child dependent on a transaction that is neither on chain nor in the package. 123

    Supporting material shown on this page

    Breez unilateral-exit sourcePinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    32const EXIT_CHAIN_STATUSES: [TreeNodeStatus; 3] = [
    33    TreeNodeStatus::Available,
    34    TreeNodeStatus::Splitted,
    35    TreeNodeStatus::OnChain,
    36];
    fix PR 935Repository record · github.com · checked 2026-07-14
    Spark renewal statusPinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    393	}
    394
    395	splitNode, err := db.TreeNode.Create().
    396		SetTreeID(tree.ID).
    397		SetNetwork(tree.Network).
    398		SetStatus(st.TreeNodeStatusSplitLocked).
    399		SetOwnerIdentityPubkey(leaf.OwnerIdentityPubkey).
  4. Snapshot

    The fixing pull request 935 remained open after Breez 0.19.0, whose source still contained the omission. 12

    Supporting material shown on this page

    Breez unilateral-exit sourcePinned source code · github.com · checked 2026-07-14
    Relevant lines from the pinned source · open raw file
    32const EXIT_CHAIN_STATUSES: [TreeNodeStatus; 3] = [
    33    TreeNodeStatus::Available,
    34    TreeNodeStatus::Splitted,
    35    TreeNodeStatus::OnChain,
    36];
    fix PR 935Repository record · github.com · checked 2026-07-14

Scope control

What this does not establish

  • This failure concerns renewed leaves whose ancestry uses the omitted SplitLocked status in Breez 0.19.0. It is not a claim that every Spark leaf or every unilateral-exit package is unbroadcastable. 123

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

Breez unilateral-exit source

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

Open original source
3

Spark renewal status

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

Open original source

How sources, absence findings, and limitations were evaluated