Commit Graph
91 Commits
Author SHA1 Message Date
protom 9e37fee841 fix: commit send, pay and move carves at the checkpoint (#6)
The three composables commit the carve inside onCarve via the existing
commitCarve helper instead of after the flow, falling back to a URL
lookup for no-mutation carves (which fire no hook). On
failed-funds-returned with a rotation, the re-secured note is added
before the burned carved note is marked spent.
2026-08-31 14:48:03 +02:00
protom 587dd11ba8 fix(lnurlcash): commit carves before the settlement wait (#6)
A flow that carves and then waits minutes on a settlement poll used to
commit the carve only after the whole flow resolved - an abort mid-wait
left burned inputs spendable locally and stranded the fresh outputs.
ensureExactAmount now reports a mutation-bearing carve through the new
FundOperationOptions.onCarve checkpoint the moment its outcome is known;
payWithBearers and transferBetweenMints thread it through.

Because the carve may now be committed before the flows' classification
rotates run, those rotations no longer rewrite carve.note in the result -
returned funds come back as a separate verified rotatedNote, so the
committed carve and the re-secured note can both be persisted. NWC's
payChangeset adapts to the rotatedNote field; its own commit timing is
unchanged (follow-up).
2026-08-31 14:48:03 +02:00
protom 50b2427b8d fix(lnurlcash): rescue landed mutations from retry refusals
A split, merge or rotate whose answer is 'Invalid or already spent k1.'
may be the refusal of a retried request that already LANDED - believing
it strands the fresh outputs server-side and desyncs the wallet (the
input is burned at the mint but still spendable locally, so every later
operation fails). All three flows now probe a would-be output when a
refusal carries fresh secrets: live outputs are adopted (or surfaced
unverified when the probe can't tell), a genuine refusal still fails.
2026-08-31 14:03:15 +02:00
protom 48be23dceb feat(lnurlcash): probe would-be outputs before believing a mutation refusal
The redeem callback is a GET and HTTP stacks retry GETs, so a mint can
execute the first attempt and refuse the repeat as an already-spent input
(LUD-25 says SHOULD replay; real mints refuse). The kit attaches the fresh
output secrets to every refusal - probeMutationOutput tells a landed
mutation from a genuine refusal. The harness wrapper reproduces the retry
against the mock.
2026-08-31 14:03:15 +02:00
protom 4cc8e0aba2 fix: replace forgesworn with moneyer in the public mint suggestions
@mint.forgesworn.dev is shutting down; @moneyer.dev takes its place in the
curated quick-start list.
2026-08-31 13:31:36 +02:00
protom 6bb07ff9ec fix(lnurlcash): assert named claims land at the wallet's own secret
Review feedback: bind the claim answer to the secret that was polled
before building a note from it. The kit already guarantees this -
claimMintedNote returns the queried secret by construction and
fetchNoteInfo rejects a mismatched k1 echo - so the assert cannot trip
through the kit (and is therefore not separately testable); it exists so
a future kit regression fails loudly instead of tracking a wrong secret.
2026-08-31 12:54:46 +02:00
protom 637376e291 docs(lnurlcash): document the two mint output modes
Reword the rotate-after-claim invariant for named outputs and fix the
test-harness pointer (ops.testHarness.ts, not test-utils.ts).
2026-08-31 12:23:10 +02:00
protom 39a144cf50 feat(receive): accept named mints that serve no verify URL
Named mints claim through the wallet's own secret, so a missing LUD-21
verify URL no longer blocks receiving; unnamed mints still require it -
there the preimage it reveals IS the claim.
2026-08-31 12:23:10 +02:00
protom ae5064b69a feat(nwc): make_invoice against mints with wallet-named outputs
The named-mint branch claims by the wallet's secret and treats the verify
preimage as an ordinary payment receipt - but keeps the rotated guard
before handing it out, because the rescue path (a mint that credited the
preimage despite the binding) claims through claimFromPreimage, where a
failed rotate leaves that preimage a live note secret. possibleCopy is
committed exactly like the unnamed path.
2026-08-31 12:23:10 +02:00
protom c9963934aa feat(funds): keep the claimable note of a pending named transfer
An unknown-still-pending transfer to a named mint carries the note at the
wallet's own secret in its claim material - persist it unverified like the
settled-claim-failed path already does, instead of dropping it with the
result object.
2026-08-31 12:22:56 +02:00
protom 67b2122e52 feat(lnurlcash): transfer to mints with wallet-named outputs
A named target needs no verify URL: the note appearing at the wallet's own
secret is the settlement proof, and it is claimed without a rotate. The
claim material carries the secret - and the unverified note at it - from
the start, so a melt settling after the poll budget is never a lost note;
the source-note oracle classification is unchanged.
2026-08-31 12:22:56 +02:00
protom 58268b2921 feat(lnurlcash): claim mint outputs named by a wallet-chosen secret
lnurl-mint >= 0.4 refuses a mint quote without comment=sha256(secret) and
keys the note by that secret instead of the payment preimage. prepareMint
detects the capability per mint (commentAllowed >= 64 or mintToHash),
binds the quote to a wallet-drawn secret, and claimMintedNote polls the
note itself - no preimage, no rotate, since the secret never rode an
invoice. Mints that never advertised the capability get the byte-identical
old request and stay on the preimage path; a mint that took the hash but
credited the preimage is caught by the claim poll and rescued through the
quote's verify URL. The d.ts augments the conformance package's stale
published declarations for its comment-naming flags.
2026-08-31 12:22:45 +02:00
protom 9f4ae3b0f5 refactor(lnurlcash): generalize bounded polling beyond verify endpoints
pollVerifyUntilSettled keeps its exact behavior and messages, reimplemented
on a generic pollUntil so flows that watch something other than a LUD-21
verify (a named mint output appearing) share the same backoff, budget and
abort semantics.
2026-08-31 12:22:30 +02:00
protom bb147faef1 build(deps): bump lnurlcash-kit to 0.5.0 and lnurlcash-conformance to 0.4.0
The kit release line adds the LUD-25 output-naming protocol (comment/h on
the pay callback, claim polling, merge batching); the mock mint now
defaults to plain https withdraw links and serves the originally issued
invoice on verify, which the two adapted tests pinned the old shape of.
2026-08-31 12:22:21 +02:00
protom e892a330fc fix: consume owner monitor transition failures 2026-08-24 16:26:29 +02:00
protom 72f387f6e5 docs: document wallet integrity boundaries 2026-08-22 16:56:50 +02:00
protom a40079200d test: cover wallet lifecycle through the browser 2026-08-22 16:56:49 +02:00
protom 578613c869 refactor: split wallet onboarding panels 2026-08-22 16:56:49 +02:00
protom 3c2a2cc4a5 feat: await trusted mint management actions 2026-08-22 16:56:49 +02:00
protom 401a26dc6b fix: fence send and pay flows 2026-08-22 16:56:38 +02:00
protom f087ebe2f2 fix: surface receive post-commit trust failures 2026-08-22 16:56:38 +02:00
protom c59521a421 fix: commit carved wallet funds atomically 2026-08-22 16:56:38 +02:00
protom 3f6010b312 feat: restore Nostr backups through wallet lifecycle 2026-08-22 16:56:37 +02:00
protom 99e6ae1b12 fix: await wallet commits in the NWC store 2026-08-22 16:56:37 +02:00
protom 81c28ec16d feat: scope trusted mint state in Pinia 2026-08-22 16:56:25 +02:00
protom e98373491f fix: drain accepted NWC work before wallet lock 2026-08-22 16:56:25 +02:00
protom 2e0f0038f7 feat: invalidate stale wallet tabs 2026-08-22 16:56:25 +02:00
protom 3acc63e968 fix: clear runtime state after lifecycle failures 2026-08-22 16:56:25 +02:00
protom c319e11d3e feat: activate only proven wallet owners 2026-08-22 16:56:24 +02:00
protom 62b93baa05 feat: serialize wallet lifecycle transitions 2026-08-22 16:56:11 +02:00
protom 5b3a69e910 feat: apply wallet fund changes atomically 2026-08-22 16:56:11 +02:00
protom 9fa4abdaf3 feat: fence wallet mutations by lifecycle owner 2026-08-22 16:56:11 +02:00
protom 54031dc8de fix: publish activity only after persistence 2026-08-22 16:56:10 +02:00
protom e9bbb358aa fix: mirror trusted mint commits across tabs 2026-08-22 16:56:10 +02:00
protom 83c9e5b95f feat: converge trusted mints on storage events 2026-08-22 16:55:47 +02:00
protom d735aca885 feat: serialize trusted mint transactions 2026-08-22 16:55:47 +02:00
protom 82f008b33f feat: validate trusted mint registry envelopes 2026-08-22 16:55:47 +02:00
protom d890a69c40 feat: preserve trusted mint rekey transitions 2026-08-22 16:55:47 +02:00
protom 7890a492f3 refactor: export owner-aware NWC APIs 2026-08-22 16:55:47 +02:00
protom 3ed214c157 feat: drain tracked NWC handlers on stop 2026-08-22 16:55:36 +02:00
protom 513c67fc14 fix: hide invoice settlement until commit 2026-08-22 16:55:35 +02:00
protom 09b7b63c9d fix: await NWC payment bearer commits 2026-08-22 16:55:35 +02:00
protom fff24a75b2 fix: preserve conservative NWC budget debits 2026-08-22 16:55:35 +02:00
protom b52172c0cb fix: validate NWC requests before dispatch 2026-08-22 16:55:35 +02:00
protom 228a92b0f0 feat: create owner-bound NWC connections 2026-08-22 16:55:24 +02:00
protom 9f6bcad706 feat: scope NWC storage to wallet owners 2026-08-22 16:55:23 +02:00
protom 3054834cdb test: split NWC protocol harness 2026-08-22 16:55:23 +02:00
protom 845ec410e5 feat: expose fund ownership assertions 2026-08-22 16:55:23 +02:00
protom 02f901c87c fix: fence inter-mint transfer operations 2026-08-22 16:55:23 +02:00
protom c4c9d8a94a fix: fence invoice payment operations 2026-08-22 16:55:12 +02:00