Original release notes
Nutshell 0.20.3
[!CAUTION] This release includes a database migration for the mint (and wallet). Ensure you back up your database before upgrading your Nutshell instance to avoid data loss.
Nutshell 0.20.3 adds P2BK and Spark support, plus mint UX and reliability improvements.
Notable Changes
Mint
- NUT-28 P2BK (Pay-to-Blinded-Key): lock ecash to a receiver without revealing their pubkey to the mint (silent payments / payment unlinkability).
- Spark L2 wallet backend for Lightning payments via Spark.
- Interactive HTML landing page at the mint root route (
/) showing mint info, limits, contacts, and supported NUTs. methodfield on mint/melt quote responses (spec alignment).- Management RPC:
GetKeyset/GetKeysetswith issued liabilities and fees; matchingmint-clisubcommands. - NUT-11
sig_allmessage aggregation extended to match the latest spec. - NUT-20/29 signatures aligned with the current spec (incl. test vectors).
- Async melt race fixed: durable
PENDINGis committed before the HTTP response so clients don't see a false terminalUNPAID. - Melt change cleanup: orphan blank outputs are deleted on early-return paths (fixes restore collisions).
- Batch mint
issued_timeand legacy base64url keyset ID handling fixed. - Docker Compose Redis bound to localhost only.
Wallet
- NUT-28 P2BK support for creating and receiving P2BK-locked tokens.
cashu send --timelock/-t: per-send locktime override (matchescashu lock p2pk).- Missing mint keysets are marked deleted instead of leaving stale active state.
What's Changed
- Mark Keysets as Deleted. by @KvngMikey in https://github.com/cashubtc/nutshell/pull/797
- feat(mint): add method field to quote responses. by @KvngMikey in https://github.com/cashubtc/nutshell/pull/1055
- Remove paid field in MeltQuote by @KvngMikey in https://github.com/cashubtc/nutshell/pull/1024
- feat(mint): add keyset and keysets endpoints to management RPC with issued liabilities by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1078
- fix(docker): restrict redis access to localhost in compose by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1079
- extend and refactor nut11 sig_all message aggregation by @callebtc in https://github.com/cashubtc/nutshell/pull/811
- feat(crypto): align NUT-20/29 signatures with spec and add test vectors by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1057
- feat(mint): add interactive html landing page at root route by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1077
- feat: support NUT-28 P2BK by @KvngMikey in https://github.com/cashubtc/nutshell/pull/950
- feat(mint): Add Spark L2 wallet backend by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1019
- fix(mint): delete orphan blank outputs on melt change early-return by @gorrdy in https://github.com/cashubtc/nutshell/pull/1016
- fix: await ledger.melt() call in test_melt_quote_reuse_same_outputs by @vicjuma in https://github.com/cashubtc/nutshell/pull/1080
- chore: retire legacy curve mapping by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1082
- fix: complete remaining Pydantic v1 to v2 migration by @vicjuma in https://github.com/cashubtc/nutshell/pull/1084
- fix(mint): commit PENDING before async melt response by @callebtc in https://github.com/cashubtc/nutshell/pull/1087
- fix: handle batch mint times and base64url keysets by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1091
- refactor(mint): recalculate DLEQs on restore by @a1denvalu3 in https://github.com/cashubtc/nutshell/pull/1085
- feat(cli): add --timelock/-t option to send command by @KvngMikey in https://github.com/cashubtc/nutshell/pull/1090
- chore(release): bump version to 0.20.3 by @callebtc in https://github.com/cashubtc/nutshell/pull/1093
New Contributors
- @vicjuma made their first contribution in https://github.com/cashubtc/nutshell/pull/1080
Full Changelog: https://github.com/cashubtc/nutshell/compare/0.20.2...0.20.3

