cns 0.1.1 → 0.1.2
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 +4 -4
- data/Gemfile.lock +3 -3
- data/lib/cns.rb +11 -15
- data/lib/cns/apibc.rb +280 -0
- data/lib/cns/apice1.rb +227 -0
- data/lib/cns/apice2.rb +280 -0
- data/lib/cns/bigquery1.rb +23 -21
- data/lib/cns/bigquery2.rb +8 -6
- data/lib/cns/bigquery3.rb +33 -21
- data/lib/cns/bigquery4.rb +44 -42
- data/lib/cns/bitcoinde.rb +57 -46
- data/lib/cns/etherscan1.rb +40 -39
- data/lib/cns/etherscan2.rb +25 -23
- data/lib/cns/greymass1.rb +31 -30
- data/lib/cns/greymass2.rb +36 -35
- data/lib/cns/kraken.rb +51 -40
- data/lib/cns/paymium.rb +39 -32
- data/lib/cns/therock.rb +35 -27
- data/lib/cns/version.rb +1 -1
- metadata +5 -8
- data/lib/cns/apide.rb +0 -240
- data/lib/cns/apies.rb +0 -161
- data/lib/cns/apifr.rb +0 -139
- data/lib/cns/apigm.rb +0 -181
- data/lib/cns/apimt.rb +0 -138
- data/lib/cns/apius.rb +0 -167
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2133a6c91eacdca2448707ed31dfbb17ec295ebc245bf123aa748f4ee16c94a0
|
4
|
+
data.tar.gz: fbce4205347f06b47f7b7ad0bf3bc9d54ee95f92b02a022e5452a3fc25262812
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f44eb068aeb057e71293033f362a41c4f967cbc32ee6a8fa4a9dd5b5054dbdbc9df7fa60a6b94fe96a73f7e94722626a561e2abc78791ffaf1334475864c55ca
|
7
|
+
data.tar.gz: 2a70f181fc35bc5a854862b6e3375e29c3e2df649b5c398e51d75b41e11a83e8b2e9015a273de1bcb710f25f8a05e401a1a5a3c83ee33a36fe1c0382fff0e595
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cns (0.1.
|
4
|
+
cns (0.1.2)
|
5
5
|
curb
|
6
6
|
faraday
|
7
7
|
google-cloud-bigquery
|
@@ -19,7 +19,7 @@ GEM
|
|
19
19
|
declarative-option (0.1.0)
|
20
20
|
faraday (1.0.1)
|
21
21
|
multipart-post (>= 1.2, < 3)
|
22
|
-
google-api-client (0.
|
22
|
+
google-api-client (0.45.0)
|
23
23
|
addressable (~> 2.5, >= 2.5.1)
|
24
24
|
googleauth (~> 0.9)
|
25
25
|
httpclient (>= 2.8.1, < 3.0)
|
@@ -28,7 +28,7 @@ GEM
|
|
28
28
|
retriable (>= 2.0, < 4.0)
|
29
29
|
rexml
|
30
30
|
signet (~> 0.12)
|
31
|
-
google-cloud-bigquery (1.
|
31
|
+
google-cloud-bigquery (1.23.0)
|
32
32
|
concurrent-ruby (~> 1.0)
|
33
33
|
google-api-client (~> 0.33)
|
34
34
|
google-cloud-core (~> 1.2)
|
data/lib/cns.rb
CHANGED
@@ -1,35 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require('thor')
|
4
|
-
require('cns/
|
5
|
-
require('cns/
|
6
|
-
require('cns/
|
7
|
-
require('cns/apigm')
|
8
|
-
require('cns/apimt')
|
9
|
-
require('cns/apius')
|
4
|
+
require('cns/apibc')
|
5
|
+
require('cns/apice1')
|
6
|
+
require('cns/apice2')
|
10
7
|
require('cns/bigquery1')
|
11
8
|
require('cns/bigquery2')
|
12
9
|
require('cns/bigquery3')
|
13
10
|
require('cns/bigquery4')
|
14
|
-
require('cns/bitcoinde')
|
15
11
|
require('cns/etherscan1')
|
16
12
|
require('cns/etherscan2')
|
17
13
|
require('cns/greymass1')
|
18
14
|
require('cns/greymass2')
|
15
|
+
require('cns/bitcoinde')
|
19
16
|
require('cns/kraken')
|
20
17
|
require('cns/paymium')
|
21
18
|
require('cns/therock')
|
22
19
|
require('cns/version')
|
23
20
|
|
24
21
|
module Cns
|
25
|
-
# classe para erros desta gem
|
26
|
-
class Erro < StandardError
|
27
|
-
# @return [StandardError] personalizacao dos erros
|
28
|
-
def initialize(msg)
|
29
|
-
super(msg)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
22
|
# classe para carregar/mostrar dados transacoes eth & eos no bigquery
|
34
23
|
class CLI < Thor
|
35
24
|
desc 'work', 'carrega transacoes novas no bigquery'
|
@@ -47,6 +36,13 @@ module Cns
|
|
47
36
|
Bigquery.new(options).mostra_tudo
|
48
37
|
end
|
49
38
|
|
39
|
+
desc 'nn', 'mostra resumo transacoes'
|
40
|
+
# mostra resumo transacoes
|
41
|
+
def nn
|
42
|
+
c = Apice.new.ledger_fr
|
43
|
+
p(c)
|
44
|
+
end
|
45
|
+
|
50
46
|
default_task :show
|
51
47
|
end
|
52
48
|
end
|
data/lib/cns/apibc.rb
ADDED
@@ -0,0 +1,280 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require('faraday')
|
4
|
+
require('json')
|
5
|
+
|
6
|
+
# @author Hernani Rodrigues Vaz
|
7
|
+
module Cns
|
8
|
+
# classe para acesso dados blockchains
|
9
|
+
class Apibc
|
10
|
+
# @example account_es
|
11
|
+
# {
|
12
|
+
# status: '1',
|
13
|
+
# message: 'OK',
|
14
|
+
# result: [
|
15
|
+
# { account: '0x...', balance: '4000000000000000000' },
|
16
|
+
# { account: '0x...', balance: '87000000000000000000' }
|
17
|
+
# ]
|
18
|
+
# }
|
19
|
+
# @param [String] ads lista enderecos ETH (max 20)
|
20
|
+
# @param [Hash] par parametros base do pedido HTTP
|
21
|
+
# @return [Array<Hash>] lista enderecos e seus saldos
|
22
|
+
def account_es(ads, par = { module: 'account', action: 'balancemulti', tag: 'latest' })
|
23
|
+
JSON.parse(
|
24
|
+
(conn_es.get('api') do |o|
|
25
|
+
o.headers = { content_type: 'application/json', accept: 'application/json', user_agent: 'etherscan;ruby' }
|
26
|
+
o.params = par.merge(address: ads.join(','), apikey: ENV['ETHERSCAN_API_KEY'])
|
27
|
+
end).body,
|
28
|
+
symbolize_names: true
|
29
|
+
)[:result]
|
30
|
+
rescue StandardError
|
31
|
+
[]
|
32
|
+
end
|
33
|
+
|
34
|
+
# @example account_gm
|
35
|
+
# {
|
36
|
+
# account_name: '...',
|
37
|
+
# head_block_num: 141_391_122,
|
38
|
+
# head_block_time: '2020-09-11T16:05:51.000',
|
39
|
+
# privileged: false,
|
40
|
+
# last_code_update: '1970-01-01T00:00:00.000',
|
41
|
+
# created: '2018-06-09T13:14:37.000',
|
42
|
+
#
|
43
|
+
# core_liquid_balance: '1232.0228 EOS',
|
44
|
+
# total_resources: { owner: '...', net_weight: '1000.1142 EOS', cpu_weight: '1000.1144 EOS', ram_bytes: 8148 },
|
45
|
+
#
|
46
|
+
# ram_quota: 9548,
|
47
|
+
# net_weight: 10_001_142,
|
48
|
+
# cpu_weight: 10_001_144,
|
49
|
+
# net_limit: { used: 0, available: 1_066_648_346, max: 1_066_648_346 },
|
50
|
+
# cpu_limit: { used: 338, available: 88_498, max: 88_836 },
|
51
|
+
# ram_usage: 3574,
|
52
|
+
# permissions: [
|
53
|
+
# {
|
54
|
+
# perm_name: 'active',
|
55
|
+
# parent: 'owner',
|
56
|
+
# required_auth: {
|
57
|
+
# threshold: 1, keys: [{ key: 'EOS...', weight: 1 }], accounts: [], waits: []
|
58
|
+
# }
|
59
|
+
# },
|
60
|
+
# {
|
61
|
+
# perm_name: 'owner',
|
62
|
+
# parent: '',
|
63
|
+
# required_auth: {
|
64
|
+
# threshold: 1, keys: [{ key: 'EOS...', weight: 1 }], accounts: [], waits: []
|
65
|
+
# }
|
66
|
+
# }
|
67
|
+
# ],
|
68
|
+
# self_delegated_bandwidth: { from: '...', to: '...', net_weight: '1000.1142 EOS', cpu_weight: '1000.1144 EOS' },
|
69
|
+
# refund_request: nil,
|
70
|
+
# voter_info: {
|
71
|
+
# owner: '...',
|
72
|
+
# proxy: '...',
|
73
|
+
# producers: [],
|
74
|
+
# staked: 20_002_286,
|
75
|
+
# last_vote_weight: '17172913021904.12109375000000000',
|
76
|
+
# proxied_vote_weight: '0.00000000000000000',
|
77
|
+
# is_proxy: 0,
|
78
|
+
# flags1: 0,
|
79
|
+
# reserved2: 0,
|
80
|
+
# reserved3: '0.0000 EOS'
|
81
|
+
# },
|
82
|
+
# rex_info: nil
|
83
|
+
# }
|
84
|
+
# @param [String] add endereco EOS
|
85
|
+
# @param [String] uri Uniform Resource Identifier do pedido HTTP
|
86
|
+
# @return [Hash] endereco e seus saldo/recursos
|
87
|
+
def account_gm(add, uri = '/v1/chain/get_account')
|
88
|
+
JSON.parse(
|
89
|
+
conn_gm.post(
|
90
|
+
uri, { account_name: add }.to_json, content_type: 'application/json'
|
91
|
+
).body,
|
92
|
+
symbolize_names: true
|
93
|
+
)
|
94
|
+
rescue StandardError
|
95
|
+
{ core_liquid_balance: 0, total_resources: { net_weight: 0, cpu_weight: 0 } }
|
96
|
+
end
|
97
|
+
|
98
|
+
# @example norml_es
|
99
|
+
# {
|
100
|
+
# status: '1',
|
101
|
+
# message: 'OK',
|
102
|
+
# result: [
|
103
|
+
# {
|
104
|
+
# blockNumber: '4984535',
|
105
|
+
# timeStamp: '1517094794',
|
106
|
+
# hash: '0x...',
|
107
|
+
# nonce: '10',
|
108
|
+
# blockHash: '0x...',
|
109
|
+
# transactionIndex: '17',
|
110
|
+
# from: '0x...',
|
111
|
+
# to: '0x...',
|
112
|
+
# value: '52627271000000000000',
|
113
|
+
# gas: '21000',
|
114
|
+
# gasPrice: '19000000000',
|
115
|
+
# isError: '0',
|
116
|
+
# txreceipt_status: '1',
|
117
|
+
# input: '0x',
|
118
|
+
# contractAddress: '',
|
119
|
+
# gasUsed: '21000',
|
120
|
+
# cumulativeGasUsed: '566293',
|
121
|
+
# confirmations: '5848660'
|
122
|
+
# },
|
123
|
+
# {}
|
124
|
+
# ]
|
125
|
+
# }
|
126
|
+
# @param [String] add endereco ETH
|
127
|
+
# @param [Integer] pag pagina transacoes
|
128
|
+
# @param [Array<Hash>] ary acumulador transacoes
|
129
|
+
# @param par (see account_es)
|
130
|
+
# @return [Array<Hash>] lista completa transacoes etherscan
|
131
|
+
def norml_es(add, pag = 0, ary = [], par = { module: 'account', action: 'txlist', offset: 10_000 })
|
132
|
+
r = JSON.parse(
|
133
|
+
(conn_es.get('api') do |o|
|
134
|
+
o.headers = { content_type: 'application/json', accept: 'application/json', user_agent: 'etherscan;ruby' }
|
135
|
+
o.params = par.merge(address: add, page: pag + 1, apikey: ENV['ETHERSCAN_API_KEY'])
|
136
|
+
end).body,
|
137
|
+
symbolize_names: true
|
138
|
+
)[:result]
|
139
|
+
r.count < 10_000 ? ary + r : norml_es(add, pag + 1, ary + r)
|
140
|
+
rescue StandardError
|
141
|
+
ary
|
142
|
+
end
|
143
|
+
|
144
|
+
# @example token_es
|
145
|
+
# {
|
146
|
+
# status: '1',
|
147
|
+
# message: 'OK',
|
148
|
+
# result: [
|
149
|
+
# {
|
150
|
+
# blockNumber: '3967652',
|
151
|
+
# timeStamp: '1499081515',
|
152
|
+
# hash: '0x registo duplicado com todos os dados iguais',
|
153
|
+
# nonce: '3',
|
154
|
+
# blockHash: '0x00a49e999036dc13dc6c4244bb1d51d3146fe7f00bfb500a7624d82e299c7328',
|
155
|
+
# from: '0xd0a6e6c54dbc68db5db3a091b171a77407ff7ccf',
|
156
|
+
# contractAddress: '0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0',
|
157
|
+
# to: '0x...',
|
158
|
+
# value: '0',
|
159
|
+
# tokenName: 'EOS',
|
160
|
+
# tokenSymbol: 'EOS',
|
161
|
+
# tokenDecimal: '18',
|
162
|
+
# transactionIndex: '83',
|
163
|
+
# gas: '173399',
|
164
|
+
# gasPrice: '21000000000',
|
165
|
+
# gasUsed: '173398',
|
166
|
+
# input: 'deprecated',
|
167
|
+
# cumulativeGasUsed: '7484878',
|
168
|
+
# confirmations: '3442641'
|
169
|
+
# },
|
170
|
+
# {}
|
171
|
+
# ]
|
172
|
+
# }
|
173
|
+
# @param (see norml_es)
|
174
|
+
# @return [Array<Hash>] lista completa token transfer events etherscan
|
175
|
+
def token_es(add, pag = 0, ary = [], par = { module: 'account', action: 'tokentx', offset: 10_000 })
|
176
|
+
# registos duplicados aparecem em token events (ver exemplo acima)
|
177
|
+
# -quando ha erros na blockchain (acho)
|
178
|
+
# -quando ha token events identicos no mesmo block (acho)
|
179
|
+
r = JSON.parse(
|
180
|
+
(conn_es.get('api') do |o|
|
181
|
+
o.headers = { content_type: 'application/json', accept: 'application/json', user_agent: 'etherscan;ruby' }
|
182
|
+
o.params = par.merge(address: add, page: pag + 1, apikey: ENV['ETHERSCAN_API_KEY'])
|
183
|
+
end).body,
|
184
|
+
symbolize_names: true
|
185
|
+
)[:result]
|
186
|
+
r.count < 10_000 ? ary + r : token_es(add, pag + 1, ary + r)
|
187
|
+
rescue StandardError
|
188
|
+
ary
|
189
|
+
end
|
190
|
+
|
191
|
+
# @example ledger_gm
|
192
|
+
# {
|
193
|
+
# actions: [
|
194
|
+
# {
|
195
|
+
# account_action_seq: 964,
|
196
|
+
# action_trace: {
|
197
|
+
# account_ram_deltas: [],
|
198
|
+
# act: {
|
199
|
+
# account: 'voicebestapp',
|
200
|
+
# authorization: [
|
201
|
+
# { actor: 'thetruevoice', permission: 'active' },
|
202
|
+
# { actor: 'voicebestapp', permission: 'active' }
|
203
|
+
# ],
|
204
|
+
# data: { from: 'voicebestapp', memo: '...', quantity: '1.0001 MESSAGE', to: '...' },
|
205
|
+
# hex_data: '...',
|
206
|
+
# name: 'transfer'
|
207
|
+
# },
|
208
|
+
# action_ordinal: 10,
|
209
|
+
# block_num: 141_345_345,
|
210
|
+
# block_time: '2020-09-11T09:44:04.500',
|
211
|
+
# closest_unnotified_ancestor_action_ordinal: 5,
|
212
|
+
# context_free: false,
|
213
|
+
# creator_action_ordinal: 5,
|
214
|
+
# elapsed: 6,
|
215
|
+
# producer_block_id: '...',
|
216
|
+
# receipt: {
|
217
|
+
# abi_sequence: 1,
|
218
|
+
# act_digest: '...',
|
219
|
+
# auth_sequence: [['thetruevoice', 6_778_215], ['voicebestapp', 435_346]],
|
220
|
+
# code_sequence: 1,
|
221
|
+
# global_sequence: 233_283_589_258,
|
222
|
+
# receiver: '...',
|
223
|
+
# recv_sequence: 927
|
224
|
+
# },
|
225
|
+
# receiver: '...',
|
226
|
+
# trx_id: '...'
|
227
|
+
# },
|
228
|
+
# block_num: 141_345_345,
|
229
|
+
# block_time: '2020-09-11T09:44:04.500',
|
230
|
+
# global_action_seq: 233_283_589_258,
|
231
|
+
# irreversible: true
|
232
|
+
# },
|
233
|
+
# {}
|
234
|
+
# ],
|
235
|
+
# head_block_num: 141_721_698,
|
236
|
+
# last_irreversible_block: 141_721_371
|
237
|
+
# }
|
238
|
+
# @param add (see account_gm)
|
239
|
+
# @param [Integer] pos posicao transacoes
|
240
|
+
# @param [Array<Hash>] ary acumulador transacoes
|
241
|
+
# @param uri (see account_gm)
|
242
|
+
# @return [Array<Hash>] lista completa transacoes greymass
|
243
|
+
def ledger_gm(add, pos = 0, ary = [], uri = '/v1/history/get_actions')
|
244
|
+
r = JSON.parse(
|
245
|
+
conn_gm.post(
|
246
|
+
uri, { account_name: add, pos: pos, offset: 100 }.to_json, content_type: 'application/json'
|
247
|
+
).body,
|
248
|
+
symbolize_names: true
|
249
|
+
)[:actions]
|
250
|
+
r.count < 100 ? ary + r : ledger_gm(add, pos + r.count, ary + r)
|
251
|
+
rescue StandardError
|
252
|
+
ary
|
253
|
+
end
|
254
|
+
|
255
|
+
private
|
256
|
+
|
257
|
+
# @return [<Symbol>] adapter for the connection - default :net_http
|
258
|
+
def adapter
|
259
|
+
@adapter ||= Faraday.default_adapter
|
260
|
+
end
|
261
|
+
|
262
|
+
# @return [<Faraday::Connection>] connection object for etherscan
|
263
|
+
def conn_es
|
264
|
+
@conn_es ||=
|
265
|
+
Faraday.new(url: 'https://api.etherscan.io/') do |c|
|
266
|
+
c.request(:url_encoded)
|
267
|
+
c.adapter(adapter)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
# @return [<Faraday::Connection>] connection object for greymass
|
272
|
+
def conn_gm
|
273
|
+
@conn_gm ||=
|
274
|
+
Faraday.new(url: 'https://eos.greymass.com') do |c|
|
275
|
+
c.request(:url_encoded)
|
276
|
+
c.adapter(adapter)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
data/lib/cns/apice1.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require('openssl')
|
4
|
+
require('base64')
|
5
|
+
require('curb')
|
6
|
+
require('json')
|
7
|
+
|
8
|
+
# @author Hernani Rodrigues Vaz
|
9
|
+
module Cns
|
10
|
+
DC = %w[LTC NMC PPC DOGE XRP Linden USD CAD GBP ZEC BCH EURN NOKU FDZ GUSD SEED USDC].freeze
|
11
|
+
|
12
|
+
# (see Apice)
|
13
|
+
class Apice
|
14
|
+
# @example account_de
|
15
|
+
# {
|
16
|
+
# data: {
|
17
|
+
# balances: {
|
18
|
+
# btc: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' },
|
19
|
+
# bch: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' },
|
20
|
+
# btg: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' },
|
21
|
+
# eth: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' },
|
22
|
+
# bsv: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' },
|
23
|
+
# ltc: { total_amount: '0.00000000000000000000', available_amount: '0', reserved_amount: '0' }
|
24
|
+
# },
|
25
|
+
# encrypted_information: { uid: '0y...', bic_short: '0y...', bic_full: '0y...' }
|
26
|
+
# },
|
27
|
+
# errors: [],
|
28
|
+
# credits: 23
|
29
|
+
# }
|
30
|
+
# @param [String] uri Uniform Resource Identifier do pedido HTTP
|
31
|
+
# @return [Hash] saldos no bitcoinde
|
32
|
+
def account_de(uri = 'https://api.bitcoin.de/v4/account')
|
33
|
+
JSON.parse(
|
34
|
+
Curl.get(uri) { |r| r.headers = hde(uri) }.body,
|
35
|
+
symbolize_names: true
|
36
|
+
)[:data][:balances]
|
37
|
+
rescue StandardError
|
38
|
+
{}
|
39
|
+
end
|
40
|
+
|
41
|
+
# @example account_fr
|
42
|
+
# {
|
43
|
+
# name: '...',
|
44
|
+
# email: '...',
|
45
|
+
# locale: 'en',
|
46
|
+
# channel_id: '...',
|
47
|
+
# meta_state: 'approved',
|
48
|
+
# balance_eur: '0.0',
|
49
|
+
# locked_eur: '0.0',
|
50
|
+
# balance_btc: '0.0',
|
51
|
+
# locked_btc: '0.0',
|
52
|
+
# balance_lbtc: '0.0',
|
53
|
+
# locked_lbtc: '0.0'
|
54
|
+
# }
|
55
|
+
# @param (see account_de)
|
56
|
+
# @return [Hash] saldos no paymium
|
57
|
+
def account_fr(uri = 'https://paymium.com/api/v1/user')
|
58
|
+
JSON.parse(
|
59
|
+
Curl.get(uri) { |h| h.headers = hfr(uri) }.body,
|
60
|
+
symbolize_names: true
|
61
|
+
)
|
62
|
+
rescue StandardError
|
63
|
+
{}
|
64
|
+
end
|
65
|
+
|
66
|
+
# @example account_mt
|
67
|
+
# {
|
68
|
+
# balances: [
|
69
|
+
# { currency: 'BTC', balance: 0.0, trading_balance: 0.0 },
|
70
|
+
# { currency: 'ETH', balance: 0.0, trading_balance: 0.0 },
|
71
|
+
# { currency: 'EUR', balance: 0.0, trading_balance: 0.0 },
|
72
|
+
# { currency: 'DAI', balance: 0.0, trading_balance: 0.0 },
|
73
|
+
# ]
|
74
|
+
# }
|
75
|
+
# @param (see account_de)
|
76
|
+
# @return [Array<Hash>] lista saldos no therock
|
77
|
+
def account_mt(uri = 'https://api.therocktrading.com/v1/balances')
|
78
|
+
JSON.parse(
|
79
|
+
Curl.get(uri) { |h| h.headers = hmt(uri) }.body,
|
80
|
+
symbolize_names: true
|
81
|
+
)[:balances]
|
82
|
+
.delete_if { |e| DC.include?(e[:currency]) }
|
83
|
+
.sort { |a, b| a[:currency] <=> b[:currency] }
|
84
|
+
rescue StandardError
|
85
|
+
[]
|
86
|
+
end
|
87
|
+
|
88
|
+
# @example account_us
|
89
|
+
# {
|
90
|
+
# error: [],
|
91
|
+
# result: {
|
92
|
+
# ZEUR: '0.0038',
|
93
|
+
# XXBT: '0.0000000000',
|
94
|
+
# XETH: '1.0000000000',
|
95
|
+
# XETC: '0.0000000000',
|
96
|
+
# EOS: '0.0000001700',
|
97
|
+
# BCH: '0.0000000000'
|
98
|
+
# }
|
99
|
+
# }
|
100
|
+
# @param [String] urb Uniform Resource Base do pedido HTTP
|
101
|
+
# @param uri (see account_de)
|
102
|
+
# @param non (see hde)
|
103
|
+
# @return [Hash] saldos no kraken
|
104
|
+
def account_us(urb = 'https://api.kraken.com/0/private', uri = 'Balance', non = nnc)
|
105
|
+
JSON.parse(
|
106
|
+
Curl.post("#{urb}/#{uri}", nonce: non) { |h| h.headers = hus(uri, nonce: non) }.body,
|
107
|
+
symbolize_names: true
|
108
|
+
)[:result]
|
109
|
+
rescue StandardError
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
# @example deposits_unif_de
|
116
|
+
# [
|
117
|
+
# {
|
118
|
+
# txid: 177_245,
|
119
|
+
# time: '2014-01-31T22:01:30+01:00',
|
120
|
+
# tp: 'deposit',
|
121
|
+
# add: '1KK6HhG3quojFS4CY1mPcbyrjQ8BMDQxmT',
|
122
|
+
# qt: '0.13283',
|
123
|
+
# moe: 'btc',
|
124
|
+
# fee: '0'
|
125
|
+
# },
|
126
|
+
# {}
|
127
|
+
# ]
|
128
|
+
# @param [Hash] hde pagina depositos bitcoinde
|
129
|
+
# @return [Array<Hash>] lista uniformizada pagina depositos bitcoinde
|
130
|
+
def deposits_unif_de(hde)
|
131
|
+
hde[:deposits].map do |h|
|
132
|
+
{
|
133
|
+
add: h[:address],
|
134
|
+
time: Time.parse(h[:created_at]),
|
135
|
+
qt: h[:amount],
|
136
|
+
txid: Integer(h[:deposit_id])
|
137
|
+
}.merge(tp: 'deposit', moe: 'btc', fee: '0')
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# @example withdrawals_unif_de
|
142
|
+
# [
|
143
|
+
# {
|
144
|
+
# txid: 136_605,
|
145
|
+
# time: '2014-02-05T13:05:17+01:00',
|
146
|
+
# tp: 'withdrawal',
|
147
|
+
# add: '1K9YMDDrmMV25EoYNqi7KUEK57Kn3TCNUJ',
|
148
|
+
# qt: '0.120087',
|
149
|
+
# fee: '0',
|
150
|
+
# moe: 'btc'
|
151
|
+
# },
|
152
|
+
# {}
|
153
|
+
# ]
|
154
|
+
# @param [Hash] hwi pagina withdrawals bitcoinde
|
155
|
+
# @return [Array<Hash>] lista uniformizada pagina withdrawals bitcoinde
|
156
|
+
def withdrawals_unif_de(hwi)
|
157
|
+
hwi[:withdrawals].map do |h|
|
158
|
+
{
|
159
|
+
add: h[:address],
|
160
|
+
time: Time.parse(h[:transferred_at]),
|
161
|
+
qt: h[:amount],
|
162
|
+
fee: h[:network_fee],
|
163
|
+
txid: Integer(h[:withdrawal_id])
|
164
|
+
}.merge(tp: 'withdrawal', moe: 'btc')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# @return [Integer] continually-increasing unsigned integer nonce from the current Unix Time
|
169
|
+
def nnc
|
170
|
+
Integer(Float(Time.now) * 1e6)
|
171
|
+
end
|
172
|
+
|
173
|
+
# @param [String] qry query a incluir no pedido HTTP
|
174
|
+
# @param [Integer] non continually-increasing unsigned integer
|
175
|
+
# @return [Hash] headers necessarios para pedido HTTP da exchange bitcoinde
|
176
|
+
def hde(qry, non = nnc)
|
177
|
+
{
|
178
|
+
'X-API-KEY': ENV['BITCOINDE_API_KEY'],
|
179
|
+
'X-API-NONCE': non,
|
180
|
+
'X-API-SIGNATURE': OpenSSL::HMAC.hexdigest(
|
181
|
+
'sha256',
|
182
|
+
ENV['BITCOINDE_API_SECRET'],
|
183
|
+
['GET', qry, ENV['BITCOINDE_API_KEY'], non, Digest::MD5.hexdigest('')].join('#')
|
184
|
+
)
|
185
|
+
}
|
186
|
+
end
|
187
|
+
|
188
|
+
# @param (see hde)
|
189
|
+
# @return [Hash] headers necessarios para pedido HTTP da exchange paymium
|
190
|
+
def hfr(qry, non = nnc)
|
191
|
+
{
|
192
|
+
content_type: 'application/json',
|
193
|
+
'Api-Key': ENV['PAYMIUM_API_KEY'],
|
194
|
+
'Api-Nonce': non,
|
195
|
+
'Api-Signature': OpenSSL::HMAC.hexdigest('sha256', ENV['PAYMIUM_API_SECRET'], [non, qry].join)
|
196
|
+
}
|
197
|
+
end
|
198
|
+
|
199
|
+
# @param (see hde)
|
200
|
+
# @return [Hash] headers necessarios para pedido HTTP da exchange therock
|
201
|
+
def hmt(qry, non = nnc)
|
202
|
+
{
|
203
|
+
content_type: 'application/json',
|
204
|
+
'X-TRT-KEY': ENV['THEROCK_API_KEY'],
|
205
|
+
'X-TRT-NONCE': non,
|
206
|
+
'X-TRT-SIGN': OpenSSL::HMAC.hexdigest('sha512', ENV['THEROCK_API_SECRET'], [non, qry].join)
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
# @param qry (see hde)
|
211
|
+
# @param [Hash] ops opcoes trabalho
|
212
|
+
# @option ops [Hash] :nonce continually-increasing unsigned integer
|
213
|
+
# @return [Hash] headers necessarios para pedido HTTP da exchange kraken
|
214
|
+
def hus(qry, ops)
|
215
|
+
{
|
216
|
+
'api-key': ENV['KRAKEN_API_KEY'],
|
217
|
+
'api-sign': Base64.strict_encode64(
|
218
|
+
OpenSSL::HMAC.digest(
|
219
|
+
'sha512',
|
220
|
+
Base64.decode64(ENV['KRAKEN_API_SECRET']),
|
221
|
+
['/0/private/', qry, Digest::SHA256.digest("#{ops[:nonce]}#{URI.encode_www_form(ops)}")].join
|
222
|
+
)
|
223
|
+
)
|
224
|
+
}
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|