Repository navigation
NUT-XX: Transactions - #445
Draft
robwoodgate wants to merge 3 commits into
Draft
robwoodgate wants to merge 3 commits into
robwoodgate wants to merge 3 commits into
Conversation
robwoodgate
force-pushed
the
nut-transactions
branch
from
September 15, 2026 12:59
dbb04ff to
1058a98
Compare
robwoodgate
force-pushed
the
nut-transactions
branch
from
September 15, 2026 18:36
d64f124 to
8c1b1ff
Compare
robwoodgate
force-pushed
the
nut-transactions
branch
from
September 15, 2026 19:15
8c1b1ff to
2c31b8e
Compare
69 tasks
robwoodgate
force-pushed
the
nut-transactions
branch
from
September 16, 2026 22:39
2c31b8e to
fb9544b
Compare
robwoodgate
force-pushed
the
nut-transactions
branch
from
September 17, 2026 11:35
fb9544b to
0b781fc
Compare
robwoodgate
force-pushed
the
nut-transactions
branch
2 times, most recently
from
September 21, 2026 18:36
ee33f1e to
ec53004
Compare
robwoodgate
force-pushed
the
nut-transactions
branch
2 times, most recently
from
September 25, 2026 19:13
5f737e9 to
daaf699
Compare
robwoodgate
marked this pull request as draft
September 26, 2026 09:28
robwoodgate
force-pushed
the
nut-transactions
branch
2 times, most recently
from
September 26, 2026 20:27
be636a7 to
2178ba5
Compare
robwoodgate
marked this pull request as ready for review
September 26, 2026 20:50
robwoodgate
force-pushed
the
nut-transactions
branch
2 times, most recently
from
September 28, 2026 15:50
f3b5d83 to
cd721b6
Compare
This was referenced Sep 28, 2026
robwoodgate
force-pushed
the
nut-transactions
branch
4 times, most recently
from
October 12, 2026 15:20
9107781 to
c2cf25d
Compare
robwoodgate
added a commit
to robwoodgate/cdk
that referenced
this pull request
Oct 12, 2026
Add POST /v1/transaction and GET /v1/transaction/{digest}: proofs and
paid mint quotes in; blinded messages, one melt quote and a change quote
out, per cashubtc/nuts#445.
A transaction without a melt settles in one database transaction. One
with a melt runs the existing melt saga: quote inputs are issued in the
setup transaction and reversed on rollback, and the shared finalization
path settles the record instead of signing blank change. Change is the
excess less the fee paid, capped at the reserve, so it is never
negative. A melt with blinded outputs must name a change_pubkey; if the
outputs' keyset is inactivated during the payment they are not signed
and their amount goes to the change quote.
Change quotes are mint quotes with method "change", paid at creation,
served by the existing per-method mint routes. Quote inputs may draw a
quote in parts. v3 mint quote inputs now commit the amount issued
(NUT-10) in both the mint and the wallet. The shared nutroot vectors
file is added and its transcript vectors pinned.
robwoodgate
force-pushed
the
nut-transactions
branch
5 times, most recently
from
October 13, 2026 13:47
efbfd67 to
ed6c072
Compare
Collaborator
Author
Since 8 October
|
41 tasks
robwoodgate
force-pushed
the
nut-transactions
branch
from
October 15, 2026 20:47
4f73a0b to
1111e41
Compare
robwoodgate
marked this pull request as draft
October 19, 2026 19:13
robwoodgate
force-pushed
the
nut-transactions
branch
3 times, most recently
from
October 20, 2026 18:38
1c05701 to
46fc289
Compare
robwoodgate
added a commit
to cashubtc/cashu-ts
that referenced
this pull request
Oct 20, 2026
cashubtc/nuts#445 has neither: transactions carry proofs and mint quote inputs in, blinded outputs and one melt out. The rotation lock key, derived quote ids, txout quotes and error 20010 go with them. A melt's outputs are always signed under the keyset the request named, so a PAID melt that signs none of them now throws with the restore hint. The vectors gain mint_quote_to_melt, matching the spec.
robwoodgate
added a commit
to robwoodgate/cdk
that referenced
this pull request
Oct 20, 2026
POST /v1/transaction takes proofs and paid mint quotes in, blinded outputs and one melt out, in one request (cashubtc/nuts#445). Inputs equal outputs exactly; a melt returns its unspent fee reserve in NUT-08 blank outputs and settles through its melt quote. Quote inputs commit the quote's amount_issued, may be drawn in part, and price at popcount(amount) * quote_input_fee_ppk inside NUT-02's single rounding. Outputs beside a melt need a keyset that outlives the melt quote. Responses are cached (NUT-19).
robwoodgate
added a commit
to robwoodgate/cdk
that referenced
this pull request
Oct 20, 2026
POST /v1/transaction takes proofs and paid mint quotes in, blinded outputs and one melt out, in one request (cashubtc/nuts#445). Inputs equal outputs exactly; a melt returns its unspent fee reserve in NUT-08 blank outputs and settles through its melt quote. Quote inputs commit the quote's amount_issued, may be drawn in part, and price at popcount(amount) * quote_input_fee_ppk inside NUT-02's single rounding. Outputs beside a melt need a keyset that outlives the melt quote. Responses are cached (NUT-19).
robwoodgate
added a commit
to robwoodgate/nutshell
that referenced
this pull request
Oct 20, 2026
POST /v1/transaction takes proofs and paid mint quotes in, blinded outputs and one melt out, in one request (cashubtc/nuts#445). Inputs equal outputs exactly; a melt returns its unspent fee reserve in NUT-08 blank outputs and settles through its melt quote. Quote inputs commit the quote's amount_issued, may be drawn in part, and price at popcount(amount) * quote_input_fee_ppk inside NUT-02's single rounding (MINT_QUOTE_INPUT_FEE_PPK, defaulting to the keyset input fee). Outputs beside a melt need a keyset that outlives the melt quote.
33 tasks
robwoodgate
force-pushed
the
nut-transactions
branch
2 times, most recently
from
October 25, 2026 20:23
3b49416 to
ac321e3
Compare
A single endpoint, POST /v1/transaction, carries any NUT-00 transaction: proofs and paid mint quotes in; blinded messages and a melt quote out.
Link NUT-00's transaction and signing rules instead of restating them, and drop explanations and recovery guidance that change no bytes or accept/reject.
Follows NUT-04/29: one keyset per request is no longer required, so each blank output takes change in its own keyset's amounts.
robwoodgate
force-pushed
the
nut-transactions
branch
from
October 25, 2026 20:57
ac321e3 to
f6f0bc8
Compare
41 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #443 (base
taproot-secrets), so the diff is this NUT, a NUT-00 note and one test vector.Summary
Swap, mint and melt are fixed shapes of the nutroot transaction (#443).
POST /v1/transactiontakes any mix in one atomic request: proofs and paid mint quotes in, blinded messages and a melt quote out. A wallet can pay an invoice straight from a paid mint quote, or mint and consolidate in one step.Implementations
Ticked once each matches this revision.