cns 0.3.4 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 628583895b421b1b5d84af2753d24d28d4c0f2d1e4ed4f363160ef07b1d0e23d
4
- data.tar.gz: 7e14420b81120d01f9abe1171fc248949ff8ffbeff2c698901dc0d60d7d68ad5
3
+ metadata.gz: 50e17e193099669aed9ed6e7b5b555cd6a8ed33a664d4390ca96f3c0dd633da5
4
+ data.tar.gz: 47ef9c5fde7e329a39d3c2efbc37a004bafe215bfdaafdab2ea0502e3930f4ec
5
5
  SHA512:
6
- metadata.gz: 2d0f31b4f43dcef2abcfddce96174ee06de7650fa5413390e126bd532056df1349f3e438f13759651b35cf666e78e688a6378f92f3dff782a0a14f51ff1c575c
7
- data.tar.gz: 89e7998c421ad34256815ca720f02814875a2d58958c97604c24b3313388e9d6c324ba67473784299a47c9fb90b76af8806bad80563bd985fd3d56a588110029
6
+ metadata.gz: 6dae786aa9f694ee2bcd67ff33fe929bc2a45b71829c015e2ba210551a609c332123bd0c7d8761dabcb73eceaa817b8216123b89560380927243abe6d16d4361
7
+ data.tar.gz: 2a7a177ffb73054a36972c2616b99a69222ab838f2e9f1ddae48497abd2238becc7be13b636d124c28b43a7f5fbcbbd108e9a08c6fff546f5af71ee476068978
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cns (0.3.4)
4
+ cns (0.3.6)
5
5
  curb
6
6
  faraday
7
7
  google-cloud-bigquery
@@ -7,8 +7,109 @@ require('json')
7
7
 
8
8
  # @author Hernani Rodrigues Vaz
9
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
+
10
12
  # classe para acesso dados centralized exchanges
11
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) { |obj| obj.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) { |obj| obj.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) { |obj| obj.headers = hmt(uri) }.body,
80
+ symbolize_names: true
81
+ )[:balances]
82
+ .delete_if { |del| DC.include?(del[:currency]) }
83
+ .sort { |oba, obb| oba[:currency] <=> obb[: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) { |obj| obj.headers = hus(uri, nonce: non) }.body,
107
+ symbolize_names: true
108
+ )[:result]
109
+ rescue StandardError
110
+ {}
111
+ end
112
+
12
113
  # @example trades_de
13
114
  # {
14
115
  # trades: [{
@@ -319,5 +420,69 @@ module Cns
319
420
  rescue StandardError
320
421
  has
321
422
  end
423
+
424
+ private
425
+
426
+ # @return [Integer] continually-increasing unsigned integer nonce from the current Unix Time
427
+ def nnc
428
+ Integer(Float(Time.now) * 1e6)
429
+ end
430
+
431
+ # @param [String] qde query a incluir no pedido HTTP
432
+ # @param [Integer] non continually-increasing unsigned integer
433
+ # @return [Hash] headers necessarios para pedido HTTP da exchange bitcoinde
434
+ def hde(qde, non = nnc)
435
+ key = ENV['BITCOINDE_API_KEY']
436
+ {
437
+ 'X-API-KEY': key,
438
+ 'X-API-NONCE': non,
439
+ 'X-API-SIGNATURE': OpenSSL::HMAC.hexdigest(
440
+ 'sha256',
441
+ ENV['BITCOINDE_API_SECRET'],
442
+ ['GET', qde, key, non, Digest::MD5.hexdigest('')].join('#')
443
+ )
444
+ }
445
+ end
446
+
447
+ # @param [String] qfr query a incluir no pedido HTTP
448
+ # @param non (see hde)
449
+ # @return [Hash] headers necessarios para pedido HTTP da exchange paymium
450
+ def hfr(qfr, non = nnc)
451
+ {
452
+ content_type: 'application/json',
453
+ 'Api-Key': ENV['PAYMIUM_API_KEY'],
454
+ 'Api-Nonce': non,
455
+ 'Api-Signature': OpenSSL::HMAC.hexdigest('sha256', ENV['PAYMIUM_API_SECRET'], [non, qfr].join)
456
+ }
457
+ end
458
+
459
+ # @param [String] qmt query a incluir no pedido HTTP
460
+ # @param non (see hde)
461
+ # @return [Hash] headers necessarios para pedido HTTP da exchange therock
462
+ def hmt(qmt, non = nnc)
463
+ {
464
+ content_type: 'application/json',
465
+ 'X-TRT-KEY': ENV['THEROCK_API_KEY'],
466
+ 'X-TRT-NONCE': non,
467
+ 'X-TRT-SIGN': OpenSSL::HMAC.hexdigest('sha512', ENV['THEROCK_API_SECRET'], [non, qmt].join)
468
+ }
469
+ end
470
+
471
+ # @param [String] qus query a incluir no pedido HTTP
472
+ # @param [Hash] ops opcoes trabalho
473
+ # @option ops [Hash] :nonce continually-increasing unsigned integer
474
+ # @return [Hash] headers necessarios para pedido HTTP da exchange kraken
475
+ def hus(qus, ops)
476
+ {
477
+ 'api-key': ENV['KRAKEN_API_KEY'],
478
+ 'api-sign': Base64.strict_encode64(
479
+ OpenSSL::HMAC.digest(
480
+ 'sha512',
481
+ Base64.decode64(ENV['KRAKEN_API_SECRET']),
482
+ ['/0/private/', qus, Digest::SHA256.digest("#{ops[:nonce]}#{URI.encode_www_form(ops)}")].join
483
+ )
484
+ )
485
+ }
486
+ end
322
487
  end
323
488
  end
@@ -4,7 +4,7 @@ require('bigdecimal/util')
4
4
 
5
5
  # @author Hernani Rodrigues Vaz
6
6
  module Cns
7
- # (see Beaconchain)
7
+ # classe para processar historicos da beaconchain
8
8
  class Beaconchain
9
9
  # @return [Apibc] API blockchains
10
10
  attr_reader :api
@@ -98,5 +98,88 @@ module Cns
98
98
  eb: abc[:bx]
99
99
  }
100
100
  end
101
+
102
+ # @return [String] texto validadores & saldos historicos
103
+ def mostra_resumo
104
+ return unless dados.count.positive?
105
+
106
+ puts("\nindex address beaconchain blh bigquery blh")
107
+ dados.each { |obj| puts(formata_validador(obj)) }
108
+ mostra_saldos
109
+ end
110
+
111
+ # @param [Hash] hjn dados juntos bigquery & beaconchain
112
+ # @return [String] texto formatado dum validador
113
+ def formata_validador(hjn)
114
+ format('%<s1>-5.5s %<s2>-34.34s ', s1: hjn[:id], s2: formata_endereco(hjn[:ax], 34)) + formata_valores(hjn)
115
+ end
116
+
117
+ # @param (see formata_validador)
118
+ # @return [String] texto formatado valores dum validador
119
+ def formata_valores(hjn)
120
+ format(
121
+ '%<v1>11.6f %<n1>3i %<v2>12.6f %<n2>6i %<ok>-3s',
122
+ v1: hjn[:es],
123
+ n1: hjn[:eb].count,
124
+ v2: hjn[:bs],
125
+ n2: hjn[:bb].count,
126
+ ok: ok?(hjn) ? 'OK' : 'NOK'
127
+ )
128
+ end
129
+
130
+ # @param (see formata_validador)
131
+ # @return [Boolean] validador tem historicos novos(sim=NOK, nao=OK)?
132
+ def ok?(hjn)
133
+ hjn[:bs] == hjn[:es]
134
+ end
135
+
136
+ # @example pubkey inicio..fim
137
+ # 0x10f3a0cf0b534c..c033cf32e8a03586
138
+ # @param [String] add chave publica validador
139
+ # @param [Integer] max chars a mostrar
140
+ # @return [String] pubkey formatada
141
+ def formata_endereco(add, max)
142
+ return 'erro' if max < 7
143
+
144
+ max -= 2
145
+ ini = Integer(max / 2)
146
+ inf = max % 2
147
+ "#{add[0, ini - 3]}..#{add[-inf - ini - 3..]}"
148
+ end
149
+
150
+ # @example
151
+ # {
152
+ # balance: 32_489_497_108,
153
+ # effectivebalance: 32_000_000_000,
154
+ # epoch: 8296,
155
+ # validatorindex: 11_766,
156
+ # week: 5
157
+ # }
158
+ # @param [Hash] hbh historico beaconchain
159
+ # @return [String] texto formatado historico beaconchain
160
+ def formata_saldos(hbh)
161
+ idx = hbh[:validatorindex]
162
+ epc = hbh[:epoch]
163
+ format(
164
+ '%<vi>5i %<vl>17.6f %<ep>6i %<id>9i',
165
+ vi: idx,
166
+ vl: (hbh[:balance].to_d / (10**9)).round(10),
167
+ ep: epc,
168
+ id: itx(epc, idx)
169
+ )
170
+ end
171
+
172
+ # @return [String] texto historico saldos
173
+ def mostra_saldos
174
+ return unless ops[:v] && nov.count.positive?
175
+
176
+ puts("\nindex saldo epoch itx")
177
+ sorbx.each { |obj| puts(formata_saldos(obj)) }
178
+ end
179
+
180
+ # @return [Array<Hash>] lista ordenada historico saldos
181
+ def sorbx
182
+ nov.sort { |ant, prx| ant[:itx] <=> prx[:itx] }
183
+ end
101
184
  end
102
185
  end