Skip to content

Commit acc2988

Browse files
Merge #6577: backport: bitcoin#22539, #22918, #23093, #23268, #23287, #23314, #23320, #23323, #23341
ea107ac Merge bitcoin/bitcoin#23320: rpc: Add RPC help for getblock verbosity level 3 (W. J. van der Laan) 6df2fae Merge bitcoin/bitcoin#23341: RPC: Better safety with newkeypool command and wallet backups (Andrew Chow) 910f4c0 Merge bitcoin/bitcoin#23093: Add ability to flush keypool and always flush when upgrading non-HD to HD (W. J. van der Laan) cf6e969 Merge bitcoin/bitcoin#22539: Re-include RBF replacement txs in fee estimation (W. J. van der Laan) 5c226da Merge bitcoin/bitcoin#23323: doc: Add note on deleting past-EOL release branches (MarcoFalke) bf28e85 Merge bitcoin/bitcoin#23287: test: get and decode tx with a single `gettransaction` RPC call (MarcoFalke) 6f46f58 Merge bitcoin/bitcoin#22918: rpc: Add level 3 verbosity to getblock RPC call (#21245 modified) (W. J. van der Laan) 4e8f6af Merge bitcoin/bitcoin#23268: p2p: Use absolute FQDN for DNS seed domains (fanquake) 135d650 Merge bitcoin/bitcoin#23314: build: explicitly disable libsecp256k1 openssl based tests (W. J. van der Laan) Pull request description: ## What was done? Just regular backports from Bitcoin Core v23. ## How Has This Been Tested? Run unit / functional tests ## Breaking Changes N/A ## Checklist: - [x] 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 ACKs for top commit: UdjinM6: utACK ea107ac Tree-SHA512: df36fc867d533366c7f46903e018048fc9f64ef01960e1d2338195f00203fe6a9c5ac9bd13120b949015846d10cf4969853990b6c6023fbf6f4c19e716747889
2 parents abc644c + ea107ac commit acc2988

21 files changed

+287
-90
lines changed

configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -1906,7 +1906,7 @@ CPPFLAGS_TEMP="$CPPFLAGS"
19061906
unset CPPFLAGS
19071907
CPPFLAGS="$CPPFLAGS_TEMP"
19081908

1909-
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh"
1909+
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh --disable-openssl-tests"
19101910
AC_CONFIG_SUBDIRS([src/dashbls src/secp256k1])
19111911

19121912
AC_OUTPUT

doc/release-notes-22918.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
## Updated RPCs
2+
3+
- The `getblock` RPC command now supports verbosity level 3 containing transaction inputs
4+
`prevout` information. The existing `/rest/block/` REST endpoint is modified to contain
5+
this information too. Every `vin` field will contain an additional `prevout` subfield
6+
describing the spent output. `prevout` contains the following keys:
7+
- `generated` - true if the spent coins was a coinbase.
8+
- `height`
9+
- `value`
10+
- `scriptPubKey`
11+

doc/release-notes-23093.md

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Notable changes
2+
===============
3+
4+
Updated RPCs
5+
------------
6+
7+
- a new RPC `newkeypool` has been added, which will flush (entirely
8+
clear and refill) the keypool.

doc/release-process.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Release Process
66

77
Before every minor and major release:
88

9+
* [ ] Review ["Needs backport" labels](https://github.com/dashpay/dash/labels?q=backport).
910
* [ ] Update [bips.md](bips.md) to account for changes since the last release.
1011
* [ ] Update DIPs with any changes introduced by this release (see [this pull request](https://github.com/dashpay/dips/pull/142) for an example)
1112
* [ ] Update version in `configure.ac` (don't forget to set `CLIENT_VERSION_IS_RELEASE` to `true`)

src/bench/rpc_blockchain.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static void BlockToJsonVerbose(benchmark::Bench& bench)
4545
TestBlockAndIndex data;
4646
const LLMQContext& llmq_ctx = *data.testing_setup->m_node.llmq_ctx;
4747
bench.run([&] {
48-
auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, /*verbose*/ true);
48+
auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
4949
ankerl::nanobench::doNotOptimizeAway(univalue);
5050
});
5151
}
@@ -56,7 +56,7 @@ static void BlockToJsonVerboseWrite(benchmark::Bench& bench)
5656
{
5757
TestBlockAndIndex data;
5858
const LLMQContext& llmq_ctx = *data.testing_setup->m_node.llmq_ctx;
59-
auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, /*verbose*/ true);
59+
auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
6060
bench.run([&] {
6161
auto str = univalue.write();
6262
ankerl::nanobench::doNotOptimizeAway(str);

src/chainparams.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ class CMainParams : public CChainParams {
250250
// This is fine at runtime as we'll fall back to using them as an addrfetch if they don't support the
251251
// service bits we want, but we should get them updated to support all service bits wanted by any
252252
// release ASAP to avoid it where possible.
253-
vSeeds.emplace_back("dnsseed.dash.org");
253+
vSeeds.emplace_back("dnsseed.dash.org.");
254254

255255
// Dash addresses start with 'X'
256256
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,76);
@@ -443,7 +443,7 @@ class CTestNetParams : public CChainParams {
443443

444444
vSeeds.clear();
445445
// nodes with support for servicebits filtering should be at the top
446-
vSeeds.emplace_back("testnet-seed.dashdot.io"); // Just a static list of stable node(s), only supports x9
446+
vSeeds.emplace_back("testnet-seed.dashdot.io."); // Just a static list of stable node(s), only supports x9
447447

448448
// Testnet Dash addresses start with 'y'
449449
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,140);
@@ -617,7 +617,7 @@ class CDevNetParams : public CChainParams {
617617

618618
vFixedSeeds.clear();
619619
vSeeds.clear();
620-
//vSeeds.push_back(CDNSSeedData("dashevo.org", "devnet-seed.dashevo.org"));
620+
//vSeeds.push_back(CDNSSeedData("dashevo.org.", "devnet-seed.dashevo.org."));
621621

622622
// Testnet Dash addresses start with 'y'
623623
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,140);

src/core_io.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ class CTxUndo;
2222

2323
struct CSpentIndexTxInfo;
2424

25+
/**
26+
* Verbose level for block's transaction
27+
*/
28+
enum class TxVerbosity {
29+
SHOW_TXID, //!< Only TXID for each block's transaction
30+
SHOW_DETAILS, //!< Include TXID, inputs, outputs, and other common block's transaction information
31+
SHOW_DETAILS_AND_PREVOUT //!< The same as previous option with information about prevouts if available
32+
};
33+
2534
// core_read.cpp
2635
CScript ParseScript(const std::string& s);
2736
std::string ScriptToAsmStr(const CScript& script, const bool fAttemptSighashDecode = false);
@@ -47,6 +56,6 @@ std::string EncodeHexTx(const CTransaction& tx);
4756
std::string SighashToStr(unsigned char sighash_type);
4857
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool include_hex, bool include_address = true);
4958
void ScriptToUniv(const CScript& script, UniValue& out);
50-
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, int serialize_flags = 0, const CTxUndo* txundo = nullptr, const CSpentIndexTxInfo* ptxSpentInfo = nullptr);
59+
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, int serialize_flags = 0, const CTxUndo* txundo = nullptr, TxVerbosity verbosity = TxVerbosity::SHOW_DETAILS, const CSpentIndexTxInfo* ptxSpentInfo = nullptr);
5160

5261
#endif // BITCOIN_CORE_IO_H

src/core_write.cpp

+20-6
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool include
173173
out.pushKV("type", GetTxnOutputType(type));
174174
}
175175

176-
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex, int serialize_flags, const CTxUndo* txundo, const CSpentIndexTxInfo* ptxSpentInfo)
176+
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex, int serialize_flags, const CTxUndo* txundo, TxVerbosity verbosity, const CSpentIndexTxInfo* ptxSpentInfo)
177177
{
178178
uint256 txid = tx.GetHash();
179179
entry.pushKV("txid", txid.GetHex());
@@ -188,7 +188,7 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
188188

189189
// If available, use Undo data to calculate the fee. Note that txundo == nullptr
190190
// for coinbase transactions and for transactions where undo data is unavailable.
191-
const bool calculate_fee = txundo != nullptr;
191+
const bool have_undo = txundo != nullptr;
192192
CAmount amt_total_in = 0;
193193
CAmount amt_total_out = 0;
194194

@@ -221,9 +221,23 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
221221
}
222222
}
223223
}
224-
if (calculate_fee) {
225-
const CTxOut& prev_txout = txundo->vprevout[i].out;
224+
if (have_undo) {
225+
const Coin& prev_coin = txundo->vprevout[i];
226+
const CTxOut& prev_txout = prev_coin.out;
227+
226228
amt_total_in += prev_txout.nValue;
229+
230+
if (verbosity == TxVerbosity::SHOW_DETAILS_AND_PREVOUT) {
231+
UniValue o_script_pub_key(UniValue::VOBJ);
232+
ScriptPubKeyToUniv(prev_txout.scriptPubKey, o_script_pub_key, /*include_hex=*/ true, /*include_address=*/true);
233+
234+
UniValue p(UniValue::VOBJ);
235+
p.pushKV("generated", bool(prev_coin.fCoinBase));
236+
p.pushKV("height", uint64_t(prev_coin.nHeight));
237+
p.pushKV("value", ValueFromAmount(prev_txout.nValue));
238+
p.pushKV("scriptPubKey", o_script_pub_key);
239+
in.pushKV("prevout", p);
240+
}
227241
}
228242
in.pushKV("sequence", (int64_t)txin.nSequence);
229243
vin.push_back(in);
@@ -257,7 +271,7 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
257271
}
258272
vout.push_back(out);
259273

260-
if (calculate_fee) {
274+
if (have_undo) {
261275
amt_total_out += txout.nValue;
262276
}
263277
}
@@ -306,7 +320,7 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
306320
}
307321
}
308322

309-
if (calculate_fee) {
323+
if (have_undo) {
310324
CAmount fee = amt_total_in - amt_total_out;
311325
if (tx.IsPlatformTransfer()) {
312326
auto payload = GetTxPayload<CAssetUnlockPayload>(tx);

src/rest.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ static bool rest_headers(const CoreContext& context,
289289
static bool rest_block(const CoreContext& context,
290290
HTTPRequest* req,
291291
const std::string& strURIPart,
292-
bool showTxDetails)
292+
TxVerbosity tx_verbosity)
293293
{
294294
if (!CheckWarmup(req))
295295
return false;
@@ -344,7 +344,7 @@ static bool rest_block(const CoreContext& context,
344344
const LLMQContext* llmq_ctx = GetLLMQContext(context, req);
345345
if (!llmq_ctx) return false;
346346

347-
UniValue objBlock = blockToJSON(chainman.m_blockman, block, tip, pblockindex, *llmq_ctx->clhandler, *llmq_ctx->isman, showTxDetails);
347+
UniValue objBlock = blockToJSON(chainman.m_blockman, block, tip, pblockindex, *llmq_ctx->clhandler, *llmq_ctx->isman, tx_verbosity);
348348
std::string strJSON = objBlock.write() + "\n";
349349
req->WriteHeader("Content-Type", "application/json");
350350
req->WriteReply(HTTP_OK, strJSON);
@@ -359,12 +359,12 @@ static bool rest_block(const CoreContext& context,
359359

360360
static bool rest_block_extended(const CoreContext& context, HTTPRequest* req, const std::string& strURIPart)
361361
{
362-
return rest_block(context, req, strURIPart, true);
362+
return rest_block(context, req, strURIPart, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
363363
}
364364

365365
static bool rest_block_notxdetails(const CoreContext& context, HTTPRequest* req, const std::string& strURIPart)
366366
{
367-
return rest_block(context, req, strURIPart, false);
367+
return rest_block(context, req, strURIPart, TxVerbosity::SHOW_TXID);
368368
}
369369

370370
static bool rest_filter_header(const CoreContext& context, HTTPRequest* req, const std::string& strURIPart)

src/rpc/blockchain.cpp

+69-22
Original file line numberDiff line numberDiff line change
@@ -155,31 +155,37 @@ UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex
155155
return result;
156156
}
157157

158-
UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, const llmq::CChainLocksHandler& clhandler, const llmq::CInstantSendManager& isman, bool txDetails)
158+
UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, const llmq::CChainLocksHandler& clhandler, const llmq::CInstantSendManager& isman, TxVerbosity verbosity)
159159
{
160160
UniValue result = blockheaderToJSON(tip, blockindex, clhandler);
161161

162162
result.pushKV("size", (int)::GetSerializeSize(block, PROTOCOL_VERSION));
163163
UniValue txs(UniValue::VARR);
164-
if (txDetails) {
165-
CBlockUndo blockUndo;
166-
const bool have_undo{WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(blockindex) && UndoReadFromDisk(blockUndo, blockindex))};
167-
for (size_t i = 0; i < block.vtx.size(); ++i) {
168-
const CTransactionRef& tx = block.vtx.at(i);
169-
// coinbase transaction (i == 0) doesn't have undo data
170-
const CTxUndo* txundo = (have_undo && i) ? &blockUndo.vtxundo.at(i - 1) : nullptr;
171-
UniValue objTx(UniValue::VOBJ);
172-
TxToUniv(*tx, uint256(), objTx, true, 0, txundo);
173-
bool fLocked = isman.IsLocked(tx->GetHash());
174-
objTx.pushKV("instantlock", fLocked || result["chainlock"].get_bool());
175-
objTx.pushKV("instantlock_internal", fLocked);
176-
txs.push_back(objTx);
177-
}
178-
} else {
179-
for (const CTransactionRef& tx : block.vtx) {
180-
txs.push_back(tx->GetHash().GetHex());
181-
}
164+
switch (verbosity) {
165+
case TxVerbosity::SHOW_TXID:
166+
for (const CTransactionRef& tx : block.vtx) {
167+
txs.push_back(tx->GetHash().GetHex());
168+
}
169+
break;
170+
case TxVerbosity::SHOW_DETAILS:
171+
case TxVerbosity::SHOW_DETAILS_AND_PREVOUT:
172+
CBlockUndo blockUndo;
173+
const bool have_undo{WITH_LOCK(::cs_main, return !blockman.IsBlockPruned(blockindex) && UndoReadFromDisk(blockUndo, blockindex))};
174+
175+
for (size_t i = 0; i < block.vtx.size(); ++i) {
176+
const CTransactionRef& tx = block.vtx.at(i);
177+
// coinbase transaction (i.e. i == 0) doesn't have undo data
178+
const CTxUndo* txundo = (have_undo && i > 0) ? &blockUndo.vtxundo.at(i - 1) : nullptr;
179+
UniValue objTx(UniValue::VOBJ);
180+
TxToUniv(*tx, uint256(), objTx, true, 0, txundo, verbosity);
181+
bool fLocked = isman.IsLocked(tx->GetHash());
182+
objTx.pushKV("instantlock", fLocked || result["chainlock"].get_bool());
183+
objTx.pushKV("instantlock_internal", fLocked);
184+
txs.push_back(objTx);
185+
}
186+
break;
182187
}
188+
183189
result.pushKV("tx", txs);
184190
if (!block.vtx[0]->vExtraPayload.empty()) {
185191
if (const auto opt_cbTx = GetTxPayload<CCbTx>(block.vtx[0]->vExtraPayload)) {
@@ -872,10 +878,11 @@ static RPCHelpMan getblock()
872878
return RPCHelpMan{"getblock",
873879
"\nIf verbosity is 0, returns a string that is serialized, hex-encoded data for block 'hash'.\n"
874880
"If verbosity is 1, returns an Object with information about block <hash>.\n"
875-
"If verbosity is 2, returns an Object with information about block <hash> and information about each transaction. \n",
881+
"If verbosity is 2, returns an Object with information about block <hash> and information about each transaction.\n"
882+
"If verbosity is 3, returns an Object with information about block <hash> and information about each transaction, including prevout information for inputs (only for unpruned blocks in the current best chain).\n",
876883
{
877884
{"blockhash", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The block hash"},
878-
{"verbosity|verbose", RPCArg::Type::NUM, RPCArg::Default{1}, "0 for hex-encoded data, 1 for a json object, and 2 for json object with transaction data"},
885+
{"verbosity|verbose", RPCArg::Type::NUM, RPCArg::Default{1}, "0 for hex-encoded data, 1 for a JSON object, 2 for JSON object with transaction data, and 3 for JSON object with transaction data including prevout information for inputs"},
879886
},
880887
{
881888
RPCResult{"for verbosity = 0",
@@ -923,6 +930,37 @@ static RPCHelpMan getblock()
923930
}},
924931
}},
925932
}},
933+
RPCResult{"for verbosity = 3",
934+
RPCResult::Type::OBJ, "", "",
935+
{
936+
{RPCResult::Type::ELISION, "", "Same output as verbosity = 2"},
937+
{RPCResult::Type::ARR, "tx", "",
938+
{
939+
{RPCResult::Type::OBJ, "", "",
940+
{
941+
{RPCResult::Type::ARR, "vin", "",
942+
{
943+
{RPCResult::Type::OBJ, "", "",
944+
{
945+
{RPCResult::Type::ELISION, "", "The same output as verbosity = 2"},
946+
{RPCResult::Type::OBJ, "prevout", "(Only if undo information is available)",
947+
{
948+
{RPCResult::Type::BOOL, "generated", "Coinbase or not"},
949+
{RPCResult::Type::NUM, "height", "The height of the prevout"},
950+
{RPCResult::Type::NUM, "value", "The value in " + CURRENCY_UNIT},
951+
{RPCResult::Type::OBJ, "scriptPubKey", "",
952+
{
953+
{RPCResult::Type::STR, "asm", "The asm"},
954+
{RPCResult::Type::STR, "hex", "The hex"},
955+
{RPCResult::Type::STR, "address", /*optional=*/ true, "The Dash address (only if a well-defined address exists)"},
956+
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
957+
}},
958+
}},
959+
}},
960+
}},
961+
}},
962+
}},
963+
}},
926964
},
927965
RPCExamples{
928966
HelpExampleCli("getblock", "\"00000000000fd08c2fb661d2fcb0d49abb3a91e5f27082ce64feed3b4dede2e2\"")
@@ -968,7 +1006,16 @@ static RPCHelpMan getblock()
9681006
}
9691007

9701008
const LLMQContext& llmq_ctx = EnsureLLMQContext(node);
971-
return blockToJSON(chainman.m_blockman, block, tip, pblockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, verbosity >= 2);
1009+
TxVerbosity tx_verbosity;
1010+
if (verbosity == 1) {
1011+
tx_verbosity = TxVerbosity::SHOW_TXID;
1012+
} else if (verbosity == 2) {
1013+
tx_verbosity = TxVerbosity::SHOW_DETAILS;
1014+
} else {
1015+
tx_verbosity = TxVerbosity::SHOW_DETAILS_AND_PREVOUT;
1016+
}
1017+
1018+
return blockToJSON(chainman.m_blockman, block, tip, pblockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, tx_verbosity);
9721019
},
9731020
};
9741021
}

src/rpc/blockchain.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define BITCOIN_RPC_BLOCKCHAIN_H
77

88
#include <consensus/amount.h>
9+
#include <core_io.h>
910
#include <fs.h>
1011
#include <streams.h>
1112
#include <sync.h>
@@ -40,7 +41,7 @@ double GetDifficulty(const CBlockIndex* blockindex);
4041
void RPCNotifyBlockChange(const CBlockIndex*);
4142

4243
/** Block description to JSON */
43-
UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, const llmq::CChainLocksHandler& clhandler, const llmq::CInstantSendManager& isman, bool txDetails = false) LOCKS_EXCLUDED(cs_main);
44+
UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, const llmq::CChainLocksHandler& clhandler, const llmq::CInstantSendManager& isman, TxVerbosity verbosity) LOCKS_EXCLUDED(cs_main);
4445

4546
/** Block header to JSON */
4647
UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex, const llmq::CChainLocksHandler& clhandler) LOCKS_EXCLUDED(cs_main);

src/rpc/rawtransaction.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, const CTxMemPool
9696
txSpentInfoPtr = &txSpentInfo;
9797
}
9898

99-
TxToUniv(tx, uint256(), entry, true, 0, /* txundo = */ nullptr, txSpentInfoPtr);
99+
TxToUniv(tx, uint256(), entry, true, 0, /* txundo = */ nullptr, TxVerbosity::SHOW_DETAILS, txSpentInfoPtr);
100100

101101
bool chainLock = false;
102102
if (!hashBlock.IsNull()) {

0 commit comments

Comments
 (0)