sibit 0.15.1 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/sibit/bitcoinchain.rb +9 -3
- data/lib/sibit/blockchain.rb +3 -1
- data/lib/sibit/blockchair.rb +98 -0
- data/lib/sibit/cryptoapis.rb +8 -3
- data/lib/sibit/version.rb +1 -1
- data/test/test_blockchair.rb +42 -0
- data/test/test_live.rb +2 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e3a925010c38e43c7657cf822c56a377b491b04cd0d048d444e25a66eba824f
|
4
|
+
data.tar.gz: 88a8c7fbd56ebcf3d37b298bdd5df931eaabfc72406da18cacc41fa19e98538f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2d94c940bc0d564090a9079d772fc1006c0bb64fdcc014cf8b77c4bfdfcfb3e09f8be2252ba8c0b5efe42bcad0130220b61c4bf9fbd0178401d8b720a625699
|
7
|
+
data.tar.gz: 6e22d3aad01fdb1eb058fa23d62ce137750f873f11f7afabc5677df240138ce4d0027ff0a77272068a2e4f2bba3359e9be7860d09bc68d3469c63a4a1e6262a6
|
data/README.md
CHANGED
@@ -123,9 +123,10 @@ work with the following APIs:
|
|
123
123
|
* [BTC.com](https://btc.com/api-doc)
|
124
124
|
* [Cryptoapis.io](https://docs.cryptoapis.io/rest-apis/blockchain-as-a-service-apis/btc/index)
|
125
125
|
* [Bitcoinchain.com](https://bitcoinchain.com/api)
|
126
|
+
* [Blockchair.com](https://blockchair.com/api/docs)
|
126
127
|
* [Earn.com](https://bitcoinfees.earn.com/api)
|
127
128
|
|
128
|
-
The first one in this list is used by default. If you want to use a
|
129
|
+
The first one in this list is used by default. If you want to use a different
|
129
130
|
one, you just specify it in the constructor of `Sibit` object:
|
130
131
|
|
131
132
|
```ruby
|
@@ -135,7 +136,8 @@ sibit = Sibit.new(api: Sibit::Btc.new)
|
|
135
136
|
```
|
136
137
|
|
137
138
|
You may also use a combination of APIs. This may be very useful since
|
138
|
-
some APIs are not reliable
|
139
|
+
some APIs are not reliable and others don't have all the features required.
|
140
|
+
You can provide an array of objects and they
|
139
141
|
will be used one by one, until a successful response is obtained:
|
140
142
|
|
141
143
|
```ruby
|
data/lib/sibit/bitcoinchain.rb
CHANGED
@@ -50,9 +50,13 @@ class Sibit
|
|
50
50
|
|
51
51
|
# Gets the balance of the address, in satoshi.
|
52
52
|
def balance(address)
|
53
|
-
|
53
|
+
json = Sibit::Json.new(http: @http, log: @log).get(
|
54
54
|
URI("https://api-r.bitcoinchain.com/v1/address/#{address}")
|
55
|
-
)[0]
|
55
|
+
)[0]
|
56
|
+
raise Sibit::Error, "Address #{address} not found" if json.nil?
|
57
|
+
b = (json['balance'] * 100_000_000).to_i
|
58
|
+
@log.info("The balance of #{address} is #{b} satoshi")
|
59
|
+
b
|
56
60
|
end
|
57
61
|
|
58
62
|
# Get recommended fees, in satoshi per byte.
|
@@ -62,9 +66,11 @@ class Sibit
|
|
62
66
|
|
63
67
|
# Gets the hash of the latest block.
|
64
68
|
def latest
|
65
|
-
Sibit::Json.new(http: @http, log: @log).get(
|
69
|
+
hash = Sibit::Json.new(http: @http, log: @log).get(
|
66
70
|
URI('https://api-r.bitcoinchain.com/v1/status')
|
67
71
|
)['hash']
|
72
|
+
@log.info("The latest block hash is #{hash}")
|
73
|
+
hash
|
68
74
|
end
|
69
75
|
|
70
76
|
# Fetch all unspent outputs per address.
|
data/lib/sibit/blockchain.rb
CHANGED
@@ -98,9 +98,11 @@ class Sibit
|
|
98
98
|
|
99
99
|
# Gets the hash of the latest block.
|
100
100
|
def latest
|
101
|
-
Sibit::Json.new(http: @http, log: @log).get(
|
101
|
+
hash = Sibit::Json.new(http: @http, log: @log).get(
|
102
102
|
URI('https://blockchain.info/latestblock')
|
103
103
|
)['hash']
|
104
|
+
@log.info("The latest block hash is #{hash}")
|
105
|
+
hash
|
104
106
|
end
|
105
107
|
|
106
108
|
# This method should fetch a Blockchain block and return as a hash.
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2019-2020 Yegor Bugayenko
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
22
|
+
|
23
|
+
require 'uri'
|
24
|
+
require 'json'
|
25
|
+
require 'cgi'
|
26
|
+
require_relative 'version'
|
27
|
+
require_relative 'error'
|
28
|
+
require_relative 'log'
|
29
|
+
require_relative 'http'
|
30
|
+
require_relative 'json'
|
31
|
+
|
32
|
+
# Blockchair.com API.
|
33
|
+
#
|
34
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
35
|
+
# Copyright:: Copyright (c) 2019-2020 Yegor Bugayenko
|
36
|
+
# License:: MIT
|
37
|
+
class Sibit
|
38
|
+
# Btc.com API.
|
39
|
+
class Blockchair
|
40
|
+
# Constructor.
|
41
|
+
def initialize(key: nil, log: Sibit::Log.new, http: Sibit::Http.new, dry: false)
|
42
|
+
@key = key
|
43
|
+
@http = http
|
44
|
+
@log = log
|
45
|
+
@dry = dry
|
46
|
+
end
|
47
|
+
|
48
|
+
# Current price of BTC in USD (float returned).
|
49
|
+
def price(_currency)
|
50
|
+
raise Sibit::Error, 'Blockchair doesn\'t provide BTC price'
|
51
|
+
end
|
52
|
+
|
53
|
+
# Gets the balance of the address, in satoshi.
|
54
|
+
def balance(address)
|
55
|
+
json = Sibit::Json.new(http: @http, log: @log).get(
|
56
|
+
URI("https://api.blockchair.com/bitcoin/dashboards/address/#{address}?#{the_key}")
|
57
|
+
)['data'][address]
|
58
|
+
raise Sibit::Error, "Address #{address} not found" if json.nil?
|
59
|
+
b = json['address']['balance']
|
60
|
+
@log.info("The balance of #{address} is #{b} satoshi")
|
61
|
+
b
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get recommended fees, in satoshi per byte.
|
65
|
+
def fees
|
66
|
+
raise Sibit::Error, 'Not implemented yet'
|
67
|
+
end
|
68
|
+
|
69
|
+
# Gets the hash of the latest block.
|
70
|
+
def latest
|
71
|
+
raise Sibit::Error, 'Not implemented yet'
|
72
|
+
end
|
73
|
+
|
74
|
+
# Fetch all unspent outputs per address.
|
75
|
+
def utxos(_sources)
|
76
|
+
raise Sibit::Error, 'Not implemented yet'
|
77
|
+
end
|
78
|
+
|
79
|
+
# Push this transaction (in hex format) to the network.
|
80
|
+
def push(hex)
|
81
|
+
Sibit::Json.new(http: @http, log: @log).post(
|
82
|
+
URI("https://api.blockchair.com/bitcoin/push/transaction?#{the_key}"),
|
83
|
+
"data=#{hex}"
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
# This method should fetch a Blockchain block and return as a hash.
|
88
|
+
def block(_hash)
|
89
|
+
raise Sibit::Error, 'Not implemented yet'
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def the_key
|
95
|
+
@key.nil? ? '' : "key=#{CGI.escape(@key)}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/sibit/cryptoapis.rb
CHANGED
@@ -51,10 +51,13 @@ class Sibit
|
|
51
51
|
|
52
52
|
# Gets the balance of the address, in satoshi.
|
53
53
|
def balance(address)
|
54
|
-
|
54
|
+
json = Sibit::Json.new(http: @http, log: @log).get(
|
55
55
|
URI("https://api.cryptoapis.io/v1/bc/btc/mainnet/address/#{address}"),
|
56
56
|
headers: headers
|
57
|
-
)['payload']
|
57
|
+
)['payload']
|
58
|
+
b = (json['balance'].to_f * 100_000_000).to_i
|
59
|
+
@log.info("The balance of #{address} is #{b} satoshi")
|
60
|
+
b
|
58
61
|
end
|
59
62
|
|
60
63
|
# Get recommended fees, in satoshi per byte.
|
@@ -64,10 +67,12 @@ class Sibit
|
|
64
67
|
|
65
68
|
# Gets the hash of the latest block.
|
66
69
|
def latest
|
67
|
-
Sibit::Json.new(http: @http, log: @log).get(
|
70
|
+
hash = Sibit::Json.new(http: @http, log: @log).get(
|
68
71
|
URI('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/latest'),
|
69
72
|
headers: headers
|
70
73
|
)['payload']['hash']
|
74
|
+
@log.info("The latest block hash is #{hash}")
|
75
|
+
hash
|
71
76
|
end
|
72
77
|
|
73
78
|
# Fetch all unspent outputs per address.
|
data/lib/sibit/version.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2019-2020 Yegor Bugayenko
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
22
|
+
|
23
|
+
require 'minitest/autorun'
|
24
|
+
require 'webmock/minitest'
|
25
|
+
require 'json'
|
26
|
+
require_relative '../lib/sibit'
|
27
|
+
require_relative '../lib/sibit/blockchair'
|
28
|
+
|
29
|
+
# Sibit::Blockchair test.
|
30
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
31
|
+
# Copyright:: Copyright (c) 2019-2020 Yegor Bugayenko
|
32
|
+
# License:: MIT
|
33
|
+
class TestBlockchair < Minitest::Test
|
34
|
+
def test_fetch_balance
|
35
|
+
hash = '1GkQmKAmHtNfnD3LHhTkewJxKHVSta4m2a'
|
36
|
+
stub_request(:get, "https://api.blockchair.com/bitcoin/dashboards/address/#{hash}")
|
37
|
+
.to_return(body: "{\"data\": {\"#{hash}\": {\"address\": {\"balance\": 1}}}}")
|
38
|
+
sibit = Sibit::Blockchair.new
|
39
|
+
satoshi = sibit.balance(hash)
|
40
|
+
assert_equal(1, satoshi)
|
41
|
+
end
|
42
|
+
end
|
data/test/test_live.rb
CHANGED
@@ -73,6 +73,8 @@ class TestLive < Minitest::Test
|
|
73
73
|
skip
|
74
74
|
WebMock.allow_net_connect!
|
75
75
|
apis = []
|
76
|
+
require_relative '../lib/sibit/blockchair'
|
77
|
+
apis << Sibit::Blockchair.new
|
76
78
|
require_relative '../lib/sibit/cryptoapis'
|
77
79
|
apis << Sibit::Cryptoapis.new('-key-')
|
78
80
|
require_relative '../lib/sibit/btc'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sibit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -283,6 +283,7 @@ files:
|
|
283
283
|
- lib/sibit.rb
|
284
284
|
- lib/sibit/bitcoinchain.rb
|
285
285
|
- lib/sibit/blockchain.rb
|
286
|
+
- lib/sibit/blockchair.rb
|
286
287
|
- lib/sibit/btc.rb
|
287
288
|
- lib/sibit/cryptoapis.rb
|
288
289
|
- lib/sibit/earn.rb
|
@@ -297,6 +298,7 @@ files:
|
|
297
298
|
- test/test__helper.rb
|
298
299
|
- test/test_bitcoinchain.rb
|
299
300
|
- test/test_blockchain.rb
|
301
|
+
- test/test_blockchair.rb
|
300
302
|
- test/test_btc.rb
|
301
303
|
- test/test_cryptoapis.rb
|
302
304
|
- test/test_fake.rb
|
@@ -335,6 +337,7 @@ test_files:
|
|
335
337
|
- test/test__helper.rb
|
336
338
|
- test/test_bitcoinchain.rb
|
337
339
|
- test/test_blockchain.rb
|
340
|
+
- test/test_blockchair.rb
|
338
341
|
- test/test_btc.rb
|
339
342
|
- test/test_cryptoapis.rb
|
340
343
|
- test/test_fake.rb
|