Skip to content

wallet: derivehdkey RPC to get xpub at arbitrary path - #32784

Merged
achow101 merged 12 commits into
bitcoin:masterfrom
Sjors:2025/06/gethdkey
Aug 15, 2026
Merged

wallet: derivehdkey RPC to get xpub at arbitrary path#32784
achow101 merged 12 commits into
bitcoin:masterfrom
Sjors:2025/06/gethdkey

Conversation

@Sjors

@Sjors Sjors commented Jun 20, 2025

Copy link
Copy Markdown
Member

Adds a derivehdkey RPC that returns an xpub, or optionally the xprv, at an arbitrary BIP32 path (with at least one hardened step), derived from a wallet HD key.

The main use case is coordinating a multisig setup, where each participant shares an xpub derived at a hardened path (e.g. m/87h/0h/0h) distinct from their default single-signature descriptors. See the (updated) doc/multisig-tutorial.md and (updated) functional test to see how that workflow improves.

The first commits are some helpful helpers:

  • key: add DeriveExtKey() helper - performs the actual derivation
  • test: move parse_hd_keypath test to bip32_tests - from psbt_wallet_tests
  • Have ParseHDKeypath handle h derivation marker
  • util: reject out-of-range BIP32 keypath indices - ParseHDKeypath would previously map overflowing values without h to hardened.
  • fuzz: check ParseHDKeypath/WriteHDKeypath round-trip
  • rpc: ParsePathBIP32 helper
  • refactor: add hardened derivation helper - HasHardenedDerivation(), to enforce the "at least one hardened step" rule
  • wallet: generalize GetActiveHDPubKeys helper - extracts code from gethdkeys which derivehdkey needs
  • wallet: add GetExtKey helper - reconstruct an xprv from a wallet xpub (analog of GetKey()); behavior-preserving prep, also simplifies gethdkeys.

Meat and potatoes:

  • rpc: add derivehdkey - the RPC itself, plus the UnusedKey filter on GetHDPubKeys that drives key selection.
  • test: use derivehdkey in M-of-N multisig demo - rewrites the functional multisig test to use the RPC and <0;1> syntax.
  • doc: use derivehdkey in multisig tutorial - same for the prose tutorial.

@DrahtBot DrahtBot changed the title wallet: derivehdkey RPC to get xpub at arbitrary path wallet: derivehdkey RPC to get xpub at arbitrary path Jun 20, 2025
@DrahtBot

DrahtBot commented Jun 20, 2025

Copy link
Copy Markdown
Contributor

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Code Coverage & Benchmarks

For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/32784.

Reviews

See the guideline and AI policy for information on the review process.

Type Reviewers
ACK w0xlt, pseudoramdom, achow101
Concept ACK rkrux

If your review is incorrectly listed, please copy-paste <!--meta-tag:bot-skip--> into the comment that the bot should ignore.

Conflicts

Reviewers, this pull request conflicts with the following ones:

  • #35747 (wallet: Fix FillPSBT failing to sign owned inputs when UTXOs disagree by nervana21)
  • #35170 (test: Better test coverage for legacy ParseHDKeypath() by optout21)
  • #35069 (Refactor keypath parser by pythcoiner)
  • #34502 (wallet: remove most asserts of WALLET_FLAG_DESCRIPTORS flag by rkrux)
  • #32861 (Have createwalletdescriptor auto-detect an unused(KEY) by Sjors)

If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

LLM Linter (✨ experimental)

Possible typos and grammar issues:

  • # Get the activate wpkh() receive descriptor -> # Get the active wpkh() receive descriptor [“activate” is the wrong word here; “active” is intended.]

Possible places where comparison-specific test macros should replace generic comparisons:

  • [test/functional/wallet_derivehdkey.py] assert xpub_info_1["xpub"] != xpub_info_2["xpub"] -> recommend assert_not_equal(xpub_info_1["xpub"], xpub_info_2["xpub"])

2026-08-07 13:13:06

@DrahtBot

Copy link
Copy Markdown
Contributor

🚧 At least one of the CI tasks failed.
Task lint: https://github.com/bitcoin/bitcoin/runs/44475268764
LLM reason (✨ experimental): The CI failure is caused by errors from the lint check 'py_lint', specifically due to unused imports flagged by ruff.

Hints

Try to run the tests locally, according to the documentation. However, a CI failure may still
happen due to a number of reasons, for example:

  • Possibly due to a silent merge conflict (the changes in this pull request being
    incompatible with the current code in the target branch). If so, make sure to rebase on the latest
    commit of the target branch.

  • A sanitizer issue, which can only be found by compiling with the sanitizer and running the
    affected test.

  • An intermittent issue.

Leave a comment here, if you need help tracking down a confusing failure.

Comment thread src/rpc/util.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In util.h: “@params[in] path” → “@param[in] path” [Doxygen tag typo]

Comment thread doc/multisig-tutorial.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressesd -> addresses [extra “d” makes “addresses” misspelled]

@rkrux

rkrux commented Jul 18, 2025

Copy link
Copy Markdown
Contributor

Very nice, Concept ACK.
I will review this PR.

@Sjors
Sjors force-pushed the 2025/06/gethdkey branch 2 times, most recently from 380a57f to 017fb68 Compare August 1, 2025 10:52
Sjors and others added 8 commits August 7, 2026 14:44
ParseHDKeypath() parsed each path element with ToIntegral<uint32_t>, so
a bare decimal >= 2^31 (e.g. "m/2147483648" == 0x80000000) was silently
treated as "m/0h".

This commit rejects such overflow instead.
GetHDPubKeys() centralizes the descriptor xpub lookup used by gethdkeys and
createwalletdescriptor, and by the derivehdkey RPC added in a later commit.
The HDKeyFilter argument serves gethdkeys' active_only mode (Active vs All)
and createwalletdescriptor's active descriptor selection.

No behavior change, except the dynamic_cast now uses Assert() instead of
gethdkeys' CHECK_NONFATAL, since it is not a recoverable input.
Reconstruct a descriptor's extended private key from its xpub by looking
up the corresponding private key. This is the extended-key analog of
GetKey() and is used by the derivehdkey RPC in the following commit.
Add an UnusedKey filter to GetHDPubKeys() so the new RPC can prefer
unused(KEY) descriptors before falling back to active descriptors.

Co-authored-by: w0xlt <94266259+w0xlt@users.noreply.github.com>
Use derivehdkey instead of extracting each participant xpub (and
derivation info) from  the listdescriptors output.

Additionally use the new <0;1> descriptor syntax.

Finally this commits adds a few debug log lines, and expand the
explanation for why we use m/44h/1h/0h.
Use derivehdkey instead of extracting each participant xpub
from  the listdescriptors output.

Additionally use the new <0;1> descriptor syntax.
@Sjors
Sjors force-pushed the 2025/06/gethdkey branch from 5ff96ba to c3945bf Compare August 7, 2026 13:12
@Sjors

Sjors commented Aug 7, 2026

Copy link
Copy Markdown
Member Author

Rebased after #35896, which should get rid of ci failures for test: move parse_hd_keypath test to bip32_tests. Took both @w0xlt's suggestions.

@Sjors
Sjors marked this pull request as ready for review August 7, 2026 13:42
@DrahtBot DrahtBot removed the CI failed label Aug 7, 2026
@w0xlt

w0xlt commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Code looks good. One question following up on the earlier parent-key leakage discussion #32784 (comment):

HasHardenedDerivation() accepts m/44h/1h/0h/0 because the path contains hardened steps. With private=true, the returned child xprv and public account xpub allow recovery of the account xprv.

Should private output require the final step to be hardened?

possible diff if so.
diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 054ab6b763..a98471c382 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -965,7 +965,7 @@ RPCMethod derivehdkey()
         {
             {"path", RPCArg::Type::STR, RPCArg::Optional::NO, "BIP 32 derivation path with at least one hardened step."},
             {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "", {
-                {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private key"},
+                {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private key. The final derivation step must be hardened"},
                 {"hdkey", RPCArg::Type::STR, RPCArg::DefaultHint{"Either the HD key of an unused(KEY) descriptor, or any other active descriptor."}, "The HD key that the wallet knows the private key of, listed using 'gethdkeys', to use for derivation"},
             }},
         },
@@ -998,6 +998,9 @@ RPCMethod derivehdkey()
             if (!HasHardenedDerivation(path)) {
                 throw JSONRPCError(RPC_INVALID_PARAMETER, "Derivation path requires at least one hardened step");
             }
+            if (priv && !(path.back() >> 31)) {
+                throw JSONRPCError(RPC_INVALID_PARAMETER, "Private key output requires a hardened final derivation step");
+            }
 
             LOCK(wallet->cs_wallet);
 
diff --git a/test/functional/wallet_derivehdkey.py b/test/functional/wallet_derivehdkey.py
index 8905c55e68..6c741233bb 100755
--- a/test/functional/wallet_derivehdkey.py
+++ b/test/functional/wallet_derivehdkey.py
@@ -73,8 +73,8 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
             too_deep_path,
         )
 
-        xpub_info = wallet.derivehdkey("m/87h/0h/0h/0")
-        xpub_priv_info = wallet.derivehdkey("m/87h/0h/0h/0", private=True)
+        xpub_info = wallet.derivehdkey("m/87h/0h/0h/0h")
+        xpub_priv_info = wallet.derivehdkey("m/87h/0h/0h/0h", private=True)
         xprv = xpub_priv_info["xprv"]
         assert_equal(xpub_priv_info["xpub"], xpub_info["xpub"])
 
@@ -99,11 +99,11 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
             -13,
             "Error: Please enter the wallet passphrase with walletpassphrase first",
             wallet.derivehdkey,
-            "m/87h/0h/0h/0",
+            "m/87h/0h/0h/0h",
             private=True,
         )
         with WalletUnlock(wallet, "pass"):
-            xpub_info = wallet.derivehdkey("m/87h/0h/0h/0", private=True)
+            xpub_info = wallet.derivehdkey("m/87h/0h/0h/0h", private=True)
             # Unused(KEY) is preferred over active descriptors and is not
             # rotated on encryption.
             assert_equal(xpub_info["xprv"], prev_xprv)
@@ -140,6 +140,18 @@ class WalletDeriveHDKeyTest(BitcoinTestFramework):
         active_xpub = wallet.gethdkeys(active_only=True)[0]["xpub"]
         assert_equal(wallet.derivehdkey("m/44h/1h/0h", hdkey=active_xpub), xpub_info)
 
+        # An xprv at an unhardened child, together with its exposed parent
+        # xpub, would reveal the parent xprv. Public output remains allowed.
+        unhardened_path = "m/44h/1h/0h/0"
+        assert "xprv" not in wallet.derivehdkey(unhardened_path)
+        assert_raises_rpc_error(
+            -8,
+            "Private key output requires a hardened final derivation step",
+            wallet.derivehdkey,
+            unhardened_path,
+            private=True,
+        )
+
         # Get the activate wpkh() receive descriptor
         desc = list(filter(lambda d:
                            d["active"] and not d["internal"] and d["desc"][0:3] == "pkh",

@Sjors

Sjors commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

Should private output require the final step to be hardened?

I think anyone who obtains xprv's should be careful, not sure if adding restrictions makes sense.

@w0xlt w0xlt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think anyone who obtains xprv's should be careful, not sure if adding restrictions makes sense.

That being the case, ACK c3945bf

@DrahtBot
DrahtBot requested a review from pseudoramdom August 13, 2026 17:56
@pseudoramdom

Copy link
Copy Markdown
Contributor

This is in a good state IMO.
code review ACK c3945bf

@achow101

Copy link
Copy Markdown
Member

ACK c3945bf

@achow101
achow101 merged commit a8b582e into bitcoin:master Aug 15, 2026
29 checks passed
@davidgumberg

Copy link
Copy Markdown
Contributor

This needs a release note!

@Sjors
Sjors deleted the 2025/06/gethdkey branch August 17, 2026 09:35
@Sjors

Sjors commented Aug 17, 2026

Copy link
Copy Markdown
Member Author

@davidgumberg it's in doc/release-notes-32784.md

@optout21

Copy link
Copy Markdown
Contributor

Post-merge comment: the merge conflict on #35170 showed that it has overlap with this PR. I have updated #35170 accordingly. Reviews are welcome on it!

@davidgumberg

Copy link
Copy Markdown
Contributor

@davidgumberg it's in doc/release-notes-32784.md

Oops, I looked at the commit list. My bad

Kino1994 pushed a commit to Kino1994/bitcoin-full-history that referenced this pull request Aug 19, 2026
…rbitrary path

c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec doc: use derivehdkey in multisig tutorial (Sjors Provoost)
3662e3366978e1ecff1924da100cd2606899126e test: use derivehdkey in M-of-N multisig demo (Sjors Provoost)
d9570f0838355bca638ac3287fd334905fb29e16 rpc: add derivehdkey (Sjors Provoost)
62da9f9614508f6bfd30126a73c59d0c4004066e wallet: add GetExtKey helper (Sjors Provoost)
aaf1548475ded41889d5041fc2d60e8b2ca9ddcd wallet: generalize GetActiveHDPubKeys helper (Sjors Provoost)
3821452c4af1440484ddd5ccc83f83cc4c307af3 refactor: add hardened derivation helper (Sjors Provoost)
0ab61caafd10d0539da626bd4354cb7e6df15e54 rpc: ParsePathBIP32 helper (Sjors Provoost)
e36c4b76e198751c14da8d32655e47bd5678abb6 util: reject out-of-range BIP32 keypath indices (Sjors Provoost)
ba78c31a00c912ec440dfb677997b51c72058bab fuzz: check ParseHDKeypath/WriteHDKeypath round-trip (Sjors Provoost)
8cce969085dbe3137c738cbe691008974059af1e Have ParseHDKeypath handle h derivation marker (Sjors Provoost)
fc5307776236c6f08aec94978672626f5aae1aaa test: move parse_hd_keypath test to bip32_tests (Sjors Provoost)
dab525eb7717af3b246a5aa32acea174cd9bd453 key: add DeriveExtKey() helper (Sjors Provoost)

Pull request description:

  Adds a `derivehdkey` RPC that returns an xpub, or optionally the xprv, at an arbitrary BIP32 path (with at least one hardened step), derived from a wallet HD key.

  The main use case is coordinating a multisig setup, where each participant shares an xpub derived at a hardened path (e.g. `m/87h/0h/0h`) distinct from their default single-signature descriptors. See the (updated) `doc/multisig-tutorial.md` and (updated) functional test to see how that workflow improves.

  The first commits are some helpful helpers:

  - _key: add DeriveExtKey() helper_ - performs the actual derivation
  - _test: move parse_hd_keypath test to bip32_tests_ - from `psbt_wallet_tests`
  - _Have ParseHDKeypath handle h derivation marker_
  - _util: reject out-of-range BIP32 keypath indices_ -  `ParseHDKeypath` would previously map overflowing values without `h` to hardened.
  - _fuzz: check ParseHDKeypath/WriteHDKeypath round-trip_
  - _rpc: ParsePathBIP32 helper_
  - _refactor: add hardened derivation helper_ - `HasHardenedDerivation()`, to enforce the "at least one hardened step" rule
  - _wallet: generalize GetActiveHDPubKeys helper_ - extracts code from `gethdkeys` which `derivehdkey` needs
  - _wallet: add GetExtKey helper_ - reconstruct an xprv from a wallet xpub (analog of `GetKey()`); behavior-preserving prep, also simplifies `gethdkeys`.

  Meat and potatoes:
  - _rpc: add derivehdkey_ - the RPC itself, plus the `UnusedKey` filter on `GetHDPubKeys` that drives key selection.
  - _test: use derivehdkey in M-of-N multisig demo_ - rewrites the functional multisig test to use the RPC and `<0;1>` syntax.
  - _doc: use derivehdkey in multisig tutorial_ - same for the prose tutorial.

ACKs for top commit:
  pseudoramdom:
    code review ACK c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec
  achow101:
    ACK c3945bfd2bf87ae6fe7be1c0cee58b21c4269aec
  w0xlt:
    That being the case, ACK c3945bfd2b

Tree-SHA512: 661f17c9bfe26017eb14c27ba7af37093387100d3baa25f5d29bba9c1aedc40d19afe1bdfc126a18d018857bb02f1fc84386f10b8f4f4b8e9d6f4b0691d9e302
achow101 added a commit that referenced this pull request Aug 19, 2026
777aee7 refactor: deduplicate keypath element parsing (pythcoiner)
7d8fddf refactor: define BIP32_HARDENED and BIP32_UNHARDENED constants (pythcoiner)

Pull request description:

  The codebase used raw `0x80000000` (and implicit `0`) as the bip32 hardened / unhardened flag.

  `ParseHDKeypath` and `ParseKeyPathNum` were two separate parsers for BIP32 keypath elements, #32784 aligned their rules (both accept ' and h as hardened marker and reject indexes > 0x7FFFFFFF), but the parsing logic itself was still duplicated.

  This PR:
  - Define `BIP32_HARDENED_FLAG` / `BIP32_UNHARDENED_FLAG` constants to replace magic `0x80000000` and `0` literals.
  - Add `ParseKeyPathElement` as bip32 parsing util and use it consistantly in `ParseHDKeyPath` and the descriptor keypath parser.

ACKs for top commit:
  Sjors:
    ACK 777aee7
  achow101:
    ACK 777aee7

Tree-SHA512: fb096eef82bb5a90baa7de41f5562b935665ee4b64c41586cf89e06c5633be44063a35a89d01a1432c8e63222d94bd06840bafc2a837f252013e317de0f5837a
alexanderwiederin added a commit to alexanderwiederin/rust-bitcoinkernel that referenced this pull request Sep 2, 2026
…462c683d4

97462c683d4 kernel: Add script tracer
ea7d459ac08 Merge bitcoin/bitcoin#36057: build: check for SetThreadDescription() at configure time
204256c73f2 Merge bitcoin/bitcoin#35900: iwyu: Fix warnings in `src/interfaces` and treat them as errors
da1cb4dd90e Merge bitcoin/bitcoin#35586: doc: note -blocknotify is not run during IBD/reindex in help text
b31aae4f9af Merge bitcoin/bitcoin#36094: ci: bump riscv toolchain to tag 2026.08.25
607f220c6cf Revert "ci: use mirror for riscv submodules"
64af18f4e6d ci: bump riscv toolchain to tag 2026.08.25
fd573f6db9d Merge bitcoin/bitcoin#36044: test: cover OP_SUCCESSx bypassing the initial stack element size limit
2224e4af6ce Merge bitcoin/bitcoin#35850: fuzz: Implement `connect_block` harness
2777300c68f fuzz: Implement connect_block harness
bed46bd16c2 build: check for SetThreadDescription() at configure time
40add915be5 test: Add reset to CuckooCache
a24110cef7f Merge bitcoin/bitcoin#36092: fix: UB sanitizer in mempool estimator logging
8b84f917789 Merge bitcoin/bitcoin#36088: util: Set Univalue to null after read failure
576a0ebb536 fix: UB sanitizer in mempool estimator logging
5f45583e437 Merge bitcoin/bitcoin#36077: bugfix: give TxDownloadManager its own RNG
fa72de78a93 util: Set Univalue to null after read failure
fa7786592d7 test: Add UniValue failed read test
e339043ee9e Merge bitcoin/bitcoin#35829: http: Make class fields private and make HTTPResponse a struct
031175197f1 Merge bitcoin/bitcoin#36032: rpc: avoid quadratic output lookups
b91d983f66f Merge bitcoin/bitcoin#36078: qa: Reduce `-maxconnections` in the functional test framework
0f5c6d0b64a Merge bitcoin/bitcoin#35618: depends: Make tarball creation from local directory reproducible
b8a8893bf2a qa: Lower `-rpcmaxconnections` in `interface_http.py` test
6f4109b4489 qa: Reduce `-maxconnections` in the functional test framework
80eaa6cabf2 bugfix: give TxDownloadManager its own RNG
5e0d7a286a4 refactor: Drastically narrow scope of http_bitcoin namespace and rename it to bitcoin_http
8f9fd8698a7 refactor: Make HTTPRemoteClient fields private
d72f67fd6c9 refactor: Expose additional HTTPRemoteClient fields through accessors
10bbae302fb refactor: Expose HTTPRemoteClient fields to tests through methods
5b06d908316 refactor: Replace HTTPServer::MaybeDispatchRequestsFromClient() with HTTPRemoteClient::TryReadRequest()
794a753958a Merge bitcoin/bitcoin#35583: test: close the listeners before terminating the event loop
f6b3f2ff6b1 Merge bitcoin/bitcoin#36064: qa: Minor improvement follow-ups to 35730
6a028161daf Merge bitcoin/bitcoin#36025: psbt: avoid duplicate taproot leaf script keys when merging
07d92a9d65a Merge bitcoin/bitcoin#35516: rpc: preserve global xpubs and proprietary fields in joinpsbts
4375d74d24c Merge bitcoin/bitcoin#34993: wallet: `NotifyCanGetAddressesChanged` when advancing `next_index`
290be9eafa4 qa: Minor feature_init.py improvements
6248331b295 qa: Switch to warning when skipping tests
04cf9ecee43 Merge bitcoin/bitcoin#35978: contrib/init: fix unused variables in openrc script
aed80c73958 Merge bitcoin/bitcoin#36067: test: Remove `BOOST_CHECK_CLOSE` in favor of exact comparison
07ca9ba9e84 Merge bitcoin/bitcoin#36059: test: make index crash test check saved state
402f1fdae6a Merge bitcoin/bitcoin#36063: refactor: [test] Remove deprecated SetMockTime(i64) alias
135e05cfa07 Merge bitcoin/bitcoin#36046: fuzz: Use ImmediateBackgroundTaskRunner in process_messages
9e115edd39f test: Remove `BOOST_CHECK_CLOSE` in favor of exact comparison
6d570415a01 refactor(qa): Move check right below related check
7e3b60584b3 refactor(qa): Simplify through using assert_raises()
fad1e6bf238 util: refactor: Remove deprecated SetMockTime(i64) alias
faf87c3535c test: refactor: Use FakeNodeClock over manual/global SetMockTime
994c17d6c0a Merge bitcoin/bitcoin#34697: descriptor: fix musig() duplicate key checks and doubled PSBT origin paths
a1183c02aac refactor: Extract Send() and Receive() into HTTPRemoteClient from HTTPServer
6d9b61d4f8d refactor: Extract HTTPRemoteClient::MaybeDisconnect() from HTTPServer::DisconnectClients()
6fec8d6914b refactor: Make HTTPRequest fields private
b8cd77237b3 refactor: Make HTTPRequest::GetHeader() return saner optional type
1cb416397b7 psbt: avoid duplicate taproot leaf script keys when merging
32765aca5c3 Merge bitcoin/bitcoin#35730: http: limit connected HTTPRemoteClients
a3335994a84 Merge bitcoin/bitcoin#35580: bugfix:  compare non-adjusted chunk weight against block weight limit
0ea81904ebd Merge bitcoin/bitcoin#35933: psbt: don't abort on invalid MuSig2 derivations
7ea36e985a9 test: preserve index crash test state
5aa15df60c4 test: expose missing index crash checkpoint
b3ff9c4d683 iwyu: Fix warnings in `src/interfaces` and treat them as errors
d564b0255f7 iwyu: Add temporary mapping to work around upstream bug
58a7869f860 Merge bitcoin/bitcoin#36051: ci: use ruff 0.16.x
f5e91c6fbae Merge bitcoin/bitcoin#35884: util: set os-level thread names on Windows
a1e27162257 Merge bitcoin/bitcoin#36045: test: avoid undersized Boost.Test signal stacks
9d0c38db746 ci: use mypy 2.3.1
7a53beca06a ci: use pyzmq 27.2.0
f29f076f3c2 ci: use ruff 16
7dcb7f09ed6 Merge bitcoin/bitcoin#34075: fees: Introduce Mempool Based Fee Estimation to reduce overestimation
5e8586ec5b0 Merge bitcoin/bitcoin#36019: bench: Construct CTxOut and COutPoint in a single expression
950bdb763e1 bench: Construct CTxOut and COutPoint in a single expression
bf8402c8803 Merge bitcoin/bitcoin#32958: wallet/refactor: Update SignPSBTInput to return util::Expected<void, PSBTError> and remove PSBTError:Ok
02306cc915c Merge bitcoin/bitcoin#35161: consensus: document merkle mutation root invariant
fae6665f013 fuzz: Use ImmediateBackgroundTaskRunner in process_messages
9eba3aafa6c test: avoid undersized Boost.Test signal stacks
747cff84248 rpc: avoid quadratic output lookups
7f9c4e29289 doc: add release notes
e18d392689d test: add mempool estimator i/o fuzz test
970f02096d3 fees: persist mempool policy estimator data
7dcb37989d2 fees: move fee_estimates.dat into fees directory
0db2b69e6db rpc: add verbosity option to estimatesmartfee options
06bb65730eb fees: gate mempool estimates on recent block coverage
cfe585df25c validation: emit block mempool removal signal from ConnectTip
0d88558f951 fees: return mempool estimates when it's lower than block policy
56db08d5291 Merge bitcoin/bitcoin#35877: build: ci/doc win64-cross build via nix
693b1351aff fees: add caching to MemPoolFeeRateEstimator
c9bb3df29ff fees: add MemPoolFeeRateEstimator class
558e26e66e0 test: cover OP_SUCCESSx bypassing the initial stack element size limit
e5be0dc35e8 refactor: Make HTTPResponse a struct since all fields are public
69c61f9f2f3 Merge bitcoin/bitcoin#36034: Release: Prepare "Translation string freeze" step
87b8a4ee506 Merge bitcoin-core/gui#944: Fix out-of-bounds read in RPCParseCommandLine on empty command
f9cc0c020c2 Merge bitcoin/bitcoin#36020: doc: Correct after HTTPRequest::m_client changed to weak_ptr
5a431c957d1 qt: Update `src/qt/locale/bitcoin_en.ts` translation source file
08dfaa04f4c Merge bitcoin/bitcoin#36018: test: [refactor] Properly use BOOST_CHECK_EXCEPTION
fa0fe212f52 test: [refactor] Properly use BOOST_CHECK_EXCEPTION
436921eb469 test: check joinpsbts preserves global xpubs and proprietary fields
011094b282b rpc: preserve global xpubs and proprietary fields in joinpsbts
367b2202a49 Merge bitcoin/bitcoin#35665: psbt: avoid duplicate global xpub keys when merging
bab030a6feb Merge bitcoin/bitcoin#35859: wallet: use unsigned KDF iteration count
21ee7f6c00b Merge bitcoin/bitcoin#35069: Refactor keypath parser
a07f1313b14 Merge bitcoin/bitcoin#35980: contrib: reject divergent verify-commits history
32dfed44a2a Merge bitcoin/bitcoin#36012: psbt: Remove unused `IsNull()` methods
8c366094b89 Merge bitcoin/bitcoin#35956: fuzz: scope fake clocks to target phases
4d86d9cc7ed Merge bitcoin/bitcoin#35968: test: sync funding block before isolating nodes
8c1d776bf2c Merge bitcoin/bitcoin#35965: test: Tighten Coin equality and add debug output
fa8762da626 build: ci/doc win64-cross build via nix
fafe7205cc8 doc: Clarify that cygwin/msys2 are not tested/supported
4b991d7b5fe Merge bitcoin/bitcoin#34239: depends: Hash included makefiles in package checksums
fe5e2a6319b Merge bitcoin/bitcoin#32162: depends: Switch from multilib to platform-specific toolchains
4e5327bc988 fuzz: refactor: scope fake clocks to target phases
15e5c35c451 doc: Correct comments after HTTPRequest::m_client was changed from shared to weak pointer
1156ce67545 test: Tighten `Coin` equality and add debug output
59224b66aa1 Merge bitcoin/bitcoin#36008: wallet: WalletBatch->WriteVersion respect argument
2c16efbb7b5 psbt: Remove unused IsNull() methods
dd669f40b98 util: set os-level thread names on Windows
b88bffe550a Merge bitcoin/bitcoin#36010: test: Print os exit code on failure
0fd515bbb70 Merge bitcoin/bitcoin#36009: miniscript: remove unused context argument from ParseHexStr
15a7a4ed7c4 Merge bitcoin/bitcoin#35952: kernel: prevent dangling iterators from temporary ranges
ac6b6c1f06e Merge bitcoin/bitcoin#35680: private broadcast: bound rebroadcast attempts to 1,000
d411bb02ff8 Merge bitcoin/bitcoin#35993: guix: build glibc with `--enable-kernel=3.17.0`
fada80192bd test: Print os exit code on failure
381c3312191 Merge bitcoin/bitcoin#36007: http: Make HTTPRequest::m_client a weak_ptr
82b3bfe38c0 Merge bitcoin/bitcoin#35797: psbt: support output metadata updates before inputs are added
681b429393e Merge bitcoin/bitcoin#35986: p2p: reconsider orphans when missing inputs are mined
16f4bd15bc9 Merge bitcoin/bitcoin#35954: qa: Disable Qt's glib event dispatcher for GUI tests on OpenBSD
1fdd208c1ce miniscript: remove unused context argument from ParseHexStr
4ca07c2fb3d Merge bitcoin/bitcoin#35963: doc : update cjdns docs to discourage using onlynet option
4b4ae6e37c5 Merge bitcoin/bitcoin#35995: doc: fix outdated URL in hash_tests.cpp
a23df4bfa87 Merge bitcoin/bitcoin#35946: rpc: Improve some type specs for openrpc
20ad7c9eab8 Merge bitcoin/bitcoin#35955: wallet: remove orphaned GetAffectedKeys and LegacyScriptPubKeyMan declarations
979a42ec173 http: Make HTTPRequest::m_client a weak_ptr
cf36df070b4 Wallet: Check crypter return values
777aee77d12 refactor: deduplicate keypath element parsing
7d8fddfba25 refactor: define BIP32_HARDENED and BIP32_UNHARDENED constants
e4d80e7001e test: close the loop after the network thread has completed
29fba5ddbb9 test: close the listeners before terminating the event loop
bd4b1524eab init: do not count file descriptors for HTTPServer if -server=0
b08662060db init: account for maximum file descriptors needed by HTTP
158efbc723d doc: fix outdated URL in hash_tests.cpp
9cacf677a91 rpc: add fee_rate_estimator option to estimatesmartfee
ba6c61bbdd3 fees: add FeeRateEstimatorManager class
2cb6b831e03 fees: add EstimateFeeRate and MaximumTarget to CBlockPolicyEstimator
5adb2ab0843 refactor: test block policy estimator directly
9c8309a8909 test: rename policy estimator tests to block policy estimator tests
e3d5ef1b5fb fees: move StringForBlockPolicyEstimateReason to block policy estimator
74245c20e05 fees: split wallet and estimator fee reasons
ec5d19665b8 wallet: WalletBatch->WriteVersion respect argument.
cc2acebefb0 http: configure simultaneous connection limit with -rpcmaxconnections
b3d6d2d1a7e http: limit connected clients to 16
86651d81971 scripted-diff: Rename nUserBind, nBind, nMaxConnections to snake_case
5548818115c guix: build glibc with --enable-kernel=3.17.0
f72537037d3 Merge bitcoin/bitcoin#35972: fuzz: Fix assertion in `txorphan`
4800cb7aea0 Merge bitcoin/bitcoin#35735: Add state to HTTPRequest
e0992599a63 Merge bitcoin/bitcoin#35846: test: Use throwing config parser getters without fallback
e5977f0b9e5 Merge bitcoin/bitcoin#35982: Update minisketch subtree to latest master
fe7dbde52c9 Merge bitcoin/bitcoin#35976: test: Speedup fee estimation functional test with batching
9cc7dc50bdc p2p: reconsider orphans when missing inputs are mined
c90c23d388f Merge bitcoin/bitcoin#35531: txindex: hash keys and pack positions to reduce disk usage
2dcb2c6df20 Update minisketch subtree to latest master
461e3be8d3d Squashed 'src/minisketch/' changes from d1bd01e189..4a179c61e3
05c36d9fadc Merge bitcoin-core/gui#957: fix: add .dat file extension automatically when exporting watchonly
75a4e6c6788 gui: fix allow restore wallets without .dat file extension
a8b582ec1d2 Merge bitcoin/bitcoin#32784: wallet: derivehdkey RPC to get xpub at arbitrary path
465bca734eb contrib: reject divergent verify-commits history
b3d1dca3388 contrib: fail on verify-commits ancestry errors
d837bb38a44 contrib/init: fix unused variables in openrc script
fe7d475d450 private broadcast: bound broadcast attempts per tx to 1k
b3d77ea0275 test: Speedup fee estimation functional test with batching
683e05a265c Merge bitcoin/bitcoin#35889: rpc: avoid quadratic `gettxspendingprevout` work and preserve order
230185a5ee7 Merge bitcoin/bitcoin#35971: net_processing: remove unused code
ae36e2ef798 rpc: avoid quadratic prevout resolution
da1eaeb3507 rpc: preserve `gettxspendingprevout` order
f98753e7621 refactor: identify prevouts by request index
221a3fe5cfb test: cover mixed `gettxspendingprevout` order
02de12b1e61 wallet: remove remaining LegacyScriptPubKeyMan references
d194be69d60 wallet: remove orphaned GetAffectedKeys declaration
01dde6b2057 fuzz: Fix assertion in txorphan
dec68f997e7 Merge bitcoin/bitcoin#35852: scripted-diff: Use inline const(expr) over static constexpr in headers
e95bab98f03 Merge bitcoin/bitcoin#35960: common: remove `::runtime_error` from `RunCommandParseJSON`
aad830ac4a6 Merge bitcoin/bitcoin#35847: test: move more tests to `baseindex_tests` and run them for all indexes
b76afff2749 Wallet: Use unsigned KDF iteration count
e07d826e0eb rpc: Fix type in ApplyTypeStrOverride
0cff3cc5187 net_processing: Remove redundant porphanTx in ProcessOrphanTx
c7eacbd45b0 net_processing: remove Peer& from UpdatePeerStateForReceivedHeaders
8454fb2bd74 test: sync funding block before isolating nodes
8b5da677d7b common: remove ::runtime_error from RunCommandParseJSON
25bed560bed test: add forward-compat functional test for txindex
703304ed8c1 doc: add release notes for txindex disk usage and downgrading
8e5320a2d24 tests: cover txindex hash prefix collisions and legacy fallback
b75efa19ba8 txindex: skip bloom filters and legacy lookups for new databases
004d7c098ca txindex: hash key prefixes and pack block positions
5a255970fd1 refactor: move txindex db constants and legacy key to txindex_key.h
327660134cb txindex: pass the full block to DB::WriteTxs
42771e79980 txindex: use a new block locator for downgrade safety
4b08baed72c txindex: return optional tx and block hash from FindTx
fc0dcf950f9 kernel: keep range iterators tied to their owner
0936c55f626 test: characterize kernel range iterators
ef501a63d9d consensus: document merkle mutation root invariant
11090c8bb35 Merge bitcoin/bitcoin#35951: doc: release note about I2P ElGamal sunset
beefda21be3 doc : update cjdns docs to discourage using onlynet option
b2c45888fde Merge bitcoin/bitcoin#35866: test: Verify unwelcome RPC clients are rejected before reading their requests
c0792889673 psbt: update output metadata without inputs
4f5712476a3 test: characterize P2WSH miniscript output
e24e8fa2a68 test: characterize PSBT output metadata
625f951ba2f Merge bitcoin/bitcoin#35959: Update secp256k1 subtree to latest master
e9ed5e83a39 Merge bitcoin/bitcoin#35605: wallet: rpc: Deprecate `removeprunedfunds` RPC
800ad9c3c0c doc: release note I2P ElGamal sunset
2f72123f613 Merge bitcoin/bitcoin#35867: test: classify SOCKS5 peers via getpeerinfo addrbind
f464f6cd67e Update secp256k1 subtree to lastest master
09cc345c3e3 Squashed 'src/secp256k1/' changes from d2d04864ef..687155df6b
c94074fa1b1 rpc: Surface OBJ_USER_KEYS description for openrpc
c020c21d543 rpc: Handle skip type args for openrpc
e33410d8884 fuzz: document arbitrary mocktimes
4c045f1a032 Merge bitcoin/bitcoin#35945: depends, qt: Add patch for missing headers
b0615672352 Merge bitcoin/bitcoin#35947: build, msvc: Update vcpkg manifest baseline
1f5c46f7ce2 Merge bitcoin/bitcoin#35931: ci: Check DLL imports of cross-built `bitcoind.exe`
b42f7fade0c descriptor: don't prepend key origins twice
7b15e2cb442 descriptor: fix duplicate check for hardened keys
1bec7fa22c9 Merge bitcoin/bitcoin#35496: kernel: add `btck_set_mock_time` for testing time-dependent paths
c1967c4453b Merge bitcoin/bitcoin#35950: Update leveldb subtree to latest master
512dc9af1b1 Merge bitcoin/bitcoin#35930: wallet: post-#35501 cleanups in CWalletTx
b970bb34d0c Merge bitcoin/bitcoin#33585: cmake: Use builtin support for .manifest files
de2adc308a4 qa: Disable Qt's glib event dispatcher for GUI tests on OpenBSD
aa0e0f793fe Merge bitcoin/bitcoin#35729: refactor: test: Unroll `&&` conditions in macros
3e76d22de25 Update leveldb subtree to latest master
9f10ef5e96d Squashed 'src/leveldb/' changes from a7f9bdc611..13da2d6758
2c01832f7be Merge bitcoin/bitcoin#35493: wallet, descriptor: Fix MuSig private key completeness checks on `importdescriptors`
b80cee03619 Merge bitcoin/bitcoin#35924: Wallet, refactor: Remove orphaned EraseWatchOnly function
5d051c05629 Merge bitcoin/bitcoin#35943: doc: fix dead link in txrequest.h
4ca182ca402 doc: clarify alternate_wtxids is empty when only one witness variant
fa48b5d28eb test: assert listsinceblock "removed" reports current canonical wtxid
9b96ee12881 wallet, test: add unit test for variant txid validation in CWalletTx deserializer
9de6543cb55 wallet: post-#35501 cleanup in CWalletTx
e2bf51543ad build, msvc: Disable default features of the `sqlite3` package
a31425610af build, msvc: Update vcpkg manifest baseline
757aa573c45 Merge bitcoin/bitcoin#33186: wallet, test: Ancient Wallet Migration from v0.14.3 (no-HD and Single Chain)
e8cc21c57f9 Merge bitcoin/bitcoin#35925: wallet, rpc: Exclude non-owned addresses from listreceivedby*
e8500cbd19d depends, qt: Add patch for missing headers
9954aa77280 http: don't parse any new requests from a client if m_req_busy = true
c7db3ae1f90 test: cover HTTPRequest state machine
90676e24ad1 Add state to HTTPRequest to avoid duplicate work over I/O cycles
99497b38f6c cmake: Unconditionally add .rc files to sources
654a4cf5e69 cmake: Use builtin support for .manifest files
8f695379f31 cmake: Unconditionally set WIN32_EXECUTABLE target property
507e528e845 http: reuse HTTPHeaders to parse chunked trailer
902d8908c94 http: only read one HTTPRequest at a time per client
a7b0b5084a4 doc: fix dead link in txrequest.h
1d386c250f2 Merge bitcoin/bitcoin#35941: doc: remove mention of `::wsystem`
57246934e71 doc: remove mention of wsystem
5973e075882 Merge bitcoin/bitcoin#35937: test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt
b6bd573eb97 Merge bitcoin/bitcoin#34794: rest: add Cache-Control headers to REST responses
d055a3ab100 test: verify disallowed RPC clients are rejected upon `accept()`
128456b62d5 Merge bitcoin/bitcoin#35260: doc: clarify test placement guidance
fad9ab714b5 test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt
05a7c470d28 Merge bitcoin/bitcoin#35822: fuzz: reset SOCKS5 interrupt between inputs
73a94b45459 psbt: avoid aborting on invalid MuSig2 derivations
e3d1e75a519 test: characterize MuSig2 derivation aborts
1be0b46297c Merge bitcoin/bitcoin#35898: rpc: fix mempool entry vsize docs
5f4d5626e7f Merge bitcoin/bitcoin#35908: doc: Update NetBSD Build Guide
8397e09e6ba Merge bitcoin/bitcoin#35928: doc: mention -DWITH_ZMQ=ON in macOS build guide
4b4e63f2823 Merge bitcoin/bitcoin#35704: windows: remove deprecated codecvt via UTF-8 narrow APIs
67fee5bf440 ci: Check DLL imports of cross-built `bitcoind.exe`
089c883c558 test: Add coverage for listreceivedby* excluding "send" addresses
873c0548059 wallet: Exclude non-owned addresses from listreceivedby*
c3945bfd2bf doc: use derivehdkey in multisig tutorial
3662e336697 test: use derivehdkey in M-of-N multisig demo
d9570f08383 rpc: add derivehdkey
62da9f96145 wallet: add GetExtKey helper
222855ed112 doc: mention -DWITH_ZMQ=ON in macOS build guide
aaf1548475d wallet: generalize GetActiveHDPubKeys helper
3821452c4af refactor: add hardened derivation helper
0ab61caafd1 rpc: ParsePathBIP32 helper
e36c4b76e19 util: reject out-of-range BIP32 keypath indices
ba78c31a00c fuzz: check ParseHDKeypath/WriteHDKeypath round-trip
8cce969085d Have ParseHDKeypath handle h derivation marker
fc530777623 test: move parse_hd_keypath test to bip32_tests
dab525eb771 key: add DeriveExtKey() helper
71c06c5cbcd Merge bitcoin/bitcoin#35830: fees: Return false for incompatible fee estimates
55dfc244143 Merge bitcoin/bitcoin#35915: Release: Prepare "Open Transifex translations for `v32.0`" step
f11dc6170ed Merge bitcoin/bitcoin#35482: fuzz: exercise the transaction-handling path in process_message(s)
6f906106d73 Merge bitcoin/bitcoin#35879: ci: Fix $BASE_ROOT_DIR installation
d36bf709f7f Merge bitcoin/bitcoin#35914: test, fuzz: Remove unused variables
ed2c59ab654 Merge bitcoin/bitcoin#35896: refactor: Default uint256::operator==, add operator<=>
fae7ba9abae ci: Fix $BASE_ROOT_DIR installation
fabe100c2b3 test: Use throwing config parser getters without fallback
fa8acd57cd1 test: Write true/false values in config.ini
6304789a18f Wallet, refactor: Remove orphaned EraseWatchOnly function
6b6d77cc84e windows: remove deprecated codecvt via UTF-8 narrow APIs
b388674acf0 Merge bitcoin/bitcoin#35872: rpc: avoid descriptor range counter overflow
c36ffd870e8 Merge bitcoin/bitcoin#35842: rpc: Properly make RPCResult::Type::ANY non-test-only
7cb9aaaee80 Merge bitcoin/bitcoin#35759: fuzz: check http_request body matches framing
5b008514dbe Merge bitcoin/bitcoin#35878: net_processing: process unique tx INVs only
3175d576288 test, refactor: Remove unused `error` in `wallet_tests.cpp`
422f1bd92f1 test, refactor: Remove unused `utxo_pool` in `coinselector_tests.cpp`
e550945a394 test, refactor: Remove unused `removed_refs` in `txgraph_tests.cpp`
a061b011b78 Merge bitcoin/bitcoin#35912: doc: fix stale bitcoin_en.xlf reference
950b1c09225 Merge bitcoin/bitcoin#34927: test: Check that RPCs do not time out, even under load
bd01e66f0a7 Merge bitcoin/bitcoin#35885: ci: switch to a sourceware mirror for riscv
fa2e76d397a bench: Add base_blob compare bench via uint256
97abf95f48a qt: Update the `src/qt/locale/bitcoin_en.ts` translation source file
81fcecfe452 Revert "ci: Temporarily remove riscv32 config from GHA matrix"
b283e1751cc ci: use mirror for riscv submodules
fa7bc26d127 test: Check that RPCs do not time out, even under load
fa2bd96cc0d test: Map cli CalledProcessError on server error to JSONRPCException
e50f422d25f test, refactor: Remove unused variables in `test/rbf_tests.cpp`
b7ae50e2e27 fuzz, refactor: Remove unused `header` in `p2p_transport_serialization.cpp`
3df0d067ade fuzz, refactor: Remove unused `random_string` in `locale.cpp`
fc28914de4e fuzz, refactor: Remove unused `linearization` in `cluster_linearize.cpp`
da58e559865 test, refactor: Remove unused `warnings` in `wallet/test/util.cpp`
4df077d7cd3 Merge bitcoin/bitcoin#35910: refactor: Remove unused newFeeRate var in ReplacementChecks
e98ffd4bd82 doc: fix stale bitcoin_en.xlf reference
fa9a9a82acd refactor: Remove unused newFeeRate var in ReplacementChecks
fa588e9e0f8 refactor: Mark assertion_fail as [[noreturn]]
1278a5970d5 net_processing: process unique tx INVs only
75f58519277 doc: add release note for REST cache-control headers
bbe21ac29f5 doc: document REST cache-control defaults
862a1795563 http: add no-store to dispatcher-generated error responses
f32685315c2 doc: Install `pkgconf` to find `capnproto` on NetBSD
5964c7229fc doc: Switch `pkg-config` package to modern `pkgconf` on NetBSD
9b85c9814d1 doc: Drop GCC upgrade instructions for NetBSD
ea59f172209 test: cover v0.14.3 wallet migration
18b8afd0933 test: support v0.14.x in dumb_sync_blocks
faec059dfe8 refactor: Add uint256::operator<=>()
b9d573e4a95 fees: Return false for incompatible fee estimates
a3ebf8ab607 rpc: fix mempool entry vsize docs
c4fbd3c7211 Merge bitcoin/bitcoin#35895: refactor: Enable clang-tidy rule to reject anon namespace in header
465196d0154 Merge bitcoin/bitcoin#35630: test: Add importdescriptors rpc error test coverage
fa6df14c236 refactor: uint256::operator==() = default
c940fd75145 Merge bitcoin/bitcoin#35180: coins: group private cache helpers
3db96eb5fd7 Merge bitcoin/bitcoin#35582: rpc: reject null for optional parameters
fa93132d6da refactor: Enable misc-definitions-in-headers
fa5ca877b60 refactor: Enable clang-tidy rule to reject anon namespace in header
fafe5042bd1 refactor: Use C++20 std::identity over IntIdentity
28257111acf Merge bitcoin/bitcoin#35737: test: Move cluster_linearize.h contents into cluster_linearize namespace
fac4b06e997 refactor: Use CLIENT_NAME in buildOpenRPCDoc
fa3aadbc32e refactor: Use self.Arg<bool> in getopenrpcinfo
fa1871a5281 refactor: Remove stale NOLINTNEXTLINE above GetAddressInfoBaseFields
fa226479149 rpc: Properly make RPCResult::Type::ANY non-test-only
fa1242dcc02 refactor: Use std::visit in ApplyArgFallback
27b6b5a458f Merge bitcoin/bitcoin#35836: rpc: Remove meaningless bool fallback in FundTransaction
3ac8b806a69 test: test the result order of a multiple import request is correct
e4732bf0187 test: test invalid or missing timestamp throws importdescriptors
324c231efea Merge bitcoin/bitcoin#35881: iwyu: Fix warnings in `src/consensus` and treat them as errors
6ed7e05e20d gui: fix add .dat file extension automatically when exporting watchonly
75183f4464b Merge bitcoin/bitcoin#35880: fuzz: don't connman.ReceiveMsgFrom oversized msg
fab74a0e922 refactor: Use C++14 digit separator for large int literals
fae759be793 scripted-diff: Use inline constexpr over plain constexpr
fa74f58a262 scripted-diff: Use inline const over (static) const
fab1a62c870 refactor: Use inline constexpr for string literals in headers
fa08bbed8dd contrib: Adjust generate-seeds.py to write inline constexpr
fad753611b5 scripted-diff: Use inline constexpr over (static) const
faedb52583e refactor: Make CFeeRate(integral) ctor constexpr
5555d5dcb55 scripted-diff: Use inline constexpr over static constexpr
fa6e1a1e85e refactor: Remove static from constexpr functions in headers
e2ab8ae5514 wallet: spkm: Only notify CanGetAddressesChanged on change
0892f16f911 refactor: moveonly: Pair CanGetAddressesChanged notifications with desc range.
e6adae3db24 wallet: `NotifyCanGetAddressesChanged` when advancing `next_index`
acf45c44c01 rest: add Cache-Control headers to REST responses
d3cfd02bd7f Merge bitcoin/bitcoin#35501: wallet: store all witness variants of a transaction
0b8ffd01cde Merge bitcoin/bitcoin#35790: fuzz: populate wallet TXO index in wallet_create_transaction
2f52c2e8c06 Merge bitcoin/bitcoin#35886: refactor: Remove unused #include in common/system
fa7304f3a5b refactor: Remove unused #include in common/system
e7eb159a868 Merge bitcoin/bitcoin#35773: test: Suppress implicit-unsigned-integer-truncation:SaltedCoinsCacheHasher::operator()
c6ef42d7dbc Merge bitcoin/bitcoin#35205: kernel,node: add `dbcache` setter and clarify defaults
f280f5eb474 wallet: rpc: deprecate removeprunedfunds
4e8c4bc794c test: classify SOCKS5 peers via getpeerinfo addrbind
17c5e33e9c5 Merge bitcoin/bitcoin#35216: qa: Improve functional test support on illumos and *BSD
13b53f8bf67 iwyu: Fix warnings in `src/consensus` and treat them as errors
bb19f1da19c fuzz: don't connman.ReceiveMsgFrom oversized msg
8a4bab8e975 Merge bitcoin/bitcoin#35863: test: fix wrong transaction in GetP2SHSigOpCount assertion
975a314667e Merge bitcoin/bitcoin#35832: p2p: avoid block disk reads on unnecessary requests
d24610fa2c7 Merge bitcoin/bitcoin#35870: guix: move `python-minimal` to Linux GUI build
b33a5b5767e Merge bitcoin/bitcoin#35871: refactor: Annotate `MakeAndPushFeature` with `[[maybe_unused]]`
4b322989ac2 Merge bitcoin/bitcoin#34995: iwyu: Fix warnings in `src/common` and treat them as errors
75f024a84e0 Merge bitcoin/bitcoin#35875: ci: Fix NetBSD SDK download failure, Temp. remove riscv32 from GHA
fa06ea42448 ci: Temporarily remove riscv32 config from GHA matrix
873550bea38 ci: verify cross-build SDK archives
2c87337efe8 ci: update NetBSD cross-build SDK
6a2de55a0d8 test: require `TryGetTotalRam()` detection
cd086c16dd7 node, qt: inline `DEFAULT_DB_CACHE`
8bd9f46082d kernel: allow setting chainstate `dbcache`
8aa21e119b0 kernel, node: colocate dbcache bounds
7cfa21d60a5 scripted-diff: use `MIN_DBCACHE_BYTES`
ab634325768 common: cache total RAM as `uint64_t`
031fa402c8a scripted-diff: use `TryGetTotalRam`
264555af3cc rpc: avoid descriptor range counter overflow
143a13fb2bd test: characterize descriptor range endpoint
41c44f55885 node, qt: use `1_MiB` for dbcache conversions
0238aebf619 refactor: Annotate `MakeAndPushFeature` with `[[maybe_unused]]`
1ed14c61222 Merge bitcoin-core/gui#872: Menu action to export a watchonly wallet
b75eb938a04 guix: move python-minimal to GUI build
101400b28f7 guix: remove -Werror=dev
e27c179db2f Merge bitcoin/bitcoin#35869: lint: (re-)add contrib/guix for Python linting
50145f62c92 ci, iwyu: Enforce warning-free `src/common`
30f6b05857f Merge bitcoin/bitcoin#35860: fuzz: Rework rpc fuzz target
dcc2ed52b84 Merge bitcoin/bitcoin#35856: fuzz: cover the mempool interface for transaction announcement
8221d714c78 lint: document CI lief version requirement
594a02c3ae0 lint: re-add guix scripts to mypy linting
e8691056c01 test: Unroll `&&` conditions in macros
ddddffda3af doc: Add doc/release-notes-35836.md
756afe14b5c test: give each ValidateInputsStandardness case its own scope
5559fa464b3 test: fix wrong transaction in GetP2SHSigOpCount assertion
556988790a7 Merge bitcoin/bitcoin#35592: http: check rpcallowip immediately after accepting connection
fa895bb77a8 fuzz: Rework rpc fuzz target
28641fd195d p2p: reject empty getblocktxn requests
dd2561003dd fuzz: cover the mempool interface for transaction announcement
9871fb726cb p2p: reject filtered block inv early when bloom is disabled
aaf94120266 refactor: split p2p_getdata.py in sub-cases
34c03075a5a test: run generic baseindex tests against every index type
11b3e251c48 test: make baseindex flush test chain-length agnostic
8b959f4c6ab test: move unclean_shutdown test to baseindex_tests
2232d6afbe2 test: move index_reorg_crash to baseindex_tests
a3597e26837 test: move BuildChain helper into test mining util
954985e6a38 test: simplify blockfilter test's BuildChain helper
67efced1fc8 Merge bitcoin/bitcoin#35838: qa: Enable `interface_gui.py` on macOS
45f5609f2ed qa: Enable `interface_gui.py` on macOS
fa7fe798c61 wallet: Remove meaningless bool fallback in FundTransaction
9611a356035 Merge bitcoin/bitcoin#35828: util: Make LineReader consistently use string_view
6e2962e48cb Merge bitcoin/bitcoin#35753: kernel: handle null mempool on chainstate deletion
87bc4c74c4d Merge bitcoin/bitcoin#35787: init, rpc: ignore empty addnode values
67998e15c8d Merge bitcoin/bitcoin#35553: test: Add missing test case for getdata requests from blocks-only peers
9b38d077f89 Merge bitcoin-core/gui#953: Adds option to not load the wallet after migration
146988ef6c5 Merge bitcoin/bitcoin#35551: test: add interface_gui.py to test bitcoin-qt startup
7e5952b0aa0 Merge bitcoin/bitcoin#35821: guix: followups to #35537
683ae4c520b guix: consolidate config flags
665f11d04ac guix: consolidate gcc toolchain setup
288f76ed0fc guix: consolidate mingw-w64 toolchain setup
cc9b0f2266d guix: consolidate LLVM toolchain setup
b12a70f330d guix: turn linux/win linker warnings into errors
fd7d4f29704 Merge bitcoin/bitcoin#35795: build: set CMAKE_VISIBILITY_INLINES_HIDDEN in REDUCE_EXPORTS
8ecbe270f0d Merge bitcoin/bitcoin#35606: script: qa: Improve `Key::Fingerprint` type safety
a9d181f2d35 Merge bitcoin/bitcoin#35084: ipc: Add nonunix platform support
6573196e63b doc: Release note for export watchonly wallet gui action
cb51f97f6c5 gui: Menu action for exporting a watchonly wallet
4cea59573c8 add release notes
492a715d784 gui: Adds option to not load the wallet after migration
dff44e4c8f3 util: LineReader - Drop support for raw std::byte spans
5d5cdcd79d4 util: Make LineReader consistently use string_views
e8eaa80ce29 util: LineReader - Don't include newline and acknowledge single-char \r
5907a5c7dc2 gui: Add ExceptionSafeConnect that takes a lambda
7dea464d6b5 Merge bitcoin/bitcoin#35692: addrman: remove unreachable tried-collision branch
a2aab6df97d Merge bitcoin/bitcoin#35810: guix: Drop unused `(guix licenses)` import from `manifest_build.scm`
77440814bf2 fuzz: reset SOCKS5 interrupt between inputs
90ce21e21d0 rpc: reject empty node argument in addnode
69465de4470 init: ignore empty addnode values
e75b76b12c5 Merge bitcoin/bitcoin#35261: guix: disable LTO in GCC
a92e93429ee guix: Drop unused `(guix licenses)` import from `manifest_build.scm`
5be248341a8 bugfix: compare real chunk weight against block weight limit
fc987908699 test: `TestChunkBlockLimits` uses incorrect weight for comparison
e34b8d5a7dc Merge bitcoin/bitcoin#35794: doc: Discourage adding AI agents as commit (co)-authors
b33a7fcd7bd Merge bitcoin/bitcoin#34628: p2p: Replace per-peer transaction rate-limiting with global rate limits
6b059d9dbdb Merge bitcoin/bitcoin#32800: rpc: Distinguish between vsize and sigop adjusted mempool vsize
11ebbd90721 Merge bitcoin/bitcoin#28463: p2p: Increase inbound capacity for block-relay only connections
3f313a774be build: set CMAKE_VISIBILITY_INLINES_HIDDEN in REDUCE_EXPORTS
3a2c52f9d70 Merge bitcoin/bitcoin#35792: refactor: Make all `const static` class members `constexpr`
f5d7cc66ecb doc: Discourage adding AI agents as commit authors
05c35c402cc refactor: Make all `const static` class members `constexpr`
c11508406e6 doc: Update docs that refer to -maxconnections
69ce0dba2ae test: add test that EvictTxPeerIfFull only evicts tx-relaying peers
3ed7f064180 p2p: trigger possible eviction if we support bloom filters and change a peer to tx relay
0bd3d3dfa56 init: make inbound tx relay percentage configurable
cc59aee196e test: add functional test for inbound maxconnection limits
1b76e047364 net: increase inbound capacity for block-relay-only connections
baa5a2ce43a guix: pass --disable-tm-clone-registry to base GCC
9c2589630f0 guix: mirror some arguments from linux-gcc to mingw-w64-gcc
e0b8fbde897 guix: disable-nls in *-base-gcc
7dc87f8e1e2 guix: disable-lto in *-base-gcc
9ed3d6ef2a2 guix: modernise style in *-base-gcc
1eac6a728bf fuzz: populate wallet TXO index in wallet_create_transaction
610dd320d1a Merge bitcoin/bitcoin#35783: chainparams: remove my testnet3 seed
afa5e46bbc6 Merge bitcoin/bitcoin#35076: doc: clarify pruning impact on wallet sync
26b730cdbf2 Merge bitcoin/bitcoin#35320: key: validate BIP32 seed length in CExtKey::SetSeed
edf4b807f05 Merge bitcoin/bitcoin#35781: Update secp256k1 subtree to latest master
774d11c58f2 Merge bitcoin/bitcoin#35664: test: add CLTV and CHECK(MULTI)SIGVERIFY failure-path vectors to script_tests.json
526673487ce Merge bitcoin/bitcoin#34683: rpc: support a formal description of our JSON-RPC interface
290cb2f17ef Merge bitcoin/bitcoin#35775: scripted-diff: Use C.UTF-8 locale in Guix scripts
d472a7798ac Merge bitcoin/bitcoin#32764: guix: Build for macOS using LLVM toolchain only
9755d33390d Merge bitcoin/bitcoin#34808: cmake, translation: Use native Qt TS file as source for translations on Transifex
51143291a6c Merge bitcoin/bitcoin#35782: doc: fix outdated i2p URLs in comments
2cb3bfa8df7 scripted-diff: Use long form of shell options in Guix scripts
711eb10f08b guix: Add copyright headers to Guix scripts
7295b8be704 chainparams: remove my testnet3 seed
419f7427eee doc: fix outdated i2p URLs in comments
a33f240524d Squashed 'src/secp256k1/' changes from bd0287d650..d2d04864ef
c26d4e2d6f0 Update secp256k1 subtree to latest master
22a03ca6944 Merge bitcoin/bitcoin#35694: clusterlin: minor SFL optimizations
7b6f9ba7bad Merge bitcoin/bitcoin#34672: mining: add reason/debug to `submitSolution` and unify with `submitBlock`
5311b15727f Merge bitcoin/bitcoin#33014: rpc: Fix internal bug in descriptorprocesspsbt when encountering invalid signatures
c9cedebfffb coins: group private cache helpers
8a90c7cd973 guix: Build for macOS using LLVM toolchain only
db74d3390a3 doc: clarify test placement guidance
d3d74e701f7 ipc, refactor: Update mp::g_thread_context references
80f831494e5 guix: Fix `glibc` version in comment
8916f7967e1 scripted-diff: Use C.UTF-8 locale in Guix scripts
a2e074d66ac Merge bitcoin-core/gui#951: test: Nudge toward QT_STYLE_OVERRIDE=fusion on macOS
6ced9ad782b Merge bitcoin/bitcoin#35770: net: Simplify `AddressPosition` comparitor
b8844d3df75 Merge bitcoin/bitcoin#35766: p2p: Assume v2transport for addresses from seeds
fa7f5537817 test: Suppress implicit-unsigned-integer-truncation:SaltedCoinsCacheHasher::operator()
075e7f42187 net: Simplify `AddressPosition` comparitor
fa0c8337a8d test: Nudge toward QT_STYLE_OVERRIDE=fusion on macOS
faa50c08b17 refactor: Run clang-format on qt test_main.cpp
bc49bd154a3 Merge bitcoin/bitcoin#35709: depends: Update Qt to 6.8.4
efa1800a885 Merge bitcoin/bitcoin#35769: depends, zeromq: Apply upstream patch
fc4ceda8b61 Merge bitcoin-core/gui#949: Fix `-Wsfinae-incomplete` warnings when building with GCC 16.x
559d042ba25 Merge bitcoin/bitcoin#35736: bitcoin-util: replace netmagic command with getchainparams command
8f2ed31f702 Merge bitcoin/bitcoin#35767: fuzz: Avoid dangling prevoutfetch threads after AFL fork
a31c30290d4 Merge bitcoin/bitcoin#35746: ci: Test build directory path with spaces
e446ea09c4d depends, zeromq: Apply upstream patch
87b080fe2b6 fuzz: reset the reused mempool in process_message(s)
d522fd31963 fuzz: prepare deterministic mempool rebuilds
b11456386b2 fuzz: let the test input toggle IBD in the p2p fuzz targets
2a29cee6843 test: add helper to reset chainman and mempool
2a4ef42d34e fuzz: share a single FakeNodeClock in the chainman-resetting fuzz targets
32eb5210029 Merge bitcoin/bitcoin#35215: coins: use SipHash-1-3-UJ for CCoinsMap keys
883ef1d85d7 Merge bitcoin/bitcoin#35727: blockencodings: fix extra transaction count
f3f302150b5 ci: Put space and non-ASCII char in `BASE_BUILD_DIR`
a7e980af31b build: Quote host paths in NSIS installer template
faada35f9c0 fuzz: [refactor] Use 100'000 digit separator in __AFL_LOOP
cf0f2aeae00 p2p: Assume v2transport for addresses from seeds
fae067ec4a4 fuzz: Avoid dangling prevoutfetch threads after AFL fork
7e1a750d45d guix, refactor: Use `target` variable instead of hardcoded value
de9b436ba36 depends: Switch from multilib to platform-specific toolchains
d673ca765a5 Merge bitcoin/bitcoin#35537: guix: split builds into Linux, Linux GUI and macOS/Windows
b36c2d78a3a Merge bitcoin/bitcoin#35490: test: cover unused mempool space in coins cache limit
7502b9ddba7 fuzz: check http_request body matches framing
d1d85263f8e Merge bitcoin/bitcoin#35681: test: cover disconnect on private broadcast peer with relay=false
4906594a384 Merge bitcoin-core/gui#950: qt, test: Run GUI tests on macOS with `minimal` QPA plugin
e0c196f9c11 Merge bitcoin/bitcoin#35721: lint: drop most remaining default Ruff rule ignores
fd59d68c262 qt, test: Enable tests on macOS with `minimal` QPA plugin
c8b2aeb2263 qt: Avoid implicit `NSApplication` instantiation
006f8f7d49a Merge bitcoin/bitcoin#35090: fuzz: add p2p_private_broadcast harness
51d36dfd076 qt: Fix `-Wsfinae-incomplete` warnings when building with GCC 16.x
0b0785daa00 guix: split macOS and win builds
008a3e29c88 guix: split builds into Linux(gui) and macOS/Windows
a99b27f1920 validation: handle null mempool on delete
a3b5dc05723 cmake: Add `GenerateWindowsInstaller` script
3bfdcbd7ee4 coins: reuse cache hasher for txid set
2beab94896a coins: use SipHash-1-3-UJ for `CCoinsMap`
7ff55cc6500 bench: add fixed-width SipHash benchmarks
3aea85411f6 test: add SipHash-1-3-UJ coverage
a0ccd4ad171 crypto: add fixed-width SipHash-1-3-UJ
c2d7931b5c8 crypto: add generic SipHash-1-3-UJ
25bfca06d66 refactor: simplify adding SipHash-1-3-UJ
af50ba8500a test: add shared SipHash vectors
fa5cbb89097 uint256: Workaround GCC-14 stringop-overread bug in Compare
18c05d93016 Merge bitcoin/bitcoin#35590: test: wallet: BnB incomplete result on attempt-limit success
21b4b790e48 test: Move cluster_linearize.h contents into cluster_linearize namespace
b56b66fc64b Merge bitcoin/bitcoin#35679: fuzz: Remove unused `DeserializeFromFuzzingInput` params overload
6ee05c4b188 test: wallet: BnB incomplete result on attempt-limit success
6aa5d8d9481 blockencodings: fix extra transaction count
be4e64d9e40 test: characterize extra transaction miscount
2d3f72fd3fa ipc, refactor: Update mp::SpawnProcess call
7298281ba8d bitcoin-util: replace netmagic command with getchainparams command
9d6ba4b3b57 Merge bitcoin/bitcoin#34514: refactor: remove unnecessary `std::move` for a few trivially copyable types
ca9ffb8e123 rpc: add OpenRPC discovery alias
6c9d76d5894 doc: release note for alternate_wtxids in gettransaction
99bdcb064c2 test: compat, ensure downgrade preserves tx witness variants
ef2afc6a0a3 test: Test for wallet txs with alternate wtxids
2d55c7a74dd wallet: Show alternate wtxids in gettransaction
0b1af01bd44 wallet: Replace CWalletTx::SetTx with Update
56cf27db4dc wallet: Store all witness variants of a transaction
798ba6d04fa wallet: Make CWalletTx::tx private and use CWalletTx::GetTx to access
72ebdd6364c wallet: Remove unused CWalletTx CopyFrom and copy constructor
19af439bdf3 wallet: Deserialize directly in CWalletTx's ctor
afab8d4225c fuzz, refactor: Remove `Serialize` overload
efa7f8c1437 fuzz: Remove unused `DeserializeFromFuzzingInput` params overload
6eca11175be lint: remove E731 Ruff ignore
b52454538b0 lint: remove E712 Ruff ignore
e9f19815caa ipc, refactor: Add Stream type alias and use it
3859805f05e ipc, refactor: Add SocketId type alias and use it
2ee9b69c7a1 ipc, refactor: Add ProcessId type alias and use it
34497971418 ipc: Avoid 'unistd.h' error with MSVC
dbcc192dce6 ipc, refactor: fix include order
7c86d4834ed ipc, refactor: use native path separators in test
00287b9a340 ipc, refactor: Change Protocol class field order
33d37f3c35e ipc, refactor: Drop connect/listen/serve exe_name parameters
794940469e7 ipc, moveonly: combine ipc_test.cpp and ipc_tests.cpp
efb4eae3386 clusterlin: avoid recomputing intersections in MergeChunks
4b91ad149f0 clusterlin: reserve the suboptimal-chunk queue up front
e6ca996255b clusterlin: avoid heap allocations in GetLinearization
226e6388b7f depends: Update Qt to 6.8.4
fef99e6563a qt: fix out-of-bounds read in RPCParseCommandLine on empty command
349c72ee00a net_processing: Drop unnecessary txid arg from InitiateTxBroadcastToAll
12b0dc33c4a doc: Add release note for -txsendrate etc
5cde66341a6 tests: basic functional test for tx rate limiting
4842903ac12 rpc: report -txsendrate and bucket info via getnetworkinfo
74a47a52071 init: add -txsendrate configuration parameter
6307bd034bf net_processing: Provide a 30bpm heartbeat log while inv backlog is in use
df31ee57aaf net_processing: add a global delay queue for sending txs
7927650e56d util/tokenbucket.h: Provide a generic TokenBucket class
749bb447f81 txmempool: Drop CompareMiningScoreWithTopology
e1b7490fbc9 net_processing: Replace CompareInvMempoolOrder
6cfc65d2103 txmempool: Add ExtractBestByMiningScoreWithTopology
026f70e05f9 net_processing: Remove per-peer rate-limiting
46c8c471dcf net_processing: bump last_inv_sequence for bip35 messages explicitly
5d57f2cefee test: cover unused mempool space in coins cache
1fc9277a1c1 test: cover disconnect on private broadcast peer with relay=false
bc7d9050467 addrman: remove unreachable tried-collision branch
0390338692a test: check MuSig import private key warnings
5e62fbf09c0 wallet: check descriptor private key completeness on import
cd8d01bf47a descriptors: require complete MuSig private keys
55d3cd51a48 doc: add release note describing change for forbidden clients
d1ed2a6e25d http: check rpcallowip immediately after accepting connection
d24d3cbad01 fuzz: add p2p_private_broadcast harness
c4068cf37b6 test: add negative zero CSV failure script test vector
37edf0e2338 test: add CHECKLOCKTIMEVERIFY failure-path script test vectors
29b124416e4 doc: add release notes for 32800
5d25a0c28d1 rpc: add `vsize_adjusted` field to getrawtransaction output for mempool transactions
eaef8d31118 rpc: add `vsize_adjusted` and `vsize_bip141` field to mempool-related RPCs
6d387af562f psbt: remove write-only global xpub tracking set
3b7051c7e33 test: check combinepsbt with conflicting global xpub origins
7c632c0e2a2 psbt: avoid duplicate global xpub keys when merging
a86a96d17b3 test: add CHECKSIGVERIFY/CHECKMULTISIGVERIFY failure script test vectors
07fb58b9ef2 test: Test a locked wallet rejects an empty importdescriptors request
aeca0610865 rpc: reject null for optional parameters
f4a6d079c42 qa: Support `get_bind_addrs` and `feature_bind_extra` on illumos
5e96a8fd5ac doc: Add `lsof` to Test Suite Dependencies on NetBSD
5d01aa4772a qa: Ignore `lsof` warnings on NetBSD
70352fda038 qa: Strip prefix length from NetBSD `ifconfig` output
1c1735567e2 doc: Add `lsof` to Test Suite Dependencies on FreeBSD
4cb7f39c2ce qa: Drop OpenBSD from supported platforms in `get_bind_addrs` function
8a982eea854 qa: Add `skip_if_no_lsof_on_nonlinux` helper and use it where needed
7e973cce52c depends: Make tarball creation from local directory reproducible
e5b7785447f test: wallet: resend: avoid internal behavior via removeprunedfunds
c9a70f93387 script: qa: Improve Key::Fingerprint type safety
aa01721c899 test: add interface_gui.py to test bitcoin-gui startup via RPC
ef0676f4007 rpc: factor getaddressinfo embedded field docs
1fb6b605609 test: add functional test for getopenrpcinfo
672dd42d140 rpc: add getopenrpcinfo command
d5e64b01e1b doc: note -blocknotify is not run during IBD/reindex in help text
f5116c587f7 rpc: add placeholder annotation for deprecated params
26c221a980d rpc: expose RPC metadata for introspection
6a1a66c180c rpc: render Type::ANY in help text instead of aborting
06de34a0333 rpc: erase empty map entry in removeCommand
d4d64ae7393 rpc: add missing string_view include to server.h
278710a88d8 test: Add missing test case for getdata requests from blocks-only peers
156f2c6c49d kernel: add `btck_set_mock_time` for testing time-dependent paths
75929b11edb doc: add release note for submitSolution IPC changes
ed75d70fdb8 refactor: centralize SubmitBlock result handling
cbaa1696f37 mining: add reason and debug output to submitSolution
83f3bc002d0 mining: clarify SubmitBlock result handling
87bca1c2adb net: add options to AttemptToEvictConnection
2cf9d79d84c key: validate BIP32 seed length in CExtKey::SetSeed
3e8e21b2efc txgraph: avoid moving primitive members
d9f94aa882a rpc: avoid moving RPC enum types
b67baed4e7e coins: avoid moving `COutPoint` values
7e19ce200b2 rpc: Fix descriptorprocesspsbt internal bug on invalid signatures
51ee8ca1683 doc: clarify pruning impact on wallet sync
6cca38e2b92 refactor: remove unused PSBTError::Ok
3660678b953 refactor: SignPSBTInput now uses util:Expected
ec61a1af621 depends: Hash included makefiles in package checksums
a434d660250 cmake, translation: Specify English as target language explicitly
4097d6d968e cmake, translation: Sort messages within contexts alphabetically
312ab8ab0a8 cmake, translation: Skip source locations in TS files
4f553bd0da2 cmake, translation: Remove TS to XLIFF conversion
8c30055458b translation: Switch to Qt TS source file

git-subtree-dir: libbitcoinkernel-sys/bitcoin
git-subtree-split: 97462c683d49792a58ba954723a205cda86a5e0b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants