mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
Move some static functions out of wallet.h/cpp This commit just moves a few function declarations and updates callers. Function bodies are moved in two followup MOVEONLY commits. 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 proximate 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. MOVEONLY: Fee functions wallet/wallet.cpp -> wallet/fees.cpp make it actual move only Signed-off-by: Pasta <pasta@dashboost.org> MOVEONLY: Init functions wallet/wallet.cpp -> wallet/init.cpp make it actual move only Signed-off-by: Pasta <pasta@dashboost.org> add keepass include Signed-off-by: Pasta <pasta@dashboost.org>
This commit is contained in:
parent
fdf3f25a0a
commit
fc4ab83c83
@ -252,6 +252,8 @@ BITCOIN_CORE_H = \
|
|||||||
wallet/coincontrol.h \
|
wallet/coincontrol.h \
|
||||||
wallet/crypter.h \
|
wallet/crypter.h \
|
||||||
wallet/db.h \
|
wallet/db.h \
|
||||||
|
wallet/fees.h \
|
||||||
|
wallet/init.h \
|
||||||
wallet/rpcwallet.h \
|
wallet/rpcwallet.h \
|
||||||
wallet/wallet.h \
|
wallet/wallet.h \
|
||||||
wallet/walletdb.h \
|
wallet/walletdb.h \
|
||||||
@ -374,6 +376,8 @@ libdash_wallet_a_SOURCES = \
|
|||||||
privatesend/privatesend-util.cpp \
|
privatesend/privatesend-util.cpp \
|
||||||
wallet/crypter.cpp \
|
wallet/crypter.cpp \
|
||||||
wallet/db.cpp \
|
wallet/db.cpp \
|
||||||
|
wallet/fees.cpp \
|
||||||
|
wallet/init.cpp \
|
||||||
wallet/rpcdump.cpp \
|
wallet/rpcdump.cpp \
|
||||||
wallet/rpcwallet.cpp \
|
wallet/rpcwallet.cpp \
|
||||||
wallet/wallet.cpp \
|
wallet/wallet.cpp \
|
||||||
|
11
src/init.cpp
11
src/init.cpp
@ -46,6 +46,7 @@
|
|||||||
#include "utilmoneystr.h"
|
#include "utilmoneystr.h"
|
||||||
#include "validationinterface.h"
|
#include "validationinterface.h"
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
|
#include "wallet/init.h"
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -518,7 +519,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
strUsage += HelpMessageOpt("-maxuploadtarget=<n>", strprintf(_("Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)"), DEFAULT_MAX_UPLOAD_TARGET));
|
strUsage += HelpMessageOpt("-maxuploadtarget=<n>", strprintf(_("Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)"), DEFAULT_MAX_UPLOAD_TARGET));
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
strUsage += CWallet::GetWalletHelpString(showDebug);
|
strUsage += GetWalletHelpString(showDebug);
|
||||||
if (mode == HMM_BITCOIN_QT)
|
if (mode == HMM_BITCOIN_QT)
|
||||||
strUsage += HelpMessageOpt("-windowtitle=<name>", _("Wallet window title"));
|
strUsage += HelpMessageOpt("-windowtitle=<name>", _("Wallet window title"));
|
||||||
#endif
|
#endif
|
||||||
@ -1271,7 +1272,7 @@ bool AppInitParameterInteraction()
|
|||||||
if (!ParseMoney(gArgs.GetArg("-minrelaytxfee", ""), n)) {
|
if (!ParseMoney(gArgs.GetArg("-minrelaytxfee", ""), n)) {
|
||||||
return InitError(AmountErrMsg("minrelaytxfee", gArgs.GetArg("-minrelaytxfee", "")));
|
return InitError(AmountErrMsg("minrelaytxfee", gArgs.GetArg("-minrelaytxfee", "")));
|
||||||
}
|
}
|
||||||
// High fee check is done afterward in CWallet::ParameterInteraction()
|
// High fee check is done afterward in WalletParameterInteraction()
|
||||||
::minRelayTxFee = CFeeRate(n);
|
::minRelayTxFee = CFeeRate(n);
|
||||||
} else if (incrementalRelayFee > ::minRelayTxFee) {
|
} else if (incrementalRelayFee > ::minRelayTxFee) {
|
||||||
// Allow only setting incrementalRelayFee to control both
|
// Allow only setting incrementalRelayFee to control both
|
||||||
@ -1304,7 +1305,7 @@ bool AppInitParameterInteraction()
|
|||||||
nBytesPerSigOp = gArgs.GetArg("-bytespersigop", nBytesPerSigOp);
|
nBytesPerSigOp = gArgs.GetArg("-bytespersigop", nBytesPerSigOp);
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (!CWallet::ParameterInteraction())
|
if (!WalletParameterInteraction())
|
||||||
return false;
|
return false;
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
@ -1595,7 +1596,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
if (!CWallet::InitAutoBackup())
|
if (!CWallet::InitAutoBackup())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!CWallet::Verify())
|
if (!WalletVerify())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Initialize KeePass Integration
|
// Initialize KeePass Integration
|
||||||
@ -1972,7 +1973,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
|
|
||||||
// ********************************************************* Step 8: load wallet
|
// ********************************************************* Step 8: load wallet
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (!CWallet::InitLoadWallet())
|
if (!InitLoadWallet())
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
LogPrintf("No wallet support compiled in!\n");
|
LogPrintf("No wallet support compiled in!\n");
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "policy/fees.h"
|
#include "policy/fees.h"
|
||||||
#include "policy/policy.h"
|
#include "policy/policy.h"
|
||||||
#include "validation.h" // For mempool
|
#include "validation.h" // For mempool
|
||||||
|
#include "wallet/fees.h"
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
|
|
||||||
#include "privatesend/privatesend-client.h"
|
#include "privatesend/privatesend-client.h"
|
||||||
@ -547,7 +548,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
|
|||||||
nBytes -= 34;
|
nBytes -= 34;
|
||||||
|
|
||||||
// Fee
|
// Fee
|
||||||
nPayFee = CWallet::GetMinimumFee(nBytes, *coinControl, ::mempool, ::feeEstimator, nullptr /* FeeCalculation */);
|
nPayFee = GetMinimumFee(nBytes, *coinControl, ::mempool, ::feeEstimator, nullptr /* FeeCalculation */);
|
||||||
|
|
||||||
if (nPayAmount > 0)
|
if (nPayAmount > 0)
|
||||||
{
|
{
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
#include "txdb.h" // for -dbcache defaults
|
#include "txdb.h" // for -dbcache defaults
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
#include "wallet/wallet.h" // for CWallet::GetRequiredFee()
|
|
||||||
|
|
||||||
#include "privatesend/privatesend-client.h"
|
#include "privatesend/privatesend-client.h"
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "ui_interface.h"
|
#include "ui_interface.h"
|
||||||
#include "txmempool.h"
|
#include "txmempool.h"
|
||||||
#include "policy/fees.h"
|
#include "policy/fees.h"
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/fees.h"
|
||||||
|
|
||||||
#include "privatesend/privatesend.h"
|
#include "privatesend/privatesend.h"
|
||||||
#include "privatesend/privatesend-client.h"
|
#include "privatesend/privatesend-client.h"
|
||||||
@ -210,7 +210,7 @@ void SendCoinsDialog::setModel(WalletModel *_model)
|
|||||||
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(setMinimumFee()));
|
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(setMinimumFee()));
|
||||||
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateFeeSectionControls()));
|
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateFeeSectionControls()));
|
||||||
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels()));
|
connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels()));
|
||||||
ui->customFee->setSingleStep(CWallet::GetRequiredFee(1000));
|
ui->customFee->setSingleStep(GetRequiredFee(1000));
|
||||||
updateFeeSectionControls();
|
updateFeeSectionControls();
|
||||||
updateMinFeeLabel();
|
updateMinFeeLabel();
|
||||||
updateSmartFeeLabel();
|
updateSmartFeeLabel();
|
||||||
@ -709,7 +709,7 @@ void SendCoinsDialog::on_buttonMinimizeFee_clicked()
|
|||||||
|
|
||||||
void SendCoinsDialog::setMinimumFee()
|
void SendCoinsDialog::setMinimumFee()
|
||||||
{
|
{
|
||||||
ui->customFee->setValue(CWallet::GetRequiredFee(1000));
|
ui->customFee->setValue(GetRequiredFee(1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendCoinsDialog::updateFeeSectionControls()
|
void SendCoinsDialog::updateFeeSectionControls()
|
||||||
@ -741,7 +741,7 @@ void SendCoinsDialog::updateMinFeeLabel()
|
|||||||
{
|
{
|
||||||
if (model && model->getOptionsModel())
|
if (model && model->getOptionsModel())
|
||||||
ui->checkBoxMinimumFee->setText(tr("Pay only the required fee of %1").arg(
|
ui->checkBoxMinimumFee->setText(tr("Pay only the required fee of %1").arg(
|
||||||
BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), CWallet::GetRequiredFee(1000)) + "/kB")
|
BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), GetRequiredFee(1000)) + "/kB")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -765,7 +765,7 @@ void SendCoinsDialog::updateSmartFeeLabel()
|
|||||||
updateCoinControlState(coin_control);
|
updateCoinControlState(coin_control);
|
||||||
coin_control.m_feerate.reset(); // Explicitly use only fee estimation rate for smart fee labels
|
coin_control.m_feerate.reset(); // Explicitly use only fee estimation rate for smart fee labels
|
||||||
FeeCalculation feeCalc;
|
FeeCalculation feeCalc;
|
||||||
CFeeRate feeRate = CFeeRate(CWallet::GetMinimumFee(1000, coin_control, ::mempool, ::feeEstimator, &feeCalc));
|
CFeeRate feeRate = CFeeRate(GetMinimumFee(1000, coin_control, ::mempool, ::feeEstimator, &feeCalc));
|
||||||
|
|
||||||
ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), feeRate.GetFeePerK()) + "/kB");
|
ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), feeRate.GetFeePerK()) + "/kB");
|
||||||
|
|
||||||
|
87
src/wallet/fees.cpp
Normal file
87
src/wallet/fees.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// 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
|
||||||
|
bool conservative_estimate = true;
|
||||||
|
// 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;
|
||||||
|
}
|
34
src/wallet/fees.h
Normal file
34
src/wallet/fees.h
Normal file
@ -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
|
265
src/wallet/init.cpp
Normal file
265
src/wallet/init.cpp
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
// 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 "keepass.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 BIP39/BIP44. Only has effect during wallet creation/first start") + " " + strprintf(_("(default: %u)"), DEFAULT_USE_HD_WALLET));
|
||||||
|
strUsage += HelpMessageOpt("-mnemonic=<text>", _("User defined mnemonic for HD wallet (bip39). Only has effect during wallet creation/first start (default: randomly generated)"));
|
||||||
|
strUsage += HelpMessageOpt("-mnemonicpassphrase=<text>", _("User defined mnemonic passphrase for HD wallet (BIP39). Only has effect during wallet creation/first start (default: empty string)"));
|
||||||
|
strUsage += HelpMessageOpt("-hdseed=<hex>", _("User defined seed for HD wallet (should be in hex). Only has effect during wallet creation/first start (default: randomly generated)"));
|
||||||
|
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)"));
|
||||||
|
strUsage += HelpMessageOpt("-createwalletbackups=<n>", strprintf(_("Number of automatic wallet backups (default: %u)"), nWalletBackups));
|
||||||
|
strUsage += HelpMessageOpt("-walletbackupsdir=<dir>", _("Specify full path to directory for automatic wallet backups (must exist)"));
|
||||||
|
strUsage += HelpMessageOpt("-keepass", strprintf(_("Use KeePass 2 integration using KeePassHttp plugin (default: %u)"), 0));
|
||||||
|
strUsage += HelpMessageOpt("-keepassport=<port>", strprintf(_("Connect to KeePassHttp on port <port> (default: %u)"), DEFAULT_KEEPASS_HTTP_PORT));
|
||||||
|
strUsage += HelpMessageOpt("-keepasskey=<key>", _("KeePassHttp key for AES encrypted communication with KeePass"));
|
||||||
|
strUsage += HelpMessageOpt("-keepassid=<id>", _("KeePassHttp id for the established association"));
|
||||||
|
strUsage += HelpMessageOpt("-keepassname=<name>", _("Name to construct url for KeePass entry that stores the wallet passphrase"));
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (gArgs.IsArgSet("-walletbackupsdir")) {
|
||||||
|
if (!fs::is_directory(gArgs.GetArg("-walletbackupsdir", ""))) {
|
||||||
|
LogPrintf("%s: Warning: incorrect parameter -walletbackupsdir, path must exist! Using default path.\n", __func__);
|
||||||
|
InitWarning("Warning: incorrect parameter -walletbackupsdir, path must exist! Using default path.\n");
|
||||||
|
|
||||||
|
gArgs.ForceRemoveArg("-walletbackupsdir");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
25
src/wallet/init.h
Normal file
25
src/wallet/init.h
Normal file
@ -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
|
@ -9,7 +9,6 @@
|
|||||||
#include "chain.h"
|
#include "chain.h"
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
#include "init.h"
|
|
||||||
#include "httpserver.h"
|
#include "httpserver.h"
|
||||||
#include "keepass.h"
|
#include "keepass.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
@ -27,6 +26,8 @@
|
|||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
#include "wallet/walletdb.h"
|
#include "wallet/walletdb.h"
|
||||||
|
|
||||||
|
#include <init.h> // For StartShutdown
|
||||||
|
|
||||||
#include "llmq/quorums_chainlocks.h"
|
#include "llmq/quorums_chainlocks.h"
|
||||||
#include "llmq/quorums_instantsend.h"
|
#include "llmq/quorums_instantsend.h"
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "ui_interface.h"
|
#include "ui_interface.h"
|
||||||
#include "utilmoneystr.h"
|
#include "utilmoneystr.h"
|
||||||
|
#include "wallet/fees.h"
|
||||||
|
|
||||||
#include "governance/governance.h"
|
#include "governance/governance.h"
|
||||||
#include "keepass.h"
|
#include "keepass.h"
|
||||||
@ -661,63 +662,6 @@ void CWallet::Flush(bool shutdown)
|
|||||||
dbw->Flush(shutdown);
|
dbw->Flush(shutdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::Verify()
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CWallet::SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator> range)
|
void CWallet::SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator> range)
|
||||||
{
|
{
|
||||||
// We want all the wallet transactions in range to have the same metadata as
|
// We want all the wallet transactions in range to have the same metadata as
|
||||||
@ -3625,17 +3569,6 @@ bool CWallet::ConvertList(std::vector<CTxIn> vecTxIn, std::vector<CAmount>& vecA
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet,
|
bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet,
|
||||||
int& nChangePosInOut, std::string& strFailReason, const CCoinControl& coin_control, bool sign, int nExtraPayloadSize)
|
int& nChangePosInOut, std::string& strFailReason, const CCoinControl& coin_control, bool sign, int nExtraPayloadSize)
|
||||||
{
|
{
|
||||||
@ -4118,68 +4051,6 @@ bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry, CWalletDB *pwa
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmount CWallet::GetRequiredFee(unsigned int nTxBytes)
|
|
||||||
{
|
|
||||||
return std::max(minTxFee.GetFee(nTxBytes), ::minRelayTxFee.GetFee(nTxBytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
CAmount CWallet::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
|
|
||||||
bool conservative_estimate = true;
|
|
||||||
// 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 = 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
|
DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, cs_wallet);
|
LOCK2(cs_main, cs_wallet);
|
||||||
@ -5049,55 +4920,6 @@ std::vector<std::string> CWallet::GetDestValues(const std::string& prefix) const
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CWallet::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 BIP39/BIP44. Only has effect during wallet creation/first start") + " " + strprintf(_("(default: %u)"), DEFAULT_USE_HD_WALLET));
|
|
||||||
strUsage += HelpMessageOpt("-mnemonic=<text>", _("User defined mnemonic for HD wallet (bip39). Only has effect during wallet creation/first start (default: randomly generated)"));
|
|
||||||
strUsage += HelpMessageOpt("-mnemonicpassphrase=<text>", _("User defined mnemonic passphrase for HD wallet (BIP39). Only has effect during wallet creation/first start (default: empty string)"));
|
|
||||||
strUsage += HelpMessageOpt("-hdseed=<hex>", _("User defined seed for HD wallet (should be in hex). Only has effect during wallet creation/first start (default: randomly generated)"));
|
|
||||||
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)"));
|
|
||||||
strUsage += HelpMessageOpt("-createwalletbackups=<n>", strprintf(_("Number of automatic wallet backups (default: %u)"), nWalletBackups));
|
|
||||||
strUsage += HelpMessageOpt("-walletbackupsdir=<dir>", _("Specify full path to directory for automatic wallet backups (must exist)"));
|
|
||||||
strUsage += HelpMessageOpt("-keepass", strprintf(_("Use KeePass 2 integration using KeePassHttp plugin (default: %u)"), 0));
|
|
||||||
strUsage += HelpMessageOpt("-keepassport=<port>", strprintf(_("Connect to KeePassHttp on port <port> (default: %u)"), DEFAULT_KEEPASS_HTTP_PORT));
|
|
||||||
strUsage += HelpMessageOpt("-keepasskey=<key>", _("KeePassHttp key for AES encrypted communication with KeePass"));
|
|
||||||
strUsage += HelpMessageOpt("-keepassid=<id>", _("KeePassHttp id for the established association"));
|
|
||||||
strUsage += HelpMessageOpt("-keepassname=<name>", _("Name to construct url for KeePass entry that stores the wallet passphrase"));
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
CWallet* CWallet::CreateWalletFromFile(const std::string walletFile)
|
CWallet* CWallet::CreateWalletFromFile(const std::string walletFile)
|
||||||
{
|
{
|
||||||
// needed to restore wallet transaction meta data after -zapwallettxes
|
// needed to restore wallet transaction meta data after -zapwallettxes
|
||||||
@ -5312,24 +5134,6 @@ CWallet* CWallet::CreateWalletFromFile(const std::string walletFile)
|
|||||||
return walletInstance;
|
return walletInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::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 = CreateWalletFromFile(walletFile);
|
|
||||||
if (!pwallet) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
vpwallets.push_back(pwallet);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::atomic<bool> CWallet::fFlushScheduled(false);
|
std::atomic<bool> CWallet::fFlushScheduled(false);
|
||||||
|
|
||||||
void CWallet::postInitProcess(CScheduler& scheduler)
|
void CWallet::postInitProcess(CScheduler& scheduler)
|
||||||
@ -5344,134 +5148,6 @@ void CWallet::postInitProcess(CScheduler& scheduler)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::ParameterInteraction()
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (gArgs.IsArgSet("-walletbackupsdir")) {
|
|
||||||
if (!fs::is_directory(gArgs.GetArg("-walletbackupsdir", ""))) {
|
|
||||||
LogPrintf("%s: Warning: incorrect parameter -walletbackupsdir, path must exist! Using default path.\n", __func__);
|
|
||||||
InitWarning("Warning: incorrect parameter -walletbackupsdir, path must exist! Using default path.\n");
|
|
||||||
|
|
||||||
gArgs.ForceRemoveArg("-walletbackupsdir");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CWallet::InitAutoBackup()
|
bool CWallet::InitAutoBackup()
|
||||||
{
|
{
|
||||||
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET))
|
if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET))
|
||||||
|
@ -1073,16 +1073,6 @@ public:
|
|||||||
static CFeeRate minTxFee;
|
static CFeeRate minTxFee;
|
||||||
static CFeeRate fallbackFee;
|
static CFeeRate fallbackFee;
|
||||||
static CFeeRate m_discard_rate;
|
static CFeeRate m_discard_rate;
|
||||||
/**
|
|
||||||
* Estimate the minimum fee considering user set parameters
|
|
||||||
* and the required fee
|
|
||||||
*/
|
|
||||||
static CAmount GetMinimumFee(unsigned int nTxBytes, const CCoinControl& coin_control, const CTxMemPool& pool, const CBlockPolicyEstimator& estimator, FeeCalculation *feeCalc);
|
|
||||||
/**
|
|
||||||
* Return the minimum required fee taking into account the
|
|
||||||
* floating relay fee and user set minimum transaction fee
|
|
||||||
*/
|
|
||||||
static CAmount GetRequiredFee(unsigned int nTxBytes);
|
|
||||||
|
|
||||||
bool NewKeyPool();
|
bool NewKeyPool();
|
||||||
size_t KeypoolCountExternalKeys();
|
size_t KeypoolCountExternalKeys();
|
||||||
@ -1170,11 +1160,6 @@ public:
|
|||||||
//! Flush wallet (bitdb flush)
|
//! Flush wallet (bitdb flush)
|
||||||
void Flush(bool shutdown=false);
|
void Flush(bool shutdown=false);
|
||||||
|
|
||||||
//! 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).
|
|
||||||
static bool Verify();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Address book entry changed.
|
* Address book entry changed.
|
||||||
* @note called with lock cs_wallet held.
|
* @note called with lock cs_wallet held.
|
||||||
@ -1214,12 +1199,8 @@ public:
|
|||||||
/* Mark a transaction (and it in-wallet descendants) as abandoned so its inputs may be respent. */
|
/* Mark a transaction (and it in-wallet descendants) as abandoned so its inputs may be respent. */
|
||||||
bool AbandonTransaction(const uint256& hashTx);
|
bool AbandonTransaction(const uint256& hashTx);
|
||||||
|
|
||||||
/* Returns the wallets help message */
|
|
||||||
static std::string GetWalletHelpString(bool showDebug);
|
|
||||||
|
|
||||||
/* Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error */
|
/* Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error */
|
||||||
static CWallet* CreateWalletFromFile(const std::string walletFile);
|
static CWallet* CreateWalletFromFile(const std::string walletFile);
|
||||||
static bool InitLoadWallet();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wallet post-init setup
|
* Wallet post-init setup
|
||||||
@ -1227,9 +1208,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void postInitProcess(CScheduler& scheduler);
|
void postInitProcess(CScheduler& scheduler);
|
||||||
|
|
||||||
/* Wallets parameter interaction */
|
|
||||||
static bool ParameterInteraction();
|
|
||||||
|
|
||||||
/* Initialize AutoBackup functionality */
|
/* Initialize AutoBackup functionality */
|
||||||
static bool InitAutoBackup();
|
static bool InitAutoBackup();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user