blockchain 1.0.2 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +57 -57
- data/docs/blockexplorer.md +117 -117
- data/docs/createwallet.md +20 -20
- data/docs/exchangerates.md +31 -31
- data/docs/pushtx.md +18 -18
- data/docs/receive.md +57 -19
- data/docs/statistics.md +15 -15
- data/docs/wallet.md +148 -148
- data/lib/blockchain.rb +2 -1
- data/lib/blockchain/blockexplorer.rb +297 -297
- data/lib/blockchain/createwallet.rb +38 -38
- data/lib/blockchain/exchangerates.rb +46 -46
- data/lib/blockchain/pushtx.rb +15 -15
- data/lib/blockchain/receive.rb +85 -31
- data/lib/blockchain/statistics.rb +59 -59
- data/lib/blockchain/util.rb +34 -33
- data/lib/blockchain/version.rb +1 -1
- data/lib/blockchain/wallet.rb +166 -166
- metadata +3 -3
@@ -1,39 +1,39 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative 'util'
|
3
|
-
|
4
|
-
module Blockchain
|
5
|
-
|
6
|
-
def self.create_wallet(password, api_code, priv: nil, label: nil, email: nil)
|
7
|
-
|
8
|
-
params = { 'password' => password, 'api_code' => api_code }
|
9
|
-
|
10
|
-
if !priv.nil?
|
11
|
-
params['priv'] = priv
|
12
|
-
end
|
13
|
-
if !label.nil?
|
14
|
-
params['label'] = label
|
15
|
-
end
|
16
|
-
if !email.nil?
|
17
|
-
params['email'] = email
|
18
|
-
end
|
19
|
-
|
20
|
-
response = Blockchain::call_api('api/v2/create_wallet', method: 'post', data: params)
|
21
|
-
json_response = JSON.parse(response)
|
22
|
-
return CreateWalletResponse.new(json_response['guid'],
|
23
|
-
json_response['address'],
|
24
|
-
json_response['link'])
|
25
|
-
end
|
26
|
-
|
27
|
-
class CreateWalletResponse
|
28
|
-
attr_reader :identifier
|
29
|
-
attr_reader :address
|
30
|
-
attr_reader :link
|
31
|
-
|
32
|
-
def initialize(identifier, address, link)
|
33
|
-
@identifier = identifier
|
34
|
-
@address = address
|
35
|
-
@link = link
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
1
|
+
require 'json'
|
2
|
+
require_relative 'util'
|
3
|
+
|
4
|
+
module Blockchain
|
5
|
+
|
6
|
+
def self.create_wallet(password, api_code, priv: nil, label: nil, email: nil)
|
7
|
+
|
8
|
+
params = { 'password' => password, 'api_code' => api_code }
|
9
|
+
|
10
|
+
if !priv.nil?
|
11
|
+
params['priv'] = priv
|
12
|
+
end
|
13
|
+
if !label.nil?
|
14
|
+
params['label'] = label
|
15
|
+
end
|
16
|
+
if !email.nil?
|
17
|
+
params['email'] = email
|
18
|
+
end
|
19
|
+
|
20
|
+
response = Blockchain::call_api('api/v2/create_wallet', method: 'post', data: params)
|
21
|
+
json_response = JSON.parse(response)
|
22
|
+
return CreateWalletResponse.new(json_response['guid'],
|
23
|
+
json_response['address'],
|
24
|
+
json_response['link'])
|
25
|
+
end
|
26
|
+
|
27
|
+
class CreateWalletResponse
|
28
|
+
attr_reader :identifier
|
29
|
+
attr_reader :address
|
30
|
+
attr_reader :link
|
31
|
+
|
32
|
+
def initialize(identifier, address, link)
|
33
|
+
@identifier = identifier
|
34
|
+
@address = address
|
35
|
+
@link = link
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
39
|
end
|
@@ -1,47 +1,47 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative 'util'
|
3
|
-
|
4
|
-
module Blockchain
|
5
|
-
|
6
|
-
class Currency
|
7
|
-
attr_reader :last
|
8
|
-
attr_reader :buy
|
9
|
-
attr_reader :sell
|
10
|
-
attr_reader :symbol
|
11
|
-
attr_reader :p15min
|
12
|
-
|
13
|
-
def initialize(last, buy, sell, symbol, p15min)
|
14
|
-
@last = last
|
15
|
-
@buy = buy
|
16
|
-
@sell = sell
|
17
|
-
@symbol = symbol
|
18
|
-
@p15min = p15min
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.get_ticker(api_code = nil)
|
23
|
-
params = {}
|
24
|
-
if !api_code.nil? then params['api_code'] = api_code end
|
25
|
-
response = Blockchain::call_api('ticker', data: params)
|
26
|
-
json_response = JSON.parse(response)
|
27
|
-
|
28
|
-
ticker = {}
|
29
|
-
json_response.each do |key,value|
|
30
|
-
json_ccy = json_response[key]
|
31
|
-
ccy = Currency.new(json_ccy['last'],
|
32
|
-
json_ccy['buy'],
|
33
|
-
json_ccy['sell'],
|
34
|
-
json_ccy['symbol'],
|
35
|
-
json_ccy['15m'])
|
36
|
-
ticker[key] = ccy
|
37
|
-
end
|
38
|
-
return ticker
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.to_btc(ccy, value, api_code = nil)
|
42
|
-
params = { 'currency' => ccy, 'value' => value}
|
43
|
-
if !api_code.nil? then params['api_code'] = api_code end
|
44
|
-
return Blockchain::call_api('tobtc', data: params).to_f
|
45
|
-
end
|
46
|
-
|
1
|
+
require 'json'
|
2
|
+
require_relative 'util'
|
3
|
+
|
4
|
+
module Blockchain
|
5
|
+
|
6
|
+
class Currency
|
7
|
+
attr_reader :last
|
8
|
+
attr_reader :buy
|
9
|
+
attr_reader :sell
|
10
|
+
attr_reader :symbol
|
11
|
+
attr_reader :p15min
|
12
|
+
|
13
|
+
def initialize(last, buy, sell, symbol, p15min)
|
14
|
+
@last = last
|
15
|
+
@buy = buy
|
16
|
+
@sell = sell
|
17
|
+
@symbol = symbol
|
18
|
+
@p15min = p15min
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_ticker(api_code = nil)
|
23
|
+
params = {}
|
24
|
+
if !api_code.nil? then params['api_code'] = api_code end
|
25
|
+
response = Blockchain::call_api('ticker', data: params)
|
26
|
+
json_response = JSON.parse(response)
|
27
|
+
|
28
|
+
ticker = {}
|
29
|
+
json_response.each do |key,value|
|
30
|
+
json_ccy = json_response[key]
|
31
|
+
ccy = Currency.new(json_ccy['last'],
|
32
|
+
json_ccy['buy'],
|
33
|
+
json_ccy['sell'],
|
34
|
+
json_ccy['symbol'],
|
35
|
+
json_ccy['15m'])
|
36
|
+
ticker[key] = ccy
|
37
|
+
end
|
38
|
+
return ticker
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.to_btc(ccy, value, api_code = nil)
|
42
|
+
params = { 'currency' => ccy, 'value' => value}
|
43
|
+
if !api_code.nil? then params['api_code'] = api_code end
|
44
|
+
return Blockchain::call_api('tobtc', data: params).to_f
|
45
|
+
end
|
46
|
+
|
47
47
|
end
|
data/lib/blockchain/pushtx.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative 'util'
|
3
|
-
|
4
|
-
module Blockchain
|
5
|
-
|
6
|
-
def self.pushtx(tx, api_code = nil)
|
7
|
-
params = { 'tx' => tx }
|
8
|
-
|
9
|
-
if !api_code.nil?
|
10
|
-
params['api_code'] = api_code
|
11
|
-
end
|
12
|
-
|
13
|
-
Blockchain::call_api('pushtx', method: 'post', data: params)
|
14
|
-
end
|
15
|
-
|
1
|
+
require 'json'
|
2
|
+
require_relative 'util'
|
3
|
+
|
4
|
+
module Blockchain
|
5
|
+
|
6
|
+
def self.pushtx(tx, api_code = nil)
|
7
|
+
params = { 'tx' => tx }
|
8
|
+
|
9
|
+
if !api_code.nil?
|
10
|
+
params['api_code'] = api_code
|
11
|
+
end
|
12
|
+
|
13
|
+
Blockchain::call_api('pushtx', method: 'post', data: params)
|
14
|
+
end
|
15
|
+
|
16
16
|
end
|
data/lib/blockchain/receive.rb
CHANGED
@@ -1,32 +1,86 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attr_reader :
|
9
|
-
attr_reader :
|
10
|
-
attr_reader :
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
json_resp['
|
28
|
-
json_resp['
|
29
|
-
|
30
|
-
|
31
|
-
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
require_relative 'util'
|
4
|
+
|
5
|
+
module Blockchain
|
6
|
+
|
7
|
+
class ReceiveResponse
|
8
|
+
attr_reader :fee_percent
|
9
|
+
attr_reader :destination
|
10
|
+
attr_reader :input_address
|
11
|
+
attr_reader :callback_url
|
12
|
+
|
13
|
+
def initialize(fee_percent, dest, input, callback)
|
14
|
+
@fee_percent = fee_percent
|
15
|
+
@destination = dest
|
16
|
+
@input_address = input
|
17
|
+
@callback_url = callback
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.receive(dest_addr, callback, api_code = nil)
|
22
|
+
params = { 'method' => 'create', 'address' => dest_addr, 'callback' => callback }
|
23
|
+
if !api_code.nil? then params['api_code'] = api_code end
|
24
|
+
resp = Blockchain::call_api('api/receive', method: 'post', data: params)
|
25
|
+
json_resp = JSON.parse(resp)
|
26
|
+
receive_response = ReceiveResponse.new(json_resp['fee_percent'],
|
27
|
+
json_resp['destination'],
|
28
|
+
json_resp['input_address'],
|
29
|
+
json_resp['callback_url'])
|
30
|
+
return receive_response
|
31
|
+
end
|
32
|
+
|
33
|
+
module V2
|
34
|
+
class ReceiveResponse
|
35
|
+
attr_reader :address
|
36
|
+
attr_reader :index
|
37
|
+
attr_reader :callback_url
|
38
|
+
|
39
|
+
def initialize(address, index, callback)
|
40
|
+
@address = address
|
41
|
+
@index = index
|
42
|
+
@callback_url = callback
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class LogEntry
|
47
|
+
attr_reader :callback_url
|
48
|
+
attr_reader :called_at
|
49
|
+
attr_reader :raw_response
|
50
|
+
attr_reader :response_code
|
51
|
+
|
52
|
+
def initialize(callback_url, called_at, raw_response, response_code)
|
53
|
+
@callback_url = callback_url
|
54
|
+
@called_at = called_at
|
55
|
+
@raw_response = raw_response
|
56
|
+
@response_code = response_code
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.receive(xpub, callback, api_key)
|
61
|
+
params = { 'xpub' => xpub, 'callback' => callback, 'key' => api_key }
|
62
|
+
resp = Blockchain::call_api('v2/receive', method: 'get', data: params, base_url: 'https://api.blockchain.info/')
|
63
|
+
json_resp = JSON.parse(resp)
|
64
|
+
receive_response = ReceiveResponse.new(json_resp['address'],
|
65
|
+
json_resp['index'],
|
66
|
+
json_resp['callback'])
|
67
|
+
receive_response
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.callback_log(callback, api_key = nil)
|
71
|
+
params = {'callback' => callback }
|
72
|
+
params['key'] = api_key unless api_key.nil?
|
73
|
+
resp = Blockchain::call_api('v2/receive/callback_log', method: 'get', data: params, base_url: 'https://api.blockchain.info/')
|
74
|
+
json_resp = JSON.parse(resp)
|
75
|
+
receive_response = json_resp.map do |entry|
|
76
|
+
LogEntry.new(entry['callback'],
|
77
|
+
entry['called_at'],
|
78
|
+
entry['raw_response'],
|
79
|
+
entry['response_code'])
|
80
|
+
end
|
81
|
+
receive_response
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
32
86
|
end
|
@@ -1,60 +1,60 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative 'util'
|
3
|
-
|
4
|
-
module Blockchain
|
5
|
-
|
6
|
-
def self.get_statistics(api_code = nil)
|
7
|
-
params = { 'format' => 'json' }
|
8
|
-
if !api_code.nil? then params['api_code'] = api_code end
|
9
|
-
response = Blockchain::call_api('stats', method: 'get', data: params)
|
10
|
-
json_response = JSON.parse(response)
|
11
|
-
return StatisticsResponse.new(json_response)
|
12
|
-
end
|
13
|
-
|
14
|
-
class StatisticsResponse
|
15
|
-
attr_reader :trade_volume_btc
|
16
|
-
attr_reader :miners_revenue_usd
|
17
|
-
attr_reader :btc_mined
|
18
|
-
attr_reader :trade_volume_usd
|
19
|
-
attr_reader :difficulty
|
20
|
-
attr_reader :minutes_between_blocks
|
21
|
-
attr_reader :number_of_transactions
|
22
|
-
attr_reader :hash_rate
|
23
|
-
attr_reader :timestamp
|
24
|
-
attr_reader :mined_blocks
|
25
|
-
attr_reader :blocks_size
|
26
|
-
attr_reader :total_fees_btc
|
27
|
-
attr_reader :total_btc_sent
|
28
|
-
attr_reader :estimated_btc_sent
|
29
|
-
attr_reader :total_btc
|
30
|
-
attr_reader :total_blocks
|
31
|
-
attr_reader :next_retarget
|
32
|
-
attr_reader :estimated_transaction_volume_usd
|
33
|
-
attr_reader :miners_revenue_btc
|
34
|
-
attr_reader :market_price_usd
|
35
|
-
|
36
|
-
def initialize(s)
|
37
|
-
@trade_volume_btc = s['trade_volume_btc']
|
38
|
-
@miners_revenue_usd = s['miners_revenue_usd']
|
39
|
-
@btc_mined = s['n_btc_mined']
|
40
|
-
@trade_volume_usd = s['trade_volume_usd']
|
41
|
-
@difficulty = s['difficulty']
|
42
|
-
@minutes_between_blocks = s['minutes_between_blocks']
|
43
|
-
@number_of_transactions = s['n_tx']
|
44
|
-
@hash_rate = s['hash_rate']
|
45
|
-
@timestamp = s['timestamp']
|
46
|
-
@mined_blocks = s['n_blocks_mined']
|
47
|
-
@blocks_size = s['blocks_size']
|
48
|
-
@total_fees_btc = s['total_fees_btc']
|
49
|
-
@total_btc_sent = s['total_btc_sent']
|
50
|
-
@estimated_btc_sent = s['estimated_btc_sent']
|
51
|
-
@total_btc = s['totalbc']
|
52
|
-
@total_blocks = s['n_blocks_total']
|
53
|
-
@next_retarget = s['nextretarget']
|
54
|
-
@estimated_transaction_volume_usd = s['estimated_transaction_volume_usd']
|
55
|
-
@miners_revenue_btc = s['miners_revenue_btc']
|
56
|
-
@market_price_usd = s['market_price_usd']
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
1
|
+
require 'json'
|
2
|
+
require_relative 'util'
|
3
|
+
|
4
|
+
module Blockchain
|
5
|
+
|
6
|
+
def self.get_statistics(api_code = nil)
|
7
|
+
params = { 'format' => 'json' }
|
8
|
+
if !api_code.nil? then params['api_code'] = api_code end
|
9
|
+
response = Blockchain::call_api('stats', method: 'get', data: params)
|
10
|
+
json_response = JSON.parse(response)
|
11
|
+
return StatisticsResponse.new(json_response)
|
12
|
+
end
|
13
|
+
|
14
|
+
class StatisticsResponse
|
15
|
+
attr_reader :trade_volume_btc
|
16
|
+
attr_reader :miners_revenue_usd
|
17
|
+
attr_reader :btc_mined
|
18
|
+
attr_reader :trade_volume_usd
|
19
|
+
attr_reader :difficulty
|
20
|
+
attr_reader :minutes_between_blocks
|
21
|
+
attr_reader :number_of_transactions
|
22
|
+
attr_reader :hash_rate
|
23
|
+
attr_reader :timestamp
|
24
|
+
attr_reader :mined_blocks
|
25
|
+
attr_reader :blocks_size
|
26
|
+
attr_reader :total_fees_btc
|
27
|
+
attr_reader :total_btc_sent
|
28
|
+
attr_reader :estimated_btc_sent
|
29
|
+
attr_reader :total_btc
|
30
|
+
attr_reader :total_blocks
|
31
|
+
attr_reader :next_retarget
|
32
|
+
attr_reader :estimated_transaction_volume_usd
|
33
|
+
attr_reader :miners_revenue_btc
|
34
|
+
attr_reader :market_price_usd
|
35
|
+
|
36
|
+
def initialize(s)
|
37
|
+
@trade_volume_btc = s['trade_volume_btc']
|
38
|
+
@miners_revenue_usd = s['miners_revenue_usd']
|
39
|
+
@btc_mined = s['n_btc_mined']
|
40
|
+
@trade_volume_usd = s['trade_volume_usd']
|
41
|
+
@difficulty = s['difficulty']
|
42
|
+
@minutes_between_blocks = s['minutes_between_blocks']
|
43
|
+
@number_of_transactions = s['n_tx']
|
44
|
+
@hash_rate = s['hash_rate']
|
45
|
+
@timestamp = s['timestamp']
|
46
|
+
@mined_blocks = s['n_blocks_mined']
|
47
|
+
@blocks_size = s['blocks_size']
|
48
|
+
@total_fees_btc = s['total_fees_btc']
|
49
|
+
@total_btc_sent = s['total_btc_sent']
|
50
|
+
@estimated_btc_sent = s['estimated_btc_sent']
|
51
|
+
@total_btc = s['totalbc']
|
52
|
+
@total_blocks = s['n_blocks_total']
|
53
|
+
@next_retarget = s['nextretarget']
|
54
|
+
@estimated_transaction_volume_usd = s['estimated_transaction_volume_usd']
|
55
|
+
@miners_revenue_btc = s['miners_revenue_btc']
|
56
|
+
@market_price_usd = s['market_price_usd']
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
60
|
end
|
data/lib/blockchain/util.rb
CHANGED
@@ -1,34 +1,35 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
|
3
|
-
module Blockchain
|
4
|
-
|
5
|
-
class APIException < StandardError
|
6
|
-
end
|
7
|
-
|
8
|
-
BASE_URL = "https://blockchain.info/"
|
9
|
-
TIMEOUT_SECONDS = 10
|
10
|
-
|
11
|
-
def self.call_api(resource, method: 'get', data: nil)
|
12
|
-
|
13
|
-
|
14
|
-
http
|
15
|
-
http.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
request
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module Blockchain
|
4
|
+
|
5
|
+
class APIException < StandardError
|
6
|
+
end
|
7
|
+
|
8
|
+
BASE_URL = "https://blockchain.info/"
|
9
|
+
TIMEOUT_SECONDS = 10
|
10
|
+
|
11
|
+
def self.call_api(resource, method: 'get', data: nil, base_url: nil)
|
12
|
+
base_url ||= BASE_URL
|
13
|
+
url = URI.parse(base_url + resource)
|
14
|
+
http = Net::HTTP.new(url.host, url.port)
|
15
|
+
http.use_ssl = true
|
16
|
+
http.read_timeout = TIMEOUT_SECONDS
|
17
|
+
|
18
|
+
request = nil
|
19
|
+
if method == 'get'
|
20
|
+
url.query = data.nil? ? nil : URI.encode_www_form(data)
|
21
|
+
request = Net::HTTP::Get.new(url.request_uri)
|
22
|
+
elsif method == 'post'
|
23
|
+
request = Net::HTTP::Post.new(url.request_uri)
|
24
|
+
request.content_type = 'application/x-www-form-urlencoded'
|
25
|
+
if data != nil then request.set_form_data(data) else {} end
|
26
|
+
end
|
27
|
+
|
28
|
+
response = http.request(request)
|
29
|
+
if response.code != '200'
|
30
|
+
raise APIException, response.body
|
31
|
+
end
|
32
|
+
return response.body
|
33
|
+
end
|
34
|
+
|
34
35
|
end
|