public const decimal COIN = 1.0M;
public static decimal GetStakingReward(int height) =>
GetBlockValue(height) - GetMasternodePayment(height);
public static decimal GetBlockValue(int nHeight) {
if (nHeight > 1700000) return 80.00M * COIN;
if (nHeight > 1600000) return 120.00M * COIN;
if (nHeight > 1500000) return 140.00M * COIN;
if (nHeight > 1400000) return 220.00M * COIN;
if (nHeight > 1300000) return 300.00M * COIN;
if (nHeight > 1200000) return 380.00M * COIN;
if (nHeight > 1100000) return 440.00M * COIN;
if (nHeight > 1000000) return 600.00M * COIN;
if (nHeight > 900000) return 700.00M * COIN;
if (nHeight > 800000) return 440.00M * COIN;
if (nHeight > 700000) return 300.00M * COIN;
if (nHeight > 600000) return 140.00M * COIN;
if (nHeight > 525000) return 80.00M * COIN;
if (nHeight > 500000) return 60.00M * COIN;
if (nHeight > 350000) return 25.00M * COIN;
if (nHeight > 292500) return 4.50M * COIN;
if (nHeight > 292000) return 1005.50M * COIN;
if (nHeight > 210241) return 4.50M * COIN;
if (nHeight > 1) return 5.00M * COIN;
if (nHeight > 0) return 180000.00M * COIN;
public static decimal GetMasternodeNodeCollateral(int nHeight) {
if (nHeight > 900000) return 10000 * COIN;
if (nHeight > 800000) return 7000 * COIN;
if (nHeight > 700000) return 5000 * COIN;
if (nHeight > 600000) return 3000 * COIN;
if (nHeight > 500000) return 2000 * COIN;
public static decimal GetMasternodePayment(int nHeight) {
if (nHeight > 525000) return GetBlockValue(nHeight) * 65 / 100;
if (nHeight > 292500) return GetBlockValue(nHeight) * 80 / 100;
if (nHeight > 292000) return 1001 * COIN;
if (nHeight > 200) return GetBlockValue(nHeight) * 80 / 100;
public static (decimal, decimal, decimal) GetBlockRewards(int height) =>
GetStakingReward(height),
GetMasternodePayment(height)
public static decimal GetMasternodeROI(int height, int blocksPerDay, int numberOfMasternodes) =>
GetMasternodePayment(height) * blocksPerDay * 365
GetMasternodeNodeCollateral(height)
public static void Main()
Console.WriteLine("Block;Collateral;Block Reward;MN Reward %;Staking Reward %;MN Reward;Staker Reward;Coin Supply");
var prevBlockReward = 0M;
var prevStakingReward = 0M;
var prevMasternodeReward = 0M;
for(var height = 1; height < 2000000; height++) {
) = GetBlockRewards(height);
coinSupply += blockReward;
var collateral = GetMasternodeNodeCollateral(height);
if(prevCollateral != collateral || prevBlockReward != blockReward ||
prevStakingReward != stakingReward || prevMasternodeReward != masternodeReward)
"{0:N0};{1:N0};{2:N2};{3:N0};{4:N0};{5:N2};{6:N2};{7:N0}M",
(masternodeReward / blockReward) * 100,
(stakingReward / blockReward) * 100,
prevCollateral = collateral;
prevBlockReward = blockReward;
prevStakingReward = stakingReward;
prevMasternodeReward = masternodeReward;