diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 759c3f362552..a22b9eb4c142 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -271,16 +271,16 @@ func (w *wizard) makeGenesis() { blocksPerYear := 31536000 / genesis.Config.XDPoS.Period epochsPerYear := blocksPerYear / genesis.Config.XDPoS.Epoch if epochsPerYear > 0 { - rewardsPerYear := float64(threshold) * (float64(yield) / float64(100)) - rewardPerEpochPerMN := uint64(rewardsPerYear / float64(epochsPerYear)) - totalRewardPerEpoch := rewardPerEpochPerMN * uint64(len(signers)) + rewardsPerYear := float64(threshold) * (float64(yield) / 100) + rewardPerEpochPerMNWithoutFoundation := rewardsPerYear / float64(epochsPerYear) + rewardPerEpochPerMN := float64(rewardPerEpochPerMNWithoutFoundation) * 100 / float64(100-common.RewardFoundationPercent) + totalRewardPerEpoch := float64(rewardPerEpochPerMN) * float64(len(signers)) fmt.Println() - fmt.Println("Calculated Total Masternode rewards per epoch based on yield: ", totalRewardPerEpoch) - genesis.Config.XDPoS.Reward = totalRewardPerEpoch - genesis.Config.XDPoS.V2.CurrentConfig.MasternodeReward = math.Round(float64(rewardPerEpochPerMN)*1000) / 1000 - genesis.Config.XDPoS.V2.CurrentConfig.ProtectorReward = math.Round(float64(rewardPerEpochPerMN)*0.8*1000) / 1000 - genesis.Config.XDPoS.V2.CurrentConfig.ObserverReward = math.Round(float64(rewardPerEpochPerMN)*0.6*1000) / 1000 - + fmt.Println("Calculated Total Masternode rewards per epoch based on yield: ", uint64(math.Round(totalRewardPerEpoch))) + genesis.Config.XDPoS.Reward = uint64(math.Round(totalRewardPerEpoch)) + genesis.Config.XDPoS.V2.CurrentConfig.MasternodeReward = math.Round(rewardPerEpochPerMN*10000) / 10000 + genesis.Config.XDPoS.V2.CurrentConfig.ProtectorReward = math.Round(rewardPerEpochPerMN*0.8*10000) / 10000 + genesis.Config.XDPoS.V2.CurrentConfig.ObserverReward = math.Round(rewardPerEpochPerMN*0.4*10000) / 10000 } } @@ -288,6 +288,11 @@ func (w *wizard) makeGenesis() { fmt.Println("What is foundation wallet address (collect 10% of all rewards)? (default = xdc0000000000000000000000000000000000000068)") if input == nil { genesis.Config.XDPoS.FoundationWalletAddr = w.readDefaultAddress(common.FoundationAddrBinary) + } else { + if !common.IsHexAddress(input.FoundationWalletAddress) { + log.Crit("Invalid foundation wallet address", "address", input.FoundationWalletAddress) + } + genesis.Config.XDPoS.FoundationWalletAddr = common.HexToAddress(input.FoundationWalletAddress) } // Validator Smart Contract Code diff --git a/core/genesis_setup_test.go b/core/genesis_setup_test.go index 0bec6e73bf81..3a20fd7b1735 100644 --- a/core/genesis_setup_test.go +++ b/core/genesis_setup_test.go @@ -34,6 +34,10 @@ func TestSetupGenesisNormalizesLocalnetChainConfig(t *testing.T) { TIPXDCXReceiverDisableBlock: big.NewInt(12), EIP1559Block: big.NewInt(12), CancunBlock: big.NewInt(34), + PragueBlock: big.NewInt(34), + DynamicGasLimitBlock: big.NewInt(34), + TIPUpgradeRewardBlock: big.NewInt(34), + TIPUpgradePenaltyBlock: big.NewInt(34), TRC21IssuerSMC: params.LocalnetChainConfig.TRC21IssuerSMC, XDCXListingSMC: params.LocalnetChainConfig.XDCXListingSMC, RelayerRegistrationSMC: params.LocalnetChainConfig.RelayerRegistrationSMC, @@ -73,8 +77,11 @@ func TestSetupGenesisNormalizesLocalnetChainConfig(t *testing.T) { if cfg.Ethash == nil { t.Fatal("expected non-whitelisted fields to be preserved") } - if cfg.PragueBlock != nil || cfg.DynamicGasLimitBlock != nil || cfg.TIPUpgradeRewardBlock != nil { - t.Fatalf("unexpected localnet whitelist fields: Prague=%v DynamicGasLimit=%v TIPUpgradeReward=%v", cfg.PragueBlock, cfg.DynamicGasLimitBlock, cfg.TIPUpgradeRewardBlock) + if cfg.PragueBlock == nil || cfg.PragueBlock.Cmp(big.NewInt(34)) != 0 { + t.Fatalf("unexpected preserved Prague block: have %v want 34", cfg.PragueBlock) + } + if cfg.OsakaBlock != nil || cfg.TIPEpochHalvingBlock != nil { + t.Fatalf("unexpected localnet whitelist fields: Osaka=%v TIPEpochHalving=%v", cfg.OsakaBlock, cfg.TIPEpochHalvingBlock) } if cfg.LondonBlock == nil || cfg.LondonBlock.Cmp(big.NewInt(12)) != 0 { t.Fatalf("unexpected localnet London block: have %v want 12", cfg.LondonBlock) diff --git a/params/config_networks.go b/params/config_networks.go index ee500cdcb0bf..d6058bf4e8b7 100644 --- a/params/config_networks.go +++ b/params/config_networks.go @@ -200,7 +200,7 @@ var ( LocalnetV2Configs = map[uint64]*V2Config{ defaultV2SwitchRound: { MaxMasternodes: 108, - MaxProtectorNodes: 324, + MaxProtectorNodes: 432, MaxObserverNodes: 2000, SwitchRound: 0, CertThreshold: 0.667, @@ -516,22 +516,18 @@ var ( TIPXDCXReceiverDisableBlock: big.NewInt(0), EIP1559Block: big.NewInt(0), CancunBlock: big.NewInt(0), - PragueBlock: nil, - // PragueBlock: big.NewInt(0), - OsakaBlock: nil, - DynamicGasLimitBlock: nil, - // DynamicGasLimitBlock: big.NewInt(0), - TIPUpgradeRewardBlock: nil, - // TIPUpgradeRewardBlock: big.NewInt(0), - TIPUpgradePenaltyBlock: nil, - // TIPUpgradePenaltyBlock: big.NewInt(0), - TIPEpochHalvingBlock: nil, - TRC21IssuerSMC: common.HexToAddress("0x8c0faeb5C6bEd2129b8674F262Fd45c4e9468bee"), - XDCXListingSMC: common.HexToAddress("0xDE34dD0f536170993E8CFF639DdFfCF1A85D3E53"), - RelayerRegistrationSMC: common.HexToAddress("0x16c63b79f9C8784168103C0b74E6A59EC2de4a02"), - LendingRegistrationSMC: common.HexToAddress("0x7d761afd7ff65a79e4173897594a194e3c506e57"), - Clique: nil, - Ethash: nil, + PragueBlock: big.NewInt(0), + OsakaBlock: nil, + DynamicGasLimitBlock: big.NewInt(0), + TIPUpgradeRewardBlock: big.NewInt(0), + TIPUpgradePenaltyBlock: big.NewInt(0), + TIPEpochHalvingBlock: nil, + TRC21IssuerSMC: common.HexToAddress("0x8c0faeb5C6bEd2129b8674F262Fd45c4e9468bee"), + XDCXListingSMC: common.HexToAddress("0xDE34dD0f536170993E8CFF639DdFfCF1A85D3E53"), + RelayerRegistrationSMC: common.HexToAddress("0x16c63b79f9C8784168103C0b74E6A59EC2de4a02"), + LendingRegistrationSMC: common.HexToAddress("0x7d761afd7ff65a79e4173897594a194e3c506e57"), + Clique: nil, + Ethash: nil, XDPoS: &XDPoSConfig{ Period: 2, Epoch: 900, @@ -738,15 +734,15 @@ var ( MergeBlock: big.NewInt(0), ShanghaiBlock: big.NewInt(0), Gas50xBlock: big.NewInt(0), - TIPXDCXMinerDisableBlock: nil, - TIPXDCXReceiverDisableBlock: nil, + TIPXDCXMinerDisableBlock: big.NewInt(0), + TIPXDCXReceiverDisableBlock: big.NewInt(0), EIP1559Block: big.NewInt(0), CancunBlock: big.NewInt(0), PragueBlock: big.NewInt(0), - OsakaBlock: big.NewInt(0), - DynamicGasLimitBlock: nil, - TIPUpgradeRewardBlock: nil, - TIPUpgradePenaltyBlock: nil, + OsakaBlock: nil, + DynamicGasLimitBlock: big.NewInt(0), + TIPUpgradeRewardBlock: big.NewInt(0), + TIPUpgradePenaltyBlock: big.NewInt(0), TIPEpochHalvingBlock: nil, TRC21IssuerSMC: common.HexToAddress("0x8c0faeb5C6bEd2129b8674F262Fd45c4e9468bee"), XDCXListingSMC: common.HexToAddress("0xDE34dD0f536170993E8CFF639DdFfCF1A85D3E53"), diff --git a/params/config_networks_test.go b/params/config_networks_test.go index 7887a3daea49..e6c6260e9a03 100644 --- a/params/config_networks_test.go +++ b/params/config_networks_test.go @@ -79,7 +79,11 @@ func TestXDPoSMockChainConfigDeclaresModernForks(t *testing.T) { assertBlock("EIP1559Block", config.EIP1559Block) assertBlock("CancunBlock", config.CancunBlock) assertBlock("PragueBlock", config.PragueBlock) - assertBlock("OsakaBlock", config.OsakaBlock) + assertBlock("DynamicGasLimitBlock", config.DynamicGasLimitBlock) + assertBlock("TIPUpgradeRewardBlock", config.TIPUpgradeRewardBlock) + assertBlock("TIPUpgradePenaltyBlock", config.TIPUpgradePenaltyBlock) + // assertBlock("OsakaBlock", config.OsakaBlock) + assert.Nil(t, config.OsakaBlock, "OsakaBlock must stay unscheduled on TestXDPoSMockChainConfig") } func TestXDCChainConfigsDeclareForkBlocks(t *testing.T) { @@ -216,11 +220,11 @@ func TestXDCChainConfigsDeclareForkBlocks(t *testing.T) { tipXDCXReceiverDisable: big.NewInt(0), eip1559Block: big.NewInt(0), cancunBlock: big.NewInt(0), - pragueBlock: nil, + pragueBlock: big.NewInt(0), osakaBlock: nil, - dynamicGasLimitBlock: nil, - tipUpgradeRewardBlock: nil, - tipUpgradePenaltyBlock: nil, + dynamicGasLimitBlock: big.NewInt(0), + tipUpgradeRewardBlock: big.NewInt(0), + tipUpgradePenaltyBlock: big.NewInt(0), tipEpochHalvingBlock: nil, }, }