LCOV - code coverage report
Current view: top level - src - chainparams.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 339 340 99.7 %
Date: 2026-10-19 02:26:17 Functions: 13 13 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2010 Satoshi Nakamoto
       2             : // Copyright (c) 2009-2015 The Bitcoin developers
       3             : // Copyright (c) 2014-2015 The Dash developers
       4             : // Copyright (c) 2015-2022 The PIVX Core developers
       5             : // Distributed under the MIT software license, see the accompanying
       6             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       7             : 
       8             : #include "chainparams.h"
       9             : 
      10             : #include "chainparamsseeds.h"
      11             : #include "consensus/merkle.h"
      12             : #include "tinyformat.h"
      13             : #include "utilstrencodings.h"
      14             : 
      15             : #include <assert.h>
      16             : 
      17        1017 : static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
      18             : {
      19        1017 :     CMutableTransaction txNew;
      20        1017 :     txNew.nVersion = 1;
      21        1017 :     txNew.vin.resize(1);
      22        1017 :     txNew.vout.resize(1);
      23        2034 :     txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
      24        1017 :     txNew.vout[0].nValue = genesisReward;
      25        1017 :     txNew.vout[0].scriptPubKey = genesisOutputScript;
      26             : 
      27        1017 :     CBlock genesis;
      28        2034 :     genesis.vtx.push_back(std::make_shared<const CTransaction>(std::move(txNew)));
      29        1017 :     genesis.hashPrevBlock.SetNull();
      30        1017 :     genesis.nVersion = nVersion;
      31        1017 :     genesis.nTime    = nTime;
      32        1017 :     genesis.nBits    = nBits;
      33        1017 :     genesis.nNonce   = nNonce;
      34        1017 :     genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
      35        1017 :     return genesis;
      36             : }
      37             : 
      38         434 : void CChainParams::UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
      39             : {
      40         434 :     assert(IsRegTestNet()); // only available for regtest
      41         434 :     assert(idx > Consensus::BASE_NETWORK && idx < Consensus::MAX_NETWORK_UPGRADES);
      42         434 :     consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
      43         434 : }
      44             : 
      45             : /**
      46             :  * Build the genesis block. Note that the output of the genesis coinbase cannot
      47             :  * be spent as it did not originally exist in the database.
      48             :  *
      49             :  * CBlock(hash=00000ffd590b14, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=e0028e, nTime=1390095618, nBits=1e0ffff0, nNonce=28917698, vtx=1)
      50             :  *   CTransaction(hash=e0028e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
      51             :  *     CTxIn(COutPoint(000000, -1), coinbase 04ffff001d01044c5957697265642030392f4a616e2f3230313420546865204772616e64204578706572696d656e7420476f6573204c6976653a204f76657273746f636b2e636f6d204973204e6f7720416363657074696e6720426974636f696e73)
      52             :  *     CTxOut(nValue=50.00000000, scriptPubKey=0xA9037BAC7050C479B121CF)
      53             :  *   vMerkleTree: e0028e
      54             :  */
      55        1017 : static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
      56             : {
      57        1017 :     const char* pszTimestamp = "U.S. News & World Report Jan 28 2016 With His Absence, Trump Dominates Another Debate";
      58        2034 :     const CScript genesisOutputScript = CScript() << ParseHex("04c10e83b2703ccf322f7dbd62dd5855ac7c10bd055814ce121ba32607d573b8810c02c0582aed05b4deb9c4b77b26d92428c61256cd42774babea0a073b2ed0c9") << OP_CHECKSIG;
      59        2034 :     return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
      60             : }
      61             : 
      62             : // this one is for testing only
      63             : static Consensus::LLMQParams llmq_test = {
      64             :         .type = Consensus::LLMQ_TEST,
      65             :         .name = "llmq_test",
      66             :         .size = 3,
      67             :         .minSize = 2,
      68             :         .threshold = 2,
      69             : 
      70             :         .dkgInterval = 20, // one every 20 minutes
      71             :         .dkgPhaseBlocks = 2,
      72             :         .dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
      73             :         .dkgMiningWindowEnd = 15,
      74             :         .dkgBadVotesThreshold = 2,
      75             : 
      76             :         .signingActiveQuorumCount = 2, // just a few ones to allow easier testing
      77             : 
      78             :         .keepOldConnections = 3,
      79             :         .recoveryMembers = 3,
      80             : 
      81             :         .cacheDkgInterval = 60,
      82             : };
      83             : 
      84             : // Small quorum for networks with a masternode count in the tens. Sized well below
      85             : // the fleet so that membership actually rotates between DKGs instead of every
      86             : // masternode landing in every quorum.
      87             : static Consensus::LLMQParams llmq20_60 = {
      88             :         .type = Consensus::LLMQ_20_60,
      89             :         .name = "llmq_20_60",
      90             :         .size = 20,
      91             :         .minSize = 16,
      92             :         .threshold = 12,
      93             : 
      94             :         .dkgInterval = 60, // one DKG per hour
      95             :         .dkgPhaseBlocks = 6,
      96             :         .dkgMiningWindowStart = 30, // dkgPhaseBlocks * 5 = after finalization
      97             :         .dkgMiningWindowEnd = 40,
      98             :         .dkgBadVotesThreshold = 16,
      99             : 
     100             :         .signingActiveQuorumCount = 24, // a full day worth of LLMQs
     101             : 
     102             :         .keepOldConnections = 25,
     103             :         .recoveryMembers = 10,
     104             : 
     105             :         .cacheDkgInterval = 600,
     106             : };
     107             : 
     108             : static Consensus::LLMQParams llmq50_60 = {
     109             :         .type = Consensus::LLMQ_50_60,
     110             :         .name = "llmq_50_60",
     111             :         .size = 50,
     112             :         .minSize = 40,
     113             :         .threshold = 30,
     114             : 
     115             :         .dkgInterval = 60, // one DKG per hour
     116             :         .dkgPhaseBlocks = 6,
     117             :         .dkgMiningWindowStart = 30, // dkgPhaseBlocks * 5 = after finalization
     118             :         .dkgMiningWindowEnd = 40,
     119             :         .dkgBadVotesThreshold = 40,
     120             : 
     121             :         .signingActiveQuorumCount = 24, // a full day worth of LLMQs
     122             : 
     123             :         .keepOldConnections = 25,
     124             :         .recoveryMembers = 25,
     125             : 
     126             :         .cacheDkgInterval = 600,
     127             : };
     128             : 
     129             : static Consensus::LLMQParams llmq400_60 = {
     130             :         .type = Consensus::LLMQ_400_60,
     131             :         .name = "llmq_400_60",
     132             :         .size = 400,
     133             :         .minSize = 300,
     134             :         .threshold = 240,
     135             : 
     136             :         .dkgInterval = 60 * 12, // one DKG every 12 hours
     137             :         .dkgPhaseBlocks = 10,
     138             :         .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
     139             :         .dkgMiningWindowEnd = 70,
     140             :         .dkgBadVotesThreshold = 300,
     141             : 
     142             :         .signingActiveQuorumCount = 4, // two days worth of LLMQs
     143             : 
     144             :         .keepOldConnections = 5,
     145             :         .recoveryMembers = 100,
     146             : 
     147             :         .cacheDkgInterval = 60 * 12 * 10, // dkgInterval * 10
     148             : };
     149             : 
     150             : // Used for deployment and min-proto-version signaling, so it needs a higher threshold
     151             : static Consensus::LLMQParams llmq400_85 = {
     152             :         .type = Consensus::LLMQ_400_85,
     153             :         .name = "llmq_400_85",
     154             :         .size = 400,
     155             :         .minSize = 350,
     156             :         .threshold = 340,
     157             : 
     158             :         .dkgInterval = 60 * 24, // one DKG every 24 hours
     159             :         .dkgPhaseBlocks = 10,
     160             :         .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
     161             :         .dkgMiningWindowEnd = 70, // give it a larger mining window to make sure it is mined
     162             :         .dkgBadVotesThreshold = 300,
     163             : 
     164             :         .signingActiveQuorumCount = 4, // four days worth of LLMQs
     165             : 
     166             :         .keepOldConnections = 5,
     167             :         .recoveryMembers = 100,
     168             : 
     169             :         .cacheDkgInterval = 60 * 24 * 10, // dkgInterval * 10
     170             : };
     171             : 
     172             : /**
     173             :  * Main network
     174             :  */
     175             : /**
     176             :  * What makes a good checkpoint block?
     177             :  * + Is surrounded by blocks with reasonable timestamps
     178             :  *   (no blocks before with a timestamp after, none after with
     179             :  *    timestamp before)
     180             :  * + Contains no strange transactions
     181             :  */
     182             : static MapCheckpoints mapCheckpoints = {
     183             :     { 259201, uint256S("1c9121bf9329a6234bfd1ea2d91515f19cd96990725265253f4b164283ade5dd")},
     184             :     { 424998, uint256S("f31e381eedb0ed3ed65fcc98cc71f36012bee32e8efd017c4f9fb0620fd35f6b")},
     185             :     { 616764, uint256S("29dd0bd1c59484f290896687b4ffb6a49afa5c498caf61967c69a541f8191557")}, //!< First block to use new modifierV1
     186             :     { 623933, uint256S("c7aafa648a0f1450157dc93bd4d7448913a85b7448f803b4ab970d91fc2a7da7")},
     187             :     { 791150, uint256S("8e76f462e4e82d1bd21cb72e1ce1567d4ddda2390f26074ffd1f5d9c270e5e50")},
     188             :     { 795000, uint256S("4423cceeb9fd574137a18733416275a70fdf95283cc79ad976ca399aa424a443")},
     189             :     { 863787, uint256S("5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64")},
     190             :     { 863795, uint256S("2ad866818c4866e0d555181daccc628056216c0db431f88a825e84ed4f469067")},
     191             :     { 863805, uint256S("a755bd9a22b63c70d3db474f4b2b61a1f86c835b290a081bb3ec1ba2103eb4cb")},
     192             :     { 867733, uint256S("03b26296bf693de5782c76843d2fb649cb66d4b05550c6a79c047ff7e1c3ae15")},
     193             :     { 879650, uint256S("227e1d2b738b6cd83c46d1d64617934ec899d77cee34336a56e61b71acd10bb2")},
     194             :     { 895400, uint256S("7796a0274a608fac12d400198174e50beda992c1d522e52e5b95b884bc1beac6")}, //!< Block that serial# range is enforced
     195             :     { 895991, uint256S("d53013ed7ea5c325b9696c95e07667d6858f8ff7ee13fecfa90827bf3c9ae316")}, //!< Network split here
     196             :     { 908000, uint256S("202708f8c289b676fceb832a079ff6b308a28608339acbf7584de533619d014d")},
     197             :     {1142400, uint256S("98aff9d605bf123247f98b1e3a02567eb5799d208d78ec30fb89737b1c1f79c5")},
     198             :     {1679090, uint256S("f747ce055ba1b12e1f2e842bd480bc647210799359cb2e553ab292065e3419d6")}, //!< First block with a "wrapped" serial spend
     199             :     {1686229, uint256S("bb42bf1e886a7c23474634c90893dd3d68a6ccbfea4ac92a98da5cad0c6a6cb7")}, //!< Last block in the "wrapped" serial attack range
     200             :     {1778954, uint256S("0d3241268264a2908d6babf00d9cd1ffb83d93d7bb4e428820127fe227c2029c")}, //!< Network split here
     201             :     {1788528, uint256S("ea9243ff8fc079fdd7a04f11fac415de4d98e1bb0dc38db6f79f8f8bbfdbe496")}, //!< Network split here
     202             :     {2153200, uint256S("14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5")}, //!< First v7 block
     203             :     {2356049, uint256S("62e80d8e193bca84655fb78893b20f54a79f2d71124c4ea37b7ef51a0d5451c4")}, //!< Network split here
     204             :     {2365700, uint256S("b5d0beead57735539abc2db2b0b08cd65db3e5928efd3c3bf3182d5bf013f36c")}, //!< PIVX v4.1.1 enforced
     205             :     {2678402, uint256S("580a26ff0a45177a7a6f387f009c5b26140ea48b4790a857d9a796f8b3c25899")}, //!< Network split here
     206             :     {3014000, uint256S("78ad99b7225f73c42238bd7ca841ff700542b92bba75a0ef2ed351caa560f87f")}, //!< PIVX v5.3.0 enforced
     207             :     {3024000, uint256S("be4bc75afcfb9136924810f7483b2695089a366cc4ee27fd6dc3ecd5396e1f0f")}, //!< Superblock
     208             :     {3715200, uint256S("a676b9a598c393c82b949c37dd35013aeda55f5d18ab062349db6a8235972aaa")}, //!< Superblock for 5.5.0 mainnet rewards changeover
     209             : };
     210             : 
     211             : static const CCheckpointData data = {
     212             :     &mapCheckpoints,
     213             :     1591401645, // * UNIX timestamp of last checkpoint block
     214             :     5607713,    // * total number of transactions between genesis and last checkpoint
     215             :                 //   (the tx=... number in the UpdateTip debug.log lines)
     216             :     3000        // * estimated number of transactions per day after checkpoint
     217             : };
     218             : 
     219             : static MapCheckpoints mapCheckpointsTestnet = {
     220             :     {0, uint256S("0x00000f254358fe046377c224341c794b7faf942a6311a7ece773d3c378239c54")},
     221             : };
     222             : 
     223             : static const CCheckpointData dataTestnet = {
     224             :     &mapCheckpointsTestnet,
     225             :     1777507200, // * UNIX timestamp of testnet6 genesis block (April 30, 2026)
     226             :     0,          // * total number of transactions between genesis and last checkpoint (fresh start)
     227             :     250};       // * estimated number of transactions per day after checkpoint
     228             : 
     229             : static MapCheckpoints mapCheckpointsRegtest = {{0, uint256S("0x001")}};
     230             : static const CCheckpointData dataRegtest = {
     231             :     &mapCheckpointsRegtest,
     232             :     1454124731,
     233             :     0,
     234             :     100};
     235             : 
     236             : class CMainParams : public CChainParams
     237             : {
     238             : public:
     239         532 :     CMainParams()
     240         532 :     {
     241         532 :         strNetworkID = "main";
     242             : 
     243         532 :         genesis = CreateGenesisBlock(1454124731, 2402015, 0x1e0ffff0, 1, 250 * COIN);
     244         532 :         consensus.hashGenesisBlock = genesis.GetHash();
     245        1064 :         assert(consensus.hashGenesisBlock == uint256S("0x0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818"));
     246        1064 :         assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
     247             : 
     248         532 :         consensus.fPowAllowMinDifficultyBlocks = false;
     249         532 :         consensus.fPowNoRetargeting = false;
     250         532 :         consensus.powLimit   = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     251         532 :         consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     252         532 :         consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     253         532 :         consensus.nBudgetCycleBlocks = 43200;       // approx. 1 every 30 days
     254         532 :         consensus.nBudgetFeeConfirmations = 6;      // Number of confirmations for the finalization fee
     255         532 :         consensus.nCoinbaseMaturity = 100;
     256         532 :         consensus.nFutureTimeDriftPoW = 7200;
     257         532 :         consensus.nFutureTimeDriftPoS = 180;
     258         532 :         consensus.nMaxMoneyOut = 21000000 * COIN;
     259         532 :         consensus.nMNCollateralAmt = 10000 * COIN;
     260         532 :         consensus.nMNBlockReward = 3 * COIN;
     261         532 :         consensus.nNewMNBlockReward = 6 * COIN;
     262         532 :         consensus.nMNCollateralMinConf = 15;
     263         532 :         consensus.nProposalEstablishmentTime = 60 * 60 * 24;    // must be at least a day old to make it into a budget
     264         532 :         consensus.nStakeMinAge = 60 * 60;
     265         532 :         consensus.nStakeMinDepth = 600;
     266         532 :         consensus.nTargetTimespan = 40 * 60;
     267         532 :         consensus.nTargetTimespanV2 = 30 * 60;
     268         532 :         consensus.nTargetSpacing = 1 * 60;
     269         532 :         consensus.nTimeSlotLength = 15;
     270         532 :         consensus.nMaxProposalPayments = 6;
     271             : 
     272             :         // spork keys
     273         532 :         consensus.strSporkPubKey = "0410050aa740d280b134b40b40658781fc1116ba7700764e0ce27af3e1737586b3257d19232e0cb5084947f5107e44bcd577f126c9eb4a30ea2807b271d2145298";
     274         532 :         consensus.strSporkPubKeyOld = "040F129DE6546FE405995329A887329BED4321325B1A73B0A257423C05C1FCFE9E40EF0678AEF59036A22C42E61DFD29DF7EFB09F56CC73CADF64E05741880E3E7";
     275         532 :         consensus.nTime_EnforceNewSporkKey = 1608512400;    //!> December 21, 2020 01:00:00 AM GMT
     276         532 :         consensus.nTime_RejectOldSporkKey = 1614560400;     //!> March 1, 2021 01:00:00 AM GMT
     277             : 
     278             :         // height-based activations
     279         532 :         consensus.height_last_invalid_UTXO = 894538;
     280         532 :         consensus.height_last_ZC_AccumCheckpoint = 1686240;
     281         532 :         consensus.height_last_ZC_WrappedSerials = 1686229;
     282             : 
     283             :         // validation by-pass
     284         532 :         consensus.nPivxBadBlockTime = 1471401614;    // Skip nBit validation of Block 259201 per PR #915
     285         532 :         consensus.nPivxBadBlockBits = 0x1c056dac;    // Skip nBit validation of Block 259201 per PR #915
     286             : 
     287             :         // Zerocoin-related params
     288         532 :         consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
     289             :                 "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
     290             :                 "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
     291             :                 "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
     292             :                 "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
     293         532 :                 "31438167899885040445364023527381951378636564391212010397122822120720357";
     294         532 :         consensus.ZC_MaxPublicSpendsPerTx = 637;    // Assume about 220 bytes each input
     295         532 :         consensus.ZC_MaxSpendsPerTx = 7;            // Assume about 20kb each input
     296         532 :         consensus.ZC_MinMintConfirmations = 20;
     297         532 :         consensus.ZC_MinMintFee = 1 * CENT;
     298         532 :         consensus.ZC_MinStakeDepth = 200;
     299         532 :         consensus.ZC_TimeStart = 1508214600;        // October 17, 2017 4:30:00 AM
     300         532 :         consensus.ZC_HeightStart = 863735;
     301             : 
     302             :         // Network upgrades
     303         532 :         consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
     304             :                 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
     305         532 :         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
     306             :                 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
     307         532 :         consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight           = 259201;
     308         532 :         consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight        = 615800;
     309         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight            = 863787;
     310         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight         = 1153160;
     311         532 :         consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight         = 1808634;
     312         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight     = 1880000;
     313         532 :         consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight          = 1967000;
     314         532 :         consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight          = 2153200;
     315         532 :         consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight          = 2700500;
     316         532 :         consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight          = 2927000;
     317         532 :         consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight          = 3014000;
     318         532 :         consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight          = 3715200;
     319         532 :         consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight          = 4281680;  // Estimate Feb 29th 12:00 UTC
     320         532 :         consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight =
     321             :                 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
     322             : 
     323         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC].hashActivationBlock =
     324         532 :                 uint256S("0x5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64");
     325         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].hashActivationBlock =
     326         532 :                 uint256S("0x37ea75fe1c9314171cff429a91b25b9f11331076d1c9de50ee4054d61877f8af");
     327         532 :         consensus.vUpgrades[Consensus::UPGRADE_BIP65].hashActivationBlock =
     328         532 :                 uint256S("0x82629b7a9978f5c7ea3f70a12db92633a7d2e436711500db28b97efd48b1e527");
     329         532 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].hashActivationBlock =
     330         532 :                 uint256S("0xe2448b76d88d37aba4194ffed1041b680d779919157ddf5cbf423373d7f8078e");
     331         532 :         consensus.vUpgrades[Consensus::UPGRADE_V3_4].hashActivationBlock =
     332         532 :                 uint256S("0x0ef2556e40f3b9f6e02ce611b832e0bbfe7734a8ea751c7b555310ee49b61456");
     333         532 :         consensus.vUpgrades[Consensus::UPGRADE_V4_0].hashActivationBlock =
     334         532 :                 uint256S("0x14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5");
     335             : 
     336             :         /**
     337             :          * The message start string is designed to be unlikely to occur in normal data.
     338             :          * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
     339             :          * a large 4-byte int at any alignment.
     340             :          */
     341         532 :         pchMessageStart[0] = 0x90;
     342         532 :         pchMessageStart[1] = 0xc4;
     343         532 :         pchMessageStart[2] = 0xfd;
     344         532 :         pchMessageStart[3] = 0xe9;
     345         532 :         nDefaultPort = 51472;
     346             : 
     347             :         // Note that of those with the service bits flag, most only support a subset of possible options
     348         532 :         vSeeds.emplace_back("pivx.seed.fuzzbawls.pw", true);     // Primary DNS Seeder from Fuzzbawls
     349         532 :         vSeeds.emplace_back("pivx.seed2.fuzzbawls.pw", true);    // Secondary DNS Seeder from Fuzzbawls
     350         532 :         vSeeds.emplace_back("dnsseed.liquid369.wtf", true);     // Primary DNS Seeder from Liquid369
     351             : 
     352         532 :         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 30);
     353         532 :         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 13);
     354         532 :         base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 63);     // starting with 'S'
     355         532 :         base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xa2};   // starts with EXM
     356         532 :         base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 212);
     357         532 :         base58Prefixes[EXT_PUBLIC_KEY] = {0x02, 0x2D, 0x25, 0x33};
     358         532 :         base58Prefixes[EXT_SECRET_KEY] = {0x02, 0x21, 0x31, 0x2B};
     359             :         // BIP44 coin type is from https://github.com/satoshilabs/slips/blob/master/slip-0044.md
     360         532 :         base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x77};
     361             : 
     362         532 :         vFixedSeeds = std::vector<uint8_t>(std::begin(chainparams_seed_main), std::end(chainparams_seed_main));
     363             : 
     364             :         // Reject non-standard transactions by default
     365         532 :         fRequireStandard = true;
     366             : 
     367             :         // Sapling
     368         532 :         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "ps";
     369         532 :         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "pviews";
     370         532 :         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivks";
     371         532 :         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "p-secret-spending-key-main";
     372         532 :         bech32HRPs[SAPLING_EXTENDED_FVK]         = "pxviews";
     373             : 
     374         532 :         bech32HRPs[BLS_SECRET_KEY]               = "bls-sk";
     375         532 :         bech32HRPs[BLS_PUBLIC_KEY]               = "bls-pk";
     376             : 
     377             :         // long living quorum params
     378         532 :         consensus.llmqs[Consensus::LLMQ_50_60] = llmq50_60;
     379         532 :         consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
     380         532 :         consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
     381             : 
     382         532 :         nLLMQConnectionRetryTimeout = 60;
     383             : 
     384         532 :         consensus.llmqTypeChainLocks = Consensus::LLMQ_400_60;
     385             : 
     386             :         // Tier two
     387         532 :         nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
     388         532 :     }
     389             : 
     390        2317 :     const CCheckpointData& Checkpoints() const
     391             :     {
     392        2317 :         return data;
     393             :     }
     394             : 
     395             : };
     396             : 
     397             : /**
     398             :  * Testnet (v6)
     399             :  */
     400             : class CTestNetParams : public CChainParams
     401             : {
     402             : public:
     403          52 :     CTestNetParams()
     404          52 :     {
     405          52 :         strNetworkID = "test";
     406             : 
     407             :         // Testnet6 genesis - April 30, 2026.
     408          52 :         genesis = CreateGenesisBlock(1777507200, 498658, 0x1e0ffff0, 1, 250 * COIN);
     409          52 :         consensus.hashGenesisBlock = genesis.GetHash();
     410         104 :         assert(consensus.hashGenesisBlock == uint256S("0x00000f254358fe046377c224341c794b7faf942a6311a7ece773d3c378239c54"));
     411         104 :         assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
     412             : 
     413          52 :         consensus.fPowAllowMinDifficultyBlocks = true;
     414          52 :         consensus.fPowNoRetargeting = false;
     415          52 :         consensus.powLimit   = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     416          52 :         consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     417          52 :         consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     418          52 :         consensus.nBudgetCycleBlocks = 144;         // approx 10 cycles per day
     419          52 :         consensus.nBudgetFeeConfirmations = 3;      // (only 8-blocks window for finalization on testnet)
     420          52 :         consensus.nCoinbaseMaturity = 15;
     421          52 :         consensus.nFutureTimeDriftPoW = 7200;
     422          52 :         consensus.nFutureTimeDriftPoS = 180;
     423          52 :         consensus.nMaxMoneyOut = 21000000 * COIN;
     424          52 :         consensus.nMNCollateralAmt = 10000 * COIN;
     425          52 :         consensus.nMNBlockReward = 3 * COIN;
     426          52 :         consensus.nNewMNBlockReward = 6 * COIN;
     427          52 :         consensus.nMNCollateralMinConf = 15;
     428          52 :         consensus.nProposalEstablishmentTime = 60 * 5;  // at least 5 min old to make it into a budget
     429          52 :         consensus.nStakeMinAge = 60 * 60;
     430          52 :         consensus.nStakeMinDepth = 100;
     431          52 :         consensus.nTargetTimespan = 40 * 60;
     432          52 :         consensus.nTargetTimespanV2 = 30 * 60;
     433          52 :         consensus.nTargetSpacing = 1 * 60;
     434          52 :         consensus.nTimeSlotLength = 15;
     435          52 :         consensus.nMaxProposalPayments = 20;
     436             : 
     437             :         // spork keys
     438          52 :         consensus.strSporkPubKey = "04b6f3a15c8c465ac1c799e04fe79e351db3c7815aa33d70656f0bc5e3688da22bc13886ead5d2ad2307a93590ee04ad176e95c336ab179a21faf064255d79cb39";
     439          52 :         consensus.strSporkPubKeyOld = "04E88BB455E2A04E65FCC41D88CD367E9CCE1F5A409BE94D8C2B4B35D223DED9C8E2F4E061349BA3A38839282508066B6DC4DB72DD432AC4067991E6BF20176127";
     440          52 :         consensus.nTime_EnforceNewSporkKey = 1608512400;    //!> December 21, 2020 01:00:00 AM GMT
     441          52 :         consensus.nTime_RejectOldSporkKey = 1614560400;     //!> March 1, 2021 01:00:00 AM GMT
     442             : 
     443             :         // height based activations
     444          52 :         consensus.height_last_invalid_UTXO = -1;
     445          52 :         consensus.height_last_ZC_AccumCheckpoint = -1;
     446          52 :         consensus.height_last_ZC_WrappedSerials = -1;
     447          52 :         consensus.ZC_HeightStart = 0;
     448             : 
     449             :         // Zerocoin-related params
     450          52 :         consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
     451             :                 "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
     452             :                 "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
     453             :                 "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
     454             :                 "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
     455          52 :                 "31438167899885040445364023527381951378636564391212010397122822120720357";
     456          52 :         consensus.ZC_MaxPublicSpendsPerTx = 637;    // Assume about 220 bytes each input
     457          52 :         consensus.ZC_MaxSpendsPerTx = 7;            // Assume about 20kb each input
     458          52 :         consensus.ZC_MinMintConfirmations = 20;
     459          52 :         consensus.ZC_MinMintFee = 1 * CENT;
     460          52 :         consensus.ZC_MinStakeDepth = 200;
     461          52 :         consensus.ZC_TimeStart = 1508214600;        // October 17, 2017 4:30:00 AM
     462             : 
     463             :         // Network upgrades
     464          52 :         consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
     465             :                 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
     466          52 :         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
     467             :                 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
     468          52 :         consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight           = 201;
     469          52 :         consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight        = 225;
     470          52 :         consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight            = 250;
     471          52 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight         = 275;
     472          52 :         consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight         = 300;
     473          52 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight     = 350;
     474          52 :         consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight          = 400;
     475          52 :         consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight          = 450;
     476          52 :         consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight          = 500;
     477          52 :         consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight          = 550;
     478          52 :         consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight          = 600;
     479          52 :         consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight          = 650;
     480          52 :         consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight          = 700;
     481          52 :         consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight = 5000;
     482             : 
     483             :         /**
     484             :          * The message start string is designed to be unlikely to occur in normal data.
     485             :          * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
     486             :          * a large 4-byte int at any alignment.
     487             :          */
     488          52 :         pchMessageStart[0] = 0xf6;
     489          52 :         pchMessageStart[1] = 0xe7;
     490          52 :         pchMessageStart[2] = 0xd6;
     491          52 :         pchMessageStart[3] = 0xcb;
     492          52 :         nDefaultPort = 51474;
     493             : 
     494             :         // nodes with support for servicebits filtering should be at the top
     495          52 :         vSeeds.emplace_back("pivx-testnet.seed.fuzzbawls.pw", true);
     496          52 :         vSeeds.emplace_back("pivx-testnet.seed2.fuzzbawls.pw", true);
     497             : 
     498          52 :         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
     499          52 :         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19);  // Testnet pivx script addresses start with '8' or '9'
     500          52 :         base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73);     // starting with 'W'
     501          52 :         base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1};   // EXT prefix for the address
     502          52 :         base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239);     // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
     503             :         // Testnet pivx BIP32 pubkeys start with 'DRKV'
     504          52 :         base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
     505             :         // Testnet pivx BIP32 prvkeys start with 'DRKP'
     506          52 :         base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
     507             :         // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
     508          52 :         base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
     509             : 
     510          52 :         vFixedSeeds.clear(); // Testnet6 - no fixed seeds yet
     511             : 
     512          52 :         fRequireStandard = false;
     513             : 
     514             :         // Sapling
     515          52 :         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "ptestsapling";
     516          52 :         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "pviewtestsapling";
     517          52 :         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
     518          52 :         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "p-secret-spending-key-test";
     519          52 :         bech32HRPs[SAPLING_EXTENDED_FVK]         = "pxviewtestsapling";
     520             : 
     521          52 :         bech32HRPs[BLS_SECRET_KEY]               = "bls-sk-test";
     522          52 :         bech32HRPs[BLS_PUBLIC_KEY]               = "bls-pk-test";
     523             : 
     524             :         // long living quorum params
     525          52 :         consensus.llmqs[Consensus::LLMQ_20_60] = llmq20_60;
     526          52 :         consensus.llmqs[Consensus::LLMQ_50_60] = llmq50_60;
     527          52 :         consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
     528          52 :         consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
     529             : 
     530          52 :         nLLMQConnectionRetryTimeout = 60;
     531             : 
     532          52 :         consensus.llmqTypeChainLocks = Consensus::LLMQ_20_60;
     533             : 
     534             :         // Tier two
     535          52 :         nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
     536          52 :     }
     537             : 
     538           4 :     const CCheckpointData& Checkpoints() const
     539             :     {
     540           4 :         return dataTestnet;
     541             :     }
     542             : };
     543             : 
     544             : /**
     545             :  * Regression test
     546             :  */
     547             : class CRegTestParams : public CChainParams
     548             : {
     549             : public:
     550         433 :     CRegTestParams()
     551         433 :     {
     552         433 :         strNetworkID = "regtest";
     553             : 
     554         433 :         genesis = CreateGenesisBlock(1454124731, 1, 0x207fffff, 1, 250 * COIN);
     555         433 :         consensus.hashGenesisBlock = genesis.GetHash();
     556         866 :         assert(consensus.hashGenesisBlock == uint256S("0x7445589c4c8e52b105247b13373e5ee325856aa05d53f429e59ea46b7149ae3f"));
     557         866 :         assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
     558             : 
     559         433 :         consensus.fPowAllowMinDifficultyBlocks = true;
     560         433 :         consensus.fPowNoRetargeting = true;
     561         433 :         consensus.powLimit   = uint256S("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     562         433 :         consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     563         433 :         consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
     564         433 :         consensus.nBudgetCycleBlocks = 144;         // approx 10 cycles per day
     565         433 :         consensus.nBudgetFeeConfirmations = 3;      // (only 8-blocks window for finalization on regtest)
     566         433 :         consensus.nCoinbaseMaturity = 100;
     567         433 :         consensus.nFutureTimeDriftPoW = 7200;
     568         433 :         consensus.nFutureTimeDriftPoS = 180;
     569         433 :         consensus.nMaxMoneyOut = 43199500 * COIN;
     570         433 :         consensus.nMNCollateralAmt = 100 * COIN;
     571         433 :         consensus.nMNBlockReward = 3 * COIN;
     572         433 :         consensus.nNewMNBlockReward = 6 * COIN;
     573         433 :         consensus.nMNCollateralMinConf = 1;
     574         433 :         consensus.nProposalEstablishmentTime = 60 * 5;  // at least 5 min old to make it into a budget
     575         433 :         consensus.nStakeMinAge = 0;
     576         433 :         consensus.nStakeMinDepth = 20;
     577         433 :         consensus.nTargetTimespan = 40 * 60;
     578         433 :         consensus.nTargetTimespanV2 = 30 * 60;
     579         433 :         consensus.nTargetSpacing = 1 * 60;
     580         433 :         consensus.nTimeSlotLength = 15;
     581         433 :         consensus.nMaxProposalPayments = 20;
     582             : 
     583             :         /* Spork Key for RegTest:
     584             :         WIF private key: 932HEevBSujW2ud7RfB1YF91AFygbBRQj3de3LyaCRqNzKKgWXi
     585             :         private key hex: bd4960dcbd9e7f2223f24e7164ecb6f1fe96fc3a416f5d3a830ba5720c84b8ca
     586             :         Address: yCvUVd72w7xpimf981m114FSFbmAmne7j9
     587             :         */
     588         433 :         consensus.strSporkPubKey = "043969b1b0e6f327de37f297a015d37e2235eaaeeb3933deecd8162c075cee0207b13537618bde640879606001a8136091c62ec272dd0133424a178704e6e75bb7";
     589         433 :         consensus.strSporkPubKeyOld = "";
     590         433 :         consensus.nTime_EnforceNewSporkKey = 0;
     591         433 :         consensus.nTime_RejectOldSporkKey = 0;
     592             : 
     593             :         // height based activations
     594         433 :         consensus.height_last_invalid_UTXO = -1;
     595         433 :         consensus.height_last_ZC_AccumCheckpoint = 310;     // no checkpoints on regtest
     596         433 :         consensus.height_last_ZC_WrappedSerials = -1;
     597             : 
     598             :         // Zerocoin-related params
     599         433 :         consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
     600             :                 "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
     601             :                 "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
     602             :                 "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
     603             :                 "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
     604         433 :                 "31438167899885040445364023527381951378636564391212010397122822120720357";
     605         433 :         consensus.ZC_MaxPublicSpendsPerTx = 637;    // Assume about 220 bytes each input
     606         433 :         consensus.ZC_MaxSpendsPerTx = 7;            // Assume about 20kb each input
     607         433 :         consensus.ZC_MinMintConfirmations = 10;
     608         433 :         consensus.ZC_MinMintFee = 1 * CENT;
     609         433 :         consensus.ZC_MinStakeDepth = 10;
     610         433 :         consensus.ZC_TimeStart = 0;                 // not implemented on regtest
     611         433 :         consensus.ZC_HeightStart = 0;
     612             : 
     613             :         // Network upgrades
     614         433 :         consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
     615             :                 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
     616         433 :         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
     617             :                 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
     618         433 :         consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight           = 251;
     619         433 :         consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight        = 251;
     620         433 :         consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight            = 300;
     621         433 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight         = 300;
     622         433 :         consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight         =
     623             :                 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
     624         433 :         consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight     = 400;
     625         433 :         consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight          = 251;
     626         433 :         consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight          =
     627             :                 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
     628         433 :         consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight          = 300;
     629         433 :         consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight          = 300;
     630         433 :         consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight          = 251;
     631         433 :         consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight          = 576;
     632         433 :         consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight          = 1000;
     633         433 :         consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight =
     634             :                 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
     635             : 
     636             :         /**
     637             :          * The message start string is designed to be unlikely to occur in normal data.
     638             :          * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
     639             :          * a large 4-byte int at any alignment.
     640             :          */
     641         433 :         pchMessageStart[0] = 0xa1;
     642         433 :         pchMessageStart[1] = 0xcf;
     643         433 :         pchMessageStart[2] = 0x7e;
     644         433 :         pchMessageStart[3] = 0xac;
     645         433 :         nDefaultPort = 51476;
     646             : 
     647         433 :         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
     648         433 :         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19);  // Testnet pivx script addresses start with '8' or '9'
     649         433 :         base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73);     // starting with 'W'
     650         433 :         base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1};   // EXT prefix for the address
     651         433 :         base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239);     // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
     652             :         // Testnet pivx BIP32 pubkeys start with 'DRKV'
     653         433 :         base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
     654             :         // Testnet pivx BIP32 prvkeys start with 'DRKP'
     655         433 :         base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
     656             :         // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
     657         433 :         base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
     658             : 
     659             :         // Reject non-standard transactions by default
     660         433 :         fRequireStandard = true;
     661             : 
     662             :         // Sapling
     663         433 :         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "ptestsapling";
     664         433 :         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "pviewtestsapling";
     665         433 :         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
     666         433 :         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "p-secret-spending-key-test";
     667         433 :         bech32HRPs[SAPLING_EXTENDED_FVK]         = "pxviewtestsapling";
     668             : 
     669         433 :         bech32HRPs[BLS_SECRET_KEY]               = "bls-sk-test";
     670         433 :         bech32HRPs[BLS_PUBLIC_KEY]               = "bls-pk-test";
     671             : 
     672             :         // long living quorum params
     673         433 :         consensus.llmqs[Consensus::LLMQ_TEST] = llmq_test;
     674         433 :         nLLMQConnectionRetryTimeout = 10;
     675             : 
     676         433 :         consensus.llmqTypeChainLocks = Consensus::LLMQ_TEST;
     677             : 
     678             :         // Tier two
     679         433 :         nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
     680         433 :     }
     681             : 
     682      350700 :     const CCheckpointData& Checkpoints() const
     683             :     {
     684      350700 :         return dataRegtest;
     685             :     }
     686             : };
     687             : 
     688             : static std::unique_ptr<CChainParams> globalChainParams;
     689             : 
     690    16833780 : const CChainParams &Params()
     691             : {
     692    16833780 :     assert(globalChainParams);
     693    16833780 :     return *globalChainParams;
     694             : }
     695             : 
     696        1017 : std::unique_ptr<CChainParams> CreateChainParams(const std::string& chain)
     697             : {
     698        1017 :     if (chain == CBaseChainParams::MAIN)
     699         532 :         return std::unique_ptr<CChainParams>(new CMainParams());
     700         485 :     else if (chain == CBaseChainParams::TESTNET)
     701          52 :         return std::unique_ptr<CChainParams>(new CTestNetParams());
     702         433 :     else if (chain == CBaseChainParams::REGTEST)
     703        1450 :         return std::unique_ptr<CChainParams>(new CRegTestParams());
     704           0 :     throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain));
     705             : }
     706             : 
     707         942 : void SelectParams(const std::string& network)
     708             : {
     709         942 :     SelectBaseParams(network);
     710        1391 :     globalChainParams = CreateChainParams(network);
     711         942 : }
     712             : 
     713         434 : void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
     714             : {
     715         434 :     globalChainParams->UpdateNetworkUpgradeParameters(idx, nActivationHeight);
     716         434 : }

Generated by: LCOV version 1.14