Skip to content

Commit 0d94e60

Browse files
committed
refactor: Use DatabaseStatus and DatabaseOptions types
No changes in behavior. Just replaces arguments and return types
1 parent b5b4141 commit 0d94e60

File tree

7 files changed

+55
-42
lines changed

7 files changed

+55
-42
lines changed

src/interfaces/wallet.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -514,15 +514,22 @@ class WalletClientImpl : public WalletClient
514514
void setMockTime(int64_t time) override { return SetMockTime(time); }
515515

516516
//! WalletClient methods
517-
std::unique_ptr<Wallet> createWallet(const std::string& name, const SecureString& passphrase, uint64_t wallet_creation_flags, WalletCreationStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings) override
517+
std::unique_ptr<Wallet> createWallet(const std::string& name, const SecureString& passphrase, uint64_t wallet_creation_flags, bilingual_str& error, std::vector<bilingual_str>& warnings) override
518518
{
519519
std::shared_ptr<CWallet> wallet;
520-
status = CreateWallet(*m_context.chain, passphrase, wallet_creation_flags, name, true /* load_on_start */, error, warnings, wallet);
521-
return MakeWallet(std::move(wallet));
520+
DatabaseOptions options;
521+
DatabaseStatus status;
522+
options.require_create = true;
523+
options.create_flags = wallet_creation_flags;
524+
options.create_passphrase = passphrase;
525+
return MakeWallet(CreateWallet(*m_context.chain, name, true /* load_on_start */, options, status, error, warnings));
522526
}
523527
std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) override
524528
{
525-
return MakeWallet(LoadWallet(*m_context.chain, name, true /* load_on_start */, error, warnings));
529+
DatabaseOptions options;
530+
DatabaseStatus status;
531+
options.require_existing = true;
532+
return MakeWallet(LoadWallet(*m_context.chain, name, true /* load_on_start */, options, status, error, warnings));
526533
}
527534
std::string getWalletDir() override
528535
{

src/interfaces/wallet.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class CWallet;
2929
enum class FeeReason;
3030
enum class OutputType;
3131
enum class TransactionError;
32-
enum class WalletCreationStatus;
3332
enum isminetype : unsigned int;
3433
struct CRecipient;
3534
struct PartiallySignedTransaction;
@@ -311,7 +310,7 @@ class WalletClient : public ChainClient
311310
{
312311
public:
313312
//! Create new wallet.
314-
virtual std::unique_ptr<Wallet> createWallet(const std::string& name, const SecureString& passphrase, uint64_t wallet_creation_flags, WalletCreationStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;
313+
virtual std::unique_ptr<Wallet> createWallet(const std::string& name, const SecureString& passphrase, uint64_t wallet_creation_flags, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;
315314

316315
//! Load existing wallet.
317316
virtual std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;

src/qt/walletcontroller.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,9 @@ void CreateWalletActivity::createWallet()
249249
}
250250

251251
QTimer::singleShot(500, worker(), [this, name, flags] {
252-
WalletCreationStatus status;
253-
std::unique_ptr<interfaces::Wallet> wallet = node().walletClient().createWallet(name, m_passphrase, flags, status, m_error_message, m_warning_message);
252+
std::unique_ptr<interfaces::Wallet> wallet = node().walletClient().createWallet(name, m_passphrase, flags, m_error_message, m_warning_message);
254253

255-
if (status == WalletCreationStatus::SUCCESS) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
254+
if (wallet) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
256255

257256
QTimer::singleShot(500, this, &CreateWalletActivity::finish);
258257
});

src/wallet/db.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <clientversion.h>
1010
#include <fs.h>
1111
#include <streams.h>
12+
#include <support/allocators/secure.h>
1213
#include <util/memory.h>
1314

1415
#include <atomic>
@@ -202,6 +203,8 @@ enum class DatabaseFormat {
202203
struct DatabaseOptions {
203204
bool require_existing = false;
204205
bool require_create = false;
206+
uint64_t create_flags = 0;
207+
SecureString create_passphrase;
205208
bool verify = true;
206209
};
207210

@@ -212,7 +215,9 @@ enum class DatabaseStatus {
212215
FAILED_ALREADY_LOADED,
213216
FAILED_ALREADY_EXISTS,
214217
FAILED_NOT_FOUND,
218+
FAILED_CREATE,
215219
FAILED_VERIFY,
220+
FAILED_ENCRYPT,
216221
};
217222

218223
std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);

src/wallet/rpcwallet.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2515,10 +2515,12 @@ static UniValue loadwallet(const JSONRPCRequest& request)
25152515
}
25162516
}
25172517

2518+
DatabaseOptions options;
2519+
DatabaseStatus status;
25182520
bilingual_str error;
25192521
std::vector<bilingual_str> warnings;
25202522
Optional<bool> load_on_start = request.params[1].isNull() ? nullopt : Optional<bool>(request.params[1].get_bool());
2521-
std::shared_ptr<CWallet> const wallet = LoadWallet(*context.chain, name, load_on_start, error, warnings);
2523+
std::shared_ptr<CWallet> const wallet = LoadWallet(*context.chain, name, load_on_start, options, status, error, warnings);
25222524
if (!wallet) throw JSONRPCError(RPC_WALLET_ERROR, error.original);
25232525

25242526
UniValue obj(UniValue::VOBJ);
@@ -2648,18 +2650,16 @@ static UniValue createwallet(const JSONRPCRequest& request)
26482650
warnings.emplace_back(Untranslated("Wallet is an experimental descriptor wallet"));
26492651
}
26502652

2653+
DatabaseOptions options;
2654+
DatabaseStatus status;
2655+
options.create_flags = flags;
2656+
options.create_passphrase = passphrase;
26512657
bilingual_str error;
2652-
std::shared_ptr<CWallet> wallet;
26532658
Optional<bool> load_on_start = request.params[6].isNull() ? nullopt : Optional<bool>(request.params[6].get_bool());
2654-
WalletCreationStatus status = CreateWallet(*context.chain, passphrase, flags, request.params[0].get_str(), load_on_start, error, warnings, wallet);
2655-
switch (status) {
2656-
case WalletCreationStatus::CREATION_FAILED:
2657-
throw JSONRPCError(RPC_WALLET_ERROR, error.original);
2658-
case WalletCreationStatus::ENCRYPTION_FAILED:
2659-
throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, error.original);
2660-
case WalletCreationStatus::SUCCESS:
2661-
break;
2662-
// no default case, so the compiler can warn about missing cases
2659+
std::shared_ptr<CWallet> wallet = CreateWallet(*context.chain, request.params[0].get_str(), load_on_start, options, status, error, warnings);
2660+
if (!wallet) {
2661+
RPCErrorCode code = status == DatabaseStatus::FAILED_ENCRYPT ? RPC_WALLET_ENCRYPTION_FAILED : RPC_WALLET_ERROR;
2662+
throw JSONRPCError(code, error.original);
26632663
}
26642664

26652665
UniValue obj(UniValue::VOBJ);

src/wallet/wallet.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
200200
}
201201

202202
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)
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

319329
const uint256 CWalletTx::ABANDON_HASH(UINT256_ONE());

src/wallet/wallet.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,10 @@ bool RemoveWallet(const std::shared_ptr<CWallet>& wallet, Optional<bool> load_on
5454
bool RemoveWallet(const std::shared_ptr<CWallet>& wallet, Optional<bool> load_on_start);
5555
std::vector<std::shared_ptr<CWallet>> GetWallets();
5656
std::shared_ptr<CWallet> GetWallet(const std::string& name);
57-
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);
57+
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);
58+
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);
5859
std::unique_ptr<interfaces::Handler> HandleLoadWallet(LoadWalletFn load_wallet);
5960

60-
enum class WalletCreationStatus {
61-
SUCCESS,
62-
CREATION_FAILED,
63-
ENCRYPTION_FAILED
64-
};
65-
66-
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);
67-
6861
//! -paytxfee default
6962
constexpr CAmount DEFAULT_PAY_TX_FEE = 0;
7063
//! -fallbackfee default

0 commit comments

Comments
 (0)