Skip to content

Don't panic when a same-mint melt settles without a preimage#92

Open
hash-money wants to merge 2 commits into
lightningdevkit:masterfrom
emergent-money:fix/same-mint-melt-no-preimage
Open

Don't panic when a same-mint melt settles without a preimage#92
hash-money wants to merge 2 commits into
lightningdevkit:masterfrom
emergent-money:fix/same-mint-melt-no-preimage

Conversation

@hash-money

Copy link
Copy Markdown
Contributor

Fixes #91. cdk-mintd settles same-mint payments internally (no Lightning payment → no payment_proof), so the melt-success None-preimage arm is a legitimate, reachable case — but it carries a debug_assert!(false) that panics every debug build the moment two wallets sharing a mint pay each other (full repro in #91; hits us on every trusted→trusted transfer between staging test wallets).

The success path already handles None (event hash falls back to the invoice payment_hash, which is always present for these melts), so the fix is just: stop asserting, log the expected case at info. cargo test -p orange-sdk --lib 17/17.

talgya added 2 commits July 9, 2026 10:22
Both mapping paths hid every non-Completed payment. The comment
justified hiding issued-but-unpaid inbound invoices, but the condition
also swallowed failed and in-flight *outbound* payments — a failed send
leaves no record in the wallet's transaction list at all, and a UI
built on list_transactions cannot show the user what happened.

Hide only non-completed inbound records (unpaid invoices/quotes stay
noise); outbound attempts always surface. Applies to both the
self-custodial path (should_surface_lightning_payment_without_metadata
gains the direction) and the trusted-payment fallback branch.

Observed downstream (emergent-money/graduated-wallet#328): a failed
BOLT11 send was absent from history while the UI already renders a
'failed' status for records it receives.
When a melt's bolt11 destination is a mint quote on the same mint,
cdk-mintd settles it internally — no Lightning payment occurs and the
melt result legitimately carries no payment_proof. The success path
already tolerates a missing preimage (the event hash falls back to the
invoice payment_hash), but the None arm carried a debug_assert!(false)
that panics any debug build the moment two wallets sharing a mint pay
each other.

Downgrade to an explanatory log_info; fixes lightningdevkit#91.
@benthecarman

Copy link
Copy Markdown
Collaborator

lgtm but is built on #89, can you make this on top of master

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Panic on same-mint melt: "Melt succeeded but no preimage" — internal settlement legitimately returns no preimage

2 participants