class Peatio::Sperocoin::Blockchain

TODO: Processing of unconfirmed transactions from mempool isn't supported now.

Constants

DEFAULT_FEATURES

Public Class Methods

new(custom_features = {}) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 9
def initialize(custom_features = {})
  @features = DEFAULT_FEATURES.merge(custom_features).slice(*SUPPORTED_FEATURES)
  @settings = {}
end

Public Instance Methods

configure(settings = {}) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 14
def configure(settings = {})
  # Clean client state during configure.
  @client = nil
  @settings.merge!(settings.slice(*SUPPORTED_SETTINGS))
end
fetch_block!(block_number) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 20
def fetch_block!(block_number)
  block_hash = client.json_rpc(:getblockhash, [block_number])

  client.json_rpc(:getblock, [block_hash]).fetch('tx')
    .each_with_object([]) do |tx, txs_array|
      txs = build_transaction(tx).map do |ntx|
        Peatio::Transaction.new(ntx.merge(block_number: block_number))
      end
      txs_array.append(*txs)
    end.yield_self { |txs_array| Peatio::Block.new(block_number, txs_array) }
rescue Sperocoin::Client::Error => e
  raise Peatio::Blockchain::ClientError, e
end
latest_block_number() click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 34
def latest_block_number
  client.json_rpc(:getblockcount)
rescue Sperocoin::Client::Error => e
  raise Peatio::Blockchain::ClientError, e
end
load_balance_of_address!(address, _currency_id) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 40
def load_balance_of_address!(address, _currency_id)
  address_with_balance = client.json_rpc(:listaddressgroupings)
                               .flatten(1)
                               .find { |addr| addr[0] == address }

  if address_with_balance.blank?
    raise Peatio::Blockchain::UnavailableAddressBalanceError, address
  end

  address_with_balance[1].to_d
rescue Sperocoin::Client::Error => e
  raise Peatio::Blockchain::ClientError, e
end

Private Instance Methods

build_transaction(tx_hash) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 56
def build_transaction(tx_hash)
  client.json_rpc(:getrawtransaction, [tx_hash, 1]).fetch('vout')
    .select do |entry|
      entry.fetch('value').to_d > 0 &&
      entry['scriptPubKey'].has_key?('addresses')
    end
    .each_with_object([]) do |entry, formatted_txs|
      no_currency_tx =
        { hash: tx_hash, txout: entry['n'],
          to_address: entry['scriptPubKey']['addresses'][0],
          amount: entry.fetch('value').to_d,
          status: 'success' }

        # Build transaction for each currency belonging to blockchain.
        settings_fetch(:currencies).pluck(:id).each do |currency_id|
          formatted_txs << no_currency_tx.merge(currency_id: currency_id)
        end
    end
end
client() click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 76
def client
  @client ||= Sperocoin::Client.new(settings_fetch(:server))
end
settings_fetch(key) click to toggle source
# File lib/peatio/sperocoin/blockchain.rb, line 80
def settings_fetch(key)
  @settings.fetch(key) { raise Peatio::Blockchain::MissingSettingError, key.to_s }
end