From 752590348b9d28b1ed97e4e9939c7ac480435cd6 Mon Sep 17 00:00:00 2001 From: DanS Date: Sun, 15 Mar 2026 16:07:16 -0500 Subject: [PATCH] Fix sapling pool persistence and add subsidy/fees to getblock RPC Lower SPROUT_VALUE_VERSION and SAPLING_VALUE_VERSION constants in chain.h from upstream Zcash values (1001400/1010100) to 1000000. When DragonX was rebranded from HUSH3, CLIENT_VERSION was reset from 3.10.5 to 1.0.0, falling below these thresholds. This caused nSaplingValue to silently skip serialization, so the sapling pool total reset to 0 on every node restart. Explorer nodes should reindex once after upgrading. Add subsidy and fees fields to the getblock RPC response so explorers can display the correct 3 DRGX block reward separately from fees, instead of showing the combined coinbase output as the reward. --- src/chain.h | 8 ++++++-- src/rpc/blockchain.cpp | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/chain.h b/src/chain.h index a3d2c3eca..c35539ea4 100644 --- a/src/chain.h +++ b/src/chain.h @@ -32,8 +32,12 @@ class CChainPower; #include extern bool fZindex; -static const int SPROUT_VALUE_VERSION = 1001400; -static const int SAPLING_VALUE_VERSION = 1010100; +// These version thresholds control whether nSproutValue/nSaplingValue are +// serialized in the block index. They must be <= CLIENT_VERSION or the +// values will never be persisted, causing nChainSaplingValue to reset +// to 0 after node restart. DragonX CLIENT_VERSION is 1000150 (v1.0.1.50). +static const int SPROUT_VALUE_VERSION = 1000000; +static const int SAPLING_VALUE_VERSION = 1000000; extern int32_t ASSETCHAINS_LWMAPOS; extern char SMART_CHAIN_SYMBOL[65]; extern uint64_t ASSETCHAINS_NOTARY_PAY[]; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 5f1394a80..886616b56 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -322,6 +322,15 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx result.push_back(Pair("anchor", blockindex->hashFinalSproutRoot.GetHex())); result.push_back(Pair("blocktype", "mined")); + // Report block subsidy and fees separately so explorers don't have to + // reimplement the reward schedule to display them. + CAmount nSubsidy = GetBlockSubsidy(blockindex->GetHeight(), Params().GetConsensus()); + CAmount nCoinbase = block.vtx[0].GetValueOut(); + CAmount nFees = nCoinbase - nSubsidy; + if (nFees < 0) nFees = 0; // block 1 has premine, avoid negative + result.push_back(Pair("subsidy", ValueFromAmount(nSubsidy))); + result.push_back(Pair("fees", ValueFromAmount(nFees))); + UniValue valuePools(UniValue::VARR); valuePools.push_back(ValuePoolDesc("sapling", blockindex->nChainSaplingValue, blockindex->nSaplingValue)); result.push_back(Pair("valuePools", valuePools));