refactor: Use DatabaseStatus and DatabaseOptions types
No changes in behavior. Just replaces arguments and return types
This commit is contained in:
1 parent
b5b414151a
commit
0d94e60625
7 files changed
+55
-42
No files matched your search
@@ -514,15 +514,22 @@ public:
|
|||||||
void setMockTime(int64_t time) override { return SetMockTime(time); }
|
void setMockTime(int64_t time) override { return SetMockTime(time); }
|
||||||
|
|
||||||
//! WalletClient methods
|
//! WalletClient methods
|
||||||
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
|
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
|
||||||
{
|
{
|
||||||
std::shared_ptr<CWallet> wallet;
|
std::shared_ptr<CWallet> wallet;
|
||||||
status = CreateWallet(*m_context.chain, passphrase, wallet_creation_flags, name, true /* load_on_start */, error, warnings, wallet);
|
DatabaseOptions options;
|
||||||
return MakeWallet(std::move(wallet));
|
DatabaseStatus status;
|
||||||
|
options.require_create = true;
|
||||||
|
options.create_flags = wallet_creation_flags;
|
||||||
|
options.create_passphrase = passphrase;
|
||||||
|
return MakeWallet(CreateWallet(*m_context.chain, name, true /* load_on_start */, options, status, error, warnings));
|
||||||
}
|
}
|
||||||
std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) override
|
std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) override
|
||||||
{
|
{
|
||||||
return MakeWallet(LoadWallet(*m_context.chain, name, true /* load_on_start */, error, warnings));
|
DatabaseOptions options;
|
||||||
|
DatabaseStatus status;
|
||||||
|
options.require_existing = true;
|
||||||
|
return MakeWallet(LoadWallet(*m_context.chain, name, true /* load_on_start */, options, status, error, warnings));
|
||||||
}
|
}
|
||||||
std::string getWalletDir() override
|
std::string getWalletDir() override
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ class CWallet;
|
|||||||
enum class FeeReason;
|
enum class FeeReason;
|
||||||
enum class OutputType;
|
enum class OutputType;
|
||||||
enum class TransactionError;
|
enum class TransactionError;
|
||||||
enum class WalletCreationStatus;
|
|
||||||
enum isminetype : unsigned int;
|
enum isminetype : unsigned int;
|
||||||
struct CRecipient;
|
struct CRecipient;
|
||||||
struct PartiallySignedTransaction;
|
struct PartiallySignedTransaction;
|
||||||
@@ -311,7 +310,7 @@ class WalletClient : public ChainClient
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! Create new wallet.
|
//! Create new wallet.
|
||||||
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;
|
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;
|
||||||
|
|
||||||
//! Load existing wallet.
|
//! Load existing wallet.
|
||||||
virtual std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;
|
virtual std::unique_ptr<Wallet> loadWallet(const std::string& name, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;
|
||||||
|
|||||||
@@ -249,10 +249,9 @@ void CreateWalletActivity::createWallet()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QTimer::singleShot(500, worker(), [this, name, flags] {
|
QTimer::singleShot(500, worker(), [this, name, flags] {
|
||||||
WalletCreationStatus status;
|
std::unique_ptr<interfaces::Wallet> wallet = node().walletClient().createWallet(name, m_passphrase, flags, m_error_message, m_warning_message);
|
||||||
std::unique_ptr<interfaces::Wallet> wallet = node().walletClient().createWallet(name, m_passphrase, flags, status, m_error_message, m_warning_message);
|
|
||||||
|
|
||||||
if (status == WalletCreationStatus::SUCCESS) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
|
if (wallet) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
|
||||||
|
|
||||||
QTimer::singleShot(500, this, &CreateWalletActivity::finish);
|
QTimer::singleShot(500, this, &CreateWalletActivity::finish);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <clientversion.h>
|
#include <clientversion.h>
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <streams.h>
|
#include <streams.h>
|
||||||
|
#include <support/allocators/secure.h>
|
||||||
#include <util/memory.h>
|
#include <util/memory.h>
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@@ -202,6 +203,8 @@ enum class DatabaseFormat {
|
|||||||
struct DatabaseOptions {
|
struct DatabaseOptions {
|
||||||
bool require_existing = false;
|
bool require_existing = false;
|
||||||
bool require_create = false;
|
bool require_create = false;
|
||||||
|
uint64_t create_flags = 0;
|
||||||
|
SecureString create_passphrase;
|
||||||
bool verify = true;
|
bool verify = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -212,7 +215,9 @@ enum class DatabaseStatus {
|
|||||||
FAILED_ALREADY_LOADED,
|
FAILED_ALREADY_LOADED,
|
||||||
FAILED_ALREADY_EXISTS,
|
FAILED_ALREADY_EXISTS,
|
||||||
FAILED_NOT_FOUND,
|
FAILED_NOT_FOUND,
|
||||||
|
FAILED_CREATE,
|
||||||
FAILED_VERIFY,
|
FAILED_VERIFY,
|
||||||
|
FAILED_ENCRYPT,
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
|
std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
|
||||||
|
|||||||
+11
-11
@@ -2515,10 +2515,12 @@ static UniValue loadwallet(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DatabaseOptions options;
|
||||||
|
DatabaseStatus status;
|
||||||
bilingual_str error;
|
bilingual_str error;
|
||||||
std::vector<bilingual_str> warnings;
|
std::vector<bilingual_str> warnings;
|
||||||
Optional<bool> load_on_start = request.params[1].isNull() ? nullopt : Optional<bool>(request.params[1].get_bool());
|
Optional<bool> load_on_start = request.params[1].isNull() ? nullopt : Optional<bool>(request.params[1].get_bool());
|
||||||
std::shared_ptr<CWallet> const wallet = LoadWallet(*context.chain, name, load_on_start, error, warnings);
|
std::shared_ptr<CWallet> const wallet = LoadWallet(*context.chain, name, load_on_start, options, status, error, warnings);
|
||||||
if (!wallet) throw JSONRPCError(RPC_WALLET_ERROR, error.original);
|
if (!wallet) throw JSONRPCError(RPC_WALLET_ERROR, error.original);
|
||||||
|
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
@@ -2648,18 +2650,16 @@ static UniValue createwallet(const JSONRPCRequest& request)
|
|||||||
warnings.emplace_back(Untranslated("Wallet is an experimental descriptor wallet"));
|
warnings.emplace_back(Untranslated("Wallet is an experimental descriptor wallet"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DatabaseOptions options;
|
||||||
|
DatabaseStatus status;
|
||||||
|
options.create_flags = flags;
|
||||||
|
options.create_passphrase = passphrase;
|
||||||
bilingual_str error;
|
bilingual_str error;
|
||||||
std::shared_ptr<CWallet> wallet;
|
|
||||||
Optional<bool> load_on_start = request.params[6].isNull() ? nullopt : Optional<bool>(request.params[6].get_bool());
|
Optional<bool> load_on_start = request.params[6].isNull() ? nullopt : Optional<bool>(request.params[6].get_bool());
|
||||||
WalletCreationStatus status = CreateWallet(*context.chain, passphrase, flags, request.params[0].get_str(), load_on_start, error, warnings, wallet);
|
std::shared_ptr<CWallet> wallet = CreateWallet(*context.chain, request.params[0].get_str(), load_on_start, options, status, error, warnings);
|
||||||
switch (status) {
|
if (!wallet) {
|
||||||
case WalletCreationStatus::CREATION_FAILED:
|
RPCErrorCode code = status == DatabaseStatus::FAILED_ENCRYPT ? RPC_WALLET_ENCRYPTION_FAILED : RPC_WALLET_ERROR;
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, error.original);
|
throw JSONRPCError(code, error.original);
|
||||||
case WalletCreationStatus::ENCRYPTION_FAILED:
|
|
||||||
throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, error.original);
|
|
||||||
case WalletCreationStatus::SUCCESS:
|
|
||||||
break;
|
|
||||||
// no default case, so the compiler can warn about missing cases
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
|
|||||||
+23
-13
@@ -200,7 +200,7 @@ void UnloadWallet(std::shared_ptr<CWallet>&& wallet)
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
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)
|
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)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (!CWallet::Verify(chain, name, error, warnings)) {
|
if (!CWallet::Verify(chain, name, error, warnings)) {
|
||||||
@@ -227,20 +227,23 @@ std::shared_ptr<CWallet> LoadWalletInternal(interfaces::Chain& chain, const std:
|
|||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
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)
|
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)
|
||||||
{
|
{
|
||||||
auto result = WITH_LOCK(g_loading_wallet_mutex, return g_loading_wallet_set.insert(name));
|
auto result = WITH_LOCK(g_loading_wallet_mutex, return g_loading_wallet_set.insert(name));
|
||||||
if (!result.second) {
|
if (!result.second) {
|
||||||
error = Untranslated("Wallet already being loading.");
|
error = Untranslated("Wallet already being loading.");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto wallet = LoadWalletInternal(chain, name, load_on_start, error, warnings);
|
auto wallet = LoadWalletInternal(chain, name, load_on_start, options, status, error, warnings);
|
||||||
WITH_LOCK(g_loading_wallet_mutex, g_loading_wallet_set.erase(result.first));
|
WITH_LOCK(g_loading_wallet_mutex, g_loading_wallet_set.erase(result.first));
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
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)
|
||||||
{
|
{
|
||||||
|
uint64_t wallet_creation_flags = options.create_flags;
|
||||||
|
const SecureString& passphrase = options.create_passphrase;
|
||||||
|
|
||||||
// Indicate that the wallet is actually supposed to be blank and not just blank to make it encrypted
|
// Indicate that the wallet is actually supposed to be blank and not just blank to make it encrypted
|
||||||
bool create_blank = (wallet_creation_flags & WALLET_FLAG_BLANK_WALLET);
|
bool create_blank = (wallet_creation_flags & WALLET_FLAG_BLANK_WALLET);
|
||||||
|
|
||||||
@@ -252,39 +255,45 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
|
|||||||
// Check the wallet file location
|
// Check the wallet file location
|
||||||
if (fs::symlink_status(fs::absolute(name.empty() ? "wallet.dat" : name, GetWalletDir())).type() != fs::file_not_found) {
|
if (fs::symlink_status(fs::absolute(name.empty() ? "wallet.dat" : name, GetWalletDir())).type() != fs::file_not_found) {
|
||||||
error = strprintf(Untranslated("Wallet %s already exists."), name);
|
error = strprintf(Untranslated("Wallet %s already exists."), name);
|
||||||
return WalletCreationStatus::CREATION_FAILED;
|
status = DatabaseStatus::FAILED_CREATE;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wallet::Verify will check if we're trying to create a wallet with a duplicate name.
|
// Wallet::Verify will check if we're trying to create a wallet with a duplicate name.
|
||||||
if (!CWallet::Verify(chain, name, error, warnings)) {
|
if (!CWallet::Verify(chain, name, error, warnings)) {
|
||||||
error = Untranslated("Wallet file verification failed.") + Untranslated(" ") + error;
|
error = Untranslated("Wallet file verification failed.") + Untranslated(" ") + error;
|
||||||
return WalletCreationStatus::CREATION_FAILED;
|
status = DatabaseStatus::FAILED_VERIFY;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not allow a passphrase when private keys are disabled
|
// Do not allow a passphrase when private keys are disabled
|
||||||
if (!passphrase.empty() && (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (!passphrase.empty() && (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
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.");
|
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.");
|
||||||
return WalletCreationStatus::CREATION_FAILED;
|
status = DatabaseStatus::FAILED_CREATE;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the wallet
|
// Make the wallet
|
||||||
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile(chain, name, error, warnings, wallet_creation_flags);
|
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile(chain, name, error, warnings, wallet_creation_flags);
|
||||||
if (!wallet) {
|
if (!wallet) {
|
||||||
error = Untranslated("Wallet creation failed.") + Untranslated(" ") + error;
|
error = Untranslated("Wallet creation failed.") + Untranslated(" ") + error;
|
||||||
return WalletCreationStatus::CREATION_FAILED;
|
status = DatabaseStatus::FAILED_CREATE;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt the wallet
|
// Encrypt the wallet
|
||||||
if (!passphrase.empty() && !(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (!passphrase.empty() && !(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
if (!wallet->EncryptWallet(passphrase)) {
|
if (!wallet->EncryptWallet(passphrase)) {
|
||||||
error = Untranslated("Error: Wallet created but failed to encrypt.");
|
error = Untranslated("Error: Wallet created but failed to encrypt.");
|
||||||
return WalletCreationStatus::ENCRYPTION_FAILED;
|
status = DatabaseStatus::FAILED_ENCRYPT;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (!create_blank) {
|
if (!create_blank) {
|
||||||
// Unlock the wallet
|
// Unlock the wallet
|
||||||
if (!wallet->Unlock(passphrase)) {
|
if (!wallet->Unlock(passphrase)) {
|
||||||
error = Untranslated("Error: Wallet was encrypted but could not be unlocked");
|
error = Untranslated("Error: Wallet was encrypted but could not be unlocked");
|
||||||
return WalletCreationStatus::ENCRYPTION_FAILED;
|
status = DatabaseStatus::FAILED_ENCRYPT;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set a seed for the wallet
|
// Set a seed for the wallet
|
||||||
@@ -296,7 +305,8 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
|
|||||||
for (auto spk_man : wallet->GetActiveScriptPubKeyMans()) {
|
for (auto spk_man : wallet->GetActiveScriptPubKeyMans()) {
|
||||||
if (!spk_man->SetupGeneration()) {
|
if (!spk_man->SetupGeneration()) {
|
||||||
error = Untranslated("Unable to generate initial keys");
|
error = Untranslated("Unable to generate initial keys");
|
||||||
return WalletCreationStatus::CREATION_FAILED;
|
status = DatabaseStatus::FAILED_CREATE;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,12 +318,12 @@ WalletCreationStatus CreateWallet(interfaces::Chain& chain, const SecureString&
|
|||||||
}
|
}
|
||||||
AddWallet(wallet);
|
AddWallet(wallet);
|
||||||
wallet->postInitProcess();
|
wallet->postInitProcess();
|
||||||
result = wallet;
|
|
||||||
|
|
||||||
// Write the wallet settings
|
// Write the wallet settings
|
||||||
UpdateWalletSetting(chain, name, load_on_start, warnings);
|
UpdateWalletSetting(chain, name, load_on_start, warnings);
|
||||||
|
|
||||||
return WalletCreationStatus::SUCCESS;
|
status = DatabaseStatus::SUCCESS;
|
||||||
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint256 CWalletTx::ABANDON_HASH(UINT256_ONE());
|
const uint256 CWalletTx::ABANDON_HASH(UINT256_ONE());
|
||||||
|
|||||||
+2
-9
@@ -54,17 +54,10 @@ bool RemoveWallet(const std::shared_ptr<CWallet>& wallet, Optional<bool> load_on
|
|||||||
bool RemoveWallet(const std::shared_ptr<CWallet>& wallet, Optional<bool> load_on_start);
|
bool RemoveWallet(const std::shared_ptr<CWallet>& wallet, Optional<bool> load_on_start);
|
||||||
std::vector<std::shared_ptr<CWallet>> GetWallets();
|
std::vector<std::shared_ptr<CWallet>> GetWallets();
|
||||||
std::shared_ptr<CWallet> GetWallet(const std::string& name);
|
std::shared_ptr<CWallet> GetWallet(const std::string& name);
|
||||||
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);
|
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);
|
||||||
|
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);
|
||||||
std::unique_ptr<interfaces::Handler> HandleLoadWallet(LoadWalletFn load_wallet);
|
std::unique_ptr<interfaces::Handler> HandleLoadWallet(LoadWalletFn load_wallet);
|
||||||
|
|
||||||
enum class WalletCreationStatus {
|
|
||||||
SUCCESS,
|
|
||||||
CREATION_FAILED,
|
|
||||||
ENCRYPTION_FAILED
|
|
||||||
};
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
//! -paytxfee default
|
//! -paytxfee default
|
||||||
constexpr CAmount DEFAULT_PAY_TX_FEE = 0;
|
constexpr CAmount DEFAULT_PAY_TX_FEE = 0;
|
||||||
//! -fallbackfee default
|
//! -fallbackfee default
|
||||||
|
|||||||
Reference in new issue
Block a user