22#include <system_error>
28 std::error_code error;
31 fs::path canonical_wallet_dir = fs::canonical(wallet_dir, error);
32 if (error || !
fs::exists(canonical_wallet_dir)) {
34 strprintf(
_(
"Specified -walletdir \"%s\" does not exist"),
37 }
else if (!fs::is_directory(canonical_wallet_dir)) {
39 strprintf(
_(
"Specified -walletdir \"%s\" is not a directory"),
44 }
else if (!wallet_dir.is_absolute()) {
46 strprintf(
_(
"Specified -walletdir \"%s\" is a relative path"),
55 chain.
initMessage(
_(
"Verifying wallet(s)...").translated);
76 std::set<fs::path> wallet_paths;
79 const auto &wallet_file =
wallet.get_str();
83 if (!wallet_paths.insert(path).second) {
85 strprintf(
_(
"Ignoring duplicate -wallet %s."), wallet_file));
97 strprintf(
"Skipping -wallet path that doesn't exist. %s\n",
112 std::set<fs::path> wallet_paths;
124 std::vector<bilingual_str> warnings;
125 std::unique_ptr<WalletDatabase> database =
131 std::shared_ptr<CWallet> pwallet =
137 if (!warnings.empty()) {
149 }
catch (
const std::runtime_error &e) {
156 for (
const std::shared_ptr<CWallet> &pwallet :
GetWallets(context)) {
157 pwallet->postInitProcess();
167 std::chrono::milliseconds{500});
174 std::chrono::milliseconds{1000});
178 for (
const std::shared_ptr<CWallet> &pwallet :
GetWallets(context)) {
184 for (
const std::shared_ptr<CWallet> &pwallet :
GetWallets(context)) {
191 while (!wallets.empty()) {
192 auto wallet = wallets.back();
194 std::vector<bilingual_str> warnings;
void ForceSetArg(const std::string &strArg, const std::string &strValue)
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
Simple class for background tasks that should be run periodically or once "after a while".
void scheduleEvery(Predicate p, std::chrono::milliseconds delta) EXCLUSIVE_LOCKS_REQUIRED(!newTaskMutex)
Repeat p until it return false.
static std::shared_ptr< CWallet > Create(WalletContext &context, const std::string &name, std::unique_ptr< WalletDatabase > database, uint64_t wallet_creation_flags, bilingual_str &error, std::vector< bilingual_str > &warnings)
Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error.
void push_back(UniValue val)
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
virtual bool updateRwSetting(const std::string &name, const util::SettingsValue &value, bool write=true)=0
Write a setting to <datadir>/settings.json.
virtual void initMessage(const std::string &message)=0
Send init message.
virtual void initError(const bilingual_str &message)=0
Send init error.
virtual std::vector< util::SettingsValue > getSettingsList(const std::string &arg)=0
Get list of settings values.
virtual void initWarning(const bilingual_str &message)=0
Send init warning.
void FlushWallets(WalletContext &context)
Flush all wallets in preparation for shutdown.
void StopWallets(WalletContext &context)
Stop all wallets. Wallets will be flushed first.
void StartWallets(WalletContext &context, CScheduler &scheduler)
Complete startup of wallets.
bool LoadWallets(WalletContext &context)
Load wallet databases.
bool VerifyWallets(WalletContext &context)
Responsible for reading and validating the -wallet arguments and verifying.
void UnloadWallets(WalletContext &context)
Close all wallets.
static bool exists(const path &p)
static std::string PathToString(const path &path)
Convert path object to byte string.
static path PathFromString(const std::string &string)
Convert byte string to path object.
fs::path AbsPathJoin(const fs::path &base, const fs::path &path)
Helper function for joining two paths.
auto Join(const std::vector< T > &list, const BaseType &separator, UnaryOp unary_op) -> decltype(unary_op(list.at(0)))
Join a list of items.
WalletContext struct containing references to state shared between CWallet instances,...
interfaces::Chain * chain
bilingual_str _(const char *psz)
Translation function.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
std::unique_ptr< WalletDatabase > MakeWalletDatabase(const std::string &name, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error_string)
bool RemoveWallet(WalletContext &context, const std::shared_ptr< CWallet > &wallet, std::optional< bool > load_on_start, std::vector< bilingual_str > &warnings)
void UnloadWallet(std::shared_ptr< CWallet > &&wallet)
Explicitly unload and delete the wallet.
void MaybeResendWalletTxs(WalletContext &context)
Called periodically by the schedule thread.
bool AddWallet(WalletContext &context, const std::shared_ptr< CWallet > &wallet)
std::vector< std::shared_ptr< CWallet > > GetWallets(WalletContext &context)
void NotifyWalletLoaded(WalletContext &context, const std::shared_ptr< CWallet > &wallet)
void MaybeCompactWalletDB(WalletContext &context)
Compacts BDB state so that wallet.dat is self-contained (if there are changes)
static const bool DEFAULT_FLUSHWALLET
Overview of wallet database classes:
fs::path GetWalletDir()
Get the path of the wallet directory.