diff --git a/doc/release-notes.md b/doc/release-notes.md
index f2609118a..4a9d31f2a 100644
--- a/doc/release-notes.md
+++ b/doc/release-notes.md
@@ -1,5 +1,13 @@
Bitcoin ABC version 0.21.13 is now available from:
This release includes the following features and fixes:
+
+Low-level changes
+=================
+
+Tests
+---
+
+- `-fallbackfee` was 0 (disabled) by default for the main chain, but 20000 by default for the test chains. Now it is 0 by default for all chains. Testnet and regtest users will have to add fallbackfee=20000 to their configuration if they weren't setting it and they want it to keep working like before. (#16524)
diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp
index e1faf3dec..d68063164 100644
--- a/src/wallet/init.cpp
+++ b/src/wallet/init.cpp
@@ -1,227 +1,228 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2017 The Bitcoin Core developers
// Copyright (c) 2018-2020 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class WalletInit : public WalletInitInterface {
public:
//! Was the wallet component compiled in.
bool HasWalletSupport() const override { return true; }
//! Return the wallets help message.
void AddWalletOptions() const override;
//! Wallets parameter interaction
bool ParameterInteraction() const override;
//! Add wallets that should be opened to list of chain clients.
void Construct(NodeContext &node) const override;
};
const WalletInitInterface &g_wallet_init_interface = WalletInit();
void WalletInit::AddWalletOptions() const {
gArgs.AddArg(
"-avoidpartialspends",
strprintf("Group outputs by address, selecting all or none, instead of "
"selecting on a per-output basis. Privacy is improved as an "
"address is only used once (unless someone sends to it after "
"spending from it), but may result in slightly higher fees "
"as suboptimal coin selection may result due to the added "
"limitation (default: %u (always enabled for wallets with "
"\"avoid_reuse\" enabled))",
DEFAULT_AVOIDPARTIALSPENDS),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-disablewallet",
"Do not load the wallet and disable wallet RPC calls",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-fallbackfee=",
strprintf("A fee rate (in %s/kB) that will be used when fee "
- "estimation has insufficient data (default: %s)",
+ "estimation has insufficient data. 0 to entirely "
+ "disable the fallbackfee feature. (default: %s)",
CURRENCY_UNIT, FormatMoney(DEFAULT_FALLBACK_FEE)),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-keypool=",
strprintf("Set key pool size to (default: %u)",
DEFAULT_KEYPOOL_SIZE),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-maxtxfee=",
strprintf("Maximum total fees (in %s) to use in a single wallet "
"transaction or raw transaction; setting this too low may "
"abort large transactions (default: %s)",
CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MAXFEE)),
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
gArgs.AddArg("-mintxfee=",
strprintf("Fees (in %s/kB) smaller than this are considered "
"zero fee for transaction creation (default: %s)",
CURRENCY_UNIT,
FormatMoney(DEFAULT_TRANSACTION_MINFEE_PER_KB)),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-paytxfee=",
strprintf(
"Fee (in %s/kB) to add to transactions you send (default: %s)",
CURRENCY_UNIT,
FormatMoney(CFeeRate{DEFAULT_PAY_TX_FEE}.GetFeePerK())),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-rescan",
"Rescan the block chain for missing wallet transactions on startup",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-salvagewallet",
"Attempt to recover private keys from a corrupt wallet on startup",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-spendzeroconfchange",
strprintf(
"Spend unconfirmed change when sending transactions (default: %d)",
DEFAULT_SPEND_ZEROCONF_CHANGE),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-upgradewallet", "Upgrade wallet to latest format on startup",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-wallet=",
"Specify wallet database path. Can be specified multiple "
"times to load multiple wallets. Path is interpreted relative "
"to if it is not absolute, and will be created if "
"it does not exist (as a directory containing a wallet.dat "
"file and log files). For backwards compatibility this will "
"also accept names of existing data files in .)",
ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY,
OptionsCategory::WALLET);
gArgs.AddArg(
"-walletbroadcast",
strprintf("Make the wallet broadcast transactions (default: %d)",
DEFAULT_WALLETBROADCAST),
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-walletdir=",
"Specify directory to hold wallets (default: "
"/wallets if it exists, otherwise )",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-walletnotify=",
"Execute command when a wallet transaction changes (%s in cmd "
"is replaced by TxID)",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg(
"-zapwallettxes=",
"Delete all wallet transactions and only recover those parts of the "
"blockchain through -rescan on startup (1 = keep tx meta data e.g. "
"payment request information, 2 = drop tx meta data)",
ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);
gArgs.AddArg("-dblogsize=",
strprintf("Flush wallet database activity from memory to disk "
"log every megabytes (default: %u)",
DEFAULT_WALLET_DBLOGSIZE),
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY,
OptionsCategory::WALLET_DEBUG_TEST);
gArgs.AddArg(
"-flushwallet",
strprintf("Run a thread to flush wallet periodically (default: %d)",
DEFAULT_FLUSHWALLET),
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY,
OptionsCategory::WALLET_DEBUG_TEST);
gArgs.AddArg("-privdb",
strprintf("Sets the DB_PRIVATE flag in the wallet db "
"environment (default: %d)",
DEFAULT_WALLET_PRIVDB),
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY,
OptionsCategory::WALLET_DEBUG_TEST);
gArgs.AddArg("-walletrejectlongchains",
strprintf("Wallet will not create transactions that violate "
"mempool chain limits (default: %d)",
DEFAULT_WALLET_REJECT_LONG_CHAINS),
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY,
OptionsCategory::WALLET_DEBUG_TEST);
}
bool WalletInit::ParameterInteraction() const {
const bool is_multiwallet = gArgs.GetArgs("-wallet").size() > 1;
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
return true;
}
if (gArgs.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY) &&
gArgs.SoftSetBoolArg("-walletbroadcast", false)) {
LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting "
"-walletbroadcast=0\n",
__func__);
}
if (gArgs.GetBoolArg("-salvagewallet", false)) {
if (is_multiwallet) {
return InitError(
strprintf("%s is only allowed with a single wallet file",
"-salvagewallet"));
}
// Rewrite just private keys: rescan to find transactions
if (gArgs.SoftSetBoolArg("-rescan", true)) {
LogPrintf("%s: parameter interaction: -salvagewallet=1 -> setting "
"-rescan=1\n",
__func__);
}
}
bool zapwallettxes = gArgs.GetBoolArg("-zapwallettxes", false);
// -zapwallettxes implies dropping the mempool on startup
if (zapwallettxes && gArgs.SoftSetBoolArg("-persistmempool", false)) {
LogPrintf("%s: parameter interaction: -zapwallettxes enabled -> "
"setting -persistmempool=0\n",
__func__);
}
// -zapwallettxes implies a rescan
if (zapwallettxes) {
if (is_multiwallet) {
return InitError(
strprintf("%s is only allowed with a single wallet file",
"-zapwallettxes"));
}
if (gArgs.SoftSetBoolArg("-rescan", true)) {
LogPrintf("%s: parameter interaction: -zapwallettxes enabled -> "
"setting -rescan=1\n",
__func__);
}
}
if (is_multiwallet) {
if (gArgs.GetBoolArg("-upgradewallet", false)) {
return InitError(
strprintf("%s is only allowed with a single wallet file",
"-upgradewallet"));
}
}
if (gArgs.GetBoolArg("-sysperms", false)) {
return InitError("-sysperms is not allowed in combination with enabled "
"wallet functionality");
}
return true;
}
void WalletInit::Construct(NodeContext &node) const {
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) {
LogPrintf("Wallet disabled!\n");
return;
}
gArgs.SoftSetArg("-wallet", "");
node.chain_clients.emplace_back(
interfaces::MakeWalletClient(*node.chain, gArgs.GetArgs("-wallet")));
}
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index ac5d38972..0cc89cf59 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -1,5471 +1,5471 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2019 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include