class CryptocoinPayable::Adapters::Bitcoin

Public Class Methods

coin_symbol() click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 9
def self.coin_symbol
  'BTC'
end
subunit_in_main() click to toggle source

Satoshi in Bitcoin

# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 5
def self.subunit_in_main
  100_000_000
end

Public Instance Methods

create_address(id) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 19
def create_address(id)
  super.to_address(network: network)
end
fetch_transactions(address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 13
def fetch_transactions(address)
  fetch_block_explorer_transactions(address)
rescue StandardError
  fetch_block_cypher_transactions(address)
end

Private Instance Methods

convert_block_cypher_transactions(transaction, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 84
def convert_block_cypher_transactions(transaction, address)
  {
    transaction_hash: transaction['hash'],
    block_hash: transaction['block_hash'],
    block_time: parse_time(transaction['confirmed']),
    estimated_time: parse_time(transaction['received']),
    estimated_value: parse_total_tx_value_block_cypher(transaction['outputs'], address),
    confirmations: transaction['confirmations'].to_i
  }
end
convert_block_explorer_transactions(transaction, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 53
def convert_block_explorer_transactions(transaction, address)
  {
    transaction_hash: transaction['txid'],
    block_hash: transaction['blockhash'],
    block_time: parse_timestamp(transaction['blocktime']),
    estimated_time: parse_timestamp(transaction['time']),
    estimated_value: parse_total_tx_value_block_explorer(transaction['vout'], address),
    confirmations: transaction['confirmations']
  }
end
fetch_block_cypher_transactions(address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 70
def fetch_block_cypher_transactions(address)
  url = "https://api.blockcypher.com/v1/btc/main/addrs/#{address}/full"
  parse_block_cypher_transactions(get_request(url).body, address)
end
fetch_block_explorer_transactions(address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 41
def fetch_block_explorer_transactions(address)
  url = "https://#{prefix}blockexplorer.com/api/txs/?address=#{address}"
  parse_block_explorer_transactions(get_request(url).body, address)
end
network() click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 29
def network
  CryptocoinPayable.configuration.testnet ? :bitcoin_testnet : :bitcoin
end
parse_block_cypher_transactions(response, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 75
def parse_block_cypher_transactions(response, address)
  json = JSON.parse(response)
  raise ApiError, json['error'] if json['error']

  json['txs'].map { |tx| convert_block_cypher_transactions(tx, address) }
rescue JSON::ParserError
  raise ApiError, response
end
parse_block_explorer_transactions(response, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 46
def parse_block_explorer_transactions(response, address)
  json = JSON.parse(response)
  json['txs'].map { |tx| convert_block_explorer_transactions(tx, address) }
rescue JSON::ParserError
  raise ApiError, response
end
parse_total_tx_value_block_cypher(output_transactions, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 64
def parse_total_tx_value_block_cypher(output_transactions, address)
  output_transactions
    .map { |out| out['addresses'].join.eql?(address) ? out['value'] : 0 }
    .inject(:+) || 0
end
parse_total_tx_value_block_explorer(output_transactions, address) click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 33
def parse_total_tx_value_block_explorer(output_transactions, address)
  output_transactions
    .reject { |out| out['scriptPubKey']['addresses'].nil? }
    .select { |out| out['scriptPubKey']['addresses'].include?(address) }
    .map { |out| (out['value'].to_f * self.class.subunit_in_main).to_i }
    .inject(:+) || 0
end
prefix() click to toggle source
# File lib/cryptocoin_payable/adapters/bitcoin.rb, line 25
def prefix
  CryptocoinPayable.configuration.testnet ? 'testnet.' : ''
end