Skip to content

Commit

Permalink
Replace softfork settings for dip20 activation with v17 activation ha…
Browse files Browse the repository at this point in the history
…rd fork param

- Set testnet fork block
  • Loading branch information
celbalrai authored and ckti committed Apr 25, 2022
1 parent 1a5b627 commit 34ce372
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 83 deletions.
84 changes: 25 additions & 59 deletions src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,16 +360,16 @@ class CMainParams : public CChainParams {
consensus.nGovernanceMinQuorum = 10;
consensus.nGovernanceFilterElements = 20000;
consensus.nMasternodeMinimumConfirmations = 15;
consensus.V16DeploymentHeight = 99999999;
consensus.V17DeploymentHeight = 99999999;
consensus.BIP34Height = 1;
consensus.BIP34Hash = uint256S("000001364c4ed20f1b240810b5aa91fee23ae9b64b6e746b594b611cf6d8c87b");
consensus.BIP65Height = consensus.V16DeploymentHeight;
consensus.BIP65Height = consensus.V17DeploymentHeight;
consensus.BIP66Height = 1; // 000002f68dbbf1fcfacb8f0b4e64083efdd2f07a906728ee068d573ffa5bcb4e
consensus.DIP0001Height = consensus.V16DeploymentHeight;
consensus.DIP0003Height = consensus.V16DeploymentHeight;
consensus.DIP0001Height = consensus.V17DeploymentHeight;
consensus.DIP0003Height = consensus.V17DeploymentHeight;
// consensus.DIP0003EnforcementHeight = std::numeric_limits<int>::max();
consensus.DIP0003EnforcementHash = uint256();
consensus.DIP0008Height = consensus.V16DeploymentHeight;
consensus.DIP0008Height = consensus.V17DeploymentHeight;
consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
consensus.nPowTargetTimespan = 24 * 60 * 60; // Wagerr: 1 day
consensus.nPowTargetSpacing = 1 * 60; // Wagerr: 1 minute
Expand All @@ -379,7 +379,7 @@ class CMainParams : public CChainParams {
// Wagerr specific parameters
// Proof of Stake parameters
consensus.nPosStartHeight = 201;
consensus.nBlockTimeProtocolV2 = consensus.V16DeploymentHeight;
consensus.nBlockTimeProtocolV2 = consensus.V17DeploymentHeight;
consensus.posLimit = uint256S("000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 24
consensus.posLimit_V2 = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
consensus.nTimeSlotLength = 15;
Expand All @@ -389,10 +389,10 @@ class CMainParams : public CChainParams {
consensus.nStakeMinDepth = 600;
consensus.nStakeMinAge = 60 * 60; // 1 hour
consensus.nBlockStakeModifierV1A = 1000;
consensus.nBlockStakeModifierV2 = consensus.V16DeploymentHeight;
consensus.nBlockStakeModifierV2 = consensus.V17DeploymentHeight;
consensus.strCarbonOffsetAddress = "sYG1qGUtbTdNRYtFsKvnY3GvuauF3eVwhT";
// ATP parameters
consensus.ATPStartHeight = consensus.V16DeploymentHeight;
consensus.ATPStartHeight = consensus.V17DeploymentHeight;
consensus.WagerrAddrPrefix = "wagerr";
consensus.strTokenManagementKey = "sYG1qGUtbTdNRYtFsKvnY3GvuauF3eVwhT";
consensus.nOpGroupNewRequiredConfirmations = 1;
Expand Down Expand Up @@ -421,15 +421,6 @@ class CMainParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

// Deployment of DIP0020, DIP0021 and LLMQ_20_70 quorums
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].bit = 6;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nStartTime = 1625097600; // July 1st, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nTimeout = 1656633600; // July 1st, 2022
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nWindowSize = 4032;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdStart = 3226; // 80% of 4032
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdMin = 2420; // 60% of 4032
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nFalloffCoeff = 5; // this corresponds to 10 periods

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000d582cb44b331457f3f0"); // 1515952

Expand Down Expand Up @@ -554,16 +545,16 @@ class CTestNetParams : public CChainParams {
consensus.nGovernanceMinQuorum = 1;
consensus.nGovernanceFilterElements = 500;
consensus.nMasternodeMinimumConfirmations = 1;
consensus.V16DeploymentHeight = 99999999;
consensus.V17DeploymentHeight = 826130;
consensus.BIP34Height = 1;
consensus.BIP34Hash = uint256S("0000065432f43b3efb23bd0f63fe33d00d02a5f36233fe1b982c08274d58ef12");
consensus.BIP65Height = consensus.V16DeploymentHeight;
consensus.BIP65Height = consensus.V17DeploymentHeight;
consensus.BIP66Height = 1; // 0000065432f43b3efb23bd0f63fe33d00d02a5f36233fe1b982c08274d58ef12
consensus.DIP0001Height = consensus.V16DeploymentHeight;
consensus.DIP0003Height = consensus.V16DeploymentHeight;
consensus.DIP0001Height = consensus.V17DeploymentHeight;
consensus.DIP0003Height = consensus.V17DeploymentHeight;
// consensus.DIP0003EnforcementHeight = std::numeric_limits<int>::max();
consensus.DIP0003EnforcementHash = uint256();
consensus.DIP0008Height = consensus.V16DeploymentHeight;
consensus.DIP0008Height = consensus.V17DeploymentHeight;
consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
consensus.nPowTargetTimespan = 24 * 60 * 60; // Wagerr: 1 day
consensus.nPowTargetSpacing = 1 * 60; // Wagerr: 1 minute
Expand All @@ -573,7 +564,7 @@ class CTestNetParams : public CChainParams {
// Wagerr specific parameters
// Proof of Stake parameters
consensus.nPosStartHeight = 201;
consensus.nBlockTimeProtocolV2 = consensus.V16DeploymentHeight;
consensus.nBlockTimeProtocolV2 = consensus.V17DeploymentHeight;
consensus.posLimit = uint256S("000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 24
consensus.posLimit_V2 = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
consensus.nTimeSlotLength = 15;
Expand All @@ -583,10 +574,10 @@ class CTestNetParams : public CChainParams {
consensus.nStakeMinDepth = 100;
consensus.nStakeMinAge = 60 * 60; // 1 hour
consensus.nBlockStakeModifierV1A = 51197;
consensus.nBlockStakeModifierV2 = std::numeric_limits<int>::max();
consensus.nBlockStakeModifierV2 = 826130;
consensus.strCarbonOffsetAddress = "TkDutp66Ygp5PpPnrETvfyrtnxq5UevLpo";
// ATP parameters
consensus.ATPStartHeight = consensus.V16DeploymentHeight;
consensus.ATPStartHeight = consensus.V17DeploymentHeight;
consensus.WagerrAddrPrefix = "wagerrtest";
consensus.strTokenManagementKey = "TkDutp66Ygp5PpPnrETvfyrtnxq5UevLpo";
consensus.nOpGroupNewRequiredConfirmations = 1;
Expand Down Expand Up @@ -614,15 +605,6 @@ class CTestNetParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

// Deployment of DIP0020, DIP0021 and LLMQ_20_70 quorums
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].bit = 6;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nStartTime = 1606780800; // December 1st, 2020
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nTimeout = 1638316800; // December 1st, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nWindowSize = 100;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdStart = 80; // 80% of 100
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdMin = 60; // 60% of 100
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nFalloffCoeff = 5; // this corresponds to 10 periods

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000000000000"); // 0

Expand Down Expand Up @@ -734,7 +716,7 @@ class CDevNetParams : public CChainParams {
consensus.nGovernanceMinQuorum = 1;
consensus.nGovernanceFilterElements = 500;
consensus.nMasternodeMinimumConfirmations = 1;
consensus.V16DeploymentHeight = 1;
consensus.V17DeploymentHeight = 1;
consensus.BIP34Height = 1; // BIP34 activated immediately on devnet
consensus.BIP65Height = 1; // BIP65 activated immediately on devnet
consensus.BIP66Height = 1; // BIP66 activated immediately on devnet
Expand All @@ -752,7 +734,7 @@ class CDevNetParams : public CChainParams {
// Wagerr specific parameters
// Proof of Stake parameters
consensus.nPosStartHeight = 201;
consensus.nBlockTimeProtocolV2 = consensus.V16DeploymentHeight;
consensus.nBlockTimeProtocolV2 = consensus.V17DeploymentHeight;
consensus.posLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
consensus.posLimit_V2 = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
consensus.nTimeSlotLength = 15;
Expand All @@ -762,10 +744,10 @@ class CDevNetParams : public CChainParams {
consensus.nStakeMinDepth = 100;
consensus.nStakeMinAge = 60 * 60; // 1 hour
consensus.nBlockStakeModifierV1A = 1000;
consensus.nBlockStakeModifierV2 = consensus.V16DeploymentHeight;
consensus.nBlockStakeModifierV2 = consensus.V17DeploymentHeight;
consensus.strCarbonOffsetAddress = "TkDutp66Ygp5PpPnrETvfyrtnxq5UevLpo";
// ATP parameters
consensus.ATPStartHeight = consensus.V16DeploymentHeight;
consensus.ATPStartHeight = consensus.V17DeploymentHeight;
consensus.WagerrAddrPrefix = "wagerrtest";
consensus.strTokenManagementKey = "TkDutp66Ygp5PpPnrETvfyrtnxq5UevLpo";
consensus.nOpGroupNewRequiredConfirmations = 1;
Expand Down Expand Up @@ -794,15 +776,6 @@ class CDevNetParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

// Deployment of DIP0020, DIP0021 and LLMQ_20_70 quorums
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].bit = 6;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nStartTime = 1604188800; // November 1st, 2020
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nTimeout = 1635724800; // November 1st, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nWindowSize = 100;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdStart = 80; // 80% of 100
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdMin = 60; // 60% of 100
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nFalloffCoeff = 5; // this corresponds to 10 periods

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000000000000000");

Expand Down Expand Up @@ -908,10 +881,10 @@ class CRegTestParams : public CChainParams {
consensus.nGovernanceMinQuorum = 1;
consensus.nGovernanceFilterElements = 100;
consensus.nMasternodeMinimumConfirmations = 1;
consensus.V16DeploymentHeight = 300;
consensus.V17DeploymentHeight = 300;
consensus.BIP34Height = 100000000; // BIP34 has not activated on regtest (far in the future so block v1 are not rejected in tests)
consensus.BIP34Hash = uint256();
consensus.BIP65Height = consensus.V16DeploymentHeight; // BIP65 activated on regtest (Used in rpc activation tests)
consensus.BIP65Height = consensus.V17DeploymentHeight; // BIP65 activated on regtest (Used in rpc activation tests)
consensus.BIP66Height = 1251; // BIP66 activated on regtest (Used in rpc activation tests)
consensus.DIP0001Height = 2000;
consensus.DIP0003Height = 210;
Expand All @@ -927,7 +900,7 @@ class CRegTestParams : public CChainParams {
// Wagerr specific parameters
// Proof of Stake parameters
consensus.nPosStartHeight = 201;
consensus.nBlockTimeProtocolV2 = consensus.V16DeploymentHeight;
consensus.nBlockTimeProtocolV2 = consensus.V17DeploymentHeight;
consensus.posLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
consensus.posLimit_V2 = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
consensus.nTimeSlotLength = 15;
Expand All @@ -937,10 +910,10 @@ class CRegTestParams : public CChainParams {
consensus.nStakeMinDepth = 1;
consensus.nStakeMinAge = 0;
consensus.nBlockStakeModifierV1A = consensus.nPosStartHeight;
consensus.nBlockStakeModifierV2 = consensus.V16DeploymentHeight;
consensus.nBlockStakeModifierV2 = consensus.V17DeploymentHeight;
consensus.strCarbonOffsetAddress = "TqMgq4qkw7bGxf6CDhtDfEqzEtWD5C7x8U";
// ATP parameters
consensus.ATPStartHeight = consensus.V16DeploymentHeight;
consensus.ATPStartHeight = consensus.V17DeploymentHeight;
consensus.WagerrAddrPrefix = "wagerrreg";
consensus.strTokenManagementKey = "TqMgq4qkw7bGxf6CDhtDfEqzEtWD5C7x8U";
consensus.nOpGroupNewRequiredConfirmations = 1;
Expand Down Expand Up @@ -968,13 +941,6 @@ class CRegTestParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 25;
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 999999999999ULL;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].bit = 6;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nStartTime = 0;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nTimeout = 999999999999ULL;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nWindowSize = 100;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdStart = 80;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nThresholdMin = 60;
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0020].nFalloffCoeff = 5;

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x00");
Expand Down
3 changes: 1 addition & 2 deletions src/consensus/params.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ namespace Consensus {
enum DeploymentPos
{
DEPLOYMENT_TESTDUMMY,
DEPLOYMENT_DIP0020, // Deployment of DIP0020, DIP0021 and LMQ_20_70 quorums
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
MAX_VERSION_BITS_DEPLOYMENTS
};
Expand Down Expand Up @@ -145,7 +144,7 @@ struct Params {
int nGovernanceFilterElements;
int nMasternodeMinimumConfirmations;
/** Deployment of v16 Hard Fork */
int V16DeploymentHeight;
int V17DeploymentHeight;
/** Block height and hash at which BIP34 becomes active */
int BIP34Height;
uint256 BIP34Hash;
Expand Down
2 changes: 1 addition & 1 deletion src/llmq/quorums_instantsend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ void CInstantSendManager::UpdatedBlockTip(const CBlockIndex* pindexNew)
{
if (!fUpgradedDB) {
LOCK(cs_main);
if (VersionBitsState(pindexNew, Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0020, versionbitscache) == ThresholdState::ACTIVE) {
if (pindexNew->nHeight >= Params().GetConsensus().V17DeploymentHeight) {
db.Upgrade();
fUpgradedDB = true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/llmq/quorums_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ bool CLLMQUtils::IsQuorumTypeEnabled(Consensus::LLMQType llmqType, const CBlockI
LOCK(cs_llmq_vbc);

const Consensus::Params& consensusParams = Params().GetConsensus();
bool f_dip0020_Active = VersionBitsState(pindex, consensusParams, Consensus::DEPLOYMENT_DIP0020, llmq_versionbitscache) == ThresholdState::ACTIVE;
bool f_dip0020_Active = pindex->nHeight >= consensusParams.V17DeploymentHeight;

switch (llmqType)
{
Expand Down
4 changes: 2 additions & 2 deletions src/miner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
bool fDIP0003Active_context = nHeight >= chainparams.GetConsensus().DIP0003Height;
bool fDIP0008Active_context = nHeight >= chainparams.GetConsensus().DIP0008Height;

pblock->nVersion = nHeight >= chainparams.GetConsensus().V16DeploymentHeight ?
pblock->nVersion = nHeight >= chainparams.GetConsensus().V17DeploymentHeight ?
ComputeBlockVersion(pindexPrev, chainparams.GetConsensus(), fPos, chainparams.BIP9CheckMasternodesUpgraded())
: VERSIONBITS_LAST_OLD_BLOCK_VERSION;
// -regtest only: allow overriding block.nVersion with
Expand Down Expand Up @@ -328,7 +328,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
pblock->nNonce = 0;
if (nHeight < chainparams.GetConsensus().V16DeploymentHeight)
if (nHeight < chainparams.GetConsensus().V17DeploymentHeight)
pblock->nAccumulatorCheckpoint = pindexPrev ? pindexPrev->nAccumulatorCheckpoint : uint256();
pblocktemplate->nPrevBits = pindexPrev->nBits;
pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(*pblock->vtx[0]);
Expand Down
20 changes: 10 additions & 10 deletions src/pos/rewards.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ CAmount GetBlockSubsidyWagerr(const int nPrevHeight, const bool fPos, const Cons
CAmount nSubsidy = 0;
int nHeight = nPrevHeight + 1;

if (nHeight >= consensusParams.V16DeploymentHeight + 4 * 513000) return 260 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 3 * 513000) return 520 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 2 * 513000) return 770 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 513000) return 1000 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight) return 1210 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 4 * 513000) return 260 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 3 * 513000) return 520 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 2 * 513000) return 770 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 513000) return 1000 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight) return 1210 * COIN;
if (nHeight >= 107624) return 2710 * COIN;
if (nHeight >= 67004) return 0 * COIN;
if (nHeight >= 67001) return 2850000000 * COIN;
Expand All @@ -31,11 +31,11 @@ CAmount GetBlockSubsidyWagerr(const int nPrevHeight, const bool fPos, const Cons
}

CAmount GetMasternodePayment(int nHeight, CAmount blockValue, bool isZWGRStake, const Consensus::Params& consensusParams) {
if (nHeight >= consensusParams.V16DeploymentHeight + 4 * 513000) return 156 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 3 * 513000) return 312 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 2 * 513000) return 462 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight + 513000) return 600 * COIN;
if (nHeight >= consensusParams.V16DeploymentHeight) return 726 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 4 * 513000) return 156 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 3 * 513000) return 312 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 2 * 513000) return 462 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight + 513000) return 600 * COIN;
if (nHeight >= consensusParams.V17DeploymentHeight) return 726 * COIN;
if (nHeight >= consensusParams.nBlockZerocoinV2 && !isZWGRStake) return blockValue > 2440 * COIN ? 2440 * COIN : 0;
if (nHeight >= consensusParams.nBlockZerocoinV2 && isZWGRStake) return blockValue > 2410 * COIN ? 2410 * COIN : 0;
if (nHeight >= consensusParams.nPosStartHeight) return blockValue > 2440 * COIN ? 2440 * COIN : 0;
Expand Down
Loading

0 comments on commit 34ce372

Please sign in to comment.