/Users/eugenesiegel/btc/bitcoin/src/wallet/init.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2009-2010 Satoshi Nakamoto |
2 | | // Copyright (c) 2009-2022 The Bitcoin Core developers |
3 | | // Distributed under the MIT software license, see the accompanying |
4 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | | |
6 | | #include <bitcoin-build-config.h> // IWYU pragma: keep |
7 | | |
8 | | #include <common/args.h> |
9 | | #include <init.h> |
10 | | #include <interfaces/chain.h> |
11 | | #include <interfaces/init.h> |
12 | | #include <interfaces/wallet.h> |
13 | | #include <net.h> |
14 | | #include <node/context.h> |
15 | | #include <node/interface_ui.h> |
16 | | #include <outputtype.h> |
17 | | #include <univalue.h> |
18 | | #include <util/check.h> |
19 | | #include <util/moneystr.h> |
20 | | #include <util/translation.h> |
21 | | #include <wallet/coincontrol.h> |
22 | | #include <wallet/wallet.h> |
23 | | #include <walletinitinterface.h> |
24 | | |
25 | | using node::NodeContext; |
26 | | |
27 | | namespace wallet { |
28 | | class WalletInit : public WalletInitInterface |
29 | | { |
30 | | public: |
31 | | //! Was the wallet component compiled in. |
32 | 0 | bool HasWalletSupport() const override {return true;} |
33 | | |
34 | | //! Return the wallets help message. |
35 | | void AddWalletOptions(ArgsManager& argsman) const override; |
36 | | |
37 | | //! Wallets parameter interaction |
38 | | bool ParameterInteraction() const override; |
39 | | |
40 | | //! Add wallets that should be opened to list of chain clients. |
41 | | void Construct(NodeContext& node) const override; |
42 | | }; |
43 | | |
44 | | void WalletInit::AddWalletOptions(ArgsManager& argsman) const |
45 | 49.9k | { |
46 | 49.9k | argsman.AddArg("-addresstype", strprintf("What type of addresses to use (\"legacy\", \"p2sh-segwit\", \"bech32\", or \"bech32m\", default: \"%s\")", FormatOutputType(DEFAULT_ADDRESS_TYPE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
47 | 49.9k | argsman.AddArg("-avoidpartialspends", strprintf("Group outputs by address, selecting many (possibly all) or none, instead of selecting on a per-output basis. Privacy is improved as addresses are mostly swept with fewer transactions and outputs are aggregated in clean change addresses. It may result in higher fees due to less optimal coin selection caused by this added limitation and possibly a larger-than-necessary number of inputs being used. Always enabled for wallets with \"avoid_reuse\" enabled, otherwise default: %u.", DEFAULT_AVOIDPARTIALSPENDS), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
48 | 49.9k | argsman.AddArg("-changetype", |
49 | 49.9k | "What type of change to use (\"legacy\", \"p2sh-segwit\", \"bech32\", or \"bech32m\"). Default is \"legacy\" when " |
50 | 49.9k | "-addresstype=legacy, else it is an implementation detail.", |
51 | 49.9k | ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
52 | 49.9k | argsman.AddArg("-consolidatefeerate=<amt>", strprintf("The maximum feerate (in %s/kvB) at which transaction building may use more inputs than strictly necessary so that the wallet's UTXO pool can be reduced (default: %s).", CURRENCY_UNIT, FormatMoney(DEFAULT_CONSOLIDATE_FEERATE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
53 | 49.9k | argsman.AddArg("-disablewallet", "Do not load the wallet and disable wallet RPC calls", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
54 | 49.9k | argsman.AddArg("-discardfee=<amt>", strprintf("The fee rate (in %s/kvB) that indicates your tolerance for discarding change by adding it to the fee (default: %s). " Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
55 | 49.9k | "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", |
56 | 49.9k | CURRENCY_UNIT, FormatMoney(DEFAULT_DISCARD_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
57 | | |
58 | 49.9k | argsman.AddArg("-fallbackfee=<amt>", strprintf("A fee rate (in %s/kvB) that will be used when fee estimation has insufficient data. 0 to entirely disable the fallbackfee feature. (default: %s)", Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
59 | 49.9k | CURRENCY_UNIT, FormatMoney(DEFAULT_FALLBACK_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
60 | 49.9k | argsman.AddArg("-keypool=<n>", strprintf("Set key pool size to <n> (default: %u). Warning: Smaller sizes may increase the risk of losing funds when restoring from an old backup, if none of the addresses in the original keypool have been used.", DEFAULT_KEYPOOL_SIZE), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
61 | 49.9k | argsman.AddArg("-maxapsfee=<n>", strprintf("Spend up to this amount in additional (absolute) fees (in %s) if it allows the use of partial spend avoidance (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_MAX_AVOIDPARTIALSPEND_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
62 | 49.9k | argsman.AddArg("-maxtxfee=<amt>", strprintf("Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)", Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
63 | 49.9k | CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MAXFEE)), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
64 | 49.9k | argsman.AddArg("-mintxfee=<amt>", strprintf("Fee rates (in %s/kvB) smaller than this are considered zero fee for transaction creation (default: %s)", Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
65 | 49.9k | CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MINFEE)), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
66 | 49.9k | argsman.AddArg("-paytxfee=<amt>", strprintf("(DEPRECATED) Fee rate (in %s/kvB) to add to transactions you send (default: %s)", Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
67 | 49.9k | CURRENCY_UNIT, FormatMoney(CFeeRate{DEFAULT_PAY_TX_FEE}.GetFeePerK())), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
68 | | #ifdef ENABLE_EXTERNAL_SIGNER |
69 | | argsman.AddArg("-signer=<cmd>", "External signing tool, see doc/external-signer.md", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
70 | | #endif |
71 | 49.9k | argsman.AddArg("-spendzeroconfchange", strprintf("Spend unconfirmed change when sending transactions (default: %u)", DEFAULT_SPEND_ZEROCONF_CHANGE), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
72 | 49.9k | argsman.AddArg("-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), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
73 | 49.9k | argsman.AddArg("-wallet=<path>", "Specify wallet path to load at startup. Can be used multiple times to load multiple wallets. Path is to a directory containing wallet data and log files. If the path is not absolute, it is interpreted relative to <walletdir>. This only loads existing wallets and does not create new ones. For backwards compatibility this also accepts names of existing top-level data files in <walletdir>.", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::WALLET); |
74 | 49.9k | argsman.AddArg("-walletbroadcast", strprintf("Make the wallet broadcast transactions (default: %u)", DEFAULT_WALLETBROADCAST), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
75 | 49.9k | argsman.AddArg("-walletdir=<dir>", "Specify directory to hold wallets (default: <datadir>/wallets if it exists, otherwise <datadir>)", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::WALLET); |
76 | 49.9k | #if HAVE_SYSTEM |
77 | 49.9k | argsman.AddArg("-walletnotify=<cmd>", "Execute command when a wallet transaction changes. %s in cmd is replaced by TxID, %w is replaced by wallet name, %b is replaced by the hash of the block including the transaction (set to 'unconfirmed' if the transaction is not included) and %h is replaced by the block height (-1 if not included). %w is not currently implemented on windows. On systems where %w is supported, it should NOT be quoted because this would break shell escaping used to invoke the command.", ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); |
78 | 49.9k | #endif |
79 | 49.9k | argsman.AddArg("-walletrbf", strprintf("Send transactions with full-RBF opt-in enabled (RPC only, default: %u)", DEFAULT_WALLET_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
80 | | |
81 | 49.9k | argsman.AddArg("-unsafesqlitesync", "Set SQLite synchronous=OFF to disable waiting for the database to sync to disk. This is unsafe and can cause data loss and corruption. This option is only used by tests to improve their performance (default: false)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::WALLET_DEBUG_TEST); |
82 | | |
83 | 49.9k | argsman.AddArg("-walletrejectlongchains", strprintf("Wallet will not create transactions that violate mempool chain limits (default: %u)", DEFAULT_WALLET_REJECT_LONG_CHAINS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::WALLET_DEBUG_TEST); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
84 | 49.9k | argsman.AddArg("-walletcrosschain", strprintf("Allow reusing wallet files across chains (default: %u)", DEFAULT_WALLETCROSSCHAIN), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::WALLET_DEBUG_TEST); Line | Count | Source | 1172 | 49.9k | #define strprintf tfm::format |
|
85 | 49.9k | } |
86 | | |
87 | | bool WalletInit::ParameterInteraction() const |
88 | 49.9k | { |
89 | 49.9k | if (gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) { |
90 | 0 | for (const std::string& wallet : gArgs.GetArgs("-wallet")) { |
91 | 0 | LogPrintf("%s: parameter interaction: -disablewallet -> ignoring -wallet=%s\n", __func__, wallet); Line | Count | Source | 266 | 0 | #define LogPrintf(...) LogInfo(__VA_ARGS__) Line | Count | Source | 261 | 0 | #define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__) Line | Count | Source | 255 | 0 | #define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__) |
|
|
|
92 | 0 | } |
93 | |
|
94 | 0 | return true; |
95 | 0 | } |
96 | | |
97 | 49.9k | if (gArgs.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY) && gArgs.SoftSetBoolArg("-walletbroadcast", false)0 ) { |
98 | 0 | LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -walletbroadcast=0\n", __func__); Line | Count | Source | 266 | 0 | #define LogPrintf(...) LogInfo(__VA_ARGS__) Line | Count | Source | 261 | 0 | #define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__) Line | Count | Source | 255 | 0 | #define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__) |
|
|
|
99 | 0 | } |
100 | | |
101 | 49.9k | return true; |
102 | 49.9k | } |
103 | | |
104 | | void WalletInit::Construct(NodeContext& node) const |
105 | 0 | { |
106 | 0 | ArgsManager& args = *Assert(node.args); Line | Count | Source | 106 | 0 | #define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val) |
|
107 | 0 | if (args.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET)) { |
108 | 0 | LogPrintf("Wallet disabled!\n"); Line | Count | Source | 266 | 0 | #define LogPrintf(...) LogInfo(__VA_ARGS__) Line | Count | Source | 261 | 0 | #define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__) Line | Count | Source | 255 | 0 | #define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__) |
|
|
|
109 | 0 | return; |
110 | 0 | } |
111 | 0 | auto wallet_loader = node.init->makeWalletLoader(*node.chain); |
112 | 0 | node.wallet_loader = wallet_loader.get(); |
113 | 0 | node.chain_clients.emplace_back(std::move(wallet_loader)); |
114 | 0 | } |
115 | | } // namespace wallet |
116 | | |
117 | | const WalletInitInterface& g_wallet_init_interface = wallet::WalletInit(); |