diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp --- a/src/bench/coin_selection.cpp +++ b/src/bench/coin_selection.cpp @@ -34,7 +34,7 @@ SelectParams(CBaseChainParams::REGTEST); auto chain = interfaces::MakeChain(); - const CWallet wallet(Params(), *chain, WalletLocation(), + const CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); std::vector> wtxs; LOCK(wallet.cs_wallet); @@ -106,7 +106,7 @@ SelectParams(CBaseChainParams::REGTEST); auto chain = interfaces::MakeChain(); - const CWallet wallet(Params(), *chain, WalletLocation(), + const CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); LOCK(wallet.cs_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 @@ -61,7 +61,7 @@ auto chain = interfaces::MakeChain(); std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateMock()); + Params(), chain.get(), WalletLocation(), WalletDatabase::CreateMock()); bool firstRun; wallet->LoadWallet(firstRun); 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 @@ -116,7 +116,7 @@ auto chain = interfaces::MakeChain(); std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateMock()); + Params(), chain.get(), WalletLocation(), WalletDatabase::CreateMock()); bool firstRun; wallet->LoadWallet(firstRun); diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp --- a/src/wallet/test/coinselector_tests.cpp +++ b/src/wallet/test/coinselector_tests.cpp @@ -301,7 +301,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test) { auto testChain = interfaces::MakeChain(); - CWallet testWallet(Params(), *testChain, WalletLocation(), + CWallet testWallet(Params(), testChain.get(), WalletLocation(), WalletDatabase::CreateDummy()); CoinSet setCoinsRet, setCoinsRet2; @@ -730,7 +730,7 @@ // to find a solution that can pay the target value BOOST_AUTO_TEST_CASE(SelectCoins_test) { auto testChain = interfaces::MakeChain(); - CWallet testWallet(Params(), *testChain, WalletLocation(), + CWallet testWallet(Params(), testChain.get(), WalletLocation(), WalletDatabase::CreateDummy()); // Random generator stuff diff --git a/src/wallet/test/wallet_test_fixture.cpp b/src/wallet/test/wallet_test_fixture.cpp --- a/src/wallet/test/wallet_test_fixture.cpp +++ b/src/wallet/test/wallet_test_fixture.cpp @@ -12,8 +12,9 @@ #include WalletTestingSetup::WalletTestingSetup(const std::string &chainName) - : TestingSetup(chainName), m_wallet(Params(), *m_chain, WalletLocation(), - WalletDatabase::CreateMock()) { + : TestingSetup(chainName), + m_wallet(Params(), m_chain.get(), WalletLocation(), + WalletDatabase::CreateMock()) { bool fFirstRun; m_wallet.LoadWallet(fFirstRun); m_wallet.m_chain_notifications_handler = 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 @@ -45,7 +45,7 @@ // Verify ScanForWalletTransactions accommodates a null start block. { - CWallet wallet(Params(), *chain, WalletLocation(), + CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); AddKey(wallet, coinbaseKey); WalletRescanReserver reserver(&wallet); @@ -62,7 +62,7 @@ // Verify ScanForWalletTransactions picks up transactions in both the old // and new block files. { - CWallet wallet(Params(), *chain, WalletLocation(), + CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); AddKey(wallet, coinbaseKey); WalletRescanReserver reserver(&wallet); @@ -83,7 +83,7 @@ // Verify ScanForWalletTransactions only picks transactions in the new block // file. { - CWallet wallet(Params(), *chain, WalletLocation(), + CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); AddKey(wallet, coinbaseKey); WalletRescanReserver reserver(&wallet); @@ -103,7 +103,7 @@ // Verify ScanForWalletTransactions scans no blocks. { - CWallet wallet(Params(), *chain, WalletLocation(), + CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); AddKey(wallet, coinbaseKey); WalletRescanReserver reserver(&wallet); @@ -138,8 +138,9 @@ // before the missing block, and success for a key whose creation time is // after. { - std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateDummy()); + std::shared_ptr wallet = + std::make_shared(Params(), chain.get(), WalletLocation(), + WalletDatabase::CreateDummy()); AddWallet(wallet); UniValue keys; keys.setArray(); @@ -218,8 +219,9 @@ // Import key into wallet and call dumpwallet to create backup file. { - std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateDummy()); + std::shared_ptr wallet = + std::make_shared(Params(), chain.get(), WalletLocation(), + WalletDatabase::CreateDummy()); LOCK(wallet->cs_wallet); wallet->mapKeyMetadata[coinbaseKey.GetPubKey().GetID()].nCreateTime = KEY_TIME; @@ -236,8 +238,9 @@ // Call importwallet RPC and verify all blocks with timestamps >= BLOCK_TIME // were scanned, and no prior blocks were scanned. { - std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateDummy()); + std::shared_ptr wallet = + std::make_shared(Params(), chain.get(), WalletLocation(), + WalletDatabase::CreateDummy()); JSONRPCRequest request; request.params.setArray(); @@ -265,7 +268,7 @@ // debit functions. BOOST_FIXTURE_TEST_CASE(coin_mark_dirty_immature_credit, TestChain100Setup) { auto chain = interfaces::MakeChain(); - CWallet wallet(Params(), *chain, WalletLocation(), + CWallet wallet(Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); CWalletTx wtx(&wallet, m_coinbase_txns.back()); auto locked_chain = chain->lock(); @@ -359,8 +362,9 @@ ListCoinsTestingSetup() { CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())); - wallet = std::make_unique(Params(), *m_chain, WalletLocation(), - WalletDatabase::CreateMock()); + wallet = + std::make_unique(Params(), m_chain.get(), WalletLocation(), + WalletDatabase::CreateMock()); bool firstRun; wallet->LoadWallet(firstRun); AddKey(*wallet, coinbaseKey); @@ -485,7 +489,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup) { auto chain = interfaces::MakeChain(); std::shared_ptr wallet = std::make_shared( - Params(), *chain, WalletLocation(), WalletDatabase::CreateDummy()); + Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); wallet->SetMinVersion(FEATURE_LATEST); wallet->SetWalletFlag(WALLET_FLAG_DISABLE_PRIVATE_KEYS); BOOST_CHECK(!wallet->TopUpKeyPool(1000)); diff --git a/src/wallet/test/walletdb_tests.cpp b/src/wallet/test/walletdb_tests.cpp --- a/src/wallet/test/walletdb_tests.cpp +++ b/src/wallet/test/walletdb_tests.cpp @@ -19,7 +19,7 @@ static std::unique_ptr LoadWallet(WalletBatch &batch) { auto chain = interfaces::MakeChain(); std::unique_ptr wallet = std::make_unique( - Params(), *chain, WalletLocation(), WalletDatabase::CreateDummy()); + Params(), chain.get(), WalletLocation(), WalletDatabase::CreateDummy()); DBErrors res = batch.LoadWallet(wallet.get()); BOOST_CHECK(res == DBErrors::LOAD_OK); return wallet; diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -768,7 +768,7 @@ EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); /** Interface for accessing chain state. */ - interfaces::Chain &m_chain; + interfaces::Chain *m_chain; /** * Wallet location which includes wallet name (see WalletLocation). @@ -836,7 +836,7 @@ unsigned int nMasterKeyMaxID = 0; /** Construct wallet with specified name and database implementation. */ - CWallet(const CChainParams &chainParamsIn, interfaces::Chain &chain, + CWallet(const CChainParams &chainParamsIn, interfaces::Chain *chain, const WalletLocation &location, std::unique_ptr databaseIn) : m_chain(chain), m_location(location), database(std::move(databaseIn)), @@ -865,7 +865,10 @@ std::unique_ptr m_chain_notifications_handler; /** Interface for accessing chain state. */ - interfaces::Chain &chain() const { return m_chain; } + interfaces::Chain &chain() const { + assert(m_chain); + return *m_chain; + } const CWalletTx *GetWalletTx(const TxId &txid) const; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3415,7 +3415,6 @@ } DBErrors CWallet::LoadWallet(bool &fFirstRunRet) { - auto locked_chain = chain().lock(); LOCK(cs_wallet); fFirstRunRet = false; @@ -4352,7 +4351,7 @@ if (salvage_wallet) { // Recover readable keypairs: - CWallet dummyWallet(chainParams, chain, WalletLocation(), + CWallet dummyWallet(chainParams, &chain, WalletLocation(), WalletDatabase::CreateDummy()); std::string backup_filename; if (!WalletBatch::Recover( @@ -4399,7 +4398,7 @@ _("Zapping all transactions from wallet...").translated); std::unique_ptr tempWallet = std::make_unique( - chainParams, chain, location, + chainParams, &chain, location, WalletDatabase::Create(location.GetPath())); DBErrors nZapWalletRet = tempWallet->ZapWalletTx(vWtx); if (nZapWalletRet != DBErrors::LOAD_OK) { @@ -4417,7 +4416,7 @@ // TODO: Can't use std::make_shared because we need a custom deleter but // should be possible to use std::allocate_shared. std::shared_ptr walletInstance( - new CWallet(chainParams, chain, location, + new CWallet(chainParams, &chain, location, WalletDatabase::Create(location.GetPath())), ReleaseWallet); DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun); diff --git a/src/wallet/wallettool.cpp b/src/wallet/wallettool.cpp --- a/src/wallet/wallettool.cpp +++ b/src/wallet/wallettool.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -30,9 +29,8 @@ return nullptr; } // dummy chain interface - auto chain = interfaces::MakeChain(); std::shared_ptr wallet_instance( - new CWallet(Params(), *chain, WalletLocation(name), + new CWallet(Params(), nullptr /* chain */, WalletLocation(name), WalletDatabase::Create(path)), WalletToolReleaseWallet); bool first_run = true; @@ -61,9 +59,8 @@ } // dummy chain interface - auto chain = interfaces::MakeChain(); std::shared_ptr wallet_instance( - new CWallet(Params(), *chain, WalletLocation(name), + new CWallet(Params(), nullptr /* chain */, WalletLocation(name), WalletDatabase::Create(path)), WalletToolReleaseWallet); DBErrors load_wallet_ret;