Skip to content

Commit 25dd4d8

Browse files
author
MacroFake
committed
Merge bitcoin/bitcoin#24595: deploymentstatus: move g_versionbitscache global to ChainstateManager
bb5c24b validation: move g_versionbitscache into ChainstateManager (Anthony Towns) eca22c7 test/versionbits: make versionbitscache a parameter (Anthony Towns) d603f1d deploymentstatus: make versionbitscache a parameter (Anthony Towns) 78adef1 refactor: use chainman instead of chainParams for DeploymentActive* (Anthony Towns) deffe0d deploymentstatus: allow chainman in place of consensusParams (Anthony Towns) eaa2e3f validation: move UpdateUncommittedBlockStructures and GenerateCoinbaseCommitment into ChainstateManager (Anthony Towns) 5c67e84 validation: replace ::Params() calls with chainstate/chainman member (Anthony Towns) 38860f9 validation: remove redundant CChainParams params from ChainstateManager methods (Anthony Towns) 69675ea validation: add CChainParams to ChainstateManager (Anthony Towns) Pull request description: Gives `ChainstateManager` a reference to the `CChainParams` its working on, and simplifies some of the functions that would otherwise take that as a parameter. Removes the `g_versionbitscache` global by moving it into `ChainstateManager`. ACKs for top commit: dongcarl: reACK bb5c24b MarcoFalke: review ACK bb5c24b 📙 Tree-SHA512: 3fa74905e5df561e3e74bb0b8fce6085c5311e6633e7d74c0fb0c82a907f5bbb1fd4ebc5d11d4f0b1c019bb51eabb9f6e4bcc4652a696d36a5878c807b85f121
2 parents 1d5325a + bb5c24b commit 25dd4d8

18 files changed

+200
-170
lines changed

src/bitcoin-chainstate.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ int main(int argc, char* argv[])
7070

7171

7272
// SETUP: Chainstate
73-
ChainstateManager chainman;
73+
ChainstateManager chainman{chainparams};
7474

7575
auto rv = node::LoadChainstate(false,
7676
std::ref(chainman),
@@ -163,7 +163,7 @@ int main(int argc, char* argv[])
163163
LOCK(cs_main);
164164
const CBlockIndex* pindex = chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock);
165165
if (pindex) {
166-
UpdateUncommittedBlockStructures(block, pindex, chainparams.GetConsensus());
166+
chainman.UpdateUncommittedBlockStructures(block, pindex);
167167
}
168168
}
169169

@@ -190,7 +190,7 @@ int main(int argc, char* argv[])
190190
bool new_block;
191191
auto sc = std::make_shared<submitblock_StateCatcher>(block.GetHash());
192192
RegisterSharedValidationInterface(sc);
193-
bool accepted = chainman.ProcessNewBlock(chainparams, blockptr, /*force_processing=*/true, /*new_block=*/&new_block);
193+
bool accepted = chainman.ProcessNewBlock(blockptr, /*force_processing=*/true, /*new_block=*/&new_block);
194194
UnregisterSharedValidationInterface(sc);
195195
if (!new_block && accepted) {
196196
std::cerr << "duplicate" << std::endl;

src/deploymentstatus.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
#include <type_traits>
1111

12-
VersionBitsCache g_versionbitscache;
13-
1412
/* Basic sanity checking for BuriedDeployment/DeploymentPos enums and
1513
* ValidDeployment check */
1614

src/deploymentstatus.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,30 @@
1010

1111
#include <limits>
1212

13-
/** Global cache for versionbits deployment status */
14-
extern VersionBitsCache g_versionbitscache;
15-
1613
/** Determine if a deployment is active for the next block */
17-
inline bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::BuriedDeployment dep)
14+
inline bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::BuriedDeployment dep, [[maybe_unused]] VersionBitsCache& versionbitscache)
1815
{
1916
assert(Consensus::ValidDeployment(dep));
2017
return (pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1) >= params.DeploymentHeight(dep);
2118
}
2219

23-
inline bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos dep)
20+
inline bool DeploymentActiveAfter(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos dep, VersionBitsCache& versionbitscache)
2421
{
2522
assert(Consensus::ValidDeployment(dep));
26-
return ThresholdState::ACTIVE == g_versionbitscache.State(pindexPrev, params, dep);
23+
return ThresholdState::ACTIVE == versionbitscache.State(pindexPrev, params, dep);
2724
}
2825

2926
/** Determine if a deployment is active for this block */
30-
inline bool DeploymentActiveAt(const CBlockIndex& index, const Consensus::Params& params, Consensus::BuriedDeployment dep)
27+
inline bool DeploymentActiveAt(const CBlockIndex& index, const Consensus::Params& params, Consensus::BuriedDeployment dep, [[maybe_unused]] VersionBitsCache& versionbitscache)
3128
{
3229
assert(Consensus::ValidDeployment(dep));
3330
return index.nHeight >= params.DeploymentHeight(dep);
3431
}
3532

36-
inline bool DeploymentActiveAt(const CBlockIndex& index, const Consensus::Params& params, Consensus::DeploymentPos dep)
33+
inline bool DeploymentActiveAt(const CBlockIndex& index, const Consensus::Params& params, Consensus::DeploymentPos dep, VersionBitsCache& versionbitscache)
3734
{
3835
assert(Consensus::ValidDeployment(dep));
39-
return DeploymentActiveAfter(index.pprev, params, dep);
36+
return DeploymentActiveAfter(index.pprev, params, dep, versionbitscache);
4037
}
4138

4239
/** Determine if a deployment is enabled (can ever be active) */

src/init.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
14241424
for (bool fLoaded = false; !fLoaded && !ShutdownRequested();) {
14251425
node.mempool = std::make_unique<CTxMemPool>(node.fee_estimator.get(), mempool_check_ratio);
14261426

1427-
node.chainman = std::make_unique<ChainstateManager>();
1427+
node.chainman = std::make_unique<ChainstateManager>(chainparams);
14281428
ChainstateManager& chainman = *node.chainman;
14291429

14301430
const bool fReset = fReindex;

src/net_processing.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,6 @@ void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count
11101110
if (state->pindexLastCommonBlock == state->pindexBestKnownBlock)
11111111
return;
11121112

1113-
const Consensus::Params& consensusParams = m_chainparams.GetConsensus();
11141113
std::vector<const CBlockIndex*> vToFetch;
11151114
const CBlockIndex *pindexWalk = state->pindexLastCommonBlock;
11161115
// Never fetch further than the best block we know the peer has, or more than BLOCK_DOWNLOAD_WINDOW + 1 beyond the last
@@ -1140,7 +1139,7 @@ void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count
11401139
// We consider the chain that this peer is on invalid.
11411140
return;
11421141
}
1143-
if (!State(nodeid)->fHaveWitness && DeploymentActiveAt(*pindex, consensusParams, Consensus::DEPLOYMENT_SEGWIT)) {
1142+
if (!State(nodeid)->fHaveWitness && DeploymentActiveAt(*pindex, m_chainman, Consensus::DEPLOYMENT_SEGWIT)) {
11441143
// We wouldn't download this block or its descendants from this peer.
11451144
return;
11461145
}
@@ -1641,7 +1640,7 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
16411640
return;
16421641
m_highest_fast_announce = pindex->nHeight;
16431642

1644-
bool fWitnessEnabled = DeploymentActiveAt(*pindex, m_chainparams.GetConsensus(), Consensus::DEPLOYMENT_SEGWIT);
1643+
bool fWitnessEnabled = DeploymentActiveAt(*pindex, m_chainman, Consensus::DEPLOYMENT_SEGWIT);
16451644
uint256 hashBlock(pblock->GetHash());
16461645
const std::shared_future<CSerializedNetMsg> lazy_ser{
16471646
std::async(std::launch::deferred, [&] { return msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock); })};
@@ -2214,7 +2213,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
22142213
}
22152214

22162215
BlockValidationState state;
2217-
if (!m_chainman.ProcessNewBlockHeaders(headers, state, m_chainparams, &pindexLast)) {
2216+
if (!m_chainman.ProcessNewBlockHeaders(headers, state, &pindexLast)) {
22182217
if (state.IsInvalid()) {
22192218
MaybePunishNodeForBlock(pfrom.GetId(), state, via_compact_block, "invalid header received");
22202219
return;
@@ -2258,7 +2257,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
22582257
while (pindexWalk && !m_chainman.ActiveChain().Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
22592258
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&
22602259
!IsBlockRequested(pindexWalk->GetBlockHash()) &&
2261-
(!DeploymentActiveAt(*pindexWalk, m_chainparams.GetConsensus(), Consensus::DEPLOYMENT_SEGWIT) || State(pfrom.GetId())->fHaveWitness)) {
2260+
(!DeploymentActiveAt(*pindexWalk, m_chainman, Consensus::DEPLOYMENT_SEGWIT) || State(pfrom.GetId())->fHaveWitness)) {
22622261
// We don't have this block, and it's not yet in flight.
22632262
vToFetch.push_back(pindexWalk);
22642263
}
@@ -2591,7 +2590,7 @@ void PeerManagerImpl::ProcessGetCFCheckPt(CNode& peer, CDataStream& vRecv)
25912590
void PeerManagerImpl::ProcessBlock(CNode& node, const std::shared_ptr<const CBlock>& block, bool force_processing)
25922591
{
25932592
bool new_block{false};
2594-
m_chainman.ProcessNewBlock(m_chainparams, block, force_processing, &new_block);
2593+
m_chainman.ProcessNewBlock(block, force_processing, &new_block);
25952594
if (new_block) {
25962595
node.m_last_block_time = GetTime<std::chrono::seconds>();
25972596
} else {
@@ -3569,7 +3568,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
35693568

35703569
const CBlockIndex *pindex = nullptr;
35713570
BlockValidationState state;
3572-
if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, state, m_chainparams, &pindex)) {
3571+
if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, state, &pindex)) {
35733572
if (state.IsInvalid()) {
35743573
MaybePunishNodeForBlock(pfrom.GetId(), state, /*via_compact_block=*/true, "invalid header via cmpctblock");
35753574
return;
@@ -3629,7 +3628,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
36293628
return;
36303629
}
36313630

3632-
if (DeploymentActiveAt(*pindex, m_chainparams.GetConsensus(), Consensus::DEPLOYMENT_SEGWIT) && !nodestate->fSupportsDesiredCmpctVersion) {
3631+
if (DeploymentActiveAt(*pindex, m_chainman, Consensus::DEPLOYMENT_SEGWIT) && !nodestate->fSupportsDesiredCmpctVersion) {
36333632
// Don't bother trying to process compact blocks from v1 peers
36343633
// after segwit activates.
36353634
return;

src/node/miner.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void RegenerateCommitments(CBlock& block, ChainstateManager& chainman)
5151
block.vtx.at(0) = MakeTransactionRef(tx);
5252

5353
const CBlockIndex* prev_block = WITH_LOCK(::cs_main, return chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock));
54-
GenerateCoinbaseCommitment(block, prev_block, Params().GetConsensus());
54+
chainman.GenerateCoinbaseCommitment(block, prev_block);
5555

5656
block.hashMerkleRoot = BlockMerkleRoot(block);
5757
}
@@ -126,7 +126,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
126126
assert(pindexPrev != nullptr);
127127
nHeight = pindexPrev->nHeight + 1;
128128

129-
pblock->nVersion = g_versionbitscache.ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
129+
pblock->nVersion = m_chainstate.m_chainman.m_versionbitscache.ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
130130
// -regtest only: allow overriding block.nVersion with
131131
// -blockversion=N to test forking scenarios
132132
if (chainparams.MineBlocksOnDemand()) {
@@ -154,7 +154,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
154154
coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
155155
coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
156156
pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx));
157-
pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
157+
pblocktemplate->vchCoinbaseCommitment = m_chainstate.m_chainman.GenerateCoinbaseCommitment(*pblock, pindexPrev);
158158
pblocktemplate->vTxFees[0] = -nFees;
159159

160160
LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);

src/rpc/blockchain.cpp

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,26 +1064,26 @@ static RPCHelpMan verifychain()
10641064
};
10651065
}
10661066

1067-
static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softforks, const Consensus::Params& params, Consensus::BuriedDeployment dep)
1067+
static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softforks, const ChainstateManager& chainman, Consensus::BuriedDeployment dep)
10681068
{
10691069
// For buried deployments.
10701070

1071-
if (!DeploymentEnabled(params, dep)) return;
1071+
if (!DeploymentEnabled(chainman, dep)) return;
10721072

10731073
UniValue rv(UniValue::VOBJ);
10741074
rv.pushKV("type", "buried");
10751075
// getdeploymentinfo reports the softfork as active from when the chain height is
10761076
// one below the activation height
1077-
rv.pushKV("active", DeploymentActiveAfter(blockindex, params, dep));
1078-
rv.pushKV("height", params.DeploymentHeight(dep));
1077+
rv.pushKV("active", DeploymentActiveAfter(blockindex, chainman, dep));
1078+
rv.pushKV("height", chainman.GetConsensus().DeploymentHeight(dep));
10791079
softforks.pushKV(DeploymentName(dep), rv);
10801080
}
10811081

1082-
static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softforks, const Consensus::Params& consensusParams, Consensus::DeploymentPos id)
1082+
static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softforks, const ChainstateManager& chainman, Consensus::DeploymentPos id)
10831083
{
10841084
// For BIP9 deployments.
10851085

1086-
if (!DeploymentEnabled(consensusParams, id)) return;
1086+
if (!DeploymentEnabled(chainman, id)) return;
10871087
if (blockindex == nullptr) return;
10881088

10891089
auto get_state_name = [](const ThresholdState state) -> std::string {
@@ -1099,29 +1099,29 @@ static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softfo
10991099

11001100
UniValue bip9(UniValue::VOBJ);
11011101

1102-
const ThresholdState next_state = g_versionbitscache.State(blockindex, consensusParams, id);
1103-
const ThresholdState current_state = g_versionbitscache.State(blockindex->pprev, consensusParams, id);
1102+
const ThresholdState next_state = chainman.m_versionbitscache.State(blockindex, chainman.GetConsensus(), id);
1103+
const ThresholdState current_state = chainman.m_versionbitscache.State(blockindex->pprev, chainman.GetConsensus(), id);
11041104

11051105
const bool has_signal = (ThresholdState::STARTED == current_state || ThresholdState::LOCKED_IN == current_state);
11061106

11071107
// BIP9 parameters
11081108
if (has_signal) {
1109-
bip9.pushKV("bit", consensusParams.vDeployments[id].bit);
1109+
bip9.pushKV("bit", chainman.GetConsensus().vDeployments[id].bit);
11101110
}
1111-
bip9.pushKV("start_time", consensusParams.vDeployments[id].nStartTime);
1112-
bip9.pushKV("timeout", consensusParams.vDeployments[id].nTimeout);
1113-
bip9.pushKV("min_activation_height", consensusParams.vDeployments[id].min_activation_height);
1111+
bip9.pushKV("start_time", chainman.GetConsensus().vDeployments[id].nStartTime);
1112+
bip9.pushKV("timeout", chainman.GetConsensus().vDeployments[id].nTimeout);
1113+
bip9.pushKV("min_activation_height", chainman.GetConsensus().vDeployments[id].min_activation_height);
11141114

11151115
// BIP9 status
11161116
bip9.pushKV("status", get_state_name(current_state));
1117-
bip9.pushKV("since", g_versionbitscache.StateSinceHeight(blockindex->pprev, consensusParams, id));
1117+
bip9.pushKV("since", chainman.m_versionbitscache.StateSinceHeight(blockindex->pprev, chainman.GetConsensus(), id));
11181118
bip9.pushKV("status_next", get_state_name(next_state));
11191119

11201120
// BIP9 signalling status, if applicable
11211121
if (has_signal) {
11221122
UniValue statsUV(UniValue::VOBJ);
11231123
std::vector<bool> signals;
1124-
BIP9Stats statsStruct = g_versionbitscache.Statistics(blockindex, consensusParams, id, &signals);
1124+
BIP9Stats statsStruct = chainman.m_versionbitscache.Statistics(blockindex, chainman.GetConsensus(), id, &signals);
11251125
statsUV.pushKV("period", statsStruct.period);
11261126
statsUV.pushKV("elapsed", statsStruct.elapsed);
11271127
statsUV.pushKV("count", statsStruct.count);
@@ -1142,7 +1142,7 @@ static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softfo
11421142
UniValue rv(UniValue::VOBJ);
11431143
rv.pushKV("type", "bip9");
11441144
if (ThresholdState::ACTIVE == next_state) {
1145-
rv.pushKV("height", g_versionbitscache.StateSinceHeight(blockindex, consensusParams, id));
1145+
rv.pushKV("height", chainman.m_versionbitscache.StateSinceHeight(blockindex, chainman.GetConsensus(), id));
11461146
}
11471147
rv.pushKV("active", ThresholdState::ACTIVE == next_state);
11481148
rv.pushKV("bip9", bip9);
@@ -1152,7 +1152,7 @@ static void SoftForkDescPushBack(const CBlockIndex* blockindex, UniValue& softfo
11521152

11531153
namespace {
11541154
/* TODO: when -deprecatedrpc=softforks is removed, drop these */
1155-
UniValue DeploymentInfo(const CBlockIndex* tip, const Consensus::Params& consensusParams);
1155+
UniValue DeploymentInfo(const CBlockIndex* tip, const ChainstateManager& chainman);
11561156
extern const std::vector<RPCResult> RPCHelpForDeployment;
11571157
}
11581158

@@ -1227,8 +1227,7 @@ RPCHelpMan getblockchaininfo()
12271227
}
12281228

12291229
if (IsDeprecatedRPCEnabled("softforks")) {
1230-
const Consensus::Params& consensusParams = Params().GetConsensus();
1231-
obj.pushKV("softforks", DeploymentInfo(&tip, consensusParams));
1230+
obj.pushKV("softforks", DeploymentInfo(&tip, chainman));
12321231
}
12331232

12341233
obj.pushKV("warnings", GetWarnings(false).original);
@@ -1263,16 +1262,16 @@ const std::vector<RPCResult> RPCHelpForDeployment{
12631262
}},
12641263
};
12651264

1266-
UniValue DeploymentInfo(const CBlockIndex* blockindex, const Consensus::Params& consensusParams)
1265+
UniValue DeploymentInfo(const CBlockIndex* blockindex, const ChainstateManager& chainman)
12671266
{
12681267
UniValue softforks(UniValue::VOBJ);
1269-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_HEIGHTINCB);
1270-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_DERSIG);
1271-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_CLTV);
1272-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_CSV);
1273-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_SEGWIT);
1274-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_TESTDUMMY);
1275-
SoftForkDescPushBack(blockindex, softforks, consensusParams, Consensus::DEPLOYMENT_TAPROOT);
1268+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_HEIGHTINCB);
1269+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_DERSIG);
1270+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_CLTV);
1271+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_CSV);
1272+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_SEGWIT);
1273+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TESTDUMMY);
1274+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TAPROOT);
12761275
return softforks;
12771276
}
12781277
} // anon namespace
@@ -1311,12 +1310,10 @@ static RPCHelpMan getdeploymentinfo()
13111310
}
13121311
}
13131312

1314-
const Consensus::Params& consensusParams = Params().GetConsensus();
1315-
13161313
UniValue deploymentinfo(UniValue::VOBJ);
13171314
deploymentinfo.pushKV("hash", blockindex->GetBlockHash().ToString());
13181315
deploymentinfo.pushKV("height", blockindex->nHeight);
1319-
deploymentinfo.pushKV("deployments", DeploymentInfo(blockindex, consensusParams));
1316+
deploymentinfo.pushKV("deployments", DeploymentInfo(blockindex, chainman));
13201317
return deploymentinfo;
13211318
},
13221319
};

0 commit comments

Comments
 (0)