sibit 0.16.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e3a925010c38e43c7657cf822c56a377b491b04cd0d048d444e25a66eba824f
4
- data.tar.gz: 88a8c7fbd56ebcf3d37b298bdd5df931eaabfc72406da18cacc41fa19e98538f
3
+ metadata.gz: 5ff1fd9e3917932468cb14ce7d91e23b9b086fb46fee75a828c1a6eed9631a57
4
+ data.tar.gz: 9833b8986c31a248beba236cd4cb11da0e36a723553d187afa31a6634be4f2c5
5
5
  SHA512:
6
- metadata.gz: c2d94c940bc0d564090a9079d772fc1006c0bb64fdcc014cf8b77c4bfdfcfb3e09f8be2252ba8c0b5efe42bcad0130220b61c4bf9fbd0178401d8b720a625699
7
- data.tar.gz: 6e22d3aad01fdb1eb058fa23d62ce137750f873f11f7afabc5677df240138ce4d0027ff0a77272068a2e4f2bba3359e9be7860d09bc68d3469c63a4a1e6262a6
6
+ metadata.gz: 7f29c08168ed4a9a0eeebef06ec5a425878401cfee1daa8409d5858fd1eb33b3cb17484fdeccbf1db5a22e3c3573a053fdbc7cc74cb9328d69c495ccec235064
7
+ data.tar.gz: b7c6f33191f5aa9dc9fd26b1e2a8154af9e7c6cae2c26f26c0700b25a86ca984b61250e55ebf7ee4b9c473a714ad74ac1d917d276db178f8c4ddf58ee66f4a9f
data/Rakefile CHANGED
@@ -37,6 +37,7 @@ task default: %i[clean test features rubocop copyright]
37
37
 
38
38
  require 'rake/testtask'
39
39
  Rake::TestTask.new(:test) do |test|
40
+ ENV['skip_live'] = 'yes'
40
41
  Rake::Cleaner.cleanup_files(['coverage'])
41
42
  test.libs << 'lib' << 'test'
42
43
  test.pattern = 'test/**/test_*.rb'
@@ -69,13 +69,14 @@ class Sibit
69
69
 
70
70
  # Get recommended fees.
71
71
  def fees
72
- raise Sibit::Error, 'fees() not implemented yet'
72
+ raise Sibit::Error, 'fees() is not provided by Blockchain API'
73
73
  end
74
74
 
75
- # Fetch all unspent outputs per address.
75
+ # Fetch all unspent outputs per address. The argument is an array
76
+ # of Bitcoin addresses.
76
77
  def utxos(sources)
77
78
  Sibit::Json.new(http: @http, log: @log).get(
78
- URI("https://blockchain.info/unspent?active=#{sources.keys.join('|')}&limit=1000")
79
+ URI("https://blockchain.info/unspent?active=#{sources.join('|')}&limit=1000")
79
80
  )['unspent_outputs'].map do |u|
80
81
  {
81
82
  value: u['value'],
@@ -106,28 +107,27 @@ class Sibit
106
107
  end
107
108
 
108
109
  # This method should fetch a Blockchain block and return as a hash.
109
- def block(_hash)
110
- raise Sibit::Error, 'Blockchain.com API fails to return next_block'
111
- # json = Sibit::Json.new(http: @http, log: @log).get(
112
- # URI("https://blockchain.info/rawblock/#{hash}")
113
- # )
114
- # {
115
- # hash: json['hash'],
116
- # orphan: !json['main_chain'],
117
- # next: json['next_block'][0],
118
- # previous: json['prev_block'],
119
- # txns: json['tx'].map do |t|
120
- # {
121
- # hash: t['hash'],
122
- # outputs: t['out'].map do |o|
123
- # {
124
- # address: o['addr'],
125
- # value: o['value']
126
- # }
127
- # end
128
- # }
129
- # end
130
- # }
110
+ def block(hash)
111
+ json = Sibit::Json.new(http: @http, log: @log).get(
112
+ URI("https://blockchain.info/rawblock/#{hash}")
113
+ )
114
+ {
115
+ hash: json['hash'],
116
+ orphan: !json['main_chain'],
117
+ next: json['next_block'][0],
118
+ previous: json['prev_block'],
119
+ txns: json['tx'].map do |t|
120
+ {
121
+ hash: t['hash'],
122
+ outputs: t['out'].map do |o|
123
+ {
124
+ address: o['addr'],
125
+ value: o['value']
126
+ }
127
+ end
128
+ }
129
+ end
130
+ }
131
131
  end
132
132
  end
133
133
  end
data/lib/sibit/btc.rb CHANGED
@@ -45,7 +45,7 @@ class Sibit
45
45
 
46
46
  # Current price of BTC in USD (float returned).
47
47
  def price(_currency)
48
- raise Sibit::Error, 'Btc.com API doesn\'t provide BTC price'
48
+ raise Sibit::Error, 'Btc.com API doesn\'t provide prices'
49
49
  end
50
50
 
51
51
  # Gets the balance of the address, in satoshi.
@@ -65,7 +65,7 @@ class Sibit
65
65
 
66
66
  # Get recommended fees, in satoshi per byte.
67
67
  def fees
68
- raise Sibit::Error, 'Not implemented yet'
68
+ raise Sibit::Error, 'Btc.com doesn\'t provide recommended fees'
69
69
  end
70
70
 
71
71
  # Gets the hash of the latest block.
@@ -78,13 +78,34 @@ class Sibit
78
78
  end
79
79
 
80
80
  # Fetch all unspent outputs per address.
81
- def utxos(_sources)
82
- raise Sibit::Error, 'Not implemented yet'
81
+ def utxos(sources)
82
+ txns = []
83
+ sources.each do |hash|
84
+ json = Sibit::Json.new(http: @http, log: @log).get(
85
+ URI("https://chain.api.btc.com/v3/address/#{hash}/unspent")
86
+ )
87
+ json['data']['list'].each do |u|
88
+ outs = Sibit::Json.new(http: @http, log: @log).get(
89
+ URI("https://chain.api.btc.com/v3/tx/#{u['tx_hash']}?verbose=3")
90
+ )['data']['outputs']
91
+ outs.each_with_index do |o, i|
92
+ next unless o['addresses'].include?(hash)
93
+ txns << {
94
+ value: o['value'],
95
+ hash: u['tx_hash'],
96
+ index: i,
97
+ confirmations: u['confirmations'],
98
+ script: [o['script_hex']].pack('H*')
99
+ }
100
+ end
101
+ end
102
+ end
103
+ txns
83
104
  end
84
105
 
85
106
  # Push this transaction (in hex format) to the network.
86
107
  def push(_hex)
87
- raise Sibit::Error, 'Not implemented yet'
108
+ raise Sibit::Error, 'Btc.com doesn\'t provide payment gateway'
88
109
  end
89
110
 
90
111
  # This method should fetch a Blockchain block and return as a hash.
data/lib/sibit/version.rb CHANGED
@@ -26,5 +26,5 @@
26
26
  # License:: MIT
27
27
  class Sibit
28
28
  # Current version of the library.
29
- VERSION = '0.16.0'
29
+ VERSION = '0.16.1'
30
30
  end
data/lib/sibit.rb CHANGED
@@ -110,7 +110,7 @@ class Sibit
110
110
  builder = Bitcoin::Builder::TxBuilder.new
111
111
  unspent = 0
112
112
  size = 100
113
- utxos = first_one { |api| api.utxos(sources) }
113
+ utxos = first_one { |api| api.utxos(sources.keys) }
114
114
  @log.info("#{utxos.count} UTXOs found, these will be used \
115
115
  (value/confirmations at tx_hash):")
116
116
  utxos.each do |utxo|
@@ -32,7 +32,6 @@ require_relative '../lib/sibit/blockchain'
32
32
  # License:: MIT
33
33
  class TestBlockchain < Minitest::Test
34
34
  def test_fetch_block
35
- skip
36
35
  hash = '0000000000000000000f676241aabc9b62b748d26192a44bc25720c34de27d19'
37
36
  stub_request(:get, "https://blockchain.info/rawblock/#{hash}")
38
37
  .to_return(body: '{"next_block": "n", "prev_block": "p", "hash": "h",
data/test/test_live.rb CHANGED
@@ -67,12 +67,23 @@ class TestLive < Minitest::Test
67
67
  end
68
68
  end
69
69
 
70
+ def test_utxos
71
+ for_each do |api|
72
+ json = api.utxos(['12fCwqBN4XsHq4iu2Wbfgq5e8YhqEGP3ee'])
73
+ assert_equal(3, json.length)
74
+ assert(json.find { |t| t[:value] == 16_200_000 }, 'UTXO not found')
75
+ assert(json.find { |t| t[:script].unpack('H*').first.start_with?('76a9141231e760') })
76
+ end
77
+ end
78
+
70
79
  private
71
80
 
72
81
  def for_each
73
- skip
82
+ skip if ENV['skip_live']
74
83
  WebMock.allow_net_connect!
75
84
  apis = []
85
+ require_relative '../lib/sibit/blockchain'
86
+ apis << Sibit::Blockchain.new
76
87
  require_relative '../lib/sibit/blockchair'
77
88
  apis << Sibit::Blockchair.new
78
89
  require_relative '../lib/sibit/cryptoapis'
@@ -81,8 +92,6 @@ class TestLive < Minitest::Test
81
92
  apis << Sibit::Btc.new
82
93
  require_relative '../lib/sibit/bitcoinchain'
83
94
  apis << Sibit::Bitcoinchain.new
84
- require_relative '../lib/sibit/blockchain'
85
- apis << Sibit::Blockchain.new
86
95
  apis.each do |api|
87
96
  begin
88
97
  yield api
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sibit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-25 00:00:00.000000000 Z
11
+ date: 2020-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace