Back to Freedom.Tech Back
All Cashu TS releasesAll versions
Release Wed, Aug 12, 2026 5 min read

Cashu TS 4.8.0

Original release notes

Mostly hardening fixes, a couple of MINOR BREAKING CHANGES to note:

Experimental: SigAll (https://github.com/cashubtc/cashu-ts/pull/951):

  1. SigAllDigests reshaped: { legacy, current } { v0 }.
  2. SigAllSigningPackage.digests removed - digests are recomputed from package contents.
  3. deserializePackage(input, options?) deserializePackage(input); the validateDigest option is gone, validation is now implicit.

Stable, type-level (https://github.com/cashubtc/cashu-ts/pull/958):

  1. NUT10Option.tags required optional.
  2. RawNUT10Option.t required optional.

Both only affect TypeScript consumers who read the field, who now see | undefined Constructing gets easier, and it matches NUT-10 and NUT-18, which both call tags optional.

Stable, behavioural (https://github.com/cashubtc/cashu-ts/pull/932):

  1. New bolt11 quote-amount check that throws, at four call sites including the read paths checkMintQuoteBolt11 and

checkMintQuoteBatchBolt11. Only affects non-compliant mints that return ln invoices that do not match the quote amounts.

---

What's Changed

  • feat(wallet): prefer stale keysets in default proof selection [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/818
  • fix(wallet): widen exact-match trim bound for selection-level fee rounding [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/819
  • refactor(wallet): make RGLI exFee an integer sort key [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/821
  • feat(wallet): support u64 amounts in proof selection [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/823
  • refactor(model): return snapshots from MintInfo accessors [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/825
  • fix(model): preserve Amount instances through MintInfo snapshot [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/827
  • fix(wallet): compute NUT-08 blank count in bigint [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/829
  • fix(model): bound Amount.from to the u64 range [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/831
  • fix(model): cap Amount at the u64 range [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/833
  • feat(wallet): prefer newest keyset version in getCheapestKeyset [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/836
  • fix(wallet): return -1 from Keyset.version for unparseable ids [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/838
  • fix(wallet): classify odd-length hex keyset ids as legacy [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/840
  • test: raise Stryker mutation coverage across crypto, model and wallet [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/842
  • fix(utils): return false from isValidHex for non-string input [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/844
  • feat(utils): rename normalizeUrl to normalizeMintUrl and make it public [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/845
  • feat(wallet): add getFeesToInclude fee helper [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/847
  • fix(wallet): validate pubkey in locked mint quote responses [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/852
  • fix(wallet): bound fee convergence loop [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/855
  • fix(wallet): reject a missing pubkey in locked mint quotes [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/857
  • fix(wallet): bound keyset denomination count at ingest [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/865
  • refactor(wallet): move MAX_KEYSET_DENOMINATIONS to limits [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/867
  • fix(utils): bound splitAmount output count [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/868
  • docs(wallet): note sendOffline throws in v5 on no offline match by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/872
  • fix(wallet): compute keyset fees with integer arithmetic [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/870
  • fix(crypto): bound untrusted P2PK witness and CBOR decode input [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/876
  • fix(crypto): harden P2PK witness edge cases [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/878
  • fix(wallet): tidy diagnostic log output [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/880
  • fix(wallet): more debug log tidy-up [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/882
  • fix(auth): tidy the OIDC debug logging [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/884
  • fix: tidy response reads and number-token parsing [v4 backport] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/887
  • fix(crypto): harden HTLC witness parsing edge cases [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/898
  • fix(crypto): tighten NUT-10 secret and tag-integer parsing [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/899
  • fix: guard CBOR and keyset map lookups against prototype-chain keys [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/901
  • fix(auth): validate OIDC provider URLs use an http(s) scheme [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/902
  • fix(utils): align base64 fallback chunk size to a 3-byte boundary [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/911
  • fix(wallet): reject extraPayload keys reserved by the melt request [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/914
  • fix(crypto): count unique signers by x-only pubkey identity [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/910
  • fix(logger): escape control characters in log messages [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/912
  • fix(utils): cap JSON nesting depth in JSONInt.parse [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/913
  • perf(wallet): look up keyset unit by map instead of scanning ids [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/915
  • fix(wallet): reject duplicate proofs before selection by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/918
  • fix(crypto): bound the deterministic counter to the safe integer range [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/921
  • fix(wallet): slim the seed error context [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/922
  • feat(wallet): claim manual counter ranges with optional CounterSource.reserveAt (v4) by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/924
  • fix(auth): stop following redirects on token-bearing requests [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/933
  • fix(auth): drop a CAT refresh that completes after the session changes [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/934
  • fix(auth): coerce the device-flow polling interval to a finite value [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/936
  • fix(ws): ignore socket events from a replaced connection [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/937
  • fix(wallet): check bolt11 quote amounts against the invoice [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/932
  • fix(mintinfo): bound mint-advertised method and endpoint lists [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/935
  • fix(crypto): bound pow2height in createNewMintKeys at runtime [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/940
  • feat(token): add getTokenMetadata proofAmounts and deprecate incompleteProofs by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/942
  • fix(auth): detach the OIDC token listener when the provider is replaced [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/943
  • chore: dual-license under MIT OR Apache-2.0 (v4) by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/944
  • fix(p2bk): share one ephemeral key across a blinded SIG_ALL batch [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/948
  • refactor(sigall): recompute signing digests from package contents [backport v4-dev] by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/951
  • fix(hooks): run both pre-push checks and fail on either by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/957
  • fix(types): make nut08Change expressible and NUT-10 tags optional by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/958
  • test: type check the test tree and fix fixture drift by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/959
  • fix(mint): derive a missing bolt11 quote state from the accounting fields by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/961
  • chore(v4-dev): release 4.8.0 by @robwoodgate in https://github.com/cashubtc/cashu-ts/pull/820

Full Changelog: https://github.com/cashubtc/cashu-ts/compare/v4.7.2...v4.8.0

Thanks to Project Loupe for suggesting some of the hardening fixes in this release