@@ -395,6 +395,80 @@ void CRegTestParams::UpdateVersionBitsParametersFromArgs(const ArgsManager& args
395395 }
396396}
397397
398+ /* *
399+ * Custom params for testing.
400+ */
401+ class CCustomParams : public CRegTestParams {
402+
403+ void UpdateFromArgs (ArgsManager& args)
404+ {
405+ UpdateVersionBitsParametersFromArgs (args);
406+
407+ consensus.nSubsidyHalvingInterval = args.GetArg (" -con_nsubsidyhalvinginterval" , consensus.nSubsidyHalvingInterval );
408+ consensus.BIP16Exception = uint256S (args.GetArg (" -con_bip16exception" , " 0x0" ));
409+ consensus.BIP34Height = args.GetArg (" -con_bip34height" , consensus.BIP34Height );
410+ consensus.BIP34Hash = uint256S (args.GetArg (" -con_bip34hash" , " 0x0" ));
411+ consensus.BIP65Height = args.GetArg (" -con_bip65height" , consensus.BIP65Height );
412+ consensus.BIP66Height = args.GetArg (" -con_bip66height" , consensus.BIP66Height );
413+ consensus.powLimit = uint256S (args.GetArg (" -con_powlimit" , " 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ));
414+ consensus.nPowTargetTimespan = args.GetArg (" -con_npowtargettimespan" , consensus.nPowTargetTimespan );
415+ consensus.nPowTargetSpacing = args.GetArg (" -con_npowtargetspacing" , consensus.nPowTargetSpacing );
416+ consensus.fPowAllowMinDifficultyBlocks = args.GetBoolArg (" -con_fpowallowmindifficultyblocks" , consensus.fPowAllowMinDifficultyBlocks );
417+ consensus.fPowNoRetargeting = args.GetBoolArg (" -con_fpownoretargeting" , consensus.fPowNoRetargeting );
418+ consensus.nRuleChangeActivationThreshold = args.GetArg (" -con_nrulechangeactivationthreshold" , consensus.nRuleChangeActivationThreshold );
419+ consensus.nMinerConfirmationWindow = args.GetArg (" -con_nminerconfirmationwindow" , consensus.nMinerConfirmationWindow );
420+
421+ consensus.nMinimumChainWork = uint256S (args.GetArg (" -con_nminimumchainwork" , " 0x0" ));
422+ consensus.defaultAssumeValid = uint256S (args.GetArg (" -con_defaultassumevalid" , " 0x00" ));
423+
424+ nPruneAfterHeight = args.GetArg (" -npruneafterheight" , nPruneAfterHeight);
425+ fDefaultConsistencyChecks = args.GetBoolArg (" -fdefaultconsistencychecks" , fDefaultConsistencyChecks );
426+ fMineBlocksOnDemand = args.GetBoolArg (" -fmineblocksondemand" , fMineBlocksOnDemand );
427+ m_fallback_fee_enabled = args.GetBoolArg (" -fallback_fee_enabled" , m_fallback_fee_enabled);
428+
429+ bech32_hrp = args.GetArg (" -bech32_hrp" , bech32_hrp);
430+ base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char >(1 , args.GetArg (" -pubkeyprefix" , 111 ));
431+ base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char >(1 , args.GetArg (" -scriptprefix" , 196 ));
432+ base58Prefixes[SECRET_KEY] = std::vector<unsigned char >(1 , args.GetArg (" -secretprefix" , 239 ));
433+
434+ std::string extpubprefix = args.GetArg (" -extpubkeyprefix" , " 043587CF" );
435+ if (!IsHex (extpubprefix) || extpubprefix.size () != 8 ) {
436+ assert (" -extpubkeyprefix must be hex string of length 8" && false );
437+ }
438+ base58Prefixes[EXT_PUBLIC_KEY] = ParseHex (extpubprefix);
439+
440+ std::string extprvprefix = args.GetArg (" -extprvkeyprefix" , " 04358394" );
441+ if (!IsHex (extprvprefix) || extprvprefix.size () != 8 ) {
442+ assert (" -extprvkeyprefix must be hex string of length 8" && false );
443+ }
444+ base58Prefixes[EXT_SECRET_KEY] = ParseHex (extprvprefix);
445+
446+ const std::string magic_str = args.GetArg (" -pchmessagestart" , " FABFB5DA" );
447+ if (!IsHex (magic_str) || magic_str.size () != 8 ) {
448+ assert (" -pchmessagestart must be hex string of length 8" && false );
449+ }
450+ const std::vector<unsigned char > magic_byte = ParseHex (magic_str);
451+ std::copy (begin (magic_byte), end (magic_byte), pchMessageStart);
452+
453+ vSeeds.clear ();
454+ if (gArgs .IsArgSet (" -seednode" )) {
455+ const auto seednodes = gArgs .GetArgs (" -seednode" );
456+ if (seednodes.size () != 1 || seednodes[0 ] != " 0" ) {
457+ vSeeds = seednodes;
458+ }
459+ }
460+ }
461+
462+ public:
463+ CCustomParams (const std::string& chain, ArgsManager& args) : CRegTestParams(args)
464+ {
465+ strNetworkID = chain;
466+ UpdateFromArgs (args);
467+ genesis = CreateGenesisBlock (strNetworkID.c_str (), CScript (OP_TRUE), 1296688602 , 2 , 0x207fffff , 1 , 50 * COIN);
468+ consensus.hashGenesisBlock = genesis.GetHash ();
469+ }
470+ };
471+
398472static std::unique_ptr<const CChainParams> globalChainParams;
399473
400474const CChainParams &Params () {
@@ -404,13 +478,15 @@ const CChainParams &Params() {
404478
405479std::unique_ptr<const CChainParams> CreateChainParams (const std::string& chain)
406480{
481+ // Reserved names for non-custom chains
407482 if (chain == CBaseChainParams::MAIN)
408483 return std::unique_ptr<CChainParams>(new CMainParams ());
409484 else if (chain == CBaseChainParams::TESTNET)
410485 return std::unique_ptr<CChainParams>(new CTestNetParams ());
411486 else if (chain == CBaseChainParams::REGTEST)
412487 return std::unique_ptr<CChainParams>(new CRegTestParams (gArgs ));
413- throw std::runtime_error (strprintf (" %s: Unknown chain %s." , __func__, chain));
488+
489+ return std::unique_ptr<CChainParams>(new CCustomParams (chain, gArgs ));
414490}
415491
416492void SelectParams (const std::string& network)
0 commit comments