diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8a5001aa00..37daf51c7c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,7 +30,7 @@ set(CLIENT_NAME "Elements Core")
set(CLIENT_VERSION_MAJOR 29)
set(CLIENT_VERSION_MINOR 1)
set(CLIENT_VERSION_BUILD 0)
-set(CLIENT_VERSION_RC 2)
+set(CLIENT_VERSION_RC 0)
set(CLIENT_VERSION_IS_RELEASE "true")
set(COPYRIGHT_YEAR "2025")
diff --git a/ci/test/00_setup_env_native_centos.sh b/ci/test/00_setup_env_native_centos.sh
index c423d788eb..af27a5ebe1 100755
--- a/ci/test/00_setup_env_native_centos.sh
+++ b/ci/test/00_setup_env_native_centos.sh
@@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_native_centos
export CI_IMAGE_NAME_TAG="quay.io/centos/centos:stream10"
-export CI_BASE_PACKAGES="gcc-c++ glibc-devel libstdc++-devel ccache make git python3 python3-pip which patch xz procps-ng ksh rsync coreutils bison e2fsprogs cmake"
+export CI_BASE_PACKAGES="gcc-c++ glibc-devel libstdc++-devel ccache make git python3 python3-pip which patch xz procps-ng rsync coreutils bison e2fsprogs cmake dash"
export PIP_PACKAGES="pyzmq"
export DEP_OPTS="DEBUG=1" # Temporarily enable a DEBUG=1 build to check for GCC-bug-117966 regressions. This can be removed once the minimum GCC version is bumped to 12 in the previous releases task, see https://github.com/bitcoin/bitcoin/issues/31436#issuecomment-2530717875
export GOAL="install"
diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh
index 0d9482d693..9295fb5639 100755
--- a/ci/test/03_test_script.sh
+++ b/ci/test/03_test_script.sh
@@ -93,7 +93,7 @@ fi
if [ -z "$NO_DEPENDS" ]; then
case "${CI_IMAGE_NAME_TAG}" in
*centos*|*rocky*)
- SHELL_OPTS="CONFIG_SHELL=/bin/ksh" # Temporarily use ksh instead of dash, until https://bugzilla.redhat.com/show_bug.cgi?id=2335416 is fixed.
+ SHELL_OPTS="CONFIG_SHELL=/bin/dash"
;;
*)
SHELL_OPTS="CONFIG_SHELL="
diff --git a/doc/release-notes.md b/doc/release-notes.md
index f5a91e1ada..923d34a99b 100644
--- a/doc/release-notes.md
+++ b/doc/release-notes.md
@@ -1,6 +1,6 @@
-Bitcoin Core version 29.1rc2 is now available from:
+Bitcoin Core version 29.1 is now available from:
-
+
This release includes various bug fixes and performance
improvements, as well as updated translations.
@@ -113,6 +113,10 @@ function signature instead of just the function name. (#32604)
- #32859 test: correctly detect nonstd TRUC tx vsize in feature_taproot
- #33001 test: Do not pass tests on unhandled exceptions
+### Indexes
+
+- #33212 index: Don't commit state in BaseIndex::Rewind
+
### Util
- #32248 Remove support for RNDR/RNDRRS for aarch64
@@ -162,10 +166,12 @@ function signature instead of just the function name. (#32604)
- #33088 doc: move cmake -B build -LH up in Unix build docs
- #33133 rpc: fix getpeerinfo ping duration unit docs
- #33119 rpc: Fix 'getdescriptoractivity' RPCHelpMan, add test to verify fix
+- #33236 doc: Remove wrong and redundant doxygen tag
### CI
- #32184 ci: Add workaround for vcpkg's libevent package
+- #33261 ci: return to using dash in CentOS job
### Misc
diff --git a/src/policy/feerate.h b/src/policy/feerate.h
index d742a43acc..6bcb5ddf5b 100644
--- a/src/policy/feerate.h
+++ b/src/policy/feerate.h
@@ -44,9 +44,6 @@ public:
/**
* Construct a fee rate from a fee in satoshis and a vsize in vB.
- *
- * param@[in] nFeePaid The fee paid by a transaction, in satoshis
- * param@[in] num_bytes The vsize of a transaction, in vbytes
*/
CFeeRate(const CAmount& nFeePaid, uint32_t num_bytes);
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index 2dd1cd8542..2b814d92b0 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -701,15 +701,15 @@ util::Result SelectCoinsSRD(const std::vector& utx
/** Find a subset of the OutputGroups that is at least as large as, but as close as possible to, the
* target amount; solve subset sum.
- * param@[in] groups OutputGroups to choose from, sorted by value in descending order.
- * param@[in] nTotalLower Total (effective) value of the UTXOs in groups.
- * param@[in] nTargetValue Subset sum target, not including change.
- * param@[out] vfBest Boolean vector representing the subset chosen that is closest to
+ * @param[in] groups OutputGroups to choose from, sorted by value in descending order.
+ * @param[in] nTotalLower Total (effective) value of the UTXOs in groups.
+ * @param[in] nTargetValue Subset sum target, not including change.
+ * @param[out] vfBest Boolean vector representing the subset chosen that is closest to
* nTargetValue, with indices corresponding to groups. If the ith
* entry is true, that means the ith group in groups was selected.
- * param@[out] nBest Total amount of subset chosen that is closest to nTargetValue.
- * paramp[in] max_selection_weight The maximum allowed weight for a selection result to be valid.
- * param@[in] iterations Maximum number of tries.
+ * @param[out] nBest Total amount of subset chosen that is closest to nTargetValue.
+ * @param[in] max_selection_weight The maximum allowed weight for a selection result to be valid.
+ * @param[in] iterations Maximum number of tries.
*/
static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::vector& groups,
const CAmount& nTotalLower, const CAmount& nTargetValue,
diff --git a/src/wallet/spend.h b/src/wallet/spend.h
index 7eb8c37de5..9c6403b913 100644
--- a/src/wallet/spend.h
+++ b/src/wallet/spend.h
@@ -130,14 +130,14 @@ FilteredOutputGroups GroupOutputs(const CWallet& wallet,
* the solution (according to the waste metric) will be chosen. If a valid input cannot be found from any
* single OutputType, fallback to running `ChooseSelectionResult()` over all available coins.
*
- * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees
- * param@[in] nTargetValue The target value
- * param@[in] groups The grouped outputs mapped by coin eligibility filters
- * param@[in] coin_selection_params Parameters for the coin selection
- * param@[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType
+ * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs
+ * @param[in] nTargetValue The target value
+ * @param[in] groups The grouped outputs mapped by coin eligibility filters
+ * @param[in] coin_selection_params Parameters for the coin selection
+ * @param[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType
* returns If successful, a SelectionResult containing the input set
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")
- * or (2) an specific error message if there was something particularly wrong (e.g. a selection
+ * or (2) a specific error message if there was something particularly wrong (e.g. a selection
* result that surpassed the tx max weight size).
*/
util::Result AttemptSelection(interfaces::Chain& chain, const CAmountMap& mapTargetValue, OutputGroupTypeMap& groups,
@@ -148,13 +148,13 @@ util::Result AttemptSelection(interfaces::Chain& chain, const C
* Multiple coin selection algorithms will be run and the input set that produces the least waste
* (according to the waste metric) will be chosen.
*
- * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees
- * param@[in] nTargetValue The target value
- * param@[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative).
- * param@[in] coin_selection_params Parameters for the coin selection
+ * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs
+ * @param[in] nTargetValue The target value
+ * @param[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative).
+ * @param[in] coin_selection_params Parameters for the coin selection
* returns If successful, a SelectionResult containing the input set
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")
- * or (2) an specific error message if there was something particularly wrong (e.g. a selection
+ * or (2) a specific error message if there was something particularly wrong (e.g. a selection
* result that surpassed the tx max weight size).
*/
util::Result ChooseSelectionResult(interfaces::Chain& chain, const CAmountMap& mapTargetValue, Groups& groups, const CoinSelectionParams& coin_selection_params);
@@ -189,10 +189,10 @@ util::Result FetchSelectedInputs(const CWallet& wallet, const
/**
* Select a set of coins such that nTargetValue is met; never select unconfirmed coins if they are not ours
- * param@[in] wallet The wallet which provides data necessary to spend the selected coins
- * param@[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering
- * param@[in] nTargetValue The target value
- * param@[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends,
+ * @param[in] wallet The wallet which provides data necessary to spend the selected coins
+ * @param[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering
+ * @param[in] nTargetValue The target value
+ * @param[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends,
* and whether to subtract the fee from the outputs.
* returns If successful, a SelectionResult containing the selected coins
* If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds")