@@ -200,7 +200,7 @@ void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
200
200
}
201
201
202
202
namespace {
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)
204
204
{
205
205
try {
206
206
if (!CWallet::Verify (chain, name, error, warnings)) {
@@ -227,20 +227,23 @@ std::shared_ptr<CWallet> LoadWalletInternal(interfaces::Chain& chain, const std:
227
227
}
228
228
} // namespace
229
229
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)
231
231
{
232
232
auto result = WITH_LOCK (g_loading_wallet_mutex, return g_loading_wallet_set.insert (name));
233
233
if (!result.second ) {
234
234
error = Untranslated (" Wallet already being loading." );
235
235
return nullptr ;
236
236
}
237
- auto wallet = LoadWalletInternal (chain, name, load_on_start, error, warnings);
237
+ auto wallet = LoadWalletInternal (chain, name, load_on_start, options, status, error, warnings);
238
238
WITH_LOCK (g_loading_wallet_mutex, g_loading_wallet_set.erase (result.first ));
239
239
return wallet;
240
240
}
241
241
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 )
243
243
{
244
+ uint64_t wallet_creation_flags = options.create_flags ;
245
+ const SecureString& passphrase = options.create_passphrase ;
246
+
244
247
// Indicate that the wallet is actually supposed to be blank and not just blank to make it encrypted
245
248
bool create_blank = (wallet_creation_flags & WALLET_FLAG_BLANK_WALLET);
246
249
@@ -252,39 +255,45 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
252
255
// Check the wallet file location
253
256
if (fs::symlink_status (fs::absolute (name.empty () ? " wallet.dat" : name, GetWalletDir ())).type () != fs::file_not_found) {
254
257
error = strprintf (Untranslated (" Wallet %s already exists." ), name);
255
- return WalletCreationStatus::CREATION_FAILED;
258
+ status = DatabaseStatus::FAILED_CREATE;
259
+ return nullptr ;
256
260
}
257
261
258
262
// Wallet::Verify will check if we're trying to create a wallet with a duplicate name.
259
263
if (!CWallet::Verify (chain, name, error, warnings)) {
260
264
error = Untranslated (" Wallet file verification failed." ) + Untranslated (" " ) + error;
261
- return WalletCreationStatus::CREATION_FAILED;
265
+ status = DatabaseStatus::FAILED_VERIFY;
266
+ return nullptr ;
262
267
}
263
268
264
269
// Do not allow a passphrase when private keys are disabled
265
270
if (!passphrase.empty () && (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
266
271
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 ;
268
274
}
269
275
270
276
// Make the wallet
271
277
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile (chain, name, error, warnings, wallet_creation_flags);
272
278
if (!wallet) {
273
279
error = Untranslated (" Wallet creation failed." ) + Untranslated (" " ) + error;
274
- return WalletCreationStatus::CREATION_FAILED;
280
+ status = DatabaseStatus::FAILED_CREATE;
281
+ return nullptr ;
275
282
}
276
283
277
284
// Encrypt the wallet
278
285
if (!passphrase.empty () && !(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
279
286
if (!wallet->EncryptWallet (passphrase)) {
280
287
error = Untranslated (" Error: Wallet created but failed to encrypt." );
281
- return WalletCreationStatus::ENCRYPTION_FAILED;
288
+ status = DatabaseStatus::FAILED_ENCRYPT;
289
+ return nullptr ;
282
290
}
283
291
if (!create_blank) {
284
292
// Unlock the wallet
285
293
if (!wallet->Unlock (passphrase)) {
286
294
error = Untranslated (" Error: Wallet was encrypted but could not be unlocked" );
287
- return WalletCreationStatus::ENCRYPTION_FAILED;
295
+ status = DatabaseStatus::FAILED_ENCRYPT;
296
+ return nullptr ;
288
297
}
289
298
290
299
// Set a seed for the wallet
@@ -296,7 +305,8 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
296
305
for (auto spk_man : wallet->GetActiveScriptPubKeyMans ()) {
297
306
if (!spk_man->SetupGeneration ()) {
298
307
error = Untranslated (" Unable to generate initial keys" );
299
- return WalletCreationStatus::CREATION_FAILED;
308
+ status = DatabaseStatus::FAILED_CREATE;
309
+ return nullptr ;
300
310
}
301
311
}
302
312
}
@@ -308,12 +318,12 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
308
318
}
309
319
AddWallet (wallet);
310
320
wallet->postInitProcess ();
311
- result = wallet;
312
321
313
322
// Write the wallet settings
314
323
UpdateWalletSetting (chain, name, load_on_start, warnings);
315
324
316
- return WalletCreationStatus::SUCCESS;
325
+ status = DatabaseStatus::SUCCESS;
326
+ return wallet;
317
327
}
318
328
319
329
const uint256 CWalletTx::ABANDON_HASH (UINT256_ONE());
0 commit comments