]> Git Repo - VerusCoin.git/blob - src/chainparams.cpp
Improve testnet and PBaaS node connectivity
[VerusCoin.git] / src / chainparams.cpp
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or https://www.opensource.org/licenses/mit-license.php .
5
6 #include "key_io.h"
7 #include "main.h"
8 #include "crypto/equihash.h"
9
10 #include "util.h"
11 #include "utilstrencodings.h"
12
13 #include <assert.h>
14
15 #include <boost/assign/list_of.hpp>
16
17 #include "chainparamsseeds.h"
18
19 static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, const uint256& nNonce, const std::vector<unsigned char>& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
20 {
21     // To create a genesis block for a new chain which is Overwintered:
22     //   txNew.nVersion = OVERWINTER_TX_VERSION
23     //   txNew.fOverwintered = true
24     //   txNew.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID
25     //   txNew.nExpiryHeight = <default value>
26     CMutableTransaction txNew;
27     txNew.nVersion = 1;
28     txNew.vin.resize(1);
29     txNew.vout.resize(1);
30     txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
31     txNew.vout[0].nValue = genesisReward;
32     txNew.vout[0].scriptPubKey = genesisOutputScript;
33
34     CBlock genesis;
35     genesis.nTime    = nTime;
36     genesis.nBits    = nBits;
37     genesis.nNonce   = nNonce;
38     genesis.nSolution = nSolution;
39     genesis.nVersion = nVersion;
40     genesis.vtx.push_back(txNew);
41     genesis.hashPrevBlock.SetNull();
42     genesis.hashMerkleRoot = genesis.BuildMerkleTree();
43     return genesis;
44 }
45
46 /**
47  * Build the genesis block. Note that the output of its generation
48  * transaction cannot be spent since it did not originally exist in the
49  * database (and is in any case of zero value).
50  *
51  * >>> from pyblake2 import blake2s
52  * >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest()
53  *
54  * CBlock(hash=00040fe8, ver=4, hashPrevBlock=00000000000000, hashMerkleRoot=c4eaa5, nTime=1477641360, nBits=1f07ffff, nNonce=4695, vtx=1)
55  *   CTransaction(hash=c4eaa5, ver=1, vin.size=1, vout.size=1, nLockTime=0)
56  *     CTxIn(COutPoint(000000, -1), coinbase 04ffff071f0104455a6361736830623963346565663862376363343137656535303031653335303039383462366665613335363833613763616331343161303433633432303634383335643334)
57  *     CTxOut(nValue=0.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
58  *   vMerkleTree: c4eaa5
59  */
60 static CBlock CreateGenesisBlock(uint32_t nTime, const uint256& nNonce, const std::vector<unsigned char>& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
61 {
62     const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
63     const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
64     return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nSolution, nBits, nVersion, genesisReward);
65 }
66
67 /**
68  * Main network
69  */
70 /**
71  * What makes a good checkpoint block?
72  * + Is surrounded by blocks with reasonable timestamps
73  *   (no blocks before with a timestamp after, none after with
74  *    timestamp before)
75  * + Contains no strange transactions
76  */
77 void *chainparams_commandline(void *ptr);
78 #include "komodo_defs.h"
79
80 extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
81 extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
82 extern uint32_t ASSETCHAIN_INIT, ASSETCHAINS_MAGIC, ASSETCHAINS_ALGO, ASSETCHAINS_EQUIHASH, ASSETCHAINS_VERUSHASH;
83 extern int32_t VERUS_BLOCK_POSUNITS, ASSETCHAINS_LWMAPOS, ASSETCHAINS_SAPLING, ASSETCHAINS_OVERWINTER;
84 extern int64_t ASSETCHAINS_SUPPLY;
85 extern std::string VERUS_DEFAULT_ZADDR;
86
87 const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
88
89 class CMainParams : public CChainParams {
90 public:
91     CMainParams()
92     {
93         strNetworkID = "main";
94         strCurrencyUnits = "KMD";
95         bip44CoinType = 133; // As registered in https://github.com/satoshilabs/slips/blob/master/slip-0044.md (ZCASH, should be VRSC)
96         consensus.fCoinbaseMustBeProtected = false; // true this is only true wuth Verus and enforced after block 12800 (enforcement ending at solution V3)
97         consensus.nSubsidySlowStartInterval = 20000;
98         consensus.nPreBlossomSubsidyHalvingInterval = Consensus::PRE_BLOSSOM_HALVING_INTERVAL;
99         consensus.nPostBlossomSubsidyHalvingInterval = Consensus::POST_BLOSSOM_HALVING_INTERVAL;
100         consensus.nMajorityEnforceBlockUpgrade = 750;
101         consensus.nMajorityRejectBlockOutdated = 950;
102         consensus.nMajorityWindow = 4000;
103         consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
104         consensus.powAlternate = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
105         const size_t N = 200, K = 9;
106         BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
107         consensus.nEquihashN = N;
108         consensus.nEquihashK = K;
109         consensus.nPowAveragingWindow = 17;
110         consensus.nMaxFutureBlockTime = 7 * 60; // 7 mins
111
112         assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
113         consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
114         consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
115         consensus.nPowTargetSpacing = 1 * 60;
116         consensus.nPreBlossomPowTargetSpacing = Consensus::PRE_BLOSSOM_POW_TARGET_SPACING;
117         consensus.nPostBlossomPowTargetSpacing = Consensus::POST_BLOSSOM_POW_TARGET_SPACING;
118         consensus.nPowAllowMinDifficultyBlocksAfterHeight = boost::none;
119         consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
120         consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
121             Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
122         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
123         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
124             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
125         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170005;
126         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
127         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170007;
128         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
129         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nProtocolVersion = 170009;
130         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
131
132         // The best chain should have at least this much work.
133         consensus.nMinimumChainWork = uint256S("000000000000000000000000000000000000000000000000017e73a331fae01c");
134
135         /**
136          * The message start string is designed to be unlikely to occur in normal data.
137          * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
138          * a large 32-bit integer with any alignment.
139          */
140         pchMessageStart[0] = 0xf9;
141         pchMessageStart[1] = 0xee;
142         pchMessageStart[2] = 0xe4;
143         pchMessageStart[3] = 0x8d;
144         vAlertPubKey = ParseHex("020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9");
145         // (Zcash) vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
146         nDefaultPort = 7770;
147         nMinerThreads = 0;
148         nMaxTipAge = 24 * 60 * 60;
149         nPruneAfterHeight = 100000;
150
151         const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
152         CMutableTransaction txNew;
153         txNew.vin.resize(1);
154         txNew.vout.resize(1);
155         txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
156         txNew.vout[0].nValue = 50 * COIN;
157         txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
158         genesis.vtx.push_back(txNew);
159         genesis.hashPrevBlock.SetNull();
160         genesis.hashMerkleRoot = genesis.BuildMerkleTree();
161         genesis.nVersion = 1;
162         genesis.nTime    = 1231006505;
163         genesis.nBits    = KOMODO_MINDIFF_NBITS;
164         genesis.nNonce   = uint256S("0x000000000000000000000000000000000000000000000000000000000000000b");
165         genesis.nSolution = ParseHex("000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2");
166
167
168         /*genesis = CreateGenesisBlock(
169             1477641360,
170             uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"),
171             ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"),
172             0x1f07ffff, 4, 0);*/
173
174         consensus.hashGenesisBlock = genesis.GetHash();
175         assert(consensus.hashGenesisBlock == uint256S("0x027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71"));
176         assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
177         vFixedSeeds.clear();
178         vSeeds.clear();
179         vSeeds.push_back(CDNSSeedData("veruscoin.io", "seeds.veruscoin.io"));
180         vSeeds.push_back(CDNSSeedData("komodoplatform.com", "seeds.komodoplatform.com")); // @kolo - old static dns seeds
181         vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "static.kolo.supernet.org")); // @kolo - new static dns seeds ToDo
182         vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo
183         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,60);
184         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,85);
185         base58Prefixes[IDENTITY_ADDRESS] = std::vector<unsigned char>(1,102);
186         base58Prefixes[INDEX_ADDRESS] = std::vector<unsigned char>(1,137);
187         base58Prefixes[QUANTUM_ADDRESS] = std::vector<unsigned char>(1,58);
188         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,188);
189         base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
190         base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
191         // guarantees the first two characters, when base58 encoded, are "zc"
192         base58Prefixes[ZCPAYMENT_ADDRRESS] = {22,154};
193         // guarantees the first 4 characters, when base58 encoded, are "ZiVK"
194         base58Prefixes[ZCVIEWING_KEY]      = {0xA8,0xAB,0xD3};
195         // guarantees the first two characters, when base58 encoded, are "SK"
196         base58Prefixes[ZCSPENDING_KEY] = {171,54};
197
198         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "zs";
199         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "zviews";
200         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivks";
201         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "secret-extended-key-main";
202
203         vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
204
205         fMiningRequiresPeers = true;
206         fDefaultConsistencyChecks = false;
207         fRequireStandard = true;
208         fMineBlocksOnDemand = false;
209         fTestnetToBeDeprecatedFieldRPC = false;
210
211         if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
212         {
213
214         }
215     }
216 };
217 static CMainParams mainParams;
218
219 void CChainParams::SetCheckpointData(CChainParams::CCheckpointData checkpointData)
220 {
221     CChainParams::checkpointData = checkpointData;
222 }
223
224 void *chainparams_commandline(void *ptr)
225 {
226     CChainParams::CCheckpointData checkpointData;
227     while ( ASSETCHAINS_P2PPORT == 0 )
228     {
229         #ifdef _WIN32
230         boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
231         #else
232         sleep(1);
233         #endif
234     }
235     //fprintf(stderr,">>>>>>>> port.%u\n",ASSETCHAINS_P2PPORT);
236     if ( ASSETCHAINS_SYMBOL[0] != 0 )
237     {
238         mainParams.SetDefaultPort(ASSETCHAINS_P2PPORT);
239         if ( ASSETCHAINS_RPCPORT == 0 )
240             ASSETCHAINS_RPCPORT = ASSETCHAINS_P2PPORT + 1;
241         mainParams.pchMessageStart[0] = ASSETCHAINS_MAGIC & 0xff;
242         mainParams.pchMessageStart[1] = (ASSETCHAINS_MAGIC >> 8) & 0xff;
243         mainParams.pchMessageStart[2] = (ASSETCHAINS_MAGIC >> 16) & 0xff;
244         mainParams.pchMessageStart[3] = (ASSETCHAINS_MAGIC >> 24) & 0xff;
245         fprintf(stderr,">>>>>>>>>> %s: p2p.%u rpc.%u magic.%08x %u %lu coins\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT,ASSETCHAINS_MAGIC,ASSETCHAINS_MAGIC,ASSETCHAINS_SUPPLY / COIN);
246
247         if (ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH)
248         {
249             // this is only good for 60 second blocks with an averaging window of 45. for other parameters, use:
250             // nLwmaAjustedWeight = (N+1)/2 * (0.9989^(500/nPowAveragingWindow)) * nPowTargetSpacing 
251             mainParams.consensus.nLwmaAjustedWeight = 1350;
252             mainParams.consensus.nPowAveragingWindow = 45;
253             if (strcmp(ASSETCHAINS_SYMBOL, "VRSC") == 0)
254             {
255                 mainParams.consensus.powAlternate = uint256S("00000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
256             }
257             else
258             {
259                 mainParams.consensus.powAlternate = uint256S("0000000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
260             }
261         }
262
263         if (ASSETCHAINS_LWMAPOS != 0)
264         {
265             mainParams.consensus.posLimit = uint256S("000000000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
266             mainParams.consensus.nPOSAveragingWindow = 45;
267             // spacing is 1000 units per block to get better resolution, POS is 50% hard coded for now, we can vary it later
268             // when we get reliable integer math on nLwmaPOSAjustedWeight
269             mainParams.consensus.nPOSTargetSpacing = VERUS_BLOCK_POSUNITS * 2;
270             // nLwmaPOSAjustedWeight = (N+1)/2 * (0.9989^(500/nPOSAveragingWindow)) * nPOSTargetSpacing
271             // this needs to be recalculated if VERUS_BLOCK_POSUNITS is changed
272             mainParams.consensus.nLwmaPOSAjustedWeight = 46531;
273         }
274
275         // this includes VRSCTEST, unlike the checkpoints and changes below
276         if (_IsVerusActive())
277         {
278             mainParams.consensus.fCoinbaseMustBeProtected = true;
279         }
280
281         // only require coinbase protection on Verus from the Komodo family of coins
282         if (_IsVerusMainnetActive())
283         {
284             mainParams.consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 227520;
285             mainParams.consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 227520;
286             checkpointData = //(Checkpoints::CCheckpointData)
287                 {
288                     boost::assign::map_list_of
289                     (0, mainParams.consensus.hashGenesisBlock)
290                     (10000, uint256S("0xac2cd7d37177140ea4991cf630c0b9c7f94d707b84fb0351bf3a44856d2ae5dc"))
291                     (20000, uint256S("0xb0e8cb9f77aaa7ff5bd90d6c08d06f4c4bf03e00c2b8a35a042e760845590c8a"))
292                     (30000, uint256S("0xf2112ca577338ad7104bf905fa6a63d36b17a86f914c97b73cd31d43fcd7557c"))
293                     (40000, uint256S("0x00000000008f83378dab727864b763ce91a4ea5f75d55939c0c1390cfb8c38f1"))
294                     (49170, uint256S("0x2add646c0089871ec2379f02f7cd60b3af6efd9c152a6f16fc10925458c270cc")),
295                     (int64_t)1529910234,    // * UNIX timestamp of last checkpoint block
296                     (int64_t)63661,         // * total number of transactions between genesis and last checkpoint
297                                             //   (the tx=... number in the SetBestChain debug.log lines)
298                     (double)2777            // * estimated number of transactions per day after checkpoint
299                                             //   total number of tx / (checkpoint block height / (24 * 24))
300                 };
301
302             mainParams.consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000001a8f4f23f8b2d1f7e");
303         }
304         else
305         {
306             mainParams.vSeeds.clear();
307             if (_IsVerusActive)
308             {
309                 mainParams.vSeeds.push_back(CDNSSeedData("veruscoin.io", "seeds.veruscoin.io"));
310             }
311             mainParams.consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000000000020");
312             mainParams.consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = ASSETCHAINS_SAPLING;
313             mainParams.consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = ASSETCHAINS_OVERWINTER;
314             checkpointData = //(Checkpoints::CCheckpointData)
315             {
316                 boost::assign::map_list_of
317                 (0, mainParams.consensus.hashGenesisBlock),
318                 (int64_t)1231006505,
319                 (int64_t)1,
320                 (double)2777            // * estimated number of transactions per day after checkpoint
321                                         //   total number of tx / (checkpoint block height / (24 * 24))
322             };
323         }
324     }
325     else
326     {
327             checkpointData = //(Checkpoints::CCheckpointData)
328             {
329                 boost::assign::map_list_of
330
331                 (0, mainParams.consensus.hashGenesisBlock)
332                 (       5000,   uint256S("0x049cfc91eef411e96603a42c9a77c5e30e9fe96f783ab818f4c00fb56fb29b6c"))
333                 (       10000,  uint256S("0x0a0169db3614311cd4181deb73cfcf7f640e7dc956cda34e0121a0351925e9ae"))
334                 (       15000,  uint256S("0x00f0bd236790e903321a2d22f85bd6bf8a505f6ef4eddb20458a65d37e14d142"))
335                 (       20000,  uint256S("0x01bbf0c38892bdcced62b538329cf63bc7badca3e7e1bff8eb10345436871c6e"))
336                 (       25000,  uint256S("0x04ca27808268dda8f942b647a6df844be1b263a661a13740293db962022d1f9e"))
337                 (       30000,  uint256S("0x04c9e8cfbcd37399085e529b50147de8afb80c76c48752c122d56f23316a7acb"))
338                 (       35000,  uint256S("0x00815f1240354cff7487c67f7dff78e248cb9053ed2c92751d1a9ad42d3eaedf"))
339                 (       40000,  uint256S("0x00eafd9dfb1e5f1bf1cca0c49be628538900daf69b665464443d29c2c3b6a2fe"))
340                 (       45000,  uint256S("0x0377730632caf694b92f40d03ae0fbe5bd86a1205014b71d975453ac793b0af9"))
341                 (       50000,  uint256S("0x00076e16d3fa5194da559c17cf9cf285e21d1f13154ae4f7c7b87919549345aa"))
342                 (       55000,  uint256S("0x0005a0701a83e05b639418ea4c87018544a4d22b2b49e5f111161e8ffc455108"))
343                 (       60000,  uint256S("0x0000296fc15f8599b7c6561d0e0a96f24766135ed79107b603d6dd6e55142c0d"))
344                 (       65000,  uint256S("0x000861f5d7970d5399733b4605074d47f877d6536f74ffae6f08e871ee29e6f2"))
345                 (       70000,  uint256S("0x0002af1d487c567526c517b52996944dca344e139cddca77c2e72f746e73b263"))
346                 (       75000,  uint256S("0x0d08129659be5f105e70c047769359eaf3475d61a726750859fdca3e1a2bf5cc"))
347                 (       80000,  uint256S("0x0af5f3f1caae4f08c74a82689731d1ef8e55107c06f9a996e251b8ecb96989ad"))
348                 (       85000,  uint256S("0x00000c8ee29086c5fb39eddad0619773b9ce936c77c13e5e5118a4998e939544"))
349                 (       90000,  uint256S("0x06d3bb7f9ee5b55f67b2dc13c680699a2f736f43a44b4e4cfd41a58aa00f063f"))
350                 (       95000,  uint256S("0x0670981b269879aae83a88f6f0c4db34763c93fd410d96435f2acb4e6580b976"))
351                 (       100000, uint256S("0x0f02eb1f3a4b89df9909fec81a4bd7d023e32e24e1f5262d9fc2cc36a715be6f"))
352                 (       105000, uint256S("0x018b97d7e6d259add24afe0e08fc125dc21d734e8831b68b430f5c3896deb4af"))
353                 (       110000, uint256S("0x09644ff52734e0e911a9ba7ecd03cf7995b25301840a9637891ef9af69f59c32"))
354                 (       115000, uint256S("0x0ee382b4729b8ceb918a92913f9c144a6a4f8a50bfc0f8b4aac5b12592caed7f"))
355                 (       120000, uint256S("0x082a7918a0dd9cb2df65f55acb8d0a4a535b3fa684d92c3ebcb24ed7019d975b"))
356                 (       125000, uint256S("0x00008f76c4484fd539c9d02fc69c40a50b6f9e00984d33890b85cc0324159e9e"))
357                 (       130000, uint256S("0x011b09e53acfe46f310e8c960a9c4f4f490cc7b2cd3791d7a6a80d6e8ac96b36"))
358                 (       135000, uint256S("0x01e0cd48358fa05646baa6f00e26717474d6049a537c8861b324d1f497dc3d4a"))
359                 (       140000, uint256S("0x0e6db36fd8a9d1b7baf359c8bd5c76635d0bcada973a75b5d2028ca3baea4961"))
360                 (       145000, uint256S("0x00010c40b57316ce6cde076807c9db956452a3c82cb09fe7d56c6bb1a7e24726"))
361                 (       150000, uint256S("0x0a817f15b9da636f453a7a01835cfc534ed1a55ce7f08c566471d167678bedce"))
362                 (       155000, uint256S("0x0528084fd00223bd9747635d7a4d8cc79f158795cad654efb78e4e4cc5f23d6a"))
363                 (       160000, uint256S("0x00003a09f26ae9fb7ebbfa3ef589b81ccd8909a82430f7414bc68d5a5a3316ab"))
364                 (       165000, uint256S("0x00004a0c6a29e7d1f22ea4e44d05e861fec5fcd8eebc5a61574c4ecf29dbb9be"))
365                 (       170000, uint256S("0x0cf9eac27badc0ae9a2b370dd7cc3fcb550f139349551e60978f394a2e1b262b"))
366                 (       175000, uint256S("0x0000137856b825d431da27ff4c3cf22f5482fa21952d45b0db0ec6774fb9b510"))
367                 (       180000, uint256S("0x000000b0afcccf98aa0afb6ac61050892bd9415857d66313d1f67fd1bbac312f"))
368                 (       185000, uint256S("0x00c2af8f88d84de080067f8ae1c25754e32e5516d20c11f85b9adae2d683687b"))
369                 (       190000, uint256S("0x00000033d85b3e7d19e02278ef300b8ab957d3dd3e58b4c81166ba0a58af5c3f"))
370                 (       195000, uint256S("0x000000964b6068be1dd4ee6893d183e86cba82a2744fb5439c463d0ba7e053b6"))
371                 (       200000, uint256S("0x000001763a9337328651ca57ac487cc0507087be5838fb74ca4165ff19f0e84f"))
372                 (       205000, uint256S("0x049fc6832e64a75ae898b32804e151e7561ea49082858c3d4af89a7de4b82f06"))
373                 (       210000, uint256S("0x0000000d9078b9c9604cc663eafafba8f3643bb3f3ddbb78fed4993236e1edb5"))
374                 (       215000, uint256S("0x00060089ecc21bcc62094e2f7f0448fe163415f6ef2f2aafe047757889ca82fe"))
375                 (       220000, uint256S("0x000082c78e6c2a13a9c23dd7a6faaf962fc133142b4a2d07725561f59c03bfa2"))
376                 (       225000, uint256S("0x00030026483167fe13505cf27049307ce42e0d9c5aa093aed10baa4f49edf4ca"))
377                 (       230000, uint256S("0x000183a3e17988060a35776b99c1f0b43393bbe7153b2718dfc57f428191de4e"))
378                 (       235000, uint256S("0x000184995f0ec024ed3783e322c8cfa5e68d9f0c77c3aaea301b22d311619156"))
379                 (       240000, uint256S("0x0000002cc7cf6d0a44ab57f9bd3bfa11a865bbf1cd87a2081095bc90981633a3"))
380                 (       245000, uint256S("0x004c5f19a88c8fe8a604006dbd2d44c94baef2a00876a17d8e2be2124003f979"))
381                 (       250000, uint256S("0x0dd54ef5f816c7fde9d2b1c8c1a26412b3c761cc5dd3901fa5c4cd1900892fba"))
382                 (       255000, uint256S("0x0b6da9e4f50c8bc7a92c539bc7474ffd6c29e0a8531f0dbbbc261fff1f990827"))
383                 (       260000, uint256S("0x0cac8b12bf7233ee5a68fcde9e251852b177833fefa2a9f39ec28474b0851cb9"))
384                 (       265000, uint256S("0x04feb5b4029f3b8b8eb3e6661a78eadd1a26b4af00ac59b5f05b261afcfd2818"))
385                 (       270000, uint256S("0x01bc5897bd20b8b61acf4989987ba85fbc37d9ebe848924aa8effcb08bf48fe0"))
386                 (       275000, uint256S("0x0416bc29eb5a12231826e546ba90fcd38aeef387ff77b45849cd418a9c1a6f12"))
387                 (       280000, uint256S("0x000007593e9880b171d46bce59aa0cec2a1b1f53d1fd7e8f71ccb2b9182374a4"))
388                 (       285000, uint256S("0x05a338b2d90cd79740221fe8635b7a834f2e486fcbb2464a4294f5a21231a5f5"))
389                 (       290000, uint256S("0x064ca3912cdcd833702d07a530e98bc5c6c1cd738a8825c7240b17cd68ca0cc4"))
390                 (       295000, uint256S("0x036b3bb318d743fd78db983a9aadd52869991d48913c4eebe2a074387d67cc5a"))
391                 (       300000, uint256S("0x000000fa5efd1998959926047727519ed7de06dcf9f2cd92a4f71e907e1312dc"))
392                 (       305000, uint256S("0x00003656231e83de2348755153ed175794696a113d7e8a15c01f90fdb7c2f287"))
393                 (       310000, uint256S("0x0cf6baf727eb931da0813ed8b032648c4766be79e146b0d40c643f9d8edf40f7"))
394                 (       315000, uint256S("0x082469974c152ebe69f1787f0d06aa5d9dd1dc69c880febde7eac2bc800146dd"))
395                 (       320000, uint256S("0x0000063df36b99bfb2516f55cb548a5baed1f2d8ae69c3559dc478c5c2eb32df"))
396                 (       325000, uint256S("0x0cb926b303a1514ba0a2f729af88ccb143517f396e9e0bde09b0736900698e0f"))
397                 (       330000, uint256S("0x000000be3d8bb6e31c3b534819aae7014cbbe9a44ab3e799dc1bfc724c6ab184"))
398                 (       335000, uint256S("0x0d0756608189fd5bbd8ec50e76180074e69e973439cc09df49134e4cb970ed4d"))
399                 (       340000, uint256S("0x0d814eacdb9c97003d703c0ff79b1b97b9ed8615fe12b1afaede946e5fdfe0a7"))
400                 (       345000, uint256S("0x000000c2910f510f1de325d300202da1a391f2719dd378173299151c3da94e85"))
401                 (       350000, uint256S("0x0000000228ef321323f81dae00c98d7960fc7486fb2d881007fee60d1e34653f"))
402                 (       355000, uint256S("0x03e6a55e382b478e0fab9c3584da3629fd9b977986a333a406b24b0d3559bf44"))
403                 (       360000, uint256S("0x0859c86dd718bcb5b58af06389197794e2beea6239653f2e6fa7b8a7433d29ea"))
404                 (       365000, uint256S("0x07896332665c707a8f55398a998e7878e8d2681ba79dd95c2859b1dafc9343d0"))
405                 (       370000, uint256S("0x040efd8c64cf5cf96ecf75468741a8880d1386eb5e349bef0a55116d4023944c"))
406                 (       375000, uint256S("0x053029e7599a09fe6c01203997d7ca738dd4c6d216a433695a0d514def1eccc0"))
407                 (       380000, uint256S("0x0cae44e7a421c389b88a5a204d3e39779e93aeacaab1b693741bf279fd0c8acd"))
408                 (       385000, uint256S("0x0b4032d2c799ba93644231ce57134dd24e13ec0dc267c1ed5912389691d2bd72"))
409                 (       390000, uint256S("0x0afd0f166f33a881ef289af7ea7010d58c4bbd560dee10b561c79e1b8dfd0593"))
410                 (       395000, uint256S("0x083774b88cf1b138d67c242d9b33c54f69d7e901b5e8144dc4a2303ab9927102"))
411                 (       400000, uint256S("0x036d294c5be96f4c0efb28e652eb3968231e87204a823991a85c5fdab3c43ae6"))
412                 (       405000, uint256S("0x0522e33bb2161fb1b33acef9a4a438fcf420dcae8a0b472e234d223d731c42b2"))
413                 (       410000, uint256S("0x0361d06aa807c66b87befea8119a485341d1118b694c3dbb4c3cf0b85ac69e9b"))
414                 (       415000, uint256S("0x072d5653d8673f64ef8b9c655f7b8021072070a072b799013ff6e96de99a59e6"))
415                 (       420000, uint256S("0x013b693d66955be69d4501cb1d307ca323a5c8473e25866ae7e700cdce0c654f"))
416                 (       425000, uint256S("0x0ef0c55af27c6971289a790dee2b2ec728fb9c6555ff9306c07f1083cf0fb4b5"))
417                 (       430000, uint256S("0x0ccbeeaba28291e0316a9cf54c005097c61dc67ba6f32283406d6c83b828da00"))
418                 (       435000, uint256S("0x020ed6b7fe1124400baba7feed463ba0c90e7e6903493fdc1a1a18c4a506055a"))
419                 (       440000, uint256S("0x055aaadca1908abeedc831a3f9115aa31284fc223d010590caf7b612960b61a4"))
420                 (       445000, uint256S("0x06d2327fa25ea7e2be742fc0e45fc4f9adb41811f21be0357f8543c5434df715"))
421                 (       450000, uint256S("0x0906ef1e8dc194f1f03bd4ce1ac8c6992fd721ef2c5ccbf4871ec8cdbb456c18"))
422                 (       455000, uint256S("0x0b8b92eec29eb20262dcf9916f0ca36d6abf0c39d321d3f480a5535cb978db71"))
423                 (       460000, uint256S("0x0cb04591f69a255b1127aaff3bbd59eaa21a5d9cca999de197516c251895c536"))
424                 (       465000, uint256S("0x029985ae78d8bb8fd170aeb3ab02ea76134ed0c19ae00211cc28a61fe5755b88"))
425                 (       470000, uint256S("0x01a2f4b56f37b223e75572862ad1ba956ec179332f8cd40590d7253563c86ba8"))
426                 (       475000, uint256S("0x0a34c6f9d4d9cb8c78c14b8041a7cc1874cfcbb22a34a5c068d1d6ff3ed9fdf0"))
427                 (       480000, uint256S("0x0ebab25030179996ae25969f34f6a297c7ffce1994f9b4186082a47032a9a7dc"))
428                 (       485000, uint256S("0x06a096e6bccf3b85537a30f95db6a414deacc0509bc84da264c2830df1a1d9b0"))
429                 (       490000, uint256S("0x0af828930ef13405cb536b88a3d1d4e0d84dc79ee260402c56bfa86e261c74ff"))
430                 (       495000, uint256S("0x09d44905bfd12849d3c2178b2ba882f8e9d6565b6e4d7a97c70a92bd6de7c5e6"))
431                 (       500000, uint256S("0x0bebdb417f7a51fe0c36fcf94e2ed29895a9a862eaa61601272866a7ecd6391b"))
432                 (       505000, uint256S("0x0c1609f4f3561baa1fc975877948af94d2107c88686a9821bc240016cc87d953"))
433                 (       510000, uint256S("0x0cf9a5a4997b871e615e5e398627e45fa15b3e6970ae22b47bdd11b0f5fa0fa7"))
434                 (       515000, uint256S("0x034171d4819e9961de13309743a32a179abede97d60ea64101dc04c97a1a0807"))
435                 (       520000, uint256S("0x0648fa44d5bbc2cc04a782e083c11df64ac06185f0f8e11a7416625ebb6409a6"))
436                 (       525000, uint256S("0x0000000ef17d63af3159e52cd351b6f000536ad88adc3a937bb747955fed58a2"))
437                 (       530000, uint256S("0x08e3af153995ba09e50086b64145cf4cd57db6b29f16f06f28d80d7f6121cfad"))
438                 (       535000, uint256S("0x02a0ffd00b51e2061b85de50a9223d9c84f4e357dc1046397bb9d7d4a827a3fb"))
439                 (       540000, uint256S("0x04bf07d026af29025c1ac2815e067f4a41d2872701ac9780eb3015d51cdcd854"))
440                 (       545000, uint256S("0x0a0d6d86635946792ad0dca57ed227a5360fc8b6d79e47132aac11e90a4963ce"))
441                 (       550000, uint256S("0x06df52fc5f9ba03ccc3a7673b01ab47990bd5c4947f6e1bc0ba14d21cd5bcccd"))
442                 (       555000, uint256S("0x0baf38eea8e08fcad3a9d760f27377e79c291b08e7fb4920cadd5cb7bab547f3"))
443                 (       560000, uint256S("0x00000004c34abbf1366adbae965b644c01debf15409acc715ff51cb221d92dd7"))
444                 (       565000, uint256S("0x067bae7119f083e0fa1820bc8e25dcfa7717e42aabaef18beefd87d974953dfb"))
445                 (       570000, uint256S("0x00000011a7ce7b628b7be17777d8dea2574d83f165e23c9e44aa705975820fd3"))
446                 (       575000, uint256S("0x0e1110a193a30d3f8d369017233a2486b11c748b3d033859a2eb7b37062d303e"))
447                 (       580000, uint256S("0x083cb58484aff80f48e3537e0451d49e544b3efa3da97274800c91e567d33a92"))
448                 (       585000, uint256S("0x0224cf835428d03472edf4f7b6fcc63b9d8d6f1d5a90ad8186bf123d541b4ea8"))
449                 (       590000, uint256S("0x0cfcf3b9517894e4df49db5faf8b74f3a9e01eb83c0cc5051c115d4424615dae"))
450                 (       595000, uint256S("0x0000000a45266983dd81e0df381a3b0455699b2f76d5b4d3f17b87d657a1b56d"))
451                 (       600000, uint256S("0x00000005080d5689c3b4466e551cd1986e5d2024a62a79b1335afe12c42779e4"))
452                 (       605000, uint256S("0x0000001c691da36848542299af859d4eb3fa408a0f425b1fbe6d622d2100623a"))
453                 (       610000, uint256S("0x040d8c7a0ac89e3ed8605a198583a795986aacbf18722a9897d7b925bcf757f6"))
454                 (       615000, uint256S("0x0449cf00fc36206389c14cbf1d762f8b96bb0440ccea5b46703e7c69b0e2bc42"))
455                 (       620000, uint256S("0x07227a41340c25ee1a7e9b60414259780202ffa990079fc91d8faeac9af03e60"))
456                 (       625000, uint256S("0x047c2472fe2afabb3d38decf24bba4ba712b60e7a1782f4afae3ede3f912f493"))
457                 (       630000, uint256S("0x0a7f1f04e66260cf972ab1374a9126b8abc1adaa3ab4669db5d4d4ddb9ad493d"))
458                 (       635000, uint256S("0x048df95165eb821dabf37ef28cf7f3be72e216e95377684253dab806985b50a4"))
459                 (       640000, uint256S("0x066b3c6a6a3c8dc58bef509a972c3e3ade14493b40e1b361ecbc928134e302be"))
460                 (       645000, uint256S("0x07d059888c9ade3bbe16d6b4d70ee9b8302d104b37a3c6cd61f81012aabd0e1e"))
461                 (       650000, uint256S("0x039a3cb760cc6e564974caf69e8ae621c14567f3a36e4991f77fd869294b1d52"))
462                 (       655000, uint256S("0x089350ee8d28b44837eb4b1fe77704953d5de2077f10c74a888d9d3ea1e13c2a"))
463                 (       660000, uint256S("0x000000023f8a582a61ae2f6fab6fe8197e79b7a68aaac67432421b09f1bdd4ba"))
464                 (       665000, uint256S("0x0b16edce865e7a0d662115774e0c0d3abbf9c69004155b693ddc933f051bfb26"))
465                 (       670000, uint256S("0x09070b109b089490bc372fd8358abae352d6db0e46ade6ed2200e4d4ff7aa6af"))
466                 (       675000, uint256S("0x08d9edeed3b6ac55991e9f32af0218ff8fa9dc808078623f4c831eb09d4f186b"))
467                 (       680000, uint256S("0x00000003eb2b30bfac929d3496acecab19625ac9f854a86aaf9678bea99e1cc1"))
468                 (       681777, uint256S("0x0000243296b9b26c040f471fdd9398ef72e57062cf05c19b9ba2fefac8165306")),
469                 (int64_t)1516924927,     // * UNIX timestamp of last checkpoint block
470                 (int64_t)1253783,         // * total number of transactions between genesis and last checkpoint
471                                 //   (the tx=... number in the SetBestChain debug.log lines)
472                 (double)2777            // * estimated number of transactions per day after checkpoint
473                                 //   total number of tx / (checkpoint block height / (24 * 24))
474             };
475     }
476
477     mainParams.SetCheckpointData(checkpointData);
478
479     ASSETCHAIN_INIT = 1;
480     return(0);
481 }
482
483 /**
484  * Testnet (v3)
485  */
486 class CTestNetParams : public CChainParams {
487 public:
488     CTestNetParams() {
489         strNetworkID = "test";
490         strCurrencyUnits = "TAZ";
491         bip44CoinType = 1;
492         consensus.fCoinbaseMustBeProtected = true;
493         consensus.nSubsidySlowStartInterval = 20000;
494         consensus.nPreBlossomSubsidyHalvingInterval = Consensus::PRE_BLOSSOM_HALVING_INTERVAL;
495         consensus.nPostBlossomSubsidyHalvingInterval = Consensus::POST_BLOSSOM_HALVING_INTERVAL;
496         consensus.nMajorityEnforceBlockUpgrade = 51;
497         consensus.nMajorityRejectBlockOutdated = 75;
498         consensus.nMajorityWindow = 400;
499         const size_t N = 200, K = 9;
500         BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
501         consensus.nEquihashN = N;
502         consensus.nEquihashK = K;
503         consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
504         consensus.powAlternate = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
505         consensus.nPowAveragingWindow = 17;
506         assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
507         consensus.nMaxFutureBlockTime = 7 * 60;
508
509         vAlertPubKey = ParseHex("00");
510         nDefaultPort = 17770;
511         nMinerThreads = 0;
512         consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
513         consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
514         consensus.nPreBlossomPowTargetSpacing = Consensus::PRE_BLOSSOM_POW_TARGET_SPACING;
515         consensus.nPostBlossomPowTargetSpacing = Consensus::POST_BLOSSOM_POW_TARGET_SPACING;
516         consensus.nPowAllowMinDifficultyBlocksAfterHeight = 299187;
517         consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
518         consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
519             Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
520         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
521         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
522             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
523         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
524         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 207500;
525         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170007;
526         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 280000;
527         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nProtocolVersion = 170008;
528         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nActivationHeight = 584000;
529
530         // The best chain should have at least this much work.
531         consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000001d0c4d9cd");
532
533         pchMessageStart[0] = 0x5A;
534         pchMessageStart[1] = 0x1F;
535         pchMessageStart[2] = 0x7E;
536         pchMessageStart[3] = 0x62;
537         vAlertPubKey = ParseHex("020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9");
538         nMaxTipAge = 24 * 60 * 60;
539
540         nPruneAfterHeight = 1000;
541
542         //! Modify the testnet genesis block so the timestamp is valid for a later start.
543         genesis.nTime = 1296688602;
544         genesis.nBits = KOMODO_MINDIFF_NBITS;
545         genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009");
546         genesis.nSolution = ParseHex("003423da3e41f916bf3ff0ee770eb844a240361abe08a8c9d46bd30226e2ad411a4047b6ddc230d173c60537e470e24f764120f5a2778b2a1285b0727bf79a0b085ad67e6266fb38fd72ef17f827315c42f921720248c983d4100e6ebd1c4b5e8762a973bac3bec7f7153b93752ebbb465f0fc9520bcfc30f9abfe303627338fed6ede9cf1b9173a736cf270cf4d9c6999ff4c3a301a78fd50dab6ccca67a0c5c2e41f216a1f3efd049a74bbe6252f9773bc309d3f9e554d996913ce8e1cec672a1fa4ea59726b61ea9e75d5ce9aa5dbfa96179a293810e02787f26de324fe7c88376ff57e29574a55faff7c2946f3e40e451861c32bf67da7377de3136858a18f34fab1bc8da37726ca2c25fc7b312a5427554ec944da81c7e27255d6c94ade9987ff7daedc2d1cc63d7d4cf93e691d13326fb1c7ee72ccdc0b134eb665fc6a9821e6fef6a6d45e4aac6dca6b505a0100ad56ea4f6fa4cdc2f0d1b65f730104a515172e34163bdb422f99d083e6eb860cf6b3f66642c4dbaf0d0fa1dca1b6166f1d1ffaa55a9d6d6df628afbdd14f1622c1c8303259299521a253bc28fcc93676723158067270fc710a09155a1e50c533e9b79ed5edba4ab70a08a9a2fc0eef0ddae050d75776a9804f8d6ad7e30ccb66c6a98d86710ca7a4dfb4feb159484796b9a015c5764aa3509051c87f729b9877ea41f8b470898c01388ed9098b1e006d3c30fc6e7c781072fa3f75d918505ee8ca75840fc62f67c57060666aa42578a2dd022eda62e3f1e447d7364074d34fd60ad9b138f60422afa6cfcb913fd6c213b496144dbfda7bfc7c24540cfe40ad0c0fd5a8c0902127f53d3178ba1b2a87bf1224d53d3a15e49ccdf121ae872a011c996d1b9793153cdcd4c0a7e99f8a35669788551cca2b62769eda24b6b55e2f4e0ac0d30aa50ecf33c6cdb24adfc922006a7bf434ced800fefe814c94c6fc8caa37b372d5088bb31d2f6b11a7a67ad3f70abbac0d5c256b637828de6cc525978cf151a2e50798e0c591787639a030291272c9ced3ab7d682e03f8c7db51f60163baa85315789666ea8c5cd6f789a7f4a5de4f8a9dfefce20f353cec606492fde8eab3e3b487b3a3a57434f8cf252a4b643fc125c8a5948b06744f5dc306aa587bdc85364c7488235c6edddd78763675e50a9637181519be06dd30c4ba0d845f9ba320d01706fd6dd64d1aa3cd4211a4a7d1d3f2c1ef2766d27d5d2cdf8e7f5e3ea309d4f149bb737305df1373a7f5313abe5986f4aa620bec4b0065d48aafac3631de3771f5c4d2f6eec67b09d9c70a3c1969fecdb014cb3c69832b63cc9d6efa378bff0ef95ffacdeb1675bb326e698f022c1a3a2e1c2b0f05e1492a6d2b7552388eca7ee8a2467ef5d4207f65d4e2ae7e33f13eb473954f249d7c20158ae703e1accddd4ea899f026618695ed2949715678a32a153df32c08922fafad68b1895e3b10e143e712940104b3b352369f4fe79bd1f1dbe03ea9909dbcf5862d1f15b3d1557a6191f54c891513cdb3c729bb9ab08c0d4c35a3ed67d517ffe1e2b7a798521aed15ff9822169c0ec860d7b897340bc2ef4c37f7eb73bd7dafef12c4fd4e6f5dd3690305257ae14ed03df5e3327b68467775a90993e613173fa6650ffa2a26e84b3ce79606bf234eda9f4053307f344099e3b10308d3785b8726fd02d8e94c2759bebd05748c3fe7d5fe087dc63608fb77f29708ab167a13f32da251e249a544124ed50c270cfc6986d9d1814273d2f0510d0d2ea335817207db6a4a23ae9b079967b63b25cb3ceea7001b65b879263f5009ac84ab89738a5b8b71fd032beb9f297326f1f5afa630a5198d684514e242f315a4d95fa6802e82799a525bb653b80b4518ec610a5996403b1391");
547         consensus.hashGenesisBlock = genesis.GetHash();
548         //assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
549
550         vFixedSeeds.clear();
551         vSeeds.clear();
552         //vSeeds.push_back(CDNSSeedData("z.cash", "dns.testnet.z.cash")); // Komodo
553
554         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
555         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
556         base58Prefixes[IDENTITY_ADDRESS] = std::vector<unsigned char>(1,102);
557         base58Prefixes[INDEX_ADDRESS] = std::vector<unsigned char>(1,137);
558         base58Prefixes[QUANTUM_ADDRESS] = std::vector<unsigned char>(1,58);
559         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,128);
560         base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x35)(0x87)(0xCF).convert_to_container<std::vector<unsigned char> >();
561         base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x35)(0x83)(0x94).convert_to_container<std::vector<unsigned char> >();
562         base58Prefixes[ZCPAYMENT_ADDRRESS] = {20,81};
563         // guarantees the first 4 characters, when base58 encoded, are "ZiVt"
564         base58Prefixes[ZCVIEWING_KEY]  = {0xA8,0xAC,0x0C};
565         base58Prefixes[ZCSPENDING_KEY] = {177,235};
566
567         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "ztestsapling";
568         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "zviewtestsapling";
569         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivktestsapling";
570         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "secret-extended-key-test";
571
572         vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
573
574         //fRequireRPCPassword = true;
575         fMiningRequiresPeers = false;//true;
576         fDefaultConsistencyChecks = false;
577         fRequireStandard = true;
578         fMineBlocksOnDemand = false;
579         fTestnetToBeDeprecatedFieldRPC = true;
580
581
582         checkpointData = (CCheckpointData) {
583             boost::assign::map_list_of
584             (0, consensus.hashGenesisBlock)
585             (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")),
586             1486897419,  // * UNIX timestamp of last checkpoint block
587             47163,       // * total number of transactions between genesis and last checkpoint
588                          //   (the tx=... number in the SetBestChain debug.log lines)
589             715          //   total number of tx / (checkpoint block height / (24 * 24))
590         };
591
592         /*
593         // Hardcoded fallback value for the Sprout shielded value pool balance
594         // for nodes that have not reindexed since the introduction of monitoring
595         // in #2795.
596         nSproutValuePoolCheckpointHeight = 440329;
597         nSproutValuePoolCheckpointBalance = 40000029096803;
598         fZIP209Enabled = true;
599         hashSproutValuePoolCheckpointBlock = uint256S("000a95d08ba5dcbabe881fc6471d11807bcca7df5f1795c99f3ec4580db4279b");
600
601         // Founders reward script expects a vector of 2-of-3 multisig addresses
602         vFoundersRewardAddress = {
603             "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
604             "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9", 
605             "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo", 
606             "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK", 
607             "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC", 
608             "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH", 
609             "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a", 
610             "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J", 
611             "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t", 
612             "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy", 
613             "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4", 
614             "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt", 
615             };
616         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight(0));
617         */
618     }
619 };
620 static CTestNetParams testNetParams;
621
622 /**
623  * Regression test
624  */
625 class CRegTestParams : public CChainParams {
626 public:
627     CRegTestParams() {
628         strNetworkID = "regtest";
629         strCurrencyUnits = "REG";
630         bip44CoinType = 1;
631         consensus.fCoinbaseMustBeProtected = false;
632         consensus.nSubsidySlowStartInterval = 0;
633         consensus.nPreBlossomSubsidyHalvingInterval = Consensus::PRE_BLOSSOM_REGTEST_HALVING_INTERVAL;
634         consensus.nPostBlossomSubsidyHalvingInterval = Consensus::POST_BLOSSOM_REGTEST_HALVING_INTERVAL;
635         consensus.nMajorityEnforceBlockUpgrade = 750;
636         consensus.nMajorityRejectBlockOutdated = 950;
637         consensus.nMajorityWindow = 1000;
638         const size_t N = 48, K = 5;
639         BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
640         consensus.nEquihashN = N;
641         consensus.nEquihashK = K;
642         consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
643         consensus.powAlternate = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
644         consensus.nPowAveragingWindow = 17;
645         consensus.nMaxFutureBlockTime = 7 * 60; // 7 mins
646         assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
647         consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
648         consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
649         consensus.nPreBlossomPowTargetSpacing = Consensus::PRE_BLOSSOM_POW_TARGET_SPACING;
650         consensus.nPostBlossomPowTargetSpacing = Consensus::POST_BLOSSOM_POW_TARGET_SPACING;
651         consensus.nPowAllowMinDifficultyBlocksAfterHeight = 0;
652         consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
653         consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
654             Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
655         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
656         consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
657             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
658         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
659         consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight =
660             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
661         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170006;
662         consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight =
663             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
664         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nProtocolVersion = 170008;
665         consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nActivationHeight =
666             Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
667
668         // The best chain should have at least this much work.
669         consensus.nMinimumChainWork = uint256S("0x00");
670
671         pchMessageStart[0] = 0xaa;
672         pchMessageStart[1] = 0x8e;
673         pchMessageStart[2] = 0xf3;
674         pchMessageStart[3] = 0xf5;
675         nMinerThreads = 1;
676         nMaxTipAge = 24 * 60 * 60;
677         nPruneAfterHeight = 1000;
678         
679         genesis = CreateGenesisBlock(
680             1296688602,
681             uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"),
682             ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"),
683
684
685             KOMODO_MINDIFF_NBITS, 4, 0);
686         consensus.hashGenesisBlock = genesis.GetHash();
687         assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
688         assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
689
690         nDefaultPort = 17779;
691         nPruneAfterHeight = 1000;
692
693         vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
694         vSeeds.clear();  //! Regtest mode doesn't have any DNS seeds.
695
696         fMiningRequiresPeers = false;
697         fDefaultConsistencyChecks = true;
698         fRequireStandard = false;
699         fMineBlocksOnDemand = true;
700         fTestnetToBeDeprecatedFieldRPC = false;
701
702         checkpointData = (CCheckpointData){
703             boost::assign::map_list_of
704             ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
705             0,
706             0,
707             0
708         };
709         // These prefixes are the same as the testnet prefixes
710         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,60);
711         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,85);
712         base58Prefixes[IDENTITY_ADDRESS] = std::vector<unsigned char>(1,102);
713         base58Prefixes[INDEX_ADDRESS] = std::vector<unsigned char>(1,137);
714         base58Prefixes[QUANTUM_ADDRESS] = std::vector<unsigned char>(1,58);
715         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,188);
716         //base58Prefixes[PUBKEY_ADDRESS]     = {0x1D,0x25};
717         //base58Prefixes[SCRIPT_ADDRESS]     = {0x1C,0xBA};
718         //base58Prefixes[SECRET_KEY]         = {0xEF};
719         // do not rely on these BIP32 prefixes; they are not specified and may change
720         base58Prefixes[EXT_PUBLIC_KEY]     = {0x04,0x35,0x87,0xCF};
721         base58Prefixes[EXT_SECRET_KEY]     = {0x04,0x35,0x83,0x94};
722         base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
723         base58Prefixes[ZCVIEWING_KEY]      = {0xA8,0xAC,0x0C};
724         base58Prefixes[ZCSPENDING_KEY]     = {0xAC,0x08};
725
726         bech32HRPs[SAPLING_PAYMENT_ADDRESS]      = "zregtestsapling";
727         bech32HRPs[SAPLING_FULL_VIEWING_KEY]     = "zviewregtestsapling";
728         bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivkregtestsapling";
729         bech32HRPs[SAPLING_EXTENDED_SPEND_KEY]   = "secret-extended-key-regtest";
730
731         // Founders reward script expects a vector of 2-of-3 multisig addresses
732         vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
733         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight(0));
734     }
735
736     void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
737     {
738         assert(idx > Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES);
739         consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
740     }
741
742     void UpdateRegtestPow(int64_t nPowMaxAdjustDown, int64_t nPowMaxAdjustUp, uint256 powLimit)
743     {
744         consensus.nPowMaxAdjustDown = nPowMaxAdjustDown;
745         consensus.nPowMaxAdjustUp = nPowMaxAdjustUp;
746         consensus.powLimit = powLimit;
747     }
748
749     void SetRegTestZIP209Enabled() {
750         fZIP209Enabled = true;
751     }
752 };
753 static CRegTestParams regTestParams;
754
755 static CChainParams *pCurrentParams = 0;
756
757 const CChainParams &Params() {
758     // the only reason this should occur is before initialization to convert addresses
759     // we don't use others besides main, and the only risk in returning it would be something else not initialized
760     if (!pCurrentParams)
761     {
762         return mainParams;
763     }
764     return *pCurrentParams;
765 }
766
767 void DisableCoinbaseMustBeProtected()
768 {
769     CChainParams &curParams = pCurrentParams ? *pCurrentParams : mainParams;
770     curParams.DisableCoinbaseMustBeProtected();
771 }
772
773 void EnableCoinbaseMustBeProtected()
774 {
775     CChainParams &curParams = pCurrentParams ? *pCurrentParams : mainParams;
776     curParams.EnableCoinbaseMustBeProtected();
777 }
778
779 bool AreParamsInitialized()
780 {
781     return (pCurrentParams != NULL);
782 }
783
784 CChainParams &Params(CBaseChainParams::Network network) {
785     switch (network) {
786         case CBaseChainParams::MAIN:
787             return mainParams;
788         case CBaseChainParams::TESTNET:
789             return testNetParams;
790         case CBaseChainParams::REGTEST:
791             return regTestParams;
792         default:
793             assert(false && "Unimplemented network");
794             return mainParams;
795     }
796 }
797
798 void SelectParams(CBaseChainParams::Network network) {
799     SelectBaseParams(network);
800     pCurrentParams = &Params(network);
801
802     // Some python qa rpc tests need to enforce the coinbase consensus rule
803     if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
804         regTestParams.SetRegTestCoinbaseMustBeProtected();
805     }
806
807     // When a developer is debugging turnstile violations in regtest mode, enable ZIP209
808     if (network == CBaseChainParams::REGTEST && mapArgs.count("-developersetpoolsizezero")) {
809         regTestParams.SetRegTestZIP209Enabled();
810     }
811 }
812
813 bool SelectParamsFromCommandLine()
814 {
815     CBaseChainParams::Network network = NetworkIdFromCommandLine();
816     if (network == CBaseChainParams::MAX_NETWORK_TYPES)
817         return false;
818
819     SelectParams(network);
820
821     return true;
822 }
823
824
825 // Block height must be >0 and <=last founders reward block height
826 // Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
827 std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
828     int preBlossomMaxHeight = consensus.GetLastFoundersRewardBlockHeight(0);
829     // zip208
830     // FounderAddressAdjustedHeight(height) :=
831     // height, if not IsBlossomActivated(height)
832     // BlossomActivationHeight + floor((height - BlossomActivationHeight) / BlossomPoWTargetSpacingRatio), otherwise
833     bool blossomActive = consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_BLOSSOM);
834     if (blossomActive) {
835         int blossomActivationHeight = consensus.vUpgrades[Consensus::UPGRADE_BLOSSOM].nActivationHeight;
836         nHeight = blossomActivationHeight + ((nHeight - blossomActivationHeight) / Consensus::BLOSSOM_POW_TARGET_SPACING_RATIO);
837     }
838     assert(nHeight > 0 && nHeight <= preBlossomMaxHeight);
839     size_t addressChangeInterval = (preBlossomMaxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
840     size_t i = nHeight / addressChangeInterval;
841     return vFoundersRewardAddress[i];
842 }
843
844 // Block height must be >0 and <=last founders reward block height
845 // The founders reward address is expected to be a multisig (P2SH) address
846 CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
847     assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight(nHeight));
848
849     CTxDestination address = DecodeDestination(GetFoundersRewardAddressAtHeight(nHeight).c_str());
850     assert(IsValidDestination(address));
851     assert(boost::get<CScriptID>(&address) != nullptr);
852     CScriptID scriptID = boost::get<CScriptID>(address); // address is a boost variant
853     CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
854     return script;
855 }
856
857 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
858     assert(i >= 0 && i < vFoundersRewardAddress.size());
859     return vFoundersRewardAddress[i];
860 }
861
862 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
863 {
864     regTestParams.UpdateNetworkUpgradeParameters(idx, nActivationHeight);
865 }
866
867 void UpdateRegtestPow(int64_t nPowMaxAdjustDown, int64_t nPowMaxAdjustUp, uint256 powLimit) {
868     regTestParams.UpdateRegtestPow(nPowMaxAdjustDown, nPowMaxAdjustUp, powLimit);
869 }
This page took 0.08099 seconds and 4 git commands to generate.