Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

backport: bitcoin#22219, #22437, #22641, #22707, #22744, #22841, #22880, #22992, #23086, #24527 #6568

Merged
merged 10 commits into from
Feb 21, 2025
Merged
6 changes: 4 additions & 2 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ env:
base_template: &BASE_TEMPLATE
skip: $CIRRUS_REPO_FULL_NAME == "bitcoin-core/gui" && $CIRRUS_PR == "" # No need to run on the read-only mirror, unless it is a PR. https://cirrus-ci.org/guide/writing-tasks/#conditional-task-execution
merge_base_script:
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
# Unconditionally install git (used in fingerprint_script) and set the
# default git author name (used in verify-commits.py)
- bash -c "$PACKAGE_MANAGER_INSTALL git"
- git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH
- git config --global user.email "[email protected]"
- git config --global user.name "ci"
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
- git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH
- git merge FETCH_HEAD # Merge base to detect silent merge conflicts
stateful: false # https://cirrus-ci.org/guide/writing-tasks/#stateful-tasks

Expand Down
6 changes: 1 addition & 5 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
Building Dash
=============

See doc/build-*.md for instructions on building the various
elements of the Dash Core reference implementation of Dash.
See [doc/build-\*.md](/doc)
11 changes: 8 additions & 3 deletions ci/lint/06_script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ test/lint/git-subtree-check.sh src/leveldb
test/lint/check-doc.py
test/lint/all-lint.py

if [ "$CIRRUS_REPO_FULL_NAME" = "dashpay/dash" ] && [ -n "$CIRRUS_CRON" ]; then
git log --merges --before="2 days ago" -1 --format='%H' > ./contrib/verify-commits/trusted-sha512-root-commit
if [ "$CIRRUS_REPO_FULL_NAME" = "dashpay/dash" ] && [ "$CIRRUS_PR" = "" ] ; then
# Sanity check only the last few commits to get notified of missing sigs,
# missing keys, or expired keys. Usually there is only one new merge commit
# per push on the master branch and a few commits on release branches, so
# sanity checking only a few (10) commits seems sufficient and cheap.
git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-sha512-root-commit
git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-git-root
mapfile -t KEYS < contrib/verify-commits/trusted-keys
${CI_RETRY_EXE} gpg --keyserver hkps://keys.openpgp.org --recv-keys "${KEYS[@]}" &&
./contrib/verify-commits/verify-commits.py --clean-merge=2;
./contrib/verify-commits/verify-commits.py;
fi
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_fuzz.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ export RUN_UNIT_TESTS=false
export RUN_FUNCTIONAL_TESTS=false
export RUN_FUZZ_TESTS=true
export GOAL="install"
export BITCOIN_CONFIG="--enable-zmq --disable-ccache --enable-fuzz --with-sanitizers=fuzzer,address,undefined,integer --enable-suppress-external-warnings CC=clang-18 CXX=clang++-18 --with-boost-process"
export BITCOIN_CONFIG="--enable-zmq --disable-ccache --enable-fuzz --with-sanitizers=fuzzer,address,undefined,integer --enable-suppress-external-warnings CC='clang-18 -ftrivial-auto-var-init=pattern' CXX='clang++-18 -ftrivial-auto-var-init=pattern' --with-boost-process"
4 changes: 2 additions & 2 deletions src/Makefile.qt.include
Original file line number Diff line number Diff line change
Expand Up @@ -416,14 +416,14 @@ bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX

qt_dash_qt_CPPFLAGS = $(bitcoin_qt_cppflags)
qt_dash_qt_CXXFLAGS = $(bitcoin_qt_cxxflags)
qt_dash_qt_SOURCES = $(bitcoin_qt_sources)
qt_dash_qt_SOURCES = $(bitcoin_qt_sources) init/bitcoind.cpp
qt_dash_qt_LDADD = $(bitcoin_qt_ldadd)
qt_dash_qt_LDFLAGS = $(bitcoin_qt_ldflags)
qt_dash_qt_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)

dash_gui_CPPFLAGS = $(bitcoin_qt_cppflags)
dash_gui_CXXFLAGS = $(bitcoin_qt_cxxflags)
dash_gui_SOURCES = $(bitcoin_qt_sources)
dash_gui_SOURCES = $(bitcoin_qt_sources) init/bitcoind.cpp
dash_gui_LDADD = $(bitcoin_qt_ldadd)
dash_gui_LDFLAGS = $(bitcoin_qt_ldflags)
dash_gui_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)
Expand Down
1 change: 1 addition & 0 deletions src/Makefile.qttest.include
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ qt_test_test_dash_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_
$(QT_INCLUDES) $(QT_TEST_INCLUDES)

qt_test_test_dash_qt_SOURCES = \
init/bitcoind.cpp \
qt/test/apptests.cpp \
qt/test/optiontests.cpp \
qt/test/rpcnestedtests.cpp \
Expand Down
3 changes: 2 additions & 1 deletion src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,7 @@ class CRegTestParams : public CChainParams {
consensus.BIP34Hash = uint256();
consensus.BIP65Height = 1; // Always active unless overridden
consensus.BIP66Height = 1; // Always active unless overridden
consensus.BIP147Height = 1; // Always active unless overridden
consensus.BIP147Height = 0; // Always active unless overridden
consensus.CSVHeight = 1; // Always active unless overridden
consensus.DIP0001Height = 1; // Always active unless overridden
consensus.DIP0003Height = 432; // Always active for DashTestFramework in functional tests (see dip3params)
Expand Down Expand Up @@ -1028,6 +1028,7 @@ static void MaybeUpdateHeights(const ArgsManager& args, Consensus::Params& conse
} else if (name == "dip0008") {
consensus.DIP0008Height = int{height};
} else if (name == "dip0024") {
consensus.DIP0024Height = int{height};
consensus.DIP0024QuorumsHeight = int{height};
} else if (name == "v19") {
consensus.V19Height = int{height};
Expand Down
10 changes: 10 additions & 0 deletions src/dummywallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@
#include <util/system.h>
#include <walletinitinterface.h>

class ArgsManager;
class CWallet;

namespace interfaces {
class Chain;
class Handler;
class Wallet;
class WalletClient;
namespace CoinJoin {
class Loader;
} // namespcae CoinJoin
}

class DummyWalletInit : public WalletInitInterface {
Expand Down Expand Up @@ -80,4 +85,9 @@ std::unique_ptr<Wallet> MakeWallet(const std::shared_ptr<CWallet>& wallet, const
throw std::logic_error("Wallet function called in non-wallet build.");
}

std::unique_ptr<WalletClient> MakeWalletLoader(Chain& chain, const std::unique_ptr<interfaces::CoinJoin::Loader>& coinjoin_loader, ArgsManager& args)
{
throw std::logic_error("Wallet function called in non-wallet build.");
}

} // namespace interfaces
3 changes: 2 additions & 1 deletion src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <index/blockfilterindex.h>
#include <index/coinstatsindex.h>
#include <index/txindex.h>
#include <interfaces/init.h>
#include <interfaces/node.h>
#include <mapport.h>
#include <node/miner.h>
Expand Down Expand Up @@ -1431,7 +1432,7 @@ bool AppInitLockDataDirectory()

bool AppInitInterfaces(NodeContext& node)
{
node.chain = interfaces::MakeChain(node);
node.chain = node.init->makeChain();
return true;
}

Expand Down
9 changes: 9 additions & 0 deletions src/init/bitcoin-node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <interfaces/chain.h>
#include <interfaces/echo.h>
#include <interfaces/init.h>
#include <interfaces/ipc.h>
#include <interfaces/node.h>
#include <interfaces/wallet.h>
#include <node/context.h>
#include <util/system.h>

Expand All @@ -24,6 +27,12 @@ class BitcoinNodeInit : public interfaces::Init
m_node.args = &gArgs;
m_node.init = this;
}
std::unique_ptr<interfaces::Node> makeNode() override { return interfaces::MakeNode(m_node); }
std::unique_ptr<interfaces::Chain> makeChain() override { return interfaces::MakeChain(m_node); }
std::unique_ptr<interfaces::WalletLoader> makeWalletLoader(interfaces::Chain& chain, const std::unique_ptr<interfaces::CoinJoin::Loader>& loader) override
{
return MakeWalletLoader(chain, loader, *Assert(m_node.args));
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
interfaces::Ipc* ipc() override { return m_ipc.get(); }
NodeContext& m_node;
Expand Down
11 changes: 11 additions & 0 deletions src/init/bitcoind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <interfaces/chain.h>
#include <interfaces/echo.h>
#include <interfaces/init.h>
#include <interfaces/node.h>
#include <interfaces/wallet.h>
#include <node/context.h>
#include <util/system.h>

Expand All @@ -18,6 +22,13 @@ class BitcoindInit : public interfaces::Init
m_node.args = &gArgs;
m_node.init = this;
}
std::unique_ptr<interfaces::Node> makeNode() override { return interfaces::MakeNode(m_node); }
std::unique_ptr<interfaces::Chain> makeChain() override { return interfaces::MakeChain(m_node); }
std::unique_ptr<interfaces::WalletLoader> makeWalletLoader(interfaces::Chain& chain, const std::unique_ptr<interfaces::CoinJoin::Loader>& loader) override
{
return MakeWalletLoader(chain, loader, *Assert(m_node.args));
}
std::unique_ptr<interfaces::Echo> makeEcho() override { return interfaces::MakeEcho(); }
NodeContext& m_node;
};
} // namespace
Expand Down
2 changes: 1 addition & 1 deletion src/interfaces/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
namespace interfaces {
std::unique_ptr<Node> Init::makeNode() { return {}; }
std::unique_ptr<Chain> Init::makeChain() { return {}; }
std::unique_ptr<WalletLoader> Init::makeWalletLoader(Chain& chain) { return {}; }
std::unique_ptr<WalletLoader> Init::makeWalletLoader(Chain& chain, const std::unique_ptr<CoinJoin::Loader>&) { return {}; }
std::unique_ptr<Echo> Init::makeEcho() { return {}; }
Ipc* Init::ipc() { return nullptr; }
} // namespace interfaces
7 changes: 6 additions & 1 deletion src/interfaces/init.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ class Ipc;
class Node;
class WalletLoader;

namespace CoinJoin
{
class Loader;
}

//! Initial interface created when a process is first started, and used to give
//! and get access to other interfaces (Node, Chain, Wallet, etc).
//!
Expand All @@ -29,7 +34,7 @@ class Init
virtual ~Init() = default;
virtual std::unique_ptr<Node> makeNode();
virtual std::unique_ptr<Chain> makeChain();
virtual std::unique_ptr<WalletLoader> makeWalletLoader(Chain& chain);
virtual std::unique_ptr<interfaces::WalletLoader> makeWalletLoader(interfaces::Chain&, const std::unique_ptr<CoinJoin::Loader>&);
virtual std::unique_ptr<Echo> makeEcho();
virtual Ipc* ipc();
};
Expand Down
2 changes: 1 addition & 1 deletion src/interfaces/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ class Node
};

//! Return implementation of Node interface.
std::unique_ptr<Node> MakeNode(NodeContext* context = nullptr);
std::unique_ptr<Node> MakeNode(NodeContext& context);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider maintaining consistency in context handling pattern.

The change from NodeContext* context = nullptr to NodeContext& context creates an inconsistency with other context-related methods in the file. All other methods (e.g., setContext in EVO, GOV, LLMQ interfaces) use pointer-based context handling.

Consider one of these approaches to maintain consistency:

  1. Keep using pointer but make it non-nullable:
-std::unique_ptr<Node> MakeNode(NodeContext& context);
+std::unique_ptr<Node> MakeNode(NodeContext* context /* not null */);
  1. Update all context-related methods to use references:
-virtual void setContext(NodeContext* context) {}
+virtual void setContext(NodeContext& context) {}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
std::unique_ptr<Node> MakeNode(NodeContext& context);
std::unique_ptr<Node> MakeNode(NodeContext* context /* not null */);


//! Block tip (could be a header or not, depends on the subscribed signal).
struct BlockTip {
Expand Down
4 changes: 2 additions & 2 deletions src/node/interfaces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ class NodeImpl : public Node
MasternodeSyncImpl m_masternodeSync;
CoinJoinOptionsImpl m_coinjoin;

explicit NodeImpl(NodeContext* context) { setContext(context); }
explicit NodeImpl(NodeContext& context) { setContext(&context); }
void initLogging() override { InitLogging(*Assert(m_context->args)); }
void initParameterInteraction() override { InitParameterInteraction(*Assert(m_context->args)); }
bilingual_str getWarnings() override { return GetWarnings(true); }
Expand Down Expand Up @@ -1026,6 +1026,6 @@ class ChainImpl : public Chain
} // namespace node

namespace interfaces {
std::unique_ptr<Node> MakeNode(NodeContext* context) { return std::make_unique<node::NodeImpl>(context); }
std::unique_ptr<Node> MakeNode(NodeContext& context) { return std::make_unique<node::NodeImpl>(context); }
std::unique_ptr<Chain> MakeChain(NodeContext& node) { return std::make_unique<node::ChainImpl>(node); }
} // namespace interfaces
16 changes: 9 additions & 7 deletions src/qt/bitcoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <fs.h>
#include <init.h>
#include <interfaces/handler.h>
#include <interfaces/init.h>
#include <interfaces/node.h>
#include <net.h>
#include <node/context.h>
Expand Down Expand Up @@ -269,10 +270,10 @@ void BitcoinApplication::createSplashScreen(const NetworkStyle *networkStyle)
connect(this, &BitcoinApplication::requestedShutdown, m_splash, &QWidget::close);
}

void BitcoinApplication::setNode(interfaces::Node& node)
void BitcoinApplication::createNode(interfaces::Init& init)
{
assert(!m_node);
m_node = &node;
m_node = init.makeNode();
if (optionsModel) optionsModel->setNode(*m_node);
if (m_splash) m_splash->setNode(*m_node);
}
Expand Down Expand Up @@ -478,11 +479,13 @@ int GuiMain(int argc, char* argv[])
util::WinCmdLineArgs winArgs;
std::tie(argc, argv) = winArgs.get();
#endif
SetupEnvironment();
util::ThreadSetInternalName("main");

NodeContext node_context;
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode(&node_context);
int unused_exit_status;
std::unique_ptr<interfaces::Init> init = interfaces::MakeNodeInit(node_context, argc, argv, unused_exit_status);

SetupEnvironment();
util::ThreadSetInternalName("main");

// Subscribe to global signals from core
boost::signals2::scoped_connection handler_message_box = ::uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
Expand All @@ -504,7 +507,6 @@ int GuiMain(int argc, char* argv[])

/// 2. Parse command-line options. We do this after qt in order to show an error if there are problems parsing these
// Command-line options take precedence:
node_context.args = &gArgs;
SetupServerArgs(gArgs);
SetupUIArgs(gArgs);
std::string error;
Expand Down Expand Up @@ -729,7 +731,7 @@ int GuiMain(int argc, char* argv[])
if (gArgs.GetBoolArg("-splash", DEFAULT_SPLASHSCREEN) && !gArgs.GetBoolArg("-min", false))
app.createSplashScreen(networkStyle.data());

app.setNode(*node);
app.createNode(*init);

int rv = EXIT_SUCCESS;
try
Expand Down
8 changes: 6 additions & 2 deletions src/qt/bitcoin.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class PaymentServer;
class SplashScreen;
class WalletController;
class WalletModel;
namespace interfaces {
class Init;
} // namespace interfaces


/** Main Bitcoin application object */
Expand All @@ -50,6 +53,8 @@ class BitcoinApplication: public QApplication
void createWindow(const NetworkStyle *networkStyle);
/// Create splash screen
void createSplashScreen(const NetworkStyle *networkStyle);
/// Create or spawn node
void createNode(interfaces::Init& init);
/// Basic initialization, before starting initialization/shutdown thread. Return true on success.
bool baseInitialize();

Expand All @@ -65,7 +70,6 @@ class BitcoinApplication: public QApplication
WId getMainWinId() const;

interfaces::Node& node() const { assert(m_node); return *m_node; }
void setNode(interfaces::Node& node);

public Q_SLOTS:
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
Expand Down Expand Up @@ -102,7 +106,7 @@ public Q_SLOTS:
int returnValue;
std::unique_ptr<QWidget> shutdownWindow;
SplashScreen* m_splash = nullptr;
interfaces::Node* m_node = nullptr;
std::unique_ptr<interfaces::Node> m_node;

void startThread();
};
Expand Down
2 changes: 2 additions & 0 deletions src/qt/test/addressbooktests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ void EditAddressAndSubmit(
void TestAddAddressesToSendBook(interfaces::Node& node)
{
TestChain100Setup test;
auto wallet_loader = interfaces::MakeWalletLoader(*test.m_node.chain, test.m_node.coinjoin_loader, *Assert(test.m_node.args));
test.m_node.wallet_loader = wallet_loader.get();
node.setContext(&test.m_node);
const std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(node.context()->chain.get(), node.context()->coinjoin_loader.get(), "", CreateMockWalletDatabase());
wallet->SetupLegacyScriptPubKeyMan();
Expand Down
8 changes: 4 additions & 4 deletions src/qt/test/test_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <config/bitcoin-config.h>
#endif

#include <interfaces/init.h>
#include <interfaces/node.h>
#include <qt/bitcoin.h>
#include <qt/test/apptests.h>
Expand Down Expand Up @@ -62,7 +63,8 @@ int main(int argc, char* argv[])
}

NodeContext node_context;
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode(&node_context);
int unused_exit_status;
std::unique_ptr<interfaces::Init> init = interfaces::MakeNodeInit(node_context, argc, argv, unused_exit_status);
Comment on lines +66 to +67
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Consider handling the exit status.

The unused_exit_status variable is not checked. Consider handling it to properly manage test initialization failures.


🏁 Script executed:

#!/bin/bash
# Search for other MakeNodeInit calls to see how exit status is handled
rg -A 5 "MakeNodeInit.*exit_status"

Length of output: 2413


Action Required: Handle the Exit Status in Test Initialization

The grep results confirm that in other parts of the codebase (e.g., in src/bitcoind.cpp), the return value of MakeNodeInit is checked and, if it fails, the associated exit status is returned. However, in src/qt/test/test_main.cpp the unused_exit_status is not handled after calling MakeNodeInit. This inconsistency may lead to improperly managed initialization failures in your test environment.

  • Locations to address:
    • src/qt/test/test_main.cpp (Lines 66-67): Add exit status handling similar to:
      std::unique_ptr<interfaces::Init> init = interfaces::MakeNodeInit(node_context, argc, argv, exit_status);
      if (!init) {
          return exit_status;
      }

gArgs.ForceSetArg("-listen", "0");
gArgs.ForceSetArg("-listenonion", "0");
gArgs.ForceSetArg("-discover", "0");
Expand All @@ -81,10 +83,8 @@ int main(int argc, char* argv[])
#endif

BitcoinApplication app;
app.setNode(*node);
app.setApplicationName("Dash-Qt-test");

app.node().context()->args = &gArgs; // Make gArgs available in the NodeContext
app.createNode(*init);

int num_test_failures{0};

Expand Down
2 changes: 2 additions & 0 deletions src/qt/test/wallettests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ void TestGUI(interfaces::Node& node)
for (int i = 0; i < 5; ++i) {
test.CreateAndProcessBlock({}, GetScriptForRawPubKey(test.coinbaseKey.GetPubKey()));
}
auto wallet_loader = interfaces::MakeWalletLoader(*test.m_node.chain, test.m_node.coinjoin_loader, *Assert(test.m_node.args));
test.m_node.wallet_loader = wallet_loader.get();
node.setContext(&test.m_node);
const std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(node.context()->chain.get(), node.context()->coinjoin_loader.get(), "", CreateMockWalletDatabase());
AddWallet(wallet);
Expand Down
5 changes: 2 additions & 3 deletions src/qt/transactionrecord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ bool TransactionRecord::showTransaction()
/*
* Decompose CWallet transaction to model transaction records.
*/
QList<TransactionRecord> TransactionRecord::decomposeTransaction(interfaces::Wallet& wallet, const interfaces::WalletTx& wtx)
QList<TransactionRecord> TransactionRecord::decomposeTransaction(interfaces::Node& node, interfaces::Wallet& wallet, const interfaces::WalletTx& wtx)
{
QList<TransactionRecord> parts;
int64_t nTime = wtx.time;
Expand All @@ -36,8 +36,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(interfaces::Wal
CAmount nNet = nCredit - nDebit;
uint256 hash = wtx.tx->GetHash();
std::map<std::string, std::string> mapValue = wtx.value_map;
auto node = interfaces::MakeNode();
auto& coinJoinOptions = node->coinJoinOptions();
auto& coinJoinOptions = node.coinJoinOptions();

if (nNet > 0 || wtx.is_coinbase || wtx.is_platform_transfer)
{
Expand Down
Loading
Loading