LCOV - code coverage report
Current view: top level - src - bitcoin-wallet.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 55 73 75.3 %
Date: 2026-06-25 07:23:43 Functions: 4 4 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2016-2021 The Bitcoin Core developers
       2             : // Distributed under the MIT software license, see the accompanying
       3             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4             : 
       5             : #if defined(HAVE_CONFIG_H)
       6             : #include <config/bitcoin-config.h>
       7             : #endif
       8             : 
       9             : #include <chainparams.h>
      10             : #include <chainparamsbase.h>
      11             : #include <common/url.h>
      12             : #include <compat/compat.h>
      13             : #include <interfaces/init.h>
      14             : #include <logging.h>
      15             : #include <util/strencodings.h>
      16             : #include <clientversion.h>
      17             : #include <key.h>
      18             : #include <pubkey.h>
      19             : #include <tinyformat.h>
      20             : #include <util/system.h>
      21             : #include <util/translation.h>
      22             : #include <wallet/wallettool.h>
      23             : 
      24             : #include <exception>
      25             : #include <string>
      26             : #include <tuple>
      27         136 : const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
      28             : UrlDecodeFn* const URL_DECODE = nullptr;
      29             : 
      30         136 : static void SetupWalletToolArgs(ArgsManager& argsman)
      31             : {
      32         136 :     SetupHelpOptions(argsman);
      33         136 :     SetupChainParamsBaseOptions(argsman);
      34             : 
      35         136 :     argsman.AddArg("-version", "Print version and exit", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      36         136 :     argsman.AddArg("-usehd", strprintf("Create HD (hierarchical deterministic) wallet (default: %d)", true), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      37         136 :     argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      38         136 :     argsman.AddArg("-wallet=<wallet-name>", "Specify wallet name", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      39         136 :     argsman.AddArg("-dumpfile=<file name>", "When used with 'dump', writes out the records to this file. When used with 'createfromdump', loads the records into a new wallet.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
      40         136 :     argsman.AddArg("-debug=<category>", "Output debugging information (default: 0).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
      41         136 :     argsman.AddArg("-descriptors", "Create descriptors wallet. Only for 'create'", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      42         136 :     argsman.AddArg("-legacy", "Create legacy wallet. Only for 'create'", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      43         136 :     argsman.AddArg("-format=<format>", "The format of the wallet file to create. Either \"bdb\" or \"sqlite\". Only used with 'createfromdump'", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
      44         136 :     argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -debug is true, 0 otherwise).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
      45             : 
      46         136 :     argsman.AddCommand("info", "Get wallet info");
      47         136 :     argsman.AddCommand("create", "Create new wallet file");
      48         136 :     argsman.AddCommand("salvage", "Attempt to recover private keys from a corrupt wallet. Warning: 'salvage' is experimental.");
      49         136 :     argsman.AddCommand("wipetxes", "Wipe all transactions from a wallet");
      50         136 :     argsman.AddCommand("dump", "Print out all of the wallet key-value records");
      51         136 :     argsman.AddCommand("createfromdump", "Create new wallet file from dumped records");
      52         136 : }
      53             : 
      54         136 : static std::optional<int> WalletAppInit(ArgsManager& args, int argc, char* argv[])
      55             : {
      56         136 :     SetupWalletToolArgs(args);
      57         136 :     std::string error_message;
      58         136 :     if (!args.ParseParameters(argc, argv, error_message)) {
      59          12 :         tfm::format(std::cerr, "Error parsing command line arguments: %s\n", error_message);
      60          12 :         return EXIT_FAILURE;
      61             :     }
      62         124 :     const bool missing_args{argc < 2};
      63         124 :     if (missing_args || HelpRequested(args) || args.IsArgSet("-version")) {
      64           0 :         std::string strUsage = strprintf("%s dash-wallet version", PACKAGE_NAME) + " " + FormatFullVersion() + "\n";
      65             : 
      66           0 :         if (args.IsArgSet("-version")) {
      67           0 :             strUsage += FormatParagraph(LicenseInfo());
      68           0 :         } else {
      69           0 :             strUsage += "\n"
      70             :                     "dash-wallet is an offline tool for creating and interacting with " PACKAGE_NAME " wallet files.\n"
      71             :                     "By default dash-wallet will act on wallets in the default mainnet wallet directory in the datadir.\n"
      72             :                     "To change the target wallet, use the -datadir, -wallet and -regtest/-testnet arguments.\n\n"
      73             :                     "Usage:\n"
      74             :                     "  dash-wallet [options] <command>\n";
      75           0 :             strUsage += "\n" + args.GetHelpMessage();
      76             :         }
      77           0 :         tfm::format(std::cout, "%s", strUsage);
      78           0 :         if (missing_args) {
      79           0 :             tfm::format(std::cerr, "Error: too few parameters\n");
      80           0 :             return EXIT_FAILURE;
      81             :         }
      82           0 :         return EXIT_SUCCESS;
      83           0 :     }
      84             : 
      85             :     // check for printtoconsole, allow -debug
      86         124 :     LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", args.GetBoolArg("-debug", false));
      87             : 
      88         124 :     if (!CheckDataDirOption()) {
      89           0 :         tfm::format(std::cerr, "Error: Specified data directory \"%s\" does not exist.\n", args.GetArg("-datadir", ""));
      90           0 :         return EXIT_FAILURE;
      91             :     }
      92             :     // Check for chain settings (Params() calls are only valid after this clause)
      93         124 :     SelectParams(args.GetChainName());
      94             : 
      95         124 :     return std::nullopt;
      96         136 : }
      97             : 
      98         136 : MAIN_FUNCTION
      99             : {
     100         136 :     ArgsManager& args = gArgs;
     101             : #ifdef WIN32
     102             :     util::WinCmdLineArgs winArgs;
     103             :     std::tie(argc, argv) = winArgs.get();
     104             : #endif
     105             : 
     106             :     int exit_status;
     107         136 :     std::unique_ptr<interfaces::Init> init = interfaces::MakeWalletInit(argc, argv, exit_status);
     108         136 :     if (!init) {
     109           0 :         return exit_status;
     110             :     }
     111             : 
     112         136 :     SetupEnvironment();
     113         136 :     RandomInit();
     114             :     try {
     115         136 :         if (const auto maybe_exit{WalletAppInit(args, argc, argv)}) return *maybe_exit;
     116         124 :     } catch (...) {
     117           0 :         PrintExceptionContinue(std::current_exception(), "WalletAppInit()");
     118           0 :         return EXIT_FAILURE;
     119           0 :     }
     120             : 
     121         124 :     const auto command = args.GetCommand();
     122         124 :     if (!command) {
     123           4 :         tfm::format(std::cerr, "No method provided. Run `dash-wallet -help` for valid methods.\n");
     124           4 :         return EXIT_FAILURE;
     125             :     }
     126         120 :     if (command->args.size() != 0) {
     127           4 :         tfm::format(std::cerr, "Error: Additional arguments provided (%s). Methods do not take arguments. Please refer to `-help`.\n", Join(command->args, ", "));
     128           4 :         return EXIT_FAILURE;
     129             :     }
     130             : 
     131         116 :     ECC_Start();
     132         116 :     if (!wallet::WalletTool::ExecuteWalletToolFunc(args, command->command)) {
     133          68 :         return EXIT_FAILURE;
     134             :     }
     135          48 :     ECC_Stop();
     136          48 :     return EXIT_SUCCESS;
     137         136 : }

Generated by: LCOV version 1.16