@@ -200,7 +200,7 @@ void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
200200}
201201
202202namespace {
203- std::shared_ptr<CWallet> LoadWalletInternal (interfaces::Chain& chain, const std::string& name, Optional<bool > load_on_start, bilingual_str& error, std::vector<bilingual_str>& warnings)
203+ std::shared_ptr<CWallet> LoadWalletInternal (interfaces::Chain& chain, const std::string& name, Optional<bool > load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings)
204204{
205205 try {
206206 if (!CWallet::Verify (chain, name, error, warnings)) {
@@ -227,20 +227,23 @@ std::shared_ptr<CWallet> LoadWalletInternal(interfaces::Chain& chain, const std:
227227}
228228} // namespace
229229
230- std::shared_ptr<CWallet> LoadWallet (interfaces::Chain& chain, const std::string& name, Optional<bool > load_on_start, bilingual_str& error, std::vector<bilingual_str>& warnings)
230+ std::shared_ptr<CWallet> LoadWallet (interfaces::Chain& chain, const std::string& name, Optional<bool > load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings)
231231{
232232 auto result = WITH_LOCK (g_loading_wallet_mutex, return g_loading_wallet_set.insert (name));
233233 if (!result.second ) {
234234 error = Untranslated (" Wallet already being loading." );
235235 return nullptr ;
236236 }
237- auto wallet = LoadWalletInternal (chain, name, load_on_start, error, warnings);
237+ auto wallet = LoadWalletInternal (chain, name, load_on_start, options, status, error, warnings);
238238 WITH_LOCK (g_loading_wallet_mutex, g_loading_wallet_set.erase (result.first ));
239239 return wallet;
240240}
241241
242- WalletCreationStatus CreateWallet (interfaces::Chain& chain, const SecureString& passphrase, uint64_t wallet_creation_flags, const std::string& name, Optional<bool > load_on_start, bilingual_str& error, std::vector< bilingual_str>& warnings , std::shared_ptr<CWallet >& result )
242+ std::shared_ptr<CWallet> CreateWallet (interfaces::Chain& chain, const std::string& name, Optional<bool > load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error , std::vector<bilingual_str >& warnings )
243243{
244+ uint64_t wallet_creation_flags = options.create_flags ;
245+ const SecureString& passphrase = options.create_passphrase ;
246+
244247 // Indicate that the wallet is actually supposed to be blank and not just blank to make it encrypted
245248 bool create_blank = (wallet_creation_flags & WALLET_FLAG_BLANK_WALLET);
246249
@@ -252,39 +255,45 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
252255 // Check the wallet file location
253256 if (fs::symlink_status (fs::absolute (name.empty () ? " wallet.dat" : name, GetWalletDir ())).type () != fs::file_not_found) {
254257 error = strprintf (Untranslated (" Wallet %s already exists." ), name);
255- return WalletCreationStatus::CREATION_FAILED;
258+ status = DatabaseStatus::FAILED_CREATE;
259+ return nullptr ;
256260 }
257261
258262 // Wallet::Verify will check if we're trying to create a wallet with a duplicate name.
259263 if (!CWallet::Verify (chain, name, error, warnings)) {
260264 error = Untranslated (" Wallet file verification failed." ) + Untranslated (" " ) + error;
261- return WalletCreationStatus::CREATION_FAILED;
265+ status = DatabaseStatus::FAILED_VERIFY;
266+ return nullptr ;
262267 }
263268
264269 // Do not allow a passphrase when private keys are disabled
265270 if (!passphrase.empty () && (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
266271 error = Untranslated (" Passphrase provided but private keys are disabled. A passphrase is only used to encrypt private keys, so cannot be used for wallets with private keys disabled." );
267- return WalletCreationStatus::CREATION_FAILED;
272+ status = DatabaseStatus::FAILED_CREATE;
273+ return nullptr ;
268274 }
269275
270276 // Make the wallet
271277 std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile (chain, name, error, warnings, wallet_creation_flags);
272278 if (!wallet) {
273279 error = Untranslated (" Wallet creation failed." ) + Untranslated (" " ) + error;
274- return WalletCreationStatus::CREATION_FAILED;
280+ status = DatabaseStatus::FAILED_CREATE;
281+ return nullptr ;
275282 }
276283
277284 // Encrypt the wallet
278285 if (!passphrase.empty () && !(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
279286 if (!wallet->EncryptWallet (passphrase)) {
280287 error = Untranslated (" Error: Wallet created but failed to encrypt." );
281- return WalletCreationStatus::ENCRYPTION_FAILED;
288+ status = DatabaseStatus::FAILED_ENCRYPT;
289+ return nullptr ;
282290 }
283291 if (!create_blank) {
284292 // Unlock the wallet
285293 if (!wallet->Unlock (passphrase)) {
286294 error = Untranslated (" Error: Wallet was encrypted but could not be unlocked" );
287- return WalletCreationStatus::ENCRYPTION_FAILED;
295+ status = DatabaseStatus::FAILED_ENCRYPT;
296+ return nullptr ;
288297 }
289298
290299 // Set a seed for the wallet
@@ -296,7 +305,8 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
296305 for (auto spk_man : wallet->GetActiveScriptPubKeyMans ()) {
297306 if (!spk_man->SetupGeneration ()) {
298307 error = Untranslated (" Unable to generate initial keys" );
299- return WalletCreationStatus::CREATION_FAILED;
308+ status = DatabaseStatus::FAILED_CREATE;
309+ return nullptr ;
300310 }
301311 }
302312 }
@@ -308,12 +318,12 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
308318 }
309319 AddWallet (wallet);
310320 wallet->postInitProcess ();
311- result = wallet;
312321
313322 // Write the wallet settings
314323 UpdateWalletSetting (chain, name, load_on_start, warnings);
315324
316- return WalletCreationStatus::SUCCESS;
325+ status = DatabaseStatus::SUCCESS;
326+ return wallet;
317327}
318328
319329const uint256 CWalletTx::ABANDON_HASH (UINT256_ONE());
0 commit comments