Browse Source
0.16f01103c
MOVEONLY: Init functions wallet/wallet.cpp -> wallet/init.cpp (Russell Yanofsky)e7fe320
MOVEONLY: Fee functions wallet/wallet.cpp -> wallet/fees.cpp (Russell Yanofsky)d97fe20
Move some static functions out of wallet.h/cpp (Russell Yanofsky) Pull request description: This just moves some static wallet fee and init functions out of `wallet/wallet.cpp` and into new `wallet/fees.cpp` and `wallet/init.cpp` source files. There is one commit updating declarations and callers, followed by two MOVEONLY commits actually moving the function bodies. This change is desirable because wallet.h/cpp are monolithic and hard to navigate, so pulling things out and grouping together pieces of related functionality should improve the organization. Another motivation is the wallet process separation work in https://github.com/bitcoin/bitcoin/pull/10973, where (at least initially) parameter parsing and fee estimation are still done in the main process rather than the wallet process, and having functions that run in different processes scrambled up throughout wallet.cpp is unnecessarily confusing. Tree-SHA512: 6e6982ff82b2ab4e681c043907e2b1801ceb9513394730070f16c46ad338278a863f5b3759aa13db76a259b268b1c919c81f4e339f0796a3cfb990161e8c316d
Wladimir J. van der Laan
7 years ago
13 changed files with 418 additions and 351 deletions
@ -0,0 +1,89 @@
@@ -0,0 +1,89 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2017 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 "wallet/fees.h" |
||||
|
||||
#include "policy/policy.h" |
||||
#include "txmempool.h" |
||||
#include "util.h" |
||||
#include "validation.h" |
||||
#include "wallet/coincontrol.h" |
||||
#include "wallet/wallet.h" |
||||
|
||||
|
||||
CAmount GetRequiredFee(unsigned int nTxBytes) |
||||
{ |
||||
return std::max(CWallet::minTxFee.GetFee(nTxBytes), ::minRelayTxFee.GetFee(nTxBytes)); |
||||
} |
||||
|
||||
|
||||
CAmount GetMinimumFee(unsigned int nTxBytes, const CCoinControl& coin_control, const CTxMemPool& pool, const CBlockPolicyEstimator& estimator, FeeCalculation *feeCalc) |
||||
{ |
||||
/* User control of how to calculate fee uses the following parameter precedence:
|
||||
1. coin_control.m_feerate |
||||
2. coin_control.m_confirm_target |
||||
3. payTxFee (user-set global variable) |
||||
4. nTxConfirmTarget (user-set global variable) |
||||
The first parameter that is set is used. |
||||
*/ |
||||
CAmount fee_needed; |
||||
if (coin_control.m_feerate) { // 1.
|
||||
fee_needed = coin_control.m_feerate->GetFee(nTxBytes); |
||||
if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; |
||||
// Allow to override automatic min/max check over coin control instance
|
||||
if (coin_control.fOverrideFeeRate) return fee_needed; |
||||
} |
||||
else if (!coin_control.m_confirm_target && ::payTxFee != CFeeRate(0)) { // 3. TODO: remove magic value of 0 for global payTxFee
|
||||
fee_needed = ::payTxFee.GetFee(nTxBytes); |
||||
if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE; |
||||
} |
||||
else { // 2. or 4.
|
||||
// We will use smart fee estimation
|
||||
unsigned int target = coin_control.m_confirm_target ? *coin_control.m_confirm_target : ::nTxConfirmTarget; |
||||
// By default estimates are economical iff we are signaling opt-in-RBF
|
||||
bool conservative_estimate = !coin_control.signalRbf; |
||||
// Allow to override the default fee estimate mode over the CoinControl instance
|
||||
if (coin_control.m_fee_mode == FeeEstimateMode::CONSERVATIVE) conservative_estimate = true; |
||||
else if (coin_control.m_fee_mode == FeeEstimateMode::ECONOMICAL) conservative_estimate = false; |
||||
|
||||
fee_needed = estimator.estimateSmartFee(target, feeCalc, conservative_estimate).GetFee(nTxBytes); |
||||
if (fee_needed == 0) { |
||||
// if we don't have enough data for estimateSmartFee, then use fallbackFee
|
||||
fee_needed = CWallet::fallbackFee.GetFee(nTxBytes); |
||||
if (feeCalc) feeCalc->reason = FeeReason::FALLBACK; |
||||
} |
||||
// Obey mempool min fee when using smart fee estimation
|
||||
CAmount min_mempool_fee = pool.GetMinFee(gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nTxBytes); |
||||
if (fee_needed < min_mempool_fee) { |
||||
fee_needed = min_mempool_fee; |
||||
if (feeCalc) feeCalc->reason = FeeReason::MEMPOOL_MIN; |
||||
} |
||||
} |
||||
|
||||
// prevent user from paying a fee below minRelayTxFee or minTxFee
|
||||
CAmount required_fee = GetRequiredFee(nTxBytes); |
||||
if (required_fee > fee_needed) { |
||||
fee_needed = required_fee; |
||||
if (feeCalc) feeCalc->reason = FeeReason::REQUIRED; |
||||
} |
||||
// But always obey the maximum
|
||||
if (fee_needed > maxTxFee) { |
||||
fee_needed = maxTxFee; |
||||
if (feeCalc) feeCalc->reason = FeeReason::MAXTXFEE; |
||||
} |
||||
return fee_needed; |
||||
} |
||||
|
||||
|
||||
CFeeRate GetDiscardRate(const CBlockPolicyEstimator& estimator) |
||||
{ |
||||
unsigned int highest_target = estimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE); |
||||
CFeeRate discard_rate = estimator.estimateSmartFee(highest_target, nullptr /* FeeCalculation */, false /* conservative */); |
||||
// Don't let discard_rate be greater than longest possible fee estimate if we get a valid fee estimate
|
||||
discard_rate = (discard_rate == CFeeRate(0)) ? CWallet::m_discard_rate : std::min(discard_rate, CWallet::m_discard_rate); |
||||
// Discard rate must be at least dustRelayFee
|
||||
discard_rate = std::max(discard_rate, ::dustRelayFee); |
||||
return discard_rate; |
||||
} |
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2017 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_WALLET_FEES_H |
||||
#define BITCOIN_WALLET_FEES_H |
||||
|
||||
#include "amount.h" |
||||
|
||||
class CBlockPolicyEstimator; |
||||
class CCoinControl; |
||||
class CFeeRate; |
||||
class CTxMemPool; |
||||
struct FeeCalculation; |
||||
|
||||
/**
|
||||
* Return the minimum required fee taking into account the |
||||
* floating relay fee and user set minimum transaction fee |
||||
*/ |
||||
CAmount GetRequiredFee(unsigned int nTxBytes); |
||||
|
||||
/**
|
||||
* Estimate the minimum fee considering user set parameters |
||||
* and the required fee |
||||
*/ |
||||
CAmount GetMinimumFee(unsigned int nTxBytes, const CCoinControl& coin_control, const CTxMemPool& pool, const CBlockPolicyEstimator& estimator, FeeCalculation *feeCalc); |
||||
|
||||
/**
|
||||
* Return the maximum feerate for discarding change. |
||||
*/ |
||||
CFeeRate GetDiscardRate(const CBlockPolicyEstimator& estimator); |
||||
|
||||
#endif // BITCOIN_WALLET_FEES_H
|
@ -0,0 +1,247 @@
@@ -0,0 +1,247 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2017 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 "wallet/init.h" |
||||
|
||||
#include "net.h" |
||||
#include "util.h" |
||||
#include "utilmoneystr.h" |
||||
#include "validation.h" |
||||
#include "wallet/wallet.h" |
||||
|
||||
std::string GetWalletHelpString(bool showDebug) |
||||
{ |
||||
std::string strUsage = HelpMessageGroup(_("Wallet options:")); |
||||
strUsage += HelpMessageOpt("-disablewallet", _("Do not load the wallet and disable wallet RPC calls")); |
||||
strUsage += HelpMessageOpt("-keypool=<n>", strprintf(_("Set key pool size to <n> (default: %u)"), DEFAULT_KEYPOOL_SIZE)); |
||||
strUsage += HelpMessageOpt("-fallbackfee=<amt>", strprintf(_("A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s)"), |
||||
CURRENCY_UNIT, FormatMoney(DEFAULT_FALLBACK_FEE))); |
||||
strUsage += HelpMessageOpt("-discardfee=<amt>", strprintf(_("The fee rate (in %s/kB) that indicates your tolerance for discarding change by adding it to the fee (default: %s). " |
||||
"Note: An output is discarded if it is dust at this rate, but we will always discard up to the dust relay fee and a discard fee above that is limited by the fee estimate for the longest target"), |
||||
CURRENCY_UNIT, FormatMoney(DEFAULT_DISCARD_FEE))); |
||||
strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)"), |
||||
CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MINFEE))); |
||||
strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"), |
||||
CURRENCY_UNIT, FormatMoney(payTxFee.GetFeePerK()))); |
||||
strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions on startup")); |
||||
strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet on startup")); |
||||
strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), DEFAULT_SPEND_ZEROCONF_CHANGE)); |
||||
strUsage += HelpMessageOpt("-txconfirmtarget=<n>", strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), DEFAULT_TX_CONFIRM_TARGET)); |
||||
strUsage += HelpMessageOpt("-usehd", _("Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start") + " " + strprintf(_("(default: %u)"), DEFAULT_USE_HD_WALLET)); |
||||
strUsage += HelpMessageOpt("-walletrbf", strprintf(_("Send transactions with full-RBF opt-in enabled (default: %u)"), DEFAULT_WALLET_RBF)); |
||||
strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format on startup")); |
||||
strUsage += HelpMessageOpt("-wallet=<file>", _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), DEFAULT_WALLET_DAT)); |
||||
strUsage += HelpMessageOpt("-walletbroadcast", _("Make the wallet broadcast transactions") + " " + strprintf(_("(default: %u)"), DEFAULT_WALLETBROADCAST)); |
||||
strUsage += HelpMessageOpt("-walletnotify=<cmd>", _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)")); |
||||
strUsage += HelpMessageOpt("-zapwallettxes=<mode>", _("Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup") + |
||||
" " + _("(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)")); |
||||
|
||||
if (showDebug) |
||||
{ |
||||
strUsage += HelpMessageGroup(_("Wallet debugging/testing options:")); |
||||
|
||||
strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf("Flush wallet database activity from memory to disk log every <n> megabytes (default: %u)", DEFAULT_WALLET_DBLOGSIZE)); |
||||
strUsage += HelpMessageOpt("-flushwallet", strprintf("Run a thread to flush wallet periodically (default: %u)", DEFAULT_FLUSHWALLET)); |
||||
strUsage += HelpMessageOpt("-privdb", strprintf("Sets the DB_PRIVATE flag in the wallet db environment (default: %u)", DEFAULT_WALLET_PRIVDB)); |
||||
strUsage += HelpMessageOpt("-walletrejectlongchains", strprintf(_("Wallet will not create transactions that violate mempool chain limits (default: %u)"), DEFAULT_WALLET_REJECT_LONG_CHAINS)); |
||||
} |
||||
|
||||
return strUsage; |
||||
} |
||||
|
||||
bool WalletParameterInteraction() |
||||
{ |
||||
gArgs.SoftSetArg("-wallet", DEFAULT_WALLET_DAT); |
||||
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__); |
||||
} |
||||
} |
||||
|
||||
int zapwallettxes = gArgs.GetArg("-zapwallettxes", 0); |
||||
// -zapwallettxes implies dropping the mempool on startup
|
||||
if (zapwallettxes != 0 && gArgs.SoftSetBoolArg("-persistmempool", false)) { |
||||
LogPrintf("%s: parameter interaction: -zapwallettxes=%s -> setting -persistmempool=0\n", __func__, zapwallettxes); |
||||
} |
||||
|
||||
// -zapwallettxes implies a rescan
|
||||
if (zapwallettxes != 0) { |
||||
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=%s -> setting -rescan=1\n", __func__, zapwallettxes); |
||||
} |
||||
} |
||||
|
||||
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"); |
||||
if (gArgs.GetArg("-prune", 0) && gArgs.GetBoolArg("-rescan", false)) |
||||
return InitError(_("Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.")); |
||||
|
||||
if (::minRelayTxFee.GetFeePerK() > HIGH_TX_FEE_PER_KB) |
||||
InitWarning(AmountHighWarn("-minrelaytxfee") + " " + |
||||
_("The wallet will avoid paying less than the minimum relay fee.")); |
||||
|
||||
if (gArgs.IsArgSet("-mintxfee")) |
||||
{ |
||||
CAmount n = 0; |
||||
if (!ParseMoney(gArgs.GetArg("-mintxfee", ""), n) || 0 == n) |
||||
return InitError(AmountErrMsg("mintxfee", gArgs.GetArg("-mintxfee", ""))); |
||||
if (n > HIGH_TX_FEE_PER_KB) |
||||
InitWarning(AmountHighWarn("-mintxfee") + " " + |
||||
_("This is the minimum transaction fee you pay on every transaction.")); |
||||
CWallet::minTxFee = CFeeRate(n); |
||||
} |
||||
if (gArgs.IsArgSet("-fallbackfee")) |
||||
{ |
||||
CAmount nFeePerK = 0; |
||||
if (!ParseMoney(gArgs.GetArg("-fallbackfee", ""), nFeePerK)) |
||||
return InitError(strprintf(_("Invalid amount for -fallbackfee=<amount>: '%s'"), gArgs.GetArg("-fallbackfee", ""))); |
||||
if (nFeePerK > HIGH_TX_FEE_PER_KB) |
||||
InitWarning(AmountHighWarn("-fallbackfee") + " " + |
||||
_("This is the transaction fee you may pay when fee estimates are not available.")); |
||||
CWallet::fallbackFee = CFeeRate(nFeePerK); |
||||
} |
||||
if (gArgs.IsArgSet("-discardfee")) |
||||
{ |
||||
CAmount nFeePerK = 0; |
||||
if (!ParseMoney(gArgs.GetArg("-discardfee", ""), nFeePerK)) |
||||
return InitError(strprintf(_("Invalid amount for -discardfee=<amount>: '%s'"), gArgs.GetArg("-discardfee", ""))); |
||||
if (nFeePerK > HIGH_TX_FEE_PER_KB) |
||||
InitWarning(AmountHighWarn("-discardfee") + " " + |
||||
_("This is the transaction fee you may discard if change is smaller than dust at this level")); |
||||
CWallet::m_discard_rate = CFeeRate(nFeePerK); |
||||
} |
||||
if (gArgs.IsArgSet("-paytxfee")) |
||||
{ |
||||
CAmount nFeePerK = 0; |
||||
if (!ParseMoney(gArgs.GetArg("-paytxfee", ""), nFeePerK)) |
||||
return InitError(AmountErrMsg("paytxfee", gArgs.GetArg("-paytxfee", ""))); |
||||
if (nFeePerK > HIGH_TX_FEE_PER_KB) |
||||
InitWarning(AmountHighWarn("-paytxfee") + " " + |
||||
_("This is the transaction fee you will pay if you send a transaction.")); |
||||
|
||||
payTxFee = CFeeRate(nFeePerK, 1000); |
||||
if (payTxFee < ::minRelayTxFee) |
||||
{ |
||||
return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)"), |
||||
gArgs.GetArg("-paytxfee", ""), ::minRelayTxFee.ToString())); |
||||
} |
||||
} |
||||
if (gArgs.IsArgSet("-maxtxfee")) |
||||
{ |
||||
CAmount nMaxFee = 0; |
||||
if (!ParseMoney(gArgs.GetArg("-maxtxfee", ""), nMaxFee)) |
||||
return InitError(AmountErrMsg("maxtxfee", gArgs.GetArg("-maxtxfee", ""))); |
||||
if (nMaxFee > HIGH_MAX_TX_FEE) |
||||
InitWarning(_("-maxtxfee is set very high! Fees this large could be paid on a single transaction.")); |
||||
maxTxFee = nMaxFee; |
||||
if (CFeeRate(maxTxFee, 1000) < ::minRelayTxFee) |
||||
{ |
||||
return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)"), |
||||
gArgs.GetArg("-maxtxfee", ""), ::minRelayTxFee.ToString())); |
||||
} |
||||
} |
||||
nTxConfirmTarget = gArgs.GetArg("-txconfirmtarget", DEFAULT_TX_CONFIRM_TARGET); |
||||
bSpendZeroConfChange = gArgs.GetBoolArg("-spendzeroconfchange", DEFAULT_SPEND_ZEROCONF_CHANGE); |
||||
fWalletRbf = gArgs.GetBoolArg("-walletrbf", DEFAULT_WALLET_RBF); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool WalletVerify() |
||||
{ |
||||
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) |
||||
return true; |
||||
|
||||
uiInterface.InitMessage(_("Verifying wallet(s)...")); |
||||
|
||||
// Keep track of each wallet absolute path to detect duplicates.
|
||||
std::set<fs::path> wallet_paths; |
||||
|
||||
for (const std::string& walletFile : gArgs.GetArgs("-wallet")) { |
||||
if (boost::filesystem::path(walletFile).filename() != walletFile) { |
||||
return InitError(strprintf(_("Error loading wallet %s. -wallet parameter must only specify a filename (not a path)."), walletFile)); |
||||
} |
||||
|
||||
if (SanitizeString(walletFile, SAFE_CHARS_FILENAME) != walletFile) { |
||||
return InitError(strprintf(_("Error loading wallet %s. Invalid characters in -wallet filename."), walletFile)); |
||||
} |
||||
|
||||
fs::path wallet_path = fs::absolute(walletFile, GetDataDir()); |
||||
|
||||
if (fs::exists(wallet_path) && (!fs::is_regular_file(wallet_path) || fs::is_symlink(wallet_path))) { |
||||
return InitError(strprintf(_("Error loading wallet %s. -wallet filename must be a regular file."), walletFile)); |
||||
} |
||||
|
||||
if (!wallet_paths.insert(wallet_path).second) { |
||||
return InitError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), walletFile)); |
||||
} |
||||
|
||||
std::string strError; |
||||
if (!CWalletDB::VerifyEnvironment(walletFile, GetDataDir().string(), strError)) { |
||||
return InitError(strError); |
||||
} |
||||
|
||||
if (gArgs.GetBoolArg("-salvagewallet", false)) { |
||||
// Recover readable keypairs:
|
||||
CWallet dummyWallet; |
||||
std::string backup_filename; |
||||
if (!CWalletDB::Recover(walletFile, (void *)&dummyWallet, CWalletDB::RecoverKeysOnlyFilter, backup_filename)) { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
std::string strWarning; |
||||
bool dbV = CWalletDB::VerifyDatabaseFile(walletFile, GetDataDir().string(), strWarning, strError); |
||||
if (!strWarning.empty()) { |
||||
InitWarning(strWarning); |
||||
} |
||||
if (!dbV) { |
||||
InitError(strError); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool InitLoadWallet() |
||||
{ |
||||
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) { |
||||
LogPrintf("Wallet disabled!\n"); |
||||
return true; |
||||
} |
||||
|
||||
for (const std::string& walletFile : gArgs.GetArgs("-wallet")) { |
||||
CWallet * const pwallet = CWallet::CreateWalletFromFile(walletFile); |
||||
if (!pwallet) { |
||||
return false; |
||||
} |
||||
vpwallets.push_back(pwallet); |
||||
} |
||||
|
||||
return true; |
||||
} |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2017 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_WALLET_INIT_H |
||||
#define BITCOIN_WALLET_INIT_H |
||||
|
||||
#include <string> |
||||
|
||||
//! Return the wallets help message.
|
||||
std::string GetWalletHelpString(bool showDebug); |
||||
|
||||
//! Wallets parameter interaction
|
||||
bool WalletParameterInteraction(); |
||||
|
||||
//! Responsible for reading and validating the -wallet arguments and verifying the wallet database.
|
||||
// This function will perform salvage on the wallet if requested, as long as only one wallet is
|
||||
// being loaded (CWallet::ParameterInteraction forbids -salvagewallet, -zapwallettxes or -upgradewallet with multiwallet).
|
||||
bool WalletVerify(); |
||||
|
||||
//! Load wallet databases.
|
||||
bool InitLoadWallet(); |
||||
|
||||
#endif // BITCOIN_WALLET_INIT_H
|
Loading…
Reference in new issue