diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 982736169621..b5bc9e92df02 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -71,6 +71,7 @@ jobs: git log --oneline ${COMMIT_RANGE} || echo "Could not show commit range" ./ci/dash/lint.sh + test/lint/cppcheck-dash.py du -sh "${CACHE_DIR}/cppcheck" shell: bash diff --git a/doc/man/dash-cli.1 b/doc/man/dash-cli.1 index 47158fbf95ff..a04d71f9b5cf 100644 --- a/doc/man/dash-cli.1 +++ b/doc/man/dash-cli.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASH-CLI "1" "October 2026" "dash-cli v24.0.0" "User Commands" +.TH DASH-CLI "1" "November 2026" "dash-cli v24.0.0" "User Commands" .SH NAME dash-cli \- manual page for dash-cli v24.0.0 .SH SYNOPSIS diff --git a/doc/man/dash-qt.1 b/doc/man/dash-qt.1 index aba940422d27..ec4b1a40b8cf 100644 --- a/doc/man/dash-qt.1 +++ b/doc/man/dash-qt.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASH-QT "1" "October 2026" "dash-qt v24.0.0" "User Commands" +.TH DASH-QT "1" "November 2026" "dash-qt v24.0.0" "User Commands" .SH NAME dash-qt \- manual page for dash-qt v24.0.0 .SH SYNOPSIS @@ -30,9 +30,9 @@ datadir as a warning, not an error. If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: -00000000000000119fe42827219e0686d3f7b494ae65f823194c740c5dbab492, +000000000000000346a1804da4832b0b69dd9a7f96b14c7cb54585a9ac6ae98f, testnet: -000000541a23f9db7411cddbe50f9f1ebd4aa7108ebdcad62214753f648c0239, +000000116cd3c11d44c88cbc0a26804bd277a5d790f684ec3a8aaa820690318c, devnet: 0000000000000000000000000000000000000000000000000000000000000000) .HP @@ -60,10 +60,10 @@ Specify directory to hold blocks subdirectory for *.dat files (default: .HP \fB\-blocksonly\fR .IP -Whether to reject transactions from network peers. Automatic broadcast -and rebroadcast of any transactions from inbound peers is -disabled, unless the peer has the 'forcerelay' permission. RPC -transactions are not affected. (default: 0) +Whether to reject transactions from network peers. Disables automatic +broadcast and rebroadcast of transactions, unless the source peer +has the 'forcerelay' permission. RPC transactions are not +affected. (default: 0) .HP \fB\-chainlocknotify=\fR .IP @@ -222,10 +222,11 @@ Bind to given address and always listen on it (default: 0.0.0.0). Use connections to that address and port as incoming Tor connections (default: 127.0.0.1:9996=onion, testnet: 127.0.0.1:19996=onion, devnet: 127.0.0.1:19796=onion, regtest: 127.0.0.1:19896=onion). -The default onion bind is added only when no \fB\-bind\fR is specified. -When \fB\-listenonion\fR is enabled and \fB\-bind\fR is specified, a -non\-wildcard =onion bind is required, and wildcard =onion binds -are rejected. +Without an =onion bind, the default onion bind is added unless +\fB\-bind\fR is given and \fB\-listenonion\fR is disabled; failing to bind it +stops startup only with an explicit \fB\-listenonion\fR=\fI\,1\/\fR, and otherwise +no onion service is created. While \fB\-listenonion\fR is enabled, a +wildcard =onion bind is an error. .HP \fB\-cjdnsreachable\fR .IP @@ -285,7 +286,9 @@ Accept connections from outside (default: 1 if no \fB\-proxy\fR, \fB\-connect\fR .HP \fB\-listenonion\fR .IP -Automatically create Tor onion service (default: 1) +Automatically create Tor onion service if Tor is available and the onion +bind could be bound (see \fB\-bind\fR). If set to 1 explicitly, fail to +start if the onion bind cannot be bound (default: 1) .HP \fB\-maxconnections=\fR .IP @@ -426,10 +429,11 @@ download,noban,mempool,relay). Can be specified multiple times. .HP \fB\-whitelist=\fR<[permissions@]IP address or network> .IP -Add permission flags to the peers connecting from the given IP address -(e.g. 1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses -the same permissions as \fB\-whitebind\fR. Can be specified multiple -times. +Add permission flags to the peers using the given IP address (e.g. +1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses the same +permissions as \fB\-whitebind\fR. Additional flags "in" and "out" +control whether permissions apply to incoming connections and/or +manual (default: incoming only). Can be specified multiple times. .PP Indexing options: .HP @@ -1059,15 +1063,15 @@ Relay non\-P2SH multisig (default: 1) .HP \fB\-whitelistforcerelay\fR .IP -Add 'forcerelay' permission to whitelisted inbound peers with default +Add 'forcerelay' permission to whitelisted peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: 0) .HP \fB\-whitelistrelay\fR .IP -Add 'relay' permission to whitelisted inbound peers with default -permissions. This will accept relayed transactions even when not -relaying transactions (default: 1) +Add 'relay' permission to whitelisted peers with default permissions. +This will accept relayed transactions even when not relaying +transactions (default: 1) .PP Block creation options: .HP diff --git a/doc/man/dash-tx.1 b/doc/man/dash-tx.1 index f1317f16df76..932abfe40d4c 100644 --- a/doc/man/dash-tx.1 +++ b/doc/man/dash-tx.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASH-TX "1" "October 2026" "dash-tx v24.0.0" "User Commands" +.TH DASH-TX "1" "November 2026" "dash-tx v24.0.0" "User Commands" .SH NAME dash-tx \- manual page for dash-tx v24.0.0 .SH SYNOPSIS diff --git a/doc/man/dash-util.1 b/doc/man/dash-util.1 index 9f7c983b6e06..40637cd6c6af 100644 --- a/doc/man/dash-util.1 +++ b/doc/man/dash-util.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASH-UTIL "1" "October 2026" "dash-util v24.0.0" "User Commands" +.TH DASH-UTIL "1" "November 2026" "dash-util v24.0.0" "User Commands" .SH NAME dash-util \- manual page for dash-util v24.0.0 .SH SYNOPSIS diff --git a/doc/man/dash-wallet.1 b/doc/man/dash-wallet.1 index 0e4a33ece48e..73b24e314b25 100644 --- a/doc/man/dash-wallet.1 +++ b/doc/man/dash-wallet.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASH-WALLET "1" "October 2026" "dash-wallet v24.0.0" "User Commands" +.TH DASH-WALLET "1" "November 2026" "dash-wallet v24.0.0" "User Commands" .SH NAME dash-wallet \- manual page for dash-wallet v24.0.0 .SH DESCRIPTION diff --git a/doc/man/dashd.1 b/doc/man/dashd.1 index 213ae11d5007..5d4ae91221f1 100644 --- a/doc/man/dashd.1 +++ b/doc/man/dashd.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH DASHD "1" "October 2026" "dashd v24.0.0" "User Commands" +.TH DASHD "1" "November 2026" "dashd v24.0.0" "User Commands" .SH NAME dashd \- manual page for dashd v24.0.0 .SH SYNOPSIS @@ -28,9 +28,9 @@ datadir as a warning, not an error. If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: -00000000000000119fe42827219e0686d3f7b494ae65f823194c740c5dbab492, +000000000000000346a1804da4832b0b69dd9a7f96b14c7cb54585a9ac6ae98f, testnet: -000000541a23f9db7411cddbe50f9f1ebd4aa7108ebdcad62214753f648c0239, +000000116cd3c11d44c88cbc0a26804bd277a5d790f684ec3a8aaa820690318c, devnet: 0000000000000000000000000000000000000000000000000000000000000000) .HP @@ -58,10 +58,10 @@ Specify directory to hold blocks subdirectory for *.dat files (default: .HP \fB\-blocksonly\fR .IP -Whether to reject transactions from network peers. Automatic broadcast -and rebroadcast of any transactions from inbound peers is -disabled, unless the peer has the 'forcerelay' permission. RPC -transactions are not affected. (default: 0) +Whether to reject transactions from network peers. Disables automatic +broadcast and rebroadcast of transactions, unless the source peer +has the 'forcerelay' permission. RPC transactions are not +affected. (default: 0) .HP \fB\-chainlocknotify=\fR .IP @@ -220,10 +220,11 @@ Bind to given address and always listen on it (default: 0.0.0.0). Use connections to that address and port as incoming Tor connections (default: 127.0.0.1:9996=onion, testnet: 127.0.0.1:19996=onion, devnet: 127.0.0.1:19796=onion, regtest: 127.0.0.1:19896=onion). -The default onion bind is added only when no \fB\-bind\fR is specified. -When \fB\-listenonion\fR is enabled and \fB\-bind\fR is specified, a -non\-wildcard =onion bind is required, and wildcard =onion binds -are rejected. +Without an =onion bind, the default onion bind is added unless +\fB\-bind\fR is given and \fB\-listenonion\fR is disabled; failing to bind it +stops startup only with an explicit \fB\-listenonion\fR=\fI\,1\/\fR, and otherwise +no onion service is created. While \fB\-listenonion\fR is enabled, a +wildcard =onion bind is an error. .HP \fB\-cjdnsreachable\fR .IP @@ -283,7 +284,9 @@ Accept connections from outside (default: 1 if no \fB\-proxy\fR, \fB\-connect\fR .HP \fB\-listenonion\fR .IP -Automatically create Tor onion service (default: 1) +Automatically create Tor onion service if Tor is available and the onion +bind could be bound (see \fB\-bind\fR). If set to 1 explicitly, fail to +start if the onion bind cannot be bound (default: 1) .HP \fB\-maxconnections=\fR .IP @@ -424,10 +427,11 @@ download,noban,mempool,relay). Can be specified multiple times. .HP \fB\-whitelist=\fR<[permissions@]IP address or network> .IP -Add permission flags to the peers connecting from the given IP address -(e.g. 1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses -the same permissions as \fB\-whitebind\fR. Can be specified multiple -times. +Add permission flags to the peers using the given IP address (e.g. +1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses the same +permissions as \fB\-whitebind\fR. Additional flags "in" and "out" +control whether permissions apply to incoming connections and/or +manual (default: incoming only). Can be specified multiple times. .PP Indexing options: .HP @@ -1057,15 +1061,15 @@ Relay non\-P2SH multisig (default: 1) .HP \fB\-whitelistforcerelay\fR .IP -Add 'forcerelay' permission to whitelisted inbound peers with default +Add 'forcerelay' permission to whitelisted peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: 0) .HP \fB\-whitelistrelay\fR .IP -Add 'relay' permission to whitelisted inbound peers with default -permissions. This will accept relayed transactions even when not -relaying transactions (default: 1) +Add 'relay' permission to whitelisted peers with default permissions. +This will accept relayed transactions even when not relaying +transactions (default: 1) .PP Block creation options: .HP diff --git a/doc/release-notes.md b/doc/release-notes.md index 1d9cba237daf..791240fe14ae 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -462,6 +462,14 @@ does not accept that option. (#7294, #7285, #7577) participant's coins. Because admission relies on the declared directions, a participant whose entry deviates from what it declared has its collateral consumed. (#7052) +- A wallet that still has coins to mix keeps standard mixing. It joins + promotion and demotion queues that other wallets opened, but only opens its + own when it has no standard mixing session to join or start, so a conversion + waiting for a counterpart never holds up mixing. (#7995) +- A promotion prefers fully-mixed coins from different mixing transactions. If + there are not enough of those, it also spends coins that came out of the same + mixing transaction, which links them as one owner's coins, as an ordinary send + of the same coins would. (#7996) See [P2P and network changes](#p2p-and-network-changes) for the related protocol changes. @@ -657,18 +665,30 @@ and RPC parameters. the mixing metadata they cannot parse. (#7052) - Version 2 Asset Unlock transactions are relayed by instance hash using the new inventory type `MSG_ASSET_UNLOCK` (protocol version 70242). (#7639) -- Startup now fails if any configured `-bind`, `-whitebind` or the implicit Tor - onion-service bind (`127.0.0.1:9996` by default) cannot be set up. Dash Core - v23 and earlier started as long as at least one bind succeeded. -- Nodes configured with `-bind` but no specific `-bind==onion` now - refuse to start when `-listenonion` is enabled. This includes nodes without - Tor configured, since `-listenonion` is enabled by default when listening. - Shared binds cannot distinguish Tor-forwarded connections from direct - connections, which can grant Tor peers unintended IP-based whitelist - permissions. Nodes without `-bind`, including those using only `-whitebind`, - continue to get the default onion target. Users should add a specific - `-bind==onion` to accept incoming Tor connections, or set - `-listenonion=0` to disable automatic onion service creation. (#7300, #7786) +- Startup now fails if any configured `-bind` (including `-bind=...=onion`) or + `-whitebind` cannot be set up. Dash Core v23 and earlier started as long as + at least one bind succeeded. The implicit Tor onion-service bind + (`127.0.0.1:9996` by default) is still best effort, as in v23, unless + `-listenonion=1` is set explicitly. (#7300, #8003) +- The automatic Tor onion service (`-listenonion`) only forwards to a + dedicated, non-wildcard onion listener that the node actually bound, so peers + arriving through Tor are always recognized as onion peers. Without a + `-bind==onion`, Dash Core adds the default onion bind as v23 did, + also when `-bind` is given; with `-bind` and `-listenonion=0` it no longer + does. If the default onion bind fails, for example because another instance + on the same host holds it, the node logs a warning and creates no onion + service rather than pointing Tor at whatever holds that port. It still + starts and still uses Tor for outbound onion connections if its control port + is reachable; the debug log notes that no onion service was created. With an + explicit `-listenonion=1`, a failed default onion bind makes startup fail. To + run onion services for several instances on one host, give each its own + `-bind=127.0.0.1:=onion`. (#7300, #7786, #8003) +- A wildcard onion bind such as `-bind=0.0.0.0:=onion` is a startup error + unless `-listenonion=0` is set, also with the default `-listenonion`. The node + can't tell which connections to a wildcard listener came through Tor, so Tor + peers would be treated as clearnet peers. Dash Core v23 accepted it. Use a + specific address such as `-bind=127.0.0.1:=onion` instead. (#7786, + #8003) - `getqrinfo` requests now carry at most 4096 `baseBlockHashes`. A request with more is rejected and the sending peer is penalized as misbehaving. No known client sends more than a handful. The `quorum rotationinfo` RPC applies the @@ -688,6 +708,11 @@ and RPC parameters. starts without sporks (for example after the `sporks.dat` reset) receives them. Repeated `getsporks` requests are ignored while the active spork set is unchanged. (#7893, #7343) +- Address-based `-whitelist` permissions no longer apply to peers that connect + through the node's onion service. Tor forwards those peers from its own + address, usually `127.0.0.1`, so an entry such as `-whitelist=noban@127.0.0.1` + used to grant its permissions to every Tor peer. `-whitebind` is not + affected. (#8005) ## Mining and mempool policy @@ -921,6 +946,9 @@ and RPC parameters. - `-sporkaddr` now configures a single spork address. Previously it could be specified multiple times to configure a set of valid spork signers. (#7505) +- Additional flags "in" and "out" have been added to `-whitelist` to control + whether permissions apply to incoming connections and/or manual (default: + incoming only). (#8005) ### Removed options diff --git a/doc/tor.md b/doc/tor.md index d617a58e510d..9fdf7ef602f0 100644 --- a/doc/tor.md +++ b/doc/tor.md @@ -83,8 +83,17 @@ it requires a Tor connection to work. It can be explicitly disabled with `-listenonion=0`. If it is not disabled, it can be configured using the `-torcontrol` and `-torpassword` settings. -When enabled with an explicit `-bind`, the automatic service requires a non-wildcard onion bind such as `-bind=127.0.0.1:=onion`. -Without `-bind`, Dash Core adds the default onion bind. +The automatic service forwards incoming connections to a dedicated, +non-wildcard onion bind. Unless one is given with `-bind=:=onion`, +Dash Core adds the default onion bind (`127.0.0.1:9996` on mainnet). If that +port is taken, for example by another instance on the same host, no onion +service is created; give each instance its own `-bind=127.0.0.1:=onion`. +With `-bind` and `-listenonion=0`, the default onion bind is not added. If the +default onion bind fails, Dash Core still uses Tor for outbound onion +connections; only an explicit `-listenonion=1` then stops startup. A wildcard +onion bind such as `-bind=0.0.0.0:=onion` is a startup error unless +`-listenonion=0` is set, because Dash Core can't recognize the Tor peers +connecting to it. To see verbose Tor information in the dashd debug log, pass `-debug=tor`. diff --git a/src/coinjoin/client.cpp b/src/coinjoin/client.cpp index 785054bd3b44..8f4cf4b4e558 100644 --- a/src/coinjoin/client.cpp +++ b/src/coinjoin/client.cpp @@ -993,8 +993,11 @@ bool CCoinJoinClientSession::DoAutomaticDenominating(ChainstateManager& chainman const bool fV24Active = CoinJoin::IsPromotionDemotionActive(chainman); CAmount nBalanceNeedsAnonymized; - wallet::CoinJoinDenomCounts denomCounts; - bool fRebalanceOpportunity{false}; + struct Rebalance { + int nDenom; //!< session denomination: the smaller of the two, which both conversions run at + bool fPromotion; + }; + std::vector vecRebalances; // post-V24 promotion/demotion opportunities { LOCK(m_wallet->cs_wallet); @@ -1034,14 +1037,28 @@ bool CCoinJoinClientSession::DoAutomaticDenominating(ChainstateManager& chainman if (fV24Active) { // Single wallet scan covering all denominations, reused across every // adjacent-pair check instead of re-scanning per pair. - denomCounts = m_wallet->GetDenominationCounts(); - for (size_t i = 0; i + 1 < CoinJoin::vecStandardDenominations.size() && !fRebalanceOpportunity; ++i) { + const auto denomCounts = m_wallet->GetDenominationCounts(); + // Denominations: 10, 1, 0.1, 0.01, 0.001 (indices 0-4, smaller index = larger denom) + for (size_t i = 0; i + 1 < CoinJoin::vecStandardDenominations.size(); ++i) { const int nLargerDenom = 1 << i; const int nSmallerDenom = 1 << (i + 1); - fRebalanceOpportunity = m_clientman.ShouldPromote(nSmallerDenom, nLargerDenom, denomCounts) || - m_clientman.ShouldDemote(nLargerDenom, nSmallerDenom, denomCounts); + if (m_clientman.ShouldPromote(nSmallerDenom, nLargerDenom, denomCounts)) { + WalletCJLogPrint(m_wallet, "CCoinJoinClientSession::DoAutomaticDenominating -- Promotion opportunity: %d x %s -> 1 x %s\n", + CoinJoin::PROMOTION_RATIO, + CoinJoin::DenominationToString(nSmallerDenom), + CoinJoin::DenominationToString(nLargerDenom)); + vecRebalances.push_back({nSmallerDenom, /*fPromotion=*/true}); + } + if (m_clientman.ShouldDemote(nLargerDenom, nSmallerDenom, denomCounts)) { + WalletCJLogPrint(m_wallet, "CCoinJoinClientSession::DoAutomaticDenominating -- Demotion opportunity: 1 x %s -> %d x %s\n", + CoinJoin::DenominationToString(nLargerDenom), + CoinJoin::PROMOTION_RATIO, + CoinJoin::DenominationToString(nSmallerDenom)); + vecRebalances.push_back({nSmallerDenom, /*fPromotion=*/false}); + } } } + const bool fRebalanceOpportunity{!vecRebalances.empty()}; if (nBalanceNeedsAnonymized < 0 && !fRebalanceOpportunity) { WalletCJLogPrint(m_wallet, "CCoinJoinClientSession::DoAutomaticDenominating -- Nothing to do\n"); @@ -1166,50 +1183,12 @@ bool CCoinJoinClientSession::DoAutomaticDenominating(ChainstateManager& chainman } } // LOCK(m_wallet->cs_wallet); - // Post-V24: Check if we should promote or demote denominations - // This helps maintain optimal denomination distribution as coins are spent - if (fRebalanceOpportunity) { - // Check all adjacent denomination pairs for promotion/demotion opportunities - // Denominations: 10, 1, 0.1, 0.01, 0.001 (indices 0-4, smaller index = larger denom) - for (size_t i = 0; i + 1 < CoinJoin::vecStandardDenominations.size(); ++i) { - const int nLargerDenom = 1 << i; // Larger denomination (e.g., 10 DASH) - const int nSmallerDenom = 1 << (i + 1); // Smaller denomination (e.g., 1 DASH) - - // Check if we should promote smaller -> larger; ShouldPromote() requires - // PROMOTION_RATIO fully-mixed coins, the queue functions re-verify on selection - if (m_clientman.ShouldPromote(nSmallerDenom, nLargerDenom, denomCounts)) { - WalletCJLogPrint(m_wallet, "CCoinJoinClientSession::DoAutomaticDenominating -- Promotion opportunity: %d x %s -> 1 x %s\n", - CoinJoin::PROMOTION_RATIO, - CoinJoin::DenominationToString(nSmallerDenom), - CoinJoin::DenominationToString(nLargerDenom)); - - // Try to join an existing queue for promotion - if (JoinExistingQueue(nBalanceNeedsAnonymized, connman, nSmallerDenom, /*fPromotion=*/true)) { - return true; - } - // No existing queue found - try to start a new one for promotion - if (StartNewQueue(nBalanceNeedsAnonymized, connman, nSmallerDenom, /*fPromotion=*/true, /*fDemotion=*/false)) { - return true; - } - } - - // Check if we should demote larger -> smaller - if (m_clientman.ShouldDemote(nLargerDenom, nSmallerDenom, denomCounts)) { - WalletCJLogPrint(m_wallet, "CCoinJoinClientSession::DoAutomaticDenominating -- Demotion opportunity: 1 x %s -> %d x %s\n", - CoinJoin::DenominationToString(nLargerDenom), - CoinJoin::PROMOTION_RATIO, - CoinJoin::DenominationToString(nSmallerDenom)); - - // Try to join an existing queue for demotion - if (JoinExistingQueue(nBalanceNeedsAnonymized, connman, nSmallerDenom, /*fPromotion=*/false, /*fDemotion=*/true)) { - return true; - } - // No existing queue found - try to start a new one for demotion - if (StartNewQueue(nBalanceNeedsAnonymized, connman, nSmallerDenom, /*fPromotion=*/false, /*fDemotion=*/true)) { - return true; - } - } - } + // Post-V24: joining an existing queue at a conversion's denomination is cheap, but a new + // promotion/demotion queue has to wait for participants that may never come (pre-rebalance + // clients can't join it). Only start one when there is no standard mixing to do, or a lasting + // rebalance opportunity would keep the wallet from ever mixing again. + for (const auto& [nDenom, fPromotion] : vecRebalances) { + if (JoinExistingQueue(nBalanceNeedsAnonymized, connman, nDenom, fPromotion, !fPromotion)) return true; } // Standard mixing only makes sense while there is still balance to anonymize; a @@ -1224,6 +1203,10 @@ bool CCoinJoinClientSession::DoAutomaticDenominating(ChainstateManager& chainman if (StartNewQueue(nBalanceNeedsAnonymized, connman)) return true; } + for (const auto& [nDenom, fPromotion] : vecRebalances) { + if (StartNewQueue(nBalanceNeedsAnonymized, connman, nDenom, fPromotion, !fPromotion)) return true; + } + strAutoDenomResult = _("No compatible Masternode found."); return false; } diff --git a/src/evo/providertx.cpp b/src/evo/providertx.cpp index c6a5014b9c0d..f20a981ca3ff 100644 --- a/src/evo/providertx.cpp +++ b/src/evo/providertx.cpp @@ -15,6 +15,7 @@ #include