Skip to content

Commit e0151e3

Browse files
Merge #6447: [v22.0.x] backport: v22.0.0 rc.3
c7b0d80 Merge #6441: fix: hold wallet shared pointer in CJ Manager/Sessions to prevent concurrent unload (pasta) c074e09 Merge #6444: fix: add platform transfer to "most common" filter (pasta) cb04114 Merge #6442: fix: coin selection with `include_unsafe` option should respect `nCoinType` (pasta) db5b53a Merge #6434: fix: early EHF and buried EHF are indistinguish (pasta) Pull request description: ## Issue being fixed or feature implemented See commits; backports for rc.3 ## What was done? ## How Has This Been Tested? built locally ## Breaking Changes ## Checklist: _Go over all the following points, and put an `x` in all the boxes that apply._ - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: kwvg: ACK c7b0d80 UdjinM6: utACK c7b0d80 Tree-SHA512: a64d6503a845ea86df8660d34cdf819c6fefcae5e82035bd8de40152f4f7d894cd1870315b791cca81e6d4db08d9929e4d1de3338a0338478072c9e6bb66952a
2 parents a6ee725 + c7b0d80 commit e0151e3

14 files changed

+178
-147
lines changed

src/coinjoin/client.cpp

+58-74
Large diffs are not rendered by default.

src/coinjoin/client.h

+20-12
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class CoinJoinWalletManager {
9696
}
9797
}
9898

99-
void Add(CWallet& wallet);
99+
void Add(const std::shared_ptr<CWallet>& wallet);
100100
void DoMaintenance();
101101

102102
void Remove(const std::string& name);
@@ -138,7 +138,7 @@ class CoinJoinWalletManager {
138138
class CCoinJoinClientSession : public CCoinJoinBaseSession
139139
{
140140
private:
141-
CWallet& m_wallet;
141+
const std::shared_ptr<CWallet> m_wallet;
142142
CoinJoinWalletManager& m_walletman;
143143
CCoinJoinClientManager& m_clientman;
144144
CDeterministicMNManager& m_dmnman;
@@ -163,15 +163,15 @@ class CCoinJoinClientSession : public CCoinJoinBaseSession
163163
/// Create denominations
164164
bool CreateDenominated(CAmount nBalanceToDenominate);
165165
bool CreateDenominated(CAmount nBalanceToDenominate, const CompactTallyItem& tallyItem, bool fCreateMixingCollaterals)
166-
EXCLUSIVE_LOCKS_REQUIRED(m_wallet.cs_wallet);
166+
EXCLUSIVE_LOCKS_REQUIRED(m_wallet->cs_wallet);
167167

168168
/// Split up large inputs or make fee sized inputs
169169
bool MakeCollateralAmounts();
170170
bool MakeCollateralAmounts(const CompactTallyItem& tallyItem, bool fTryDenominated)
171-
EXCLUSIVE_LOCKS_REQUIRED(m_wallet.cs_wallet);
171+
EXCLUSIVE_LOCKS_REQUIRED(m_wallet->cs_wallet);
172172

173173
bool CreateCollateralTransaction(CMutableTransaction& txCollateral, std::string& strReason)
174-
EXCLUSIVE_LOCKS_REQUIRED(m_wallet.cs_wallet);
174+
EXCLUSIVE_LOCKS_REQUIRED(m_wallet->cs_wallet);
175175

176176
bool JoinExistingQueue(CAmount nBalanceNeedsAnonymized, CConnman& connman);
177177
bool StartNewQueue(CAmount nBalanceNeedsAnonymized, CConnman& connman);
@@ -181,7 +181,7 @@ class CCoinJoinClientSession : public CCoinJoinBaseSession
181181
/// step 1: prepare denominated inputs and outputs
182182
bool PrepareDenominate(int nMinRounds, int nMaxRounds, std::string& strErrorRet, const std::vector<CTxDSIn>& vecTxDSIn,
183183
std::vector<std::pair<CTxDSIn, CTxOut>>& vecPSInOutPairsRet, bool fDryRun = false)
184-
EXCLUSIVE_LOCKS_REQUIRED(m_wallet.cs_wallet);
184+
EXCLUSIVE_LOCKS_REQUIRED(m_wallet->cs_wallet);
185185
/// step 2: send denominated inputs and outputs prepared in step 1
186186
bool SendDenominate(const std::vector<std::pair<CTxDSIn, CTxOut> >& vecPSInOutPairsIn, CConnman& connman) EXCLUSIVE_LOCKS_REQUIRED(!cs_coinjoin);
187187

@@ -200,7 +200,7 @@ class CCoinJoinClientSession : public CCoinJoinBaseSession
200200
void SetNull() override EXCLUSIVE_LOCKS_REQUIRED(cs_coinjoin);
201201

202202
public:
203-
explicit CCoinJoinClientSession(CWallet& wallet, CoinJoinWalletManager& walletman,
203+
explicit CCoinJoinClientSession(const std::shared_ptr<CWallet>& wallet, CoinJoinWalletManager& walletman,
204204
CCoinJoinClientManager& clientman, CDeterministicMNManager& dmnman,
205205
CMasternodeMetaMan& mn_metaman, const CMasternodeSync& mn_sync,
206206
const std::unique_ptr<CCoinJoinClientQueueManager>& queueman, bool is_masternode);
@@ -267,7 +267,7 @@ class CCoinJoinClientQueueManager : public CCoinJoinBaseManager
267267
class CCoinJoinClientManager
268268
{
269269
private:
270-
CWallet& m_wallet;
270+
const std::shared_ptr<CWallet> m_wallet;
271271
CoinJoinWalletManager& m_walletman;
272272
CDeterministicMNManager& m_dmnman;
273273
CMasternodeMetaMan& m_mn_metaman;
@@ -306,11 +306,19 @@ class CCoinJoinClientManager
306306
CCoinJoinClientManager(CCoinJoinClientManager const&) = delete;
307307
CCoinJoinClientManager& operator=(CCoinJoinClientManager const&) = delete;
308308

309-
explicit CCoinJoinClientManager(CWallet& wallet, CoinJoinWalletManager& walletman, CDeterministicMNManager& dmnman,
310-
CMasternodeMetaMan& mn_metaman, const CMasternodeSync& mn_sync,
309+
explicit CCoinJoinClientManager(const std::shared_ptr<CWallet>& wallet, CoinJoinWalletManager& walletman,
310+
CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_metaman,
311+
const CMasternodeSync& mn_sync,
311312
const std::unique_ptr<CCoinJoinClientQueueManager>& queueman, bool is_masternode) :
312-
m_wallet(wallet), m_walletman(walletman), m_dmnman(dmnman), m_mn_metaman(mn_metaman), m_mn_sync(mn_sync), m_queueman(queueman),
313-
m_is_masternode{is_masternode} {}
313+
m_wallet(wallet),
314+
m_walletman(walletman),
315+
m_dmnman(dmnman),
316+
m_mn_metaman(mn_metaman),
317+
m_mn_sync(mn_sync),
318+
m_queueman(queueman),
319+
m_is_masternode{is_masternode}
320+
{
321+
}
314322

315323
void ProcessMessage(CNode& peer, CChainState& active_chainstate, CConnman& connman, const CTxMemPool& mempool, std::string_view msg_type, CDataStream& vRecv) EXCLUSIVE_LOCKS_REQUIRED(!cs_deqsessions);
316324

src/coinjoin/interfaces.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,7 @@ class CoinJoinLoaderImpl : public interfaces::CoinJoin::Loader
6767
explicit CoinJoinLoaderImpl(CoinJoinWalletManager& walletman)
6868
: m_walletman(walletman) {}
6969

70-
void AddWallet(CWallet& wallet) override
71-
{
72-
m_walletman.Add(wallet);
73-
}
70+
void AddWallet(const std::shared_ptr<CWallet>& wallet) override { m_walletman.Add(wallet); }
7471
void RemoveWallet(const std::string& name) override
7572
{
7673
m_walletman.Remove(name);

src/coinjoin/util.cpp

+21-20
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,15 @@ void CKeyHolderStorage::ReturnAll()
8787
}
8888
}
8989

90-
CTransactionBuilderOutput::CTransactionBuilderOutput(CTransactionBuilder* pTxBuilderIn, std::shared_ptr<CWallet> pwalletIn, CAmount nAmountIn) :
90+
CTransactionBuilderOutput::CTransactionBuilderOutput(CTransactionBuilder* pTxBuilderIn,
91+
const std::shared_ptr<CWallet>& wallet, CAmount nAmountIn) :
9192
pTxBuilder(pTxBuilderIn),
92-
dest(pwalletIn.get()),
93+
dest(wallet.get()),
9394
nAmount(nAmountIn)
9495
{
9596
assert(pTxBuilder);
9697
CTxDestination txdest;
97-
LOCK(pwalletIn->cs_wallet);
98+
LOCK(wallet->cs_wallet);
9899
dest.GetReservedDestination(txdest, false);
99100
script = ::GetScriptForDestination(txdest);
100101
}
@@ -108,15 +109,15 @@ bool CTransactionBuilderOutput::UpdateAmount(const CAmount nNewAmount)
108109
return true;
109110
}
110111

111-
CTransactionBuilder::CTransactionBuilder(std::shared_ptr<CWallet> pwalletIn, const CompactTallyItem& tallyItemIn) :
112-
pwallet(pwalletIn),
113-
dummyReserveDestination(pwalletIn.get()),
112+
CTransactionBuilder::CTransactionBuilder(const std::shared_ptr<CWallet>& wallet, const CompactTallyItem& tallyItemIn) :
113+
m_wallet(wallet),
114+
dummyReserveDestination(wallet.get()),
114115
tallyItem(tallyItemIn)
115116
{
116117
// Generate a feerate which will be used to consider if the remainder is dust and will go into fees or not
117-
coinControl.m_discard_feerate = ::GetDiscardRate(*pwallet);
118+
coinControl.m_discard_feerate = ::GetDiscardRate(*m_wallet);
118119
// Generate a feerate which will be used by calculations of this class and also by CWallet::CreateTransaction
119-
coinControl.m_feerate = std::max(GetRequiredFeeRate(*pwallet), pwallet->m_pay_tx_fee);
120+
coinControl.m_feerate = std::max(GetRequiredFeeRate(*m_wallet), m_wallet->m_pay_tx_fee);
120121
// Change always goes back to origin
121122
coinControl.destChange = tallyItemIn.txdest;
122123
// Only allow tallyItems inputs for tx creation
@@ -131,16 +132,16 @@ CTransactionBuilder::CTransactionBuilder(std::shared_ptr<CWallet> pwalletIn, con
131132
// Get a comparable dummy scriptPubKey, avoid writing/flushing to the actual wallet db
132133
CScript dummyScript;
133134
{
134-
LOCK(pwallet->cs_wallet);
135-
WalletBatch dummyBatch(pwallet->GetDatabase(), false);
135+
LOCK(m_wallet->cs_wallet);
136+
WalletBatch dummyBatch(m_wallet->GetDatabase(), false);
136137
dummyBatch.TxnBegin();
137138
CKey secret;
138-
secret.MakeNewKey(pwallet->CanSupportFeature(FEATURE_COMPRPUBKEY));
139+
secret.MakeNewKey(m_wallet->CanSupportFeature(FEATURE_COMPRPUBKEY));
139140
CPubKey dummyPubkey = secret.GetPubKey();
140141
dummyBatch.TxnAbort();
141142
dummyScript = ::GetScriptForDestination(PKHash(dummyPubkey));
142143
// Calculate required bytes for the dummy signed tx with tallyItem's inputs only
143-
nBytesBase = CalculateMaximumSignedTxSize(CTransaction(dummyTx), pwallet.get(), false);
144+
nBytesBase = CalculateMaximumSignedTxSize(CTransaction(dummyTx), m_wallet.get(), false);
144145
}
145146
// Calculate the output size
146147
nBytesOutput = ::GetSerializeSize(CTxOut(0, dummyScript), PROTOCOL_VERSION);
@@ -204,7 +205,7 @@ CTransactionBuilderOutput* CTransactionBuilder::AddOutput(CAmount nAmountOutput)
204205
{
205206
if (CouldAddOutput(nAmountOutput)) {
206207
LOCK(cs_outputs);
207-
vecOutputs.push_back(std::make_unique<CTransactionBuilderOutput>(this, pwallet, nAmountOutput));
208+
vecOutputs.push_back(std::make_unique<CTransactionBuilderOutput>(this, m_wallet, nAmountOutput));
208209
return vecOutputs.back().get();
209210
}
210211
return nullptr;
@@ -233,12 +234,12 @@ CAmount CTransactionBuilder::GetAmountUsed() const
233234
CAmount CTransactionBuilder::GetFee(unsigned int nBytes) const
234235
{
235236
CAmount nFeeCalc = coinControl.m_feerate->GetFee(nBytes);
236-
CAmount nRequiredFee = GetRequiredFee(*pwallet, nBytes);
237+
CAmount nRequiredFee = GetRequiredFee(*m_wallet, nBytes);
237238
if (nRequiredFee > nFeeCalc) {
238239
nFeeCalc = nRequiredFee;
239240
}
240-
if (nFeeCalc > pwallet->m_default_max_tx_fee) {
241-
nFeeCalc = pwallet->m_default_max_tx_fee;
241+
if (nFeeCalc > m_wallet->m_default_max_tx_fee) {
242+
nFeeCalc = m_wallet->m_default_max_tx_fee;
242243
}
243244
return nFeeCalc;
244245
}
@@ -273,9 +274,9 @@ bool CTransactionBuilder::Commit(bilingual_str& strResult)
273274

274275
CTransactionRef tx;
275276
{
276-
LOCK2(pwallet->cs_wallet, cs_main);
277+
LOCK2(m_wallet->cs_wallet, cs_main);
277278
FeeCalculation fee_calc_out;
278-
if (!pwallet->CreateTransaction(vecSend, tx, nFeeRet, nChangePosRet, strResult, coinControl, fee_calc_out)) {
279+
if (!m_wallet->CreateTransaction(vecSend, tx, nFeeRet, nChangePosRet, strResult, coinControl, fee_calc_out)) {
279280
return false;
280281
}
281282
}
@@ -312,8 +313,8 @@ bool CTransactionBuilder::Commit(bilingual_str& strResult)
312313
}
313314

314315
{
315-
LOCK2(pwallet->cs_wallet, cs_main);
316-
pwallet->CommitTransaction(tx, {}, {});
316+
LOCK2(m_wallet->cs_wallet, cs_main);
317+
m_wallet->CommitTransaction(tx, {}, {});
317318
}
318319

319320
fKeepKeys = true;

src/coinjoin/util.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class CTransactionBuilderOutput
5454
CScript script;
5555

5656
public:
57-
CTransactionBuilderOutput(CTransactionBuilder* pTxBuilderIn, std::shared_ptr<CWallet> pwalletIn, CAmount nAmountIn);
57+
CTransactionBuilderOutput(CTransactionBuilder* pTxBuilderIn, const std::shared_ptr<CWallet>& wallet, CAmount nAmountIn);
5858
CTransactionBuilderOutput(CTransactionBuilderOutput&&) = delete;
5959
CTransactionBuilderOutput& operator=(CTransactionBuilderOutput&&) = delete;
6060
/// Get the scriptPubKey of this output
@@ -77,7 +77,7 @@ class CTransactionBuilderOutput
7777
class CTransactionBuilder
7878
{
7979
/// Wallet the transaction will be build for
80-
std::shared_ptr<CWallet> pwallet;
80+
const std::shared_ptr<CWallet>& m_wallet;
8181
/// See CTransactionBuilder() for initialization
8282
CCoinControl coinControl;
8383
/// Dummy since we anyway use tallyItem's destination as change destination in coincontrol.
@@ -100,7 +100,7 @@ class CTransactionBuilder
100100
friend class CTransactionBuilderOutput;
101101

102102
public:
103-
CTransactionBuilder(std::shared_ptr<CWallet> pwalletIn, const CompactTallyItem& tallyItemIn);
103+
CTransactionBuilder(const std::shared_ptr<CWallet>& wallet, const CompactTallyItem& tallyItemIn);
104104
~CTransactionBuilder();
105105
/// Check it would be possible to add a single output with the amount nAmount. Returns true if its possible and false if not.
106106
bool CouldAddOutput(CAmount nAmountOutput) const EXCLUSIVE_LOCKS_REQUIRED(!cs_outputs);

src/evo/mnhftx.cpp

+48-18
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
static const std::string MNEHF_REQUESTID_PREFIX = "mnhf";
2626
static const std::string DB_SIGNALS = "mnhf_s";
27+
static const std::string DB_SIGNALS_v2 = "mnhf_s2";
2728

2829
uint256 MNHFTxPayload::GetRequestId() const
2930
{
@@ -57,34 +58,33 @@ CMNHFManager::Signals CMNHFManager::GetSignalsStage(const CBlockIndex* const pin
5758
{
5859
if (!DeploymentActiveAfter(pindexPrev, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) return {};
5960

60-
Signals signals = GetForBlock(pindexPrev);
61+
Signals signals_tmp = GetForBlock(pindexPrev);
62+
6163
if (pindexPrev == nullptr) return {};
6264
const int height = pindexPrev->nHeight + 1;
63-
for (auto it = signals.begin(); it != signals.end(); ) {
64-
bool found{false};
65-
const auto signal_pindex = pindexPrev->GetAncestor(it->second);
65+
66+
Signals signals_ret;
67+
68+
for (auto signal : signals_tmp) {
69+
bool expired{false};
70+
const auto signal_pindex = pindexPrev->GetAncestor(signal.second);
6671
assert(signal_pindex != nullptr);
6772
const int64_t signal_time = signal_pindex->GetMedianTimePast();
6873
for (int index = 0; index < Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++index) {
6974
const auto& deployment = Params().GetConsensus().vDeployments[index];
70-
if (deployment.bit != it->first) continue;
75+
if (deployment.bit != signal.first) continue;
7176
if (signal_time < deployment.nStartTime) {
7277
// new deployment is using the same bit as the old one
73-
LogPrintf("CMNHFManager::GetSignalsStage: mnhf signal bit=%d height:%d is expired at height=%d\n", it->first, it->second, height);
74-
it = signals.erase(it);
75-
} else {
76-
++it;
78+
LogPrintf("CMNHFManager::GetSignalsStage: mnhf signal bit=%d height:%d is expired at height=%d\n",
79+
signal.first, signal.second, height);
80+
expired = true;
7781
}
78-
found = true;
79-
break;
8082
}
81-
if (!found) {
82-
// no deployment means we buried it and aren't using the same bit (yet)
83-
LogPrintf("CMNHFManager::GetSignalsStage: mnhf signal bit=%d height:%d is not known at height=%d\n", it->first, it->second, height);
84-
it = signals.erase(it);
83+
if (!expired) {
84+
signals_ret.insert(signal);
8585
}
8686
}
87-
return signals;
87+
return signals_ret;
8888
}
8989

9090
bool MNHFTx::Verify(const llmq::CQuorumManager& qman, const uint256& quorumHash, const uint256& requestId, const uint256& msgHash, TxValidationState& state) const
@@ -287,6 +287,9 @@ CMNHFManager::Signals CMNHFManager::GetForBlock(const CBlockIndex* pindex)
287287
const Consensus::Params& consensusParams{Params().GetConsensus()};
288288
while (!to_calculate.empty()) {
289289
const CBlockIndex* pindex_top{to_calculate.top()};
290+
if (pindex_top->nHeight % 1000 == 0) {
291+
LogPrintf("re-index EHF signals at block %d\n", pindex_top->nHeight);
292+
}
290293
CBlock block;
291294
if (!ReadBlockFromDisk(block, pindex_top, consensusParams)) {
292295
throw std::runtime_error("failed-getehfforblock-read");
@@ -328,11 +331,19 @@ std::optional<CMNHFManager::Signals> CMNHFManager::GetFromCache(const CBlockInde
328331
return signals;
329332
}
330333
}
331-
if (m_evoDb.Read(std::make_pair(DB_SIGNALS, blockHash), signals)) {
334+
if (m_evoDb.Read(std::make_pair(DB_SIGNALS_v2, blockHash), signals)) {
332335
LOCK(cs_cache);
333336
mnhfCache.insert(blockHash, signals);
334337
return signals;
335338
}
339+
if (!DeploymentActiveAt(*pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_MN_RR)) {
340+
// before mn_rr activation we are safe
341+
if (m_evoDb.Read(std::make_pair(DB_SIGNALS, blockHash), signals)) {
342+
LOCK(cs_cache);
343+
mnhfCache.insert(blockHash, signals);
344+
return signals;
345+
}
346+
}
336347
return std::nullopt;
337348
}
338349

@@ -346,7 +357,7 @@ void CMNHFManager::AddToCache(const Signals& signals, const CBlockIndex* const p
346357
}
347358
if (!DeploymentActiveAt(*pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) return;
348359

349-
m_evoDb.Write(std::make_pair(DB_SIGNALS, blockHash), signals);
360+
m_evoDb.Write(std::make_pair(DB_SIGNALS_v2, blockHash), signals);
350361
}
351362

352363
void CMNHFManager::AddSignal(const CBlockIndex* const pindex, int bit)
@@ -364,6 +375,25 @@ void CMNHFManager::ConnectManagers(gsl::not_null<ChainstateManager*> chainman, g
364375
m_qman = qman;
365376
}
366377

378+
bool CMNHFManager::ForceSignalDBUpdate()
379+
{
380+
// force ehf signals db update
381+
auto dbTx = m_evoDb.BeginTransaction();
382+
383+
const bool last_legacy = bls::bls_legacy_scheme.load();
384+
bls::bls_legacy_scheme.store(false);
385+
GetSignalsStage(m_chainman->ActiveChainstate().m_chain.Tip());
386+
bls::bls_legacy_scheme.store(last_legacy);
387+
388+
dbTx->Commit();
389+
// flush it to disk
390+
if (!m_evoDb.CommitRootTransaction()) {
391+
LogPrintf("CMNHFManager::%s -- failed to commit to evoDB\n", __func__);
392+
return false;
393+
}
394+
return true;
395+
}
396+
367397
std::string MNHFTx::ToString() const
368398
{
369399
return strprintf("MNHFTx(versionBit=%d, quorumHash=%s, sig=%s)",

src/evo/mnhftx.h

+2
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ class CMNHFManager : public AbstractEHFManager
155155
*/
156156
void DisconnectManagers() { m_chainman = nullptr; m_qman = nullptr; };
157157

158+
bool ForceSignalDBUpdate() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
159+
158160
private:
159161
void AddToCache(const Signals& signals, const CBlockIndex* const pindex);
160162

src/init.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2064,6 +2064,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
20642064
strLoadError = _("Error upgrading evo database");
20652065
break;
20662066
}
2067+
if (!node.mnhf_manager->ForceSignalDBUpdate()) {
2068+
strLoadError = _("Error upgrading evo database for EHF");
2069+
break;
2070+
}
20672071

20682072
for (CChainState* chainstate : chainman.GetAll()) {
20692073
if (!is_coinsview_empty(chainstate)) {

src/interfaces/coinjoin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Loader
3333
public:
3434
virtual ~Loader() {}
3535
//! Add new wallet to CoinJoin client manager
36-
virtual void AddWallet(CWallet&) = 0;
36+
virtual void AddWallet(const std::shared_ptr<CWallet>&) = 0;
3737
//! Remove wallet from CoinJoin client manager
3838
virtual void RemoveWallet(const std::string&) = 0;
3939
virtual void FlushWallet(const std::string&) = 0;

src/qt/transactionfilterproxy.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class TransactionFilterProxy : public QSortFilterProxyModel
2323
/** Type filter bit field (all types) */
2424
static const quint32 ALL_TYPES = 0xFFFFFFFF;
2525
/** Type filter bit field (all types but Darksend-SPAM) */
26-
static const quint32 COMMON_TYPES = 4223;
26+
static const quint32 COMMON_TYPES = 0x307f;
2727

2828
static quint32 TYPE(int type) { return 1<<type; }
2929

0 commit comments

Comments
 (0)