#!/usr/bin/env perl # Copyright 2016-2020 The Hush developers # Released under the GPLv3 use warnings; use strict; my $supply = 0.0; my $block = 0; # Block 0 in Hush Smart chains is the BTC genesis block my $puposhis = 100_000_000; my $subsidy0 = 1_250_000_000; my $halvings = 0; my $initial = 6178674 * $puposhis; my $interval = 1_680_000; # ~4 years of 75s blocks my $stop = shift || -1; my $totalfr = 0; # total paid out to FR address if ($stop eq 'help' or $stop =~ m/-h/) { die < supply.csv ./hush_supply HEIGHT &> supply.csv # stop at HEIGHT # This will generate CSV in the form of: # block, supply, reward, subsidy, fr, totalfr, halvings HELP } printf "# block, supply, reward, subsidy, fr, totalfr, halvings\n"; # Block Reward Amounts in puposhis # The non-integral amounts cannot be represented exactly # 12.5 * 100000000 = 1250000000 # 12.5 * 100000000 / 2 = 625000000 # 12.5 * 100000000 / 4 = 312500000 # 12.5 * 100000000 / 8 = 156250000 # 12.5 * 100000000 / 16 = 78125000 # 12.5 * 100000000 / 32 = 39062500 # 12.5 * 100000000 / 64 = 19531250 # 12.5 * 100000000 / 128 = 9765625 # 12.5 * 100000000 / 256 = 4882812.5 # 12.5 * 100000000 / 512 = 2441406.25 # 12.5 * 100000000 / 1024 = 1220703.125 # 12.5 * 100000000 / 2048 = 610351.5625 # 12.5 * 100000000 / 4096 = 305175.78125 # 12.5 * 100000000 / 8192 = 152587.890625 # 12.5 * 100000000 / 16384 = 76293.9453125 # 12.5 * 100000000 / 32768 = 38146.97265625 # 12.5 * 100000000 / 65536 = 19073.486328125 # Hush Halving Heights and Block Rewards # 1,12500000000,340000 # 2,312500000,2020000 # 3,156250000,3700000 # 4,78125000,5380000 # 5,39062500,7060000 # 6,19531250,8740000 # 7,9765625,10420000 # 8,4882812,12100000 # 9,2441406,13780000 # 10,1220703,15460000 # 11,610351,17140000 # 12,305175,18820000 # 13,152587,20500000 # 14,76293,22180000 # 15,38146,23860000 # 16,19073,25540000 # 17,9536,27220000 # 18,4768,28900000 # 19,2384,30580000 # 20,1192,32260000 # 21,596,33940000 # 22,298,35620000 # 23,149,37300000 # 24,74,38980000 # 25,37,40660000 # 26,18,42340000 # 27,9,44020000 # 28,4,45700000 # 29,2,47380000 # 30,1,49060000 # 31,0,50740000 sub hush_block_reward { my $reward = 0; my $height = shift; my $halvings = 0; if ($height >= 50740000) { $reward = 0; $halvings = 31; } elsif ($height >= 49060000) { $reward = 1; $halvings = 30; } elsif ($height >= 47380000) { $reward = 1; $halvings = 29; } elsif ($height >= 45700000) { $reward = 2; $halvings = 28; } elsif ($height >= 44020000) { $reward = 4; $halvings = 27; } elsif ($height >= 42340000) { $reward = 9; $halvings = 26; } elsif ($height >= 40660000) { $reward = 18; $halvings = 25; } elsif ($height >= 38980000) { $reward = 37; $halvings = 24; } elsif ($height >= 37380000) { $reward = 74; $halvings = 23; } elsif ($height >= 35620000) { $reward = 149; $halvings = 22; } elsif ($height >= 33940000) { $reward = 298; $halvings = 21; } elsif ($height >= 32260001) { $reward = 596; $halvings = 20; } elsif ($height >= 30580000) { $reward = 1192; $halvings = 19; } elsif ($height >= 28900000) { $reward = 2384; $halvings = 18; } elsif ($height >= 27220000) { $reward = 4768; $halvings = 17; } elsif ($height >= 25540000) { $reward = 9536; $halvings = 16; } elsif ($height >= 23860000) { $reward = 19073; # 0.486328125 deviation $halvings = 15; } elsif ($height >= 22180000) { $reward = 38146; # 0.97265625 deviation $halvings = 14; } elsif ($height >= 20500000) { $reward = 76293; # 0.9453125 deviation $halvings = 13; } elsif ($height >= 18820000) { $reward = 152587; # 0.890625 deviation $halvings = 12; } elsif ($height >= 17140000) { $reward = 305175; # 0.78125sat deviation $halvings = 11; } elsif ($height >= 15460000) { $reward = 610351; # 0.5625sat deviation $halvings = 10; } elsif ($height >= 13780000) { $reward = 1220703; # 0.125sat deviation $halvings = 9 } elsif ($height >= 12100000) { $reward = 2441406; # 0.25sat deviation $halvings = 8 } elsif ($height >= 10420000) { $reward = 4882812; # 0.5sat deviation $halvings = 7; } elsif ($height >= 8740000) { $reward = 9765625; # last exact reward $halvings = 6; } elsif ($height >= 7060000) { $reward = 19531250; # 0.1953125 HUSH $halvings = 5; } elsif ($height >= 5380000) { $reward = 39062500; # 0.390625 HUSH $halvings = 4; } elsif ($height >= 3700000) { $reward = 78125000; # 0.78125 HUSH $halvings = 3; } elsif ($height >= 2020000) { $reward = 156250000; # 1.5625 HUSH $halvings = 2; } elsif ($height >= 340000) { $reward = 312500000; # 3.125 HUSH $halvings = 1; } elsif ($height >= 128) { $reward = 1250000000; # 12.5 HUSH } return ($reward,$halvings); } # Block reward is 0 at the 31st halving while ($halvings <= 30) { $block++; my ($reward,$halvings) = hush_block_reward($block); my $fr = int($reward / 10); my $subsidy = $reward - $fr; if($block == 1) { # initial airdrop of funds from HUSH v2 network @ Block 500000 $reward = $initial; $subsidy= $reward; $fr = 0; } $supply += $reward; $totalfr += $fr; # all values in puposhis # block, current supply, block reward amount, fr, totalfr, number of halvings printf "%d,%d,%d,%d,%d,%d,%d\n", $block, $supply, $reward, $subsidy, $fr, $totalfr, $halvings; exit(0) if $block == $stop; exit(0) if ($block > 128 && $reward == 0); exit(-1) if ($supply >= 21_000_000*$puposhis); }