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
Calls superclass method
CryptocoinPayable::Adapters::Base#create_address
# 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