Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115236
D4134.id13080.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
42 KB
Subscribers
None
D4134.id13080.diff
View Options
diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp
--- a/src/interfaces/node.cpp
+++ b/src/interfaces/node.cpp
@@ -245,8 +245,8 @@
std::vector<std::unique_ptr<Wallet>> getWallets() override {
#ifdef ENABLE_WALLET
std::vector<std::unique_ptr<Wallet>> wallets;
- for (CWallet *wallet : GetWallets()) {
- wallets.emplace_back(MakeWallet(*wallet));
+ for (const std::shared_ptr<CWallet> &wallet : GetWallets()) {
+ wallets.emplace_back(MakeWallet(wallet));
}
return wallets;
#else
@@ -269,7 +269,9 @@
}
std::unique_ptr<Handler> handleLoadWallet(LoadWalletFn fn) override {
CHECK_WALLET(return MakeHandler(::uiInterface.LoadWallet.connect(
- [fn](CWallet *wallet) { fn(MakeWallet(*wallet)); })));
+ [fn](std::shared_ptr<CWallet> wallet) {
+ fn(MakeWallet(wallet));
+ })));
}
std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(
NotifyNumConnectionsChangedFn fn) override {
@@ -306,7 +308,6 @@
}));
}
};
-
} // namespace
std::unique_ptr<Node> MakeNode() {
diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h
--- a/src/interfaces/wallet.h
+++ b/src/interfaces/wallet.h
@@ -345,7 +345,7 @@
//! Return implementation of Wallet interface. This function will be undefined
//! in builds where ENABLE_WALLET is false.
-std::unique_ptr<Wallet> MakeWallet(CWallet &wallet);
+std::unique_ptr<Wallet> MakeWallet(const std::shared_ptr<CWallet> &wallet);
} // namespace interfaces
diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp
--- a/src/interfaces/wallet.cpp
+++ b/src/interfaces/wallet.cpp
@@ -117,7 +117,8 @@
class WalletImpl : public Wallet {
public:
- WalletImpl(CWallet &wallet) : m_wallet(wallet) {}
+ WalletImpl(const std::shared_ptr<CWallet> &wallet)
+ : m_shared_wallet(wallet), m_wallet(*wallet.get()) {}
bool encryptWallet(const SecureString &wallet_passphrase) override {
return m_wallet.EncryptWallet(wallet_passphrase);
@@ -431,12 +432,13 @@
return GetMinimumFee(m_wallet, tx_bytes, coin_control, g_mempool);
}
+ std::shared_ptr<CWallet> m_shared_wallet;
CWallet &m_wallet;
};
} // namespace
-std::unique_ptr<Wallet> MakeWallet(CWallet &wallet) {
+std::unique_ptr<Wallet> MakeWallet(const std::shared_ptr<CWallet> &wallet) {
return std::make_unique<WalletImpl>(wallet);
}
diff --git a/src/qt/test/addressbooktests.cpp b/src/qt/test/addressbooktests.cpp
--- a/src/qt/test/addressbooktests.cpp
+++ b/src/qt/test/addressbooktests.cpp
@@ -56,15 +56,16 @@
*/
void TestAddAddressesToSendBook() {
TestChain100Setup test;
- CWallet wallet(Params(), "mock", WalletDatabase::CreateMock());
+ std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(
+ Params(), "mock", WalletDatabase::CreateMock());
bool firstRun;
- wallet.LoadWallet(firstRun);
+ wallet->LoadWallet(firstRun);
auto build_address = [&wallet]() {
CKey key;
key.MakeNewKey(true);
CTxDestination dest(GetDestinationForKey(
- key.GetPubKey(), wallet.m_default_address_type));
+ key.GetPubKey(), wallet->m_default_address_type));
return std::make_pair(
dest, QString::fromStdString(EncodeCashAddr(dest, Params())));
@@ -88,13 +89,14 @@
std::tie(std::ignore, new_address) = build_address();
{
- LOCK(wallet.cs_wallet);
- wallet.SetAddressBook(r_key_dest, r_label.toStdString(), "receive");
- wallet.SetAddressBook(s_key_dest, s_label.toStdString(), "send");
+ LOCK(wallet->cs_wallet);
+ wallet->SetAddressBook(r_key_dest, r_label.toStdString(), "receive");
+ wallet->SetAddressBook(s_key_dest, s_label.toStdString(), "send");
}
auto check_addbook_size = [&wallet](int expected_size) {
- QCOMPARE(static_cast<int>(wallet.mapAddressBook.size()), expected_size);
+ QCOMPARE(static_cast<int>(wallet->mapAddressBook.size()),
+ expected_size);
};
// We should start with the two addresses we added earlier and nothing else.
@@ -105,10 +107,10 @@
PlatformStyle::instantiate("other"));
auto node = interfaces::MakeNode();
OptionsModel optionsModel(*node);
- AddWallet(&wallet);
+ AddWallet(wallet);
WalletModel walletModel(std::move(node->getWallets()[0]), *node,
platformStyle.get(), &optionsModel);
- RemoveWallet(&wallet);
+ RemoveWallet(wallet);
EditAddressDialog editAddressDialog(EditAddressDialog::NewSendingAddress);
editAddressDialog.setModel(walletModel.getAddressTableModel());
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -107,45 +107,46 @@
test.CreateAndProcessBlock(
{}, GetScriptForRawPubKey(test.coinbaseKey.GetPubKey()));
}
- CWallet wallet(Params(), "mock", WalletDatabase::CreateMock());
+ std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(
+ Params(), "mock", WalletDatabase::CreateMock());
bool firstRun;
- wallet.LoadWallet(firstRun);
+ wallet->LoadWallet(firstRun);
{
- LOCK(wallet.cs_wallet);
- wallet.SetAddressBook(
+ LOCK(wallet->cs_wallet);
+ wallet->SetAddressBook(
GetDestinationForKey(test.coinbaseKey.GetPubKey(),
- wallet.m_default_address_type),
+ wallet->m_default_address_type),
"", "receive");
- wallet.AddKeyPubKey(test.coinbaseKey, test.coinbaseKey.GetPubKey());
+ wallet->AddKeyPubKey(test.coinbaseKey, test.coinbaseKey.GetPubKey());
}
{
LOCK(cs_main);
- WalletRescanReserver reserver(&wallet);
+ WalletRescanReserver reserver(wallet.get());
reserver.reserve();
- wallet.ScanForWalletTransactions(chainActive.Genesis(), nullptr,
- reserver, true);
+ wallet->ScanForWalletTransactions(chainActive.Genesis(), nullptr,
+ reserver, true);
}
- wallet.SetBroadcastTransactions(true);
+ wallet->SetBroadcastTransactions(true);
// Create widgets for sending coins and listing transactions.
std::unique_ptr<const PlatformStyle> platformStyle(
PlatformStyle::instantiate("other"));
auto node = interfaces::MakeNode();
OptionsModel optionsModel(*node);
- AddWallet(&wallet);
+ AddWallet(wallet);
WalletModel walletModel(std::move(node->getWallets().back()), *node,
platformStyle.get(), &optionsModel);
- RemoveWallet(&wallet);
+ RemoveWallet(wallet);
// Send two transactions, and verify they are added to transaction list.
SendCoinsDialog sendCoinsDialog(platformStyle.get(), &walletModel);
TransactionTableModel *transactionTableModel =
walletModel.getTransactionTableModel();
QCOMPARE(transactionTableModel->rowCount({}), 105);
- TxId txid1 =
- SendCoins(wallet, sendCoinsDialog, CTxDestination(CKeyID()), 5 * COIN);
- TxId txid2 =
- SendCoins(wallet, sendCoinsDialog, CTxDestination(CKeyID()), 10 * COIN);
+ TxId txid1 = SendCoins(*wallet.get(), sendCoinsDialog,
+ CTxDestination(CKeyID()), 5 * COIN);
+ TxId txid2 = SendCoins(*wallet.get(), sendCoinsDialog,
+ CTxDestination(CKeyID()), 10 * COIN);
QCOMPARE(transactionTableModel->rowCount({}), 107);
QVERIFY(FindTx(*transactionTableModel, txid1).isValid());
QVERIFY(FindTx(*transactionTableModel, txid2).isValid());
diff --git a/src/ui_interface.h b/src/ui_interface.h
--- a/src/ui_interface.h
+++ b/src/ui_interface.h
@@ -6,12 +6,13 @@
#ifndef BITCOIN_UI_INTERFACE_H
#define BITCOIN_UI_INTERFACE_H
-#include <cstdint>
-#include <string>
-
#include <boost/signals2/last_value.hpp>
#include <boost/signals2/signal.hpp>
+#include <cstdint>
+#include <memory>
+#include <string>
+
class CWallet;
class CBlockIndex;
@@ -107,7 +108,7 @@
boost::signals2::signal<void()> NotifyAlertChanged;
/** A wallet has been loaded. */
- boost::signals2::signal<void(CWallet *wallet)> LoadWallet;
+ boost::signals2::signal<void(std::shared_ptr<CWallet> wallet)> LoadWallet;
/**
* Show progress e.g. for verifychain.
diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp
--- a/src/wallet/init.cpp
+++ b/src/wallet/init.cpp
@@ -349,7 +349,7 @@
}
for (const std::string &walletFile : gArgs.GetArgs("-wallet")) {
- CWallet *const pwallet = CWallet::CreateWalletFromFile(
+ std::shared_ptr<CWallet> pwallet = CWallet::CreateWalletFromFile(
chainParams, walletFile, fs::absolute(walletFile, GetWalletDir()));
if (!pwallet) {
return false;
@@ -361,7 +361,7 @@
}
void WalletInit::Start(CScheduler &scheduler) const {
- for (CWallet *pwallet : GetWallets()) {
+ for (const std::shared_ptr<CWallet> &pwallet : GetWallets()) {
pwallet->postInitProcess();
}
@@ -375,20 +375,19 @@
}
void WalletInit::Flush() const {
- for (CWallet *pwallet : GetWallets()) {
+ for (const std::shared_ptr<CWallet> &pwallet : GetWallets()) {
pwallet->Flush(false);
}
}
void WalletInit::Stop() const {
- for (CWallet *pwallet : GetWallets()) {
+ for (const std::shared_ptr<CWallet> &pwallet : GetWallets()) {
pwallet->Flush(true);
}
}
void WalletInit::Close() const {
- for (CWallet *pwallet : GetWallets()) {
+ for (const std::shared_ptr<CWallet> &pwallet : GetWallets()) {
RemoveWallet(pwallet);
- delete pwallet;
}
}
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp
--- a/src/wallet/rpcdump.cpp
+++ b/src/wallet/rpcdump.cpp
@@ -108,7 +108,8 @@
}
UniValue importprivkey(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -214,7 +215,8 @@
}
UniValue abortrescan(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -283,7 +285,8 @@
}
UniValue importaddress(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -385,7 +388,8 @@
UniValue importprunedfunds(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -464,7 +468,8 @@
UniValue removeprunedfunds(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -510,7 +515,8 @@
}
UniValue importpubkey(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -596,7 +602,8 @@
}
UniValue importwallet(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -753,7 +760,8 @@
}
UniValue dumpprivkey(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -798,7 +806,8 @@
}
UniValue dumpwallet(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1323,7 +1332,9 @@
}
UniValue importmulti(const Config &config, const JSONRPCRequest &mainRequest) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(mainRequest);
+ std::shared_ptr<CWallet> const wallet =
+ GetWalletForJSONRPCRequest(mainRequest);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, mainRequest.fHelp)) {
return NullUniValue;
}
diff --git a/src/wallet/rpcwallet.h b/src/wallet/rpcwallet.h
--- a/src/wallet/rpcwallet.h
+++ b/src/wallet/rpcwallet.h
@@ -22,7 +22,8 @@
* @param[in] request JSONRPCRequest that wishes to access a wallet
* @return NULL if no wallet should be used, or a pointer to the CWallet
*/
-CWallet *GetWalletForJSONRPCRequest(const JSONRPCRequest &);
+std::shared_ptr<CWallet>
+GetWalletForJSONRPCRequest(const JSONRPCRequest &request);
std::string HelpRequiringPassphrase(CWallet *);
void EnsureWalletIsUnlocked(CWallet *);
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp
--- a/src/wallet/rpcwallet.cpp
+++ b/src/wallet/rpcwallet.cpp
@@ -50,13 +50,14 @@
return res;
}
-CWallet *GetWalletForJSONRPCRequest(const JSONRPCRequest &request) {
+std::shared_ptr<CWallet>
+GetWalletForJSONRPCRequest(const JSONRPCRequest &request) {
if (request.URI.substr(0, WALLET_ENDPOINT_BASE.size()) ==
WALLET_ENDPOINT_BASE) {
// wallet endpoint was used
std::string requestedWallet =
urlDecode(request.URI.substr(WALLET_ENDPOINT_BASE.size()));
- CWallet *pwallet = GetWallet(requestedWallet);
+ std::shared_ptr<CWallet> pwallet = GetWallet(requestedWallet);
if (!pwallet) {
throw JSONRPCError(
RPC_WALLET_NOT_FOUND,
@@ -65,7 +66,7 @@
return pwallet;
}
- std::vector<CWallet *> wallets = GetWallets();
+ std::vector<std::shared_ptr<CWallet>> wallets = GetWallets();
return wallets.size() == 1 || (request.fHelp && wallets.size() > 0)
? wallets[0]
: nullptr;
@@ -149,7 +150,9 @@
static UniValue getnewaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -226,7 +229,9 @@
static UniValue getlabeladdress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -263,7 +268,9 @@
static UniValue getrawchangeaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -315,7 +322,9 @@
}
static UniValue setlabel(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -373,7 +382,9 @@
static UniValue getaccount(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -416,7 +427,9 @@
static UniValue getaddressesbyaccount(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -515,7 +528,9 @@
static UniValue sendtoaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -608,7 +623,9 @@
static UniValue listaddressgroupings(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -670,7 +687,9 @@
static UniValue signmessage(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -743,7 +762,9 @@
static UniValue getreceivedbyaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -829,7 +850,9 @@
static UniValue getreceivedbylabel(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -905,7 +928,9 @@
static UniValue getbalance(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -994,7 +1019,9 @@
static UniValue getunconfirmedbalance(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1015,7 +1042,9 @@
}
static UniValue movecmd(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1083,7 +1112,9 @@
}
static UniValue sendfrom(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1195,7 +1226,9 @@
}
static UniValue sendmany(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1382,7 +1415,9 @@
static UniValue addmultisigaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1638,7 +1673,9 @@
static UniValue listreceivedbyaddress(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1702,7 +1739,9 @@
static UniValue listreceivedbylabel(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -1866,9 +1905,10 @@
}
}
-static UniValue listtransactions(const Config &config,
- const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+UniValue listtransactions(const Config &config, const JSONRPCRequest &request) {
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2061,7 +2101,9 @@
static UniValue listaccounts(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2163,7 +2205,9 @@
static UniValue listsinceblock(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2371,7 +2415,9 @@
static UniValue gettransaction(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2508,7 +2554,9 @@
static UniValue abandontransaction(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2560,7 +2608,9 @@
static UniValue backupwallet(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2593,7 +2643,9 @@
static UniValue keypoolrefill(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2643,7 +2695,9 @@
static UniValue walletpassphrase(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2731,7 +2785,9 @@
static UniValue walletpassphrasechange(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2792,7 +2848,9 @@
static UniValue walletlock(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2837,7 +2895,9 @@
static UniValue encryptwallet(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -2915,7 +2975,9 @@
static UniValue lockunspent(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3073,7 +3135,9 @@
static UniValue listlockunspent(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3132,7 +3196,9 @@
}
static UniValue settxfee(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3165,7 +3231,9 @@
static UniValue getwalletinfo(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3271,13 +3339,14 @@
UniValue obj(UniValue::VARR);
- for (CWallet *pwallet : GetWallets()) {
- if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
+ for (const std::shared_ptr<CWallet> &wallet : GetWallets()) {
+ if (!EnsureWalletIsAvailable(wallet.get(), request.fHelp)) {
return NullUniValue;
}
- LOCK(pwallet->cs_wallet);
- obj.push_back(pwallet->GetName());
+ LOCK(wallet->cs_wallet);
+
+ obj.push_back(wallet->GetName());
}
return obj;
@@ -3324,7 +3393,7 @@
"Wallet file verification failed: " + error);
}
- CWallet *const wallet = CWallet::CreateWalletFromFile(
+ std::shared_ptr<CWallet> const wallet = CWallet::CreateWalletFromFile(
chainParams, wallet_file, fs::absolute(wallet_file, GetWalletDir()));
if (!wallet) {
throw JSONRPCError(RPC_WALLET_ERROR, "Wallet loading failed.");
@@ -3342,7 +3411,9 @@
static UniValue resendwallettransactions(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3385,7 +3456,9 @@
static UniValue listunspent(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3603,7 +3676,9 @@
static UniValue fundrawtransaction(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3818,7 +3893,9 @@
UniValue signrawtransactionwithwallet(const Config &config,
const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -3910,8 +3987,9 @@
request.params[2]);
}
-static UniValue generate(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+UniValue generate(const Config &config, const JSONRPCRequest &request) {
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
@@ -3961,7 +4039,9 @@
}
UniValue rescanblockchain(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
@@ -4156,7 +4236,9 @@
}
UniValue getaddressinfo(const Config &config, const JSONRPCRequest &request) {
- CWallet *const pwallet = GetWalletForJSONRPCRequest(request);
+ std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
+ CWallet *const pwallet = wallet.get();
+
if (!EnsureWalletIsAvailable(pwallet, request.fHelp)) {
return NullUniValue;
}
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -73,8 +73,9 @@
// before the missing block, and success for a key whose creation time is
// after.
{
- CWallet wallet(Params(), "dummy", WalletDatabase::CreateDummy());
- AddWallet(&wallet);
+ std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(
+ Params(), "dummy", WalletDatabase::CreateDummy());
+ AddWallet(wallet);
UniValue keys;
keys.setArray();
UniValue key;
@@ -113,7 +114,7 @@
"rescanning the relevant blocks (see -reindex and "
"-rescan options).\"}},{\"success\":true}]",
0, oldTip->GetBlockTimeMax(), TIMESTAMP_WINDOW));
- RemoveWallet(&wallet);
+ RemoveWallet(wallet);
}
}
@@ -151,37 +152,39 @@
// Import key into wallet and call dumpwallet to create backup file.
{
- CWallet wallet(Params(), "dummy", WalletDatabase::CreateDummy());
- LOCK(wallet.cs_wallet);
- wallet.mapKeyMetadata[coinbaseKey.GetPubKey().GetID()].nCreateTime =
+ std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(
+ Params(), "dummy", WalletDatabase::CreateDummy());
+ LOCK(wallet->cs_wallet);
+ wallet->mapKeyMetadata[coinbaseKey.GetPubKey().GetID()].nCreateTime =
KEY_TIME;
- wallet.AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey());
+ wallet->AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey());
JSONRPCRequest request;
request.params.setArray();
request.params.push_back(backup_file);
- AddWallet(&wallet);
+ AddWallet(wallet);
::dumpwallet(GetConfig(), request);
- RemoveWallet(&wallet);
+ RemoveWallet(wallet);
}
// Call importwallet RPC and verify all blocks with timestamps >= BLOCK_TIME
// were scanned, and no prior blocks were scanned.
{
- CWallet wallet(Params(), "dummy", WalletDatabase::CreateDummy());
+ std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(
+ Params(), "dummy", WalletDatabase::CreateDummy());
JSONRPCRequest request;
request.params.setArray();
request.params.push_back(backup_file);
- AddWallet(&wallet);
+ AddWallet(wallet);
::importwallet(GetConfig(), request);
- RemoveWallet(&wallet);
+ RemoveWallet(wallet);
- LOCK(wallet.cs_wallet);
- BOOST_CHECK_EQUAL(wallet.mapWallet.size(), 3U);
+ LOCK(wallet->cs_wallet);
+ BOOST_CHECK_EQUAL(wallet->mapWallet.size(), 3U);
BOOST_CHECK_EQUAL(m_coinbase_txns.size(), 103U);
for (size_t i = 0; i < m_coinbase_txns.size(); ++i) {
- bool found = wallet.GetWalletTx(m_coinbase_txns[i]->GetId());
+ bool found = wallet->GetWalletTx(m_coinbase_txns[i]->GetId());
bool expected = i >= 100;
BOOST_CHECK_EQUAL(found, expected);
}
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -31,11 +31,11 @@
#include <utility>
#include <vector>
-bool AddWallet(CWallet *wallet);
-bool RemoveWallet(CWallet *wallet);
+bool AddWallet(const std::shared_ptr<CWallet> &wallet);
+bool RemoveWallet(const std::shared_ptr<CWallet> &wallet);
bool HasWallets();
-std::vector<CWallet *> GetWallets();
-CWallet *GetWallet(const std::string &name);
+std::vector<std::shared_ptr<CWallet>> GetWallets();
+std::shared_ptr<CWallet> GetWallet(const std::string &name);
//! Default for -keypool
static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
@@ -1239,9 +1239,9 @@
* Initializes the wallet, returns a new CWallet instance or a null pointer
* in case of an error.
*/
- static CWallet *CreateWalletFromFile(const CChainParams &chainParams,
- const std::string &name,
- const fs::path &path);
+ static std::shared_ptr<CWallet>
+ CreateWalletFromFile(const CChainParams &chainParams,
+ const std::string &name, const fs::path &path);
/**
* Wallet post-init setup
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -42,12 +42,12 @@
#include <future>
static CCriticalSection cs_wallets;
-static std::vector<CWallet *> vpwallets GUARDED_BY(cs_wallets);
+static std::vector<std::shared_ptr<CWallet>> vpwallets GUARDED_BY(cs_wallets);
-bool AddWallet(CWallet *wallet) {
+bool AddWallet(const std::shared_ptr<CWallet> &wallet) {
LOCK(cs_wallets);
assert(wallet);
- std::vector<CWallet *>::const_iterator i =
+ std::vector<std::shared_ptr<CWallet>>::const_iterator i =
std::find(vpwallets.begin(), vpwallets.end(), wallet);
if (i != vpwallets.end()) {
return false;
@@ -56,10 +56,10 @@
return true;
}
-bool RemoveWallet(CWallet *wallet) {
+bool RemoveWallet(const std::shared_ptr<CWallet> &wallet) {
LOCK(cs_wallets);
assert(wallet);
- std::vector<CWallet *>::iterator i =
+ std::vector<std::shared_ptr<CWallet>>::iterator i =
std::find(vpwallets.begin(), vpwallets.end(), wallet);
if (i == vpwallets.end()) {
return false;
@@ -73,14 +73,14 @@
return !vpwallets.empty();
}
-std::vector<CWallet *> GetWallets() {
+std::vector<std::shared_ptr<CWallet>> GetWallets() {
LOCK(cs_wallets);
return vpwallets;
}
-CWallet *GetWallet(const std::string &name) {
+std::shared_ptr<CWallet> GetWallet(const std::string &name) {
LOCK(cs_wallets);
- for (CWallet *wallet : vpwallets) {
+ for (const std::shared_ptr<CWallet> &wallet : vpwallets) {
if (wallet->GetName() == name) {
return wallet;
}
@@ -3427,8 +3427,6 @@
return nLoadWalletRet;
}
- uiInterface.LoadWallet(this);
-
return DBErrors::LOAD_OK;
}
@@ -4306,9 +4304,9 @@
error_string);
}
-CWallet *CWallet::CreateWalletFromFile(const CChainParams &chainParams,
- const std::string &name,
- const fs::path &path) {
+std::shared_ptr<CWallet>
+CWallet::CreateWalletFromFile(const CChainParams &chainParams,
+ const std::string &name, const fs::path &path) {
const std::string &walletFile = name;
// Needed to restore wallet transaction meta data after -zapwallettxes
@@ -4331,11 +4329,8 @@
int64_t nStart = GetTimeMillis();
bool fFirstRun = true;
- // Make a temporary wallet unique pointer so memory doesn't get leaked if
- // wallet creation fails.
- auto temp_wallet = std::make_unique<CWallet>(chainParams, name,
- WalletDatabase::Create(path));
- CWallet *walletInstance = temp_wallet.get();
+ std::shared_ptr<CWallet> walletInstance = std::make_shared<CWallet>(
+ chainParams, name, WalletDatabase::Create(path));
DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun);
if (nLoadWalletRet != DBErrors::LOAD_OK) {
if (nLoadWalletRet == DBErrors::CORRUPT) {
@@ -4366,6 +4361,8 @@
}
}
+ uiInterface.LoadWallet(walletInstance);
+
if (gArgs.GetBoolArg("-upgradewallet", fFirstRun)) {
int nMaxVersion = gArgs.GetArg("-upgradewallet", 0);
// The -upgradewallet without argument case
@@ -4541,7 +4538,7 @@
nStart = GetTimeMillis();
{
- WalletRescanReserver reserver(walletInstance);
+ WalletRescanReserver reserver(walletInstance.get());
if (!reserver.reserve()) {
InitError(
_("Failed to rescan the wallet during initialization"));
@@ -4581,7 +4578,7 @@
// Register with the validation interface. It's ok to do this after rescan
// since we're still holding cs_main.
- RegisterValidationInterface(temp_wallet.release());
+ RegisterValidationInterface(walletInstance.get());
walletInstance->SetBroadcastTransactions(
gArgs.GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -762,7 +762,7 @@
return;
}
- for (CWallet *pwallet : GetWallets()) {
+ for (const std::shared_ptr<CWallet> &pwallet : GetWallets()) {
WalletDatabase &dbh = pwallet->GetDBHandle();
unsigned int nUpdateCounter = dbh.nUpdateCounter;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 1, 10:24 (10 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187346
Default Alt Text
D4134.id13080.diff (42 KB)
Attached To
D4134: wallet: Use shared pointer to retain wallet instance
Event Timeline
Log In to Comment