| 109 | } |
| 110 | |
| 111 | bool LoadWallets(WalletContext &context) { |
| 112 | interfaces::Chain &chain = *context.chain; |
| 113 | try { |
| 114 | std::set<fs::path> wallet_paths; |
| 115 | for (const auto &wallet : chain.getSettingsList("wallet")) { |
| 116 | const auto &name = wallet.get_str(); |
| 117 | if (!wallet_paths.insert(fs::PathFromString(name)).second) { |
| 118 | continue; |
| 119 | } |
| 120 | DatabaseOptions options; |
| 121 | DatabaseStatus status; |
| 122 | options.require_existing = true; |
| 123 | // No need to verify, assuming verified earlier in VerifyWallets() |
| 124 | options.verify = false; |
| 125 | bilingual_str error; |
| 126 | std::vector<bilingual_str> warnings; |
| 127 | std::unique_ptr<WalletDatabase> database = |
| 128 | MakeWalletDatabase(name, options, status, error); |
| 129 | if (!database && status == DatabaseStatus::FAILED_NOT_FOUND) { |
| 130 | continue; |
| 131 | } |
| 132 | chain.initMessage(_("Loading wallet...").translated); |
| 133 | std::shared_ptr<CWallet> pwallet = |
| 134 | database |
| 135 | ? CWallet::Create(context, name, std::move(database), |
| 136 | options.create_flags, error, warnings) |
| 137 | : nullptr; |
| 138 | |
| 139 | if (!warnings.empty()) { |
| 140 | chain.initWarning(Join(warnings, Untranslated("\n"))); |
| 141 | } |
| 142 | if (!pwallet) { |
| 143 | chain.initError(error); |
| 144 | return false; |
| 145 | } |
| 146 | |
| 147 | NotifyWalletLoaded(context, pwallet); |
| 148 | AddWallet(context, pwallet); |
| 149 | } |
| 150 | return true; |
| 151 | } catch (const std::runtime_error &e) { |
| 152 | chain.initError(Untranslated(e.what())); |
| 153 | return false; |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | void StartWallets(WalletContext &context, CScheduler &scheduler) { |
| 158 | for (const std::shared_ptr<CWallet> &pwallet : GetWallets(context)) { |
no test coverage detected