@@ -203,12 +203,13 @@ namespace {
203203std::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 {
206- if (!MakeWalletDatabase (name, options, status, error)) {
206+ std::unique_ptr<WalletDatabase> database = MakeWalletDatabase (name, options, status, error);
207+ if (!database) {
207208 error = Untranslated (" Wallet file verification failed." ) + Untranslated (" " ) + error;
208209 return nullptr ;
209210 }
210211
211- std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile (chain, name, error, warnings);
212+ std::shared_ptr<CWallet> wallet = CWallet::Create (chain, name, std::move (database), options. create_flags , error, warnings);
212213 if (!wallet) {
213214 error = Untranslated (" Wallet loading failed." ) + Untranslated (" " ) + error;
214215 return nullptr ;
@@ -260,7 +261,8 @@ std::shared_ptr<CWallet> CreateWallet(interfaces::Chain& chain, const std::strin
260261 }
261262
262263 // Wallet::Verify will check if we're trying to create a wallet with a duplicate name.
263- if (!MakeWalletDatabase (name, options, status, error)) {
264+ std::unique_ptr<WalletDatabase> database = MakeWalletDatabase (name, options, status, error);
265+ if (!database) {
264266 error = Untranslated (" Wallet file verification failed." ) + Untranslated (" " ) + error;
265267 status = DatabaseStatus::FAILED_VERIFY;
266268 return nullptr ;
@@ -274,7 +276,7 @@ std::shared_ptr<CWallet> CreateWallet(interfaces::Chain& chain, const std::strin
274276 }
275277
276278 // Make the wallet
277- std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile (chain, name, error, warnings, wallet_creation_flags );
279+ std::shared_ptr<CWallet> wallet = CWallet::Create (chain, name, std::move (database), wallet_creation_flags, error, warnings );
278280 if (!wallet) {
279281 error = Untranslated (" Wallet creation failed." ) + Untranslated (" " ) + error;
280282 status = DatabaseStatus::FAILED_CREATE;
@@ -3803,18 +3805,17 @@ std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, cons
38033805 return MakeDatabase (wallet_path, options, status, error_string);
38043806}
38053807
3806- std::shared_ptr<CWallet> CWallet::CreateWalletFromFile (interfaces::Chain& chain, const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings, uint64_t wallet_creation_flags )
3808+ std::shared_ptr<CWallet> CWallet::Create (interfaces::Chain& chain, const std::string& name, std::unique_ptr<WalletDatabase> database, uint64_t wallet_creation_flags, bilingual_str& error, std::vector<bilingual_str>& warnings)
38073809{
3808- fs::path path = fs::absolute (name, GetWalletDir ());
3809- const std::string walletFile = WalletDataFilePath (path).string ();
3810+ const std::string& walletFile = database->Filename ();
38103811
38113812 chain.initMessage (_ (" Loading wallet..." ).translated );
38123813
38133814 int64_t nStart = GetTimeMillis ();
38143815 bool fFirstRun = true ;
38153816 // TODO: Can't use std::make_shared because we need a custom deleter but
38163817 // should be possible to use std::allocate_shared.
3817- std::shared_ptr<CWallet> walletInstance (new CWallet (&chain, name, CreateWalletDatabase (path )), ReleaseWallet);
3818+ std::shared_ptr<CWallet> walletInstance (new CWallet (&chain, name, std::move (database )), ReleaseWallet);
38183819 DBErrors nLoadWalletRet = walletInstance->LoadWallet (fFirstRun );
38193820 if (nLoadWalletRet != DBErrors::LOAD_OK) {
38203821 if (nLoadWalletRet == DBErrors::CORRUPT) {
0 commit comments