class BitcoinRewardEra::Calculator

Constants

BLOCKS_PER_REWARD_ERA
GENESIS_BLOCK_TIME
SECONDS_PER_REWARD_ERA

Attributes

reward_era_number[R]

Public Class Methods

new(config) click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 14
def initialize config
  @time_klass           = config[:time_klass]           || Time
  @amount_klass         = config[:amount_klass]         || Amount

  @reward_era_number = @amount_klass.new config[:reward_era_number]
end

Public Instance Methods

btc_added() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 47
def btc_added
  Amount.new end_btc - start_btc
end
btc_increase_percentage() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 55
def btc_increase_percentage
  Amount.new btc_added / last_calculator.end_btc
end
btc_per_block() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 25
def btc_per_block
  initial_reward = @amount_klass.new 50

  truncate_at_satoshis initial_reward / (2**last_reward_era_number)
end
end_btc() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 51
def end_btc
  next_calculator.start_btc
end
end_btc_percent_of_limit() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 59
def end_btc_percent_of_limit
  Amount.new end_btc / final_calculator.end_btc
end
first_block() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 21
def first_block
  Amount.new last_reward_era_number * BLOCKS_PER_REWARD_ERA
end
start_btc() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 35
def start_btc
  btc_in_circulation = BigDecimal 0

  1.upto last_reward_era_number do |ren|
    btc_in_circulation +=
      self.class.new(reward_era_number: ren)
      .btc_per_block * BLOCKS_PER_REWARD_ERA
  end

  Amount.new btc_in_circulation
end
supply_inflation_rate() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 63
def supply_inflation_rate
  Amount.new(((1 + btc_increase_percentage)**0.25) - 1)
end
year() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 31
def year
  Amount.new this_year + portion_of_year
end

Private Instance Methods

beginning_of_reward_era() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 93
def beginning_of_reward_era
  GENESIS_BLOCK_TIME + seconds_since_block_zero
end
final_calculator() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 127
def final_calculator
  self.class.new reward_era_number: final_reward_era_number
end
final_reward_era_number() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 85
def final_reward_era_number
  Amount.new 34
end
last_calculator() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 119
def last_calculator
  self.class.new reward_era_number: last_reward_era_number
end
last_reward_era_number() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 77
def last_reward_era_number
  Amount.new @reward_era_number - 1
end
next_calculator() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 123
def next_calculator
  self.class.new reward_era_number: next_reward_era_number
end
next_reward_era_number() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 81
def next_reward_era_number
  Amount.new @reward_era_number + 1
end
portion_of_year() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 101
def portion_of_year
  next_year = this_year + 1

  beginning_of_this_year =
    Time.new(this_year, 1, 1, 0, 0, 0, '+00:00').utc.to_i

  beginning_of_next_year =
    Time.new(next_year, 1, 1, 0, 0, 0, '+00:00').utc.to_i

  bd_beginning_of_reward_era = BigDecimal beginning_of_reward_era.to_i

  bd_portion_of_year =
    BigDecimal(bd_beginning_of_reward_era - beginning_of_this_year) /
    BigDecimal(beginning_of_next_year - beginning_of_this_year)

  Amount.new bd_portion_of_year
end
seconds_since_block_zero() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 89
def seconds_since_block_zero
  Amount.new first_block * 60 * 10
end
this_year() click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 97
def this_year
  Amount.new beginning_of_reward_era.year
end
truncate_at_satoshis(amount) click to toggle source
# File lib/bitcoin_reward_era/calculator.rb, line 69
def truncate_at_satoshis amount
  string = amount.to_s '8F'

  truncation_match = string.match(/^\d+[.]\d+/)

  @amount_klass.new truncation_match[0]
end