@@ -135,4 +135,51 @@ BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
135
135
}
136
136
}
137
137
138
+ void sanity_check_chainparams (std::string chainName)
139
+ {
140
+ const auto chainParams = CreateChainParams (chainName);
141
+ const auto consensus = chainParams->GetConsensus ();
142
+
143
+ // hash genesis is correct
144
+ BOOST_CHECK_EQUAL (consensus.hashGenesisBlock , chainParams->GenesisBlock ().GetHash ());
145
+
146
+ // target timespan is an even multiple of spacing
147
+ BOOST_CHECK_EQUAL (consensus.nPowTargetTimespan % consensus.nPowTargetSpacing , 0 );
148
+
149
+ // genesis nBits is positive, doesn't overflow and is lower than powLimit
150
+ arith_uint256 pow_compact;
151
+ bool neg, over;
152
+ pow_compact.SetCompact (chainParams->GenesisBlock ().nBits , &neg, &over);
153
+ BOOST_CHECK (!neg && pow_compact != 0 );
154
+ BOOST_CHECK (!over);
155
+ BOOST_CHECK (UintToArith256 (consensus.powLimit ) >= pow_compact);
156
+
157
+ // check max target * 4*nPowTargetTimespan doesn't overflow -- see pow.cpp:CalculateNextWorkRequired()
158
+ if (!consensus.fPowNoRetargeting ) {
159
+ arith_uint256 targ_max (" 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" );
160
+ targ_max /= consensus.nPowTargetTimespan *4 ;
161
+ BOOST_CHECK (UintToArith256 (consensus.powLimit ) < targ_max);
162
+ }
163
+ }
164
+
165
+ BOOST_AUTO_TEST_CASE (ChainParams_MAIN_sanity)
166
+ {
167
+ sanity_check_chainparams (CBaseChainParams::MAIN);
168
+ }
169
+
170
+ BOOST_AUTO_TEST_CASE (ChainParams_REGTEST_sanity)
171
+ {
172
+ sanity_check_chainparams (CBaseChainParams::REGTEST);
173
+ }
174
+
175
+ BOOST_AUTO_TEST_CASE (ChainParams_TESTNET_sanity)
176
+ {
177
+ sanity_check_chainparams (CBaseChainParams::TESTNET);
178
+ }
179
+
180
+ BOOST_AUTO_TEST_CASE (ChainParams_SIGNET_sanity)
181
+ {
182
+ sanity_check_chainparams (CBaseChainParams::SIGNET);
183
+ }
184
+
138
185
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments