From 22bd00651a48a50ec1d3b7f717b375f62719b456 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Sun, 11 Jan 2026 14:09:44 +0100 Subject: [PATCH 01/15] doc: add 433 (Pay to Anchor) to bips.md Github-Pull: #34252 Rebased-From: 44b12cdb11f0fd3264f24f537a5d6989e4fe96a9 --- doc/bips.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/bips.md b/doc/bips.md index 97645d0eebe..c814717a09f 100644 --- a/doc/bips.md +++ b/doc/bips.md @@ -73,3 +73,4 @@ BIPs that are implemented by Bitcoin Core: * [`BIP 386`](https://github.com/bitcoin/bips/blob/master/bip-0386.mediawiki): tr() Output Script Descriptors are implemented as of **v22.0** ([PR 22051](https://github.com/bitcoin/bitcoin/pull/22051)). * [`BIP 387`](https://github.com/bitcoin/bips/blob/master/bip-0387.mediawiki): Tapscript Multisig Output Script Descriptors are implemented as of **v24.0** ([PR 24043](https://github.com/bitcoin/bitcoin/pull/24043)). * [`BIP 431`](https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki): transactions with nVersion=3 are standard and treated as Topologically Restricted Until Confirmation as of **v28.0** ([PR 29496](https://github.com/bitcoin/bitcoin/pull/29496)). +* [`BIP 433`](https://github.com/bitcoin/bips/blob/master/bip-0433.mediawiki): Spending of Pay to Anchor (P2A) outputs is standard as of **v28.0** ([PR 30352](https://github.com/bitcoin/bitcoin/pull/30352)). From 7e1090f5e8056dd6042ecfe34eae3992a81a18fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Tue, 13 Jan 2026 12:53:51 +0100 Subject: [PATCH 02/15] psbt: Fix `PSBTInputSignedAndVerified` bounds `assert` The previous `assert` used `>=`, allowing `input_index == psbt.inputs.size()` and out-of-bounds access in `psbt.inputs[input_index]`. Found during review: https://github.com/bitcoin/bitcoin/pull/31650#discussion_r2685892867 Github-Pull: #34272 Rebased-From: 2f5b1c5f80590ffa6b5a5bcfb21fddb1dc22e852 --- src/psbt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/psbt.cpp b/src/psbt.cpp index 28ccdcb1eaa..30c0d88a938 100644 --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -301,7 +301,7 @@ bool PSBTInputSigned(const PSBTInput& input) bool PSBTInputSignedAndVerified(const PartiallySignedTransaction psbt, unsigned int input_index, const PrecomputedTransactionData* txdata) { CTxOut utxo; - assert(psbt.inputs.size() >= input_index); + assert(input_index < psbt.inputs.size()); const PSBTInput& input = psbt.inputs[input_index]; if (input.non_witness_utxo) { From 4431a60f9c75da2a417d50cd87bcd269f3147489 Mon Sep 17 00:00:00 2001 From: brunoerg Date: Wed, 31 Dec 2025 12:04:38 -0300 Subject: [PATCH 03/15] test: fix feature_pruning when built without wallet Github-Pull: #34185 Rebased-From: 9b57c8d2bd15a414e08a9e43367d8d3d82c25fe4 --- test/functional/feature_pruning.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/functional/feature_pruning.py b/test/functional/feature_pruning.py index 76c79fe0036..8023016c821 100755 --- a/test/functional/feature_pruning.py +++ b/test/functional/feature_pruning.py @@ -354,10 +354,6 @@ class PruneTest(BitcoinTestFramework): # check that wallet loads successfully when restarting a pruned node after IBD. # this was reported to fail in #7494. - self.log.info("Syncing node 5 to test wallet") - self.connect_nodes(0, 5) - nds = [self.nodes[0], self.nodes[5]] - self.sync_blocks(nds, wait=5, timeout=300) self.restart_node(5, extra_args=["-prune=550", "-blockfilterindex=1"]) # restart to trigger rescan self.log.info("Success") @@ -467,6 +463,10 @@ class PruneTest(BitcoinTestFramework): self.log.info("Test manual pruning with timestamps") self.manual_test(4, use_timestamp=True) + self.log.info("Syncing node 5 to node 0") + self.connect_nodes(0, 5) + self.sync_blocks([self.nodes[0], self.nodes[5]], wait=5, timeout=300) + if self.is_wallet_compiled(): self.log.info("Test wallet re-scan") self.wallet_test() From 311da7fee3aba2e6765e193f963b568cf668dbd1 Mon Sep 17 00:00:00 2001 From: brunoerg Date: Wed, 31 Dec 2025 15:11:16 -0300 Subject: [PATCH 04/15] test: check wallet rescan properly in feature_pruning Github-Pull: #34185 Rebased-From: 8fb5e5f41ddf550a78b1253184d79a107097815a --- test/functional/feature_pruning.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/functional/feature_pruning.py b/test/functional/feature_pruning.py index 8023016c821..d9a4c9c5b7e 100755 --- a/test/functional/feature_pruning.py +++ b/test/functional/feature_pruning.py @@ -346,16 +346,22 @@ class PruneTest(BitcoinTestFramework): self.log.info("Success") - def wallet_test(self): + def test_wallet_rescan(self): # check that the pruning node's wallet is still in good shape self.log.info("Stop and start pruning node to trigger wallet rescan") self.restart_node(2, extra_args=["-prune=550"]) - self.log.info("Success") + + wallet_info = self.nodes[2].getwalletinfo() + self.wait_until(lambda: wallet_info["scanning"] == False) + self.wait_until(lambda: wallet_info["lastprocessedblock"]["height"] == self.nodes[2].getblockcount()) # check that wallet loads successfully when restarting a pruned node after IBD. # this was reported to fail in #7494. self.restart_node(5, extra_args=["-prune=550", "-blockfilterindex=1"]) # restart to trigger rescan - self.log.info("Success") + + wallet_info = self.nodes[5].getwalletinfo() + self.wait_until(lambda: wallet_info["scanning"] == False) + self.wait_until(lambda: wallet_info["lastprocessedblock"]["height"] == self.nodes[0].getblockcount()) def run_test(self): self.log.info("Warning! This test requires 4GB of disk space") @@ -469,7 +475,7 @@ class PruneTest(BitcoinTestFramework): if self.is_wallet_compiled(): self.log.info("Test wallet re-scan") - self.wallet_test() + self.test_wallet_rescan() self.log.info("Test it's not possible to rescan beyond pruned data") self.test_rescan_blockchain() From de79f7d01ce43189006cadf08296672fb4d5d5ca Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Wed, 14 Jan 2026 12:09:11 +0000 Subject: [PATCH 05/15] qa: Fix Windows logging bug The regex `(.*)` was capturing `\r` from subprocess output on Windows, causing the closing parenthesis in logs to wrap to the next line. Stripping whitespace from the regex match fixes the formatting. Github-Pull: #34282 Rebased-From: 979d41bfab248990d7d520873d17fe52daa8d402 --- test/functional/test_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 9d556d1cd7b..56522aa6ffd 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -765,7 +765,7 @@ class TestHandler: status = "Passed" elif proc.returncode == TEST_EXIT_SKIPPED: status = "Skipped" - skip_reason = re.search(r"Test Skipped: (.*)", stdout).group(1) + skip_reason = re.search(r"Test Skipped: (.*)", stdout).group(1).strip() else: status = "Failed" self.jobs.remove(job) From 810c75b9b1a7efb2f8c021fcdc278488f702cd98 Mon Sep 17 00:00:00 2001 From: Padraic Slattery Date: Mon, 19 Jan 2026 17:45:37 +0100 Subject: [PATCH 06/15] chore: Update outdated GitHub Actions versions Github-Pull: #34344 Rebased-From: 9482f00df0b05e8ef710a7f0fac3262855ce335f --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1355c8cf12..2d03bb04761 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -235,7 +235,7 @@ jobs: sed -i '1s/^/set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.5)\n/' "${VCPKG_INSTALLATION_ROOT}/scripts/ports.cmake" - name: vcpkg tools cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: C:/vcpkg/downloads/tools key: ${{ github.job }}-vcpkg-tools @@ -341,7 +341,7 @@ jobs: uses: ./.github/actions/save-caches - name: Upload built executables - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: x86_64-w64-mingw32-executables-${{ github.run_id }} path: | @@ -363,7 +363,7 @@ jobs: - *CHECKOUT - name: Download built executables - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: x86_64-w64-mingw32-executables-${{ github.run_id }} From 33195bdd9ee9ded5aec562602978fb89d2d99f4b Mon Sep 17 00:00:00 2001 From: fanquake Date: Tue, 20 Jan 2026 16:59:33 +0000 Subject: [PATCH 07/15] test: allow overriding tar in get_previous_releases Facilitate use on distros that might have 'tar' as something else, such as 'gtar', i.e Chimera. Github-Pull: #34390 Rebased-From: be2b48b9f3e56b672e391e18a09f2d5f4e78d74e --- test/get_previous_releases.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/get_previous_releases.py b/test/get_previous_releases.py index ecb585c12d7..d6344a5ca56 100755 --- a/test/get_previous_releases.py +++ b/test/get_previous_releases.py @@ -23,6 +23,8 @@ import time import urllib.request import zipfile +TAR = os.getenv('TAR', 'tar') + SHA256_SUMS = { "0e2819135366f150d9906e294b61dff58fd1996ebd26c2f8e979d6c0b7a79580": {"tag": "v0.14.3", "archive": "bitcoin-0.14.3-aarch64-linux-gnu.tar.gz"}, "d86fc90824a85c38b25c8488115178d5785dbc975f5ff674f9f5716bc8ad6e65": {"tag": "v0.14.3", "archive": "bitcoin-0.14.3-arm-linux-gnueabihf.tar.gz"}, @@ -202,7 +204,7 @@ def download_binary(tag, args) -> int: print(f"Zip extraction failed: {e}", file=sys.stderr) return 1 else: - ret = subprocess.run(['tar', '-zxf', archive, '-C', tag, + ret = subprocess.run([TAR, '-zxf', archive, '-C', tag, '--strip-components=1', 'bitcoin-{tag}'.format(tag=tag[1:])]).returncode if ret != 0: From c294b661266bcf81b16894aa6bff0dafa88d7b86 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Wed, 14 Jan 2026 13:07:37 +0100 Subject: [PATCH 08/15] build: Temporarily remove confusing and brittle -fdebug-prefix-map Github-Pull: #34281 Rebased-From: fa37928536e0048a262260baf998ead026b14bb9 --- CMakeLists.txt | 5 ++--- contrib/guix/libexec/build.sh | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f832625170..3b2e0cd5c2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -484,9 +484,8 @@ try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK # which can cause issues with coverage builds, particularly when using # Clang in the OSS-Fuzz environment due to its use of other options # and a third party script, or with GCC. -try_append_cxx_flags("-fdebug-prefix-map=A=B" TARGET core_interface SKIP_LINK - IF_CHECK_PASSED "-fdebug-prefix-map=${PROJECT_SOURCE_DIR}/src=." -) +# Set `-fmacro-prefix-map`, so that source file names are expanded without the +# src prefix. try_append_cxx_flags("-fmacro-prefix-map=A=B" TARGET core_interface SKIP_LINK IF_CHECK_PASSED "-fmacro-prefix-map=${PROJECT_SOURCE_DIR}/src=." ) diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh index f23133fd584..ebfafb75baa 100755 --- a/contrib/guix/libexec/build.sh +++ b/contrib/guix/libexec/build.sh @@ -211,6 +211,7 @@ CONFIGFLAGS="-DREDUCE_EXPORTS=ON -DBUILD_BENCH=OFF -DBUILD_GUI_TESTS=OFF -DBUILD # CFLAGS HOST_CFLAGS="-O2 -g" HOST_CFLAGS+=$(find /gnu/store -maxdepth 1 -mindepth 1 -type d -exec echo -n " -ffile-prefix-map={}=/usr" \;) +HOST_CFLAGS+=" -fdebug-prefix-map=${DISTSRC}/src=." case "$HOST" in *mingw*) HOST_CFLAGS+=" -fno-ident" ;; *darwin*) unset HOST_CFLAGS ;; From eda6c979bd7b6971560938c1a4b24671894c6f44 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Mon, 26 Jan 2026 10:55:31 +0100 Subject: [PATCH 09/15] doc: Remove outdated -fdebug-prefix-map section in dev notes The section claims to be for ccache builds, however those are already fixed after commit 1cc58d3a0c653ac30df04d1010a3cf84c6bc307a. If there are still any build or debug problems after that commit, dedicated instructions can be added back, along with exact steps to reproduce and test. Github-Pull: #34413 Rebased-From: fa06cd4ba7303bd3036467cf00d12f36c94bcaff --- doc/developer-notes.md | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/doc/developer-notes.md b/doc/developer-notes.md index 220343ab321..558e054089a 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -305,37 +305,6 @@ If you need to build exclusively for debugging, set the `-DCMAKE_BUILD_TYPE` to `Debug` (i.e. `-DCMAKE_BUILD_TYPE=Debug`). You can always check the cmake build options of an existing build with `ccmake build`. -### Show sources in debugging - -If you have ccache enabled, absolute paths are stripped from debug information -with the `-fdebug-prefix-map` and `-fmacro-prefix-map` options (if supported by the -compiler). This might break source file detection in case you move binaries -after compilation, debug from the directory other than the project root or use -an IDE that only supports absolute paths for debugging (e.g. it won't stop at breakpoints). - -There are a few possible fixes: - -1. Configure source file mapping. - -For `gdb` create or append to [`.gdbinit` file](https://sourceware.org/gdb/current/onlinedocs/gdb#gdbinit-man): -``` -set substitute-path ./src /path/to/project/root/src -``` - -For `lldb` create or append to [`.lldbinit` file](https://lldb.llvm.org/man/lldb.html#configuration-files): -``` -settings set target.source-map ./src /path/to/project/root/src -``` - -2. Add a symlink to the `./src` directory: -``` -ln -s /path/to/project/root/src src -``` - -3. Use `debugedit` to modify debug information in the binary. - -4. If your IDE has an option for this, change your breakpoints to use the file name only. - ### debug.log If the code is behaving strangely, take a look in the `debug.log` file in the data directory; From 4deda48fa44989ee73278fe4eb6e8a27e9e56807 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Mon, 26 Jan 2026 17:17:05 +0100 Subject: [PATCH 10/15] build: Remove outdated comment about -ffile-prefix-map The -ffile-prefix-map option is no longer used and it seems fine to remove the warning about it possibly breaking coverage builds. If this needs documentation, the dev notes seem like a better place, because it also affects other places, such as depends. C.f. commit 407062f2ac93624f350e9e8a4f641c882a2aaf2f Github-Pull: #34413 Rebased-From: fa2e1b85dd6b263a77294566bd361d7873731045 --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b2e0cd5c2b..5d46df1d3bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -479,11 +479,6 @@ configure_file(contrib/filter-lcov.py filter-lcov.py USE_SOURCE_PERMISSIONS COPY # Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review. try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK) -# Avoiding the `-ffile-prefix-map` compiler option because it implies -# `-fcoverage-prefix-map` on Clang or `-fprofile-prefix-map` on GCC, -# which can cause issues with coverage builds, particularly when using -# Clang in the OSS-Fuzz environment due to its use of other options -# and a third party script, or with GCC. # Set `-fmacro-prefix-map`, so that source file names are expanded without the # src prefix. try_append_cxx_flags("-fmacro-prefix-map=A=B" TARGET core_interface SKIP_LINK From 290526bc6dec1cdf0f6db8415b05a794260de14a Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Wed, 21 Jan 2026 08:20:44 +0700 Subject: [PATCH 11/15] wallet: fix removeprunedfunds bug with conflicting transactions removeprunedfunds removes all entries from mapTxSpends for the inputs of the pruned tx. However, this is incorrect, because there could be multiple entries from conflicting transactions (that shouldn't be removed as well). This could lead to the wallet creating invalid transactions, trying to double spend utxos. The bug persists when the conflicting tx was mined, because the wallet trusts its internal accounting instead of calling AddToSpends again. Github-Pull: #34358 Rebased-From: 1f60ca360eb83fa7982b1aac402eaaf477294197 --- src/wallet/wallet.cpp | 11 ++++++-- test/functional/wallet_importprunedfunds.py | 28 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 622ee963afa..15ee7a4eedc 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2383,8 +2383,15 @@ util::Result CWallet::RemoveTxs(WalletBatch& batch, std::vector& txs for (const auto& it : erased_txs) { const Txid hash{it->first}; wtxOrdered.erase(it->second.m_it_wtxOrdered); - for (const auto& txin : it->second.tx->vin) - mapTxSpends.erase(txin.prevout); + for (const auto& txin : it->second.tx->vin) { + auto range = mapTxSpends.equal_range(txin.prevout); + for (auto iter = range.first; iter != range.second; ++iter) { + if (iter->second == hash) { + mapTxSpends.erase(iter); + break; + } + } + } for (unsigned int i = 0; i < it->second.tx->vout.size(); ++i) { m_txos.erase(COutPoint(hash, i)); } diff --git a/test/functional/wallet_importprunedfunds.py b/test/functional/wallet_importprunedfunds.py index d45be4aa188..060549d3b64 100755 --- a/test/functional/wallet_importprunedfunds.py +++ b/test/functional/wallet_importprunedfunds.py @@ -14,6 +14,7 @@ from test_framework.messages import ( from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( assert_equal, + assert_not_equal, assert_raises_rpc_error, wallet_importprivkey, ) @@ -129,6 +130,33 @@ class ImportPrunedFundsTest(BitcoinTestFramework): mb.header.nTime += 1 # modify arbitrary block header field to change block hash assert_raises_rpc_error(-5, "Block not found in chain", w1.importprunedfunds, rawtxn1, mb.serialize().hex()) + self.log.info("Test removeprunedfunds with conflicting transactions") + node = self.nodes[0] + + # Create a transaction + utxo = node.listunspent()[0] + addr = node.getnewaddress() + tx1_id = node.send(outputs=[{addr: 1}], inputs=[utxo])["txid"] + tx1_fee = node.gettransaction(tx1_id)["fee"] + + # Create a conflicting tx with a larger fee (tx1_fee is negative) + output_value = utxo["amount"] + tx1_fee - Decimal("0.00001") + raw_tx2 = node.createrawtransaction(inputs=[utxo], outputs=[{addr: output_value}]) + signed_tx2 = node.signrawtransactionwithwallet(raw_tx2) + tx2_id = node.sendrawtransaction(signed_tx2["hex"]) + assert_not_equal(tx2_id, tx1_id) + + # Both txs should be in the wallet, tx2 replaced tx1 in mempool + assert tx1_id in [tx["txid"] for tx in node.listtransactions()] + assert tx2_id in [tx["txid"] for tx in node.listtransactions()] + + # Remove the replaced tx from wallet + node.removeprunedfunds(tx1_id) + + # The UTXO should still be considered spent (by tx2) + available_utxos = [u["txid"] for u in node.listunspent(minconf=0)] + assert utxo["txid"] not in available_utxos, "UTXO should still be spent by conflicting tx" + if __name__ == '__main__': ImportPrunedFundsTest(__file__).main() From aa937589326dfc7d315fd19f83b7372df15d09ab Mon Sep 17 00:00:00 2001 From: Max Edwards Date: Thu, 25 Sep 2025 18:11:37 +0100 Subject: [PATCH 12/15] ci: remove 3rd party js from windows dll gha job We can use vswhere.exe directly to create a vs developer prompt and so can remove this third party dependency. Co-authored-by: David Gumberg Github-Pull: #32513 Rebased-From: 7ae0497eef8f5b37fc1184897a5bbc9f023dfa67 --- .github/workflows/ci.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d03bb04761..94064acfbc9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -211,11 +211,15 @@ jobs: steps: - *CHECKOUT - - name: Configure Developer Command Prompt for Microsoft Visual C++ - # Using microsoft/setup-msbuild is not enough. - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 + - name: Set up VS Developer Prompt + shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'" + run: | + $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $installationPath = & $vswherePath -latest -property installationPath + & "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x64 -no_logo && set" | foreach-object { + $name, $value = $_ -split '=', 2 + echo "$name=$value" >> $env:GITHUB_ENV + } - name: Get tool information shell: pwsh From 4664621abeac2c2311d0d1aee878d844d5371ea5 Mon Sep 17 00:00:00 2001 From: Max Edwards Date: Thu, 2 Oct 2025 15:06:44 +0100 Subject: [PATCH 13/15] ci: use a more generic way of finding mt.exe This sets up a vs developer command prompt and should hopefully should be more resilient to upstream changes Co-authored-by: David Gumberg Github-Pull: #32513 Rebased-From: e1a1b14c9359751a4d0117a27a303d1f1d3ed30f --- .github/workflows/ci.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94064acfbc9..fb2fa2eeaad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -211,7 +211,8 @@ jobs: steps: - *CHECKOUT - - name: Set up VS Developer Prompt + - &SET_UP_VS + name: Set up VS Developer Prompt shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'" run: | $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" @@ -374,19 +375,14 @@ jobs: - name: Run bitcoind.exe run: ./bin/bitcoind.exe -version - - name: Find mt.exe tool - shell: pwsh - run: | - $sdk_dir = (Get-ItemProperty 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' -Name KitsRoot10).KitsRoot10 - $sdk_latest = (Get-ChildItem "$sdk_dir\bin" -Directory | Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } | Sort-Object Name -Descending | Select-Object -First 1).Name - "MT_EXE=${sdk_dir}bin\${sdk_latest}\x64\mt.exe" >> $env:GITHUB_ENV + - *SET_UP_VS - name: Get bitcoind manifest shell: pwsh run: | - & $env:MT_EXE -nologo -inputresource:bin\bitcoind.exe -out:bitcoind.manifest + mt.exe -nologo -inputresource:bin\bitcoind.exe -out:bitcoind.manifest Get-Content bitcoind.manifest - & $env:MT_EXE -nologo -inputresource:bin\bitcoind.exe -validate_manifest + mt.exe -nologo -inputresource:bin\bitcoind.exe -validate_manifest - name: Run unit tests # Can't use ctest here like other jobs as we don't have a CMake build tree. From 0f01a4c2458bb5a3d6584697345c116512e62ebf Mon Sep 17 00:00:00 2001 From: Max Edwards Date: Thu, 2 Oct 2025 15:13:29 +0100 Subject: [PATCH 14/15] ci: Check windows manifests for all executables The other executables have manifests and these should be checked in addition to bitcoind. Skipping fuzz.exe, bench_bitcoin.exe and test_bitcoin-qt.exe as they do not have manifests. Github-Pull: #32513 Rebased-From: 156927903d64297500dd73380908c654b07bfb1a --- .github/workflows/ci.yml | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb2fa2eeaad..32b2e6d6f20 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -268,14 +268,26 @@ jobs: run: | cmake --build . -j $NUMBER_OF_PROCESSORS --config Release - - name: Get bitcoind manifest + - name: Check executable manifests if: matrix.job-type == 'standard' working-directory: build + shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'" run: | - mt.exe -nologo -inputresource:bin/Release/bitcoind.exe -out:bitcoind.manifest - cat bitcoind.manifest - echo - mt.exe -nologo -inputresource:bin/Release/bitcoind.exe -validate_manifest + mt.exe -nologo -inputresource:bin\Release\bitcoind.exe -out:bitcoind.manifest + Get-Content bitcoind.manifest + + Get-ChildItem -Filter "bin\Release\*.exe" | ForEach-Object { + $exeName = $_.Name + + # Skip as they currently do not have manifests + if ($exeName -eq "fuzz.exe" -or $exeName -eq "bench_bitcoin.exe" -or $exeName -eq "test_bitcoin-qt.exe") { + Write-Host "Skipping $exeName (no manifest present)" + return + } + + Write-Host "Checking $exeName" + & mt.exe -nologo -inputresource:$_.FullName -validate_manifest + } - name: Run test suite if: matrix.job-type == 'standard' @@ -377,12 +389,24 @@ jobs: - *SET_UP_VS - - name: Get bitcoind manifest - shell: pwsh + - name: Check executable manifests + shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'" run: | mt.exe -nologo -inputresource:bin\bitcoind.exe -out:bitcoind.manifest Get-Content bitcoind.manifest - mt.exe -nologo -inputresource:bin\bitcoind.exe -validate_manifest + + Get-ChildItem -Filter "bin\*.exe" | ForEach-Object { + $exeName = $_.Name + + # Skip as they currently do not have manifests + if ($exeName -eq "fuzz.exe" -or $exeName -eq "bench_bitcoin.exe") { + Write-Host "Skipping $exeName (no manifest present)" + return + } + + Write-Host "Checking $exeName" + & mt.exe -nologo -inputresource:$_.FullName -validate_manifest + } - name: Run unit tests # Can't use ctest here like other jobs as we don't have a CMake build tree. From 624c745e4917306198443fc9fb3465e1d6f8f214 Mon Sep 17 00:00:00 2001 From: fanquake Date: Wed, 14 Jan 2026 12:20:59 +0000 Subject: [PATCH 15/15] doc: update release notes for v30.x --- doc/release-notes.md | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/doc/release-notes.md b/doc/release-notes.md index 888b3f919c3..e8ce2e59f29 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -1,9 +1,9 @@ -v30.2 Release Notes +v30.x Release Notes =================== -Bitcoin Core version v30.2 is now available from: +Bitcoin Core version v30.x is now available from: - + This release includes new features, various bug fixes and performance improvements, as well as updated translations. @@ -42,50 +42,46 @@ Notable changes ### Wallet -- #34156 wallet: fix unnamed legacy wallet migration failure -- #34215 wallettool: fix unnamed createfromdump failure walletsdir deletion -- #34221 test: migration, avoid backup name mismatch in default_wallet_failure +- #34358 wallet: fix removeprunedfunds bug with conflicting transactions -### IPC +### PSBT -- #33511 init: Fix Ctrl-C shutdown hangs during wait calls +- #34272 psbt: Fix PSBTInputSignedAndVerified bounds assert ### Build -- #33950 guix: reduce allowed exported symbols -- #34107 build: Update minimum required Boost version -- #34227 guix: Fix osslsigncode tests +- #34281 build: Temporarily remove confusing and brittle -fdebug-prefix-map ### Test -- #34137 test: Avoid hard time.sleep(1) in feature_init.py -- #34226 wallet: test: Relative wallet failed migration cleanup - -### Fuzz - -- #34091 fuzz: doc: remove any mention to address_deserialize_v2 +- #34185 test: fix feature_pruning when built without wallet +- #34282 qa: Fix Windows logging bug +- #34390 test: allow overriding tar in get_previous_releases.py ### Doc -- #34182 doc: Update OpenBSD Build Guide +- #34252 doc: add 433 (Pay to Anchor) to bips.md +- #34413 doc: Remove outdated -fdebug-prefix-map section in dev notes -### Misc +### CI -- #34174 doc: update copyright year to 2026 +- #32513 ci: remove 3rd party js from windows dll gha job +- #34344 ci: update GitHub Actions versions Credits ======= Thanks to everyone who directly contributed to this release: -- Ava Chow - brunoerg -- davidgumberg - fanquake -- furszy - Hennadii Stepanov +- Lőrinc +- m3dwards - MarcoFalke -- Ryan Ofsky +- mzumsande +- Padraic Slattery +- Sebastian Falbesoner As well as to everyone that helped with translations on [Transifex](https://explore.transifex.com/bitcoin/bitcoin/).