cns 0.8.3 → 0.8.4

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: 447a7eabc62ea51c62ff66775c277f6ea40a8812a781f28b695ce00f773dc2b7
4
- data.tar.gz: '06778bee30d6d2e7ed2cd6ff13749b13941eb9006c961fbbaf80e358d38cb653'
3
+ metadata.gz: c1bca1a698024e59b3f4e8d69775a26223730139af0e7b5a717c26512046ec06
4
+ data.tar.gz: a3d3734c9322ae42283f1871314c28864c536a24a23219474f3eab5ec97a90da
5
5
  SHA512:
6
- metadata.gz: a308f6d97e7685d5b2335225ee180347ab1b806ff08780eac84edbf1b732b74627d860026803d9871ccb90c9b0bf74e323e1b24b23d6d64f10916d6dd0f0dae4
7
- data.tar.gz: 705c5c84272baeb7b2e60af69d5a6c802c7a6c28a9c34420a94395b87464829ac7e1a25fa37c60fe62a655aea7971cf210f827100638f37a1794d45cd6d8a89c
6
+ metadata.gz: 0047d7643b0e402d6d059bf1f0e7b4fdc024ec8439929e5dc53fac26a5c617df4d0923fb3dca0e1188887006aaf89f78ee3770c402335ca39845fc8a098de250
7
+ data.tar.gz: 9bb7c6ad69b0635f9bc09304918dba12f5d7f0a97a4b1413a020ac5b704b1694ef3b3a854260bd7706f544233c2753fa3a3d26b950fe1b0b5f0da27f3585db6f
data/.rubocop.yml CHANGED
@@ -18,7 +18,7 @@ Metrics/AbcSize:
18
18
 
19
19
  # Formatting Rules
20
20
  Layout/LineLength:
21
- Max: 160
21
+ Max: 180
22
22
  AllowHeredoc: true
23
23
  AllowURI: true
24
24
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cns (0.8.3)
4
+ cns (0.8.4)
5
5
  curb
6
6
  faraday
7
7
  google-cloud-bigquery
@@ -89,7 +89,8 @@ GEM
89
89
  multi_json (~> 1.11)
90
90
  os (>= 0.9, < 2.0)
91
91
  signet (>= 0.16, < 2.a)
92
- httpclient (2.8.3)
92
+ httpclient (2.9.0)
93
+ mutex_m
93
94
  jaro_winkler (1.6.0)
94
95
  json (2.10.1)
95
96
  jwt (2.10.1)
@@ -106,7 +107,7 @@ GEM
106
107
  mutex_m (0.3.0)
107
108
  net-http (0.6.0)
108
109
  uri
109
- nokogiri (1.18.2-x86_64-linux-gnu)
110
+ nokogiri (1.18.3-x86_64-linux-gnu)
110
111
  racc (~> 1.4)
111
112
  observer (0.1.2)
112
113
  os (1.1.4)
data/lib/cns/bigquery.rb CHANGED
@@ -7,17 +7,27 @@ require('bigdecimal/util')
7
7
  module Cns
8
8
  BD = 'hernanirvaz.coins'
9
9
  FO = File.expand_path("~/#{File.basename($PROGRAM_NAME)}.log")
10
+ # Define table configurations at the class level
11
+ TC = {
12
+ i: %w[blocknumber timestamp txhash axfrom axto iax value contractaddress input type gas gasused traceid iserror errcode],
13
+ p: %w[blocknumber timestamp blockreward iax],
14
+ w: %w[withdrawalindex validatorindex address amount blocknumber timestamp],
15
+ t: %w[blocknumber timestamp txhash nonce blockhash transactionindex axfrom axto iax value gas gasprice gasused iserror txreceipt_status input contractaddress dias],
16
+ k: %w[blocknumber timestamp txhash nonce blockhash transactionindex axfrom axto iax value tokenname tokensymbol tokendecimal gas gasprice gasused input contractaddress dias],
17
+ neost: %w[gseq aseq bnum time contract action acfrom acto iax amount moeda memo dias],
18
+ cdet: %w[txid time tp user btc eur dtc dias],
19
+ cdel: %w[txid time tp add moe qt fee],
20
+ cust: %w[txid ordertxid pair time type ordertype price cost fee vol margin misc ledgers dias],
21
+ cusl: %w[txid refid time type aclass asset amount fee]
22
+ }
10
23
 
11
24
  # classe para processar bigquery
12
25
  class Bigquery
13
26
  # @return [Google::Cloud::Bigquery] API bigquery
14
- attr_reader :api
15
27
  # @return [Google::Cloud::Bigquery::QueryJob] job bigquery
16
- attr_reader :job
17
28
  # @return [Thor::CoreExt::HashWithIndifferentAccess] opcoes trabalho
18
- attr_reader :ops
19
29
  # @return (see sql)
20
- attr_reader :sqr
30
+ attr_reader :api, :job, :ops, :sqr
21
31
 
22
32
  # @param [Thor::CoreExt::HashWithIndifferentAccess] pop opcoes trabalho
23
33
  # @option pop [Hash] :h ({}) configuracao ajuste reposicionamento temporal
@@ -85,26 +95,14 @@ module Cns
85
95
  #
86
96
  # @return [String] linhas & tabelas afetadas
87
97
  def processa_eth
88
- str = 'ETH'
89
- str += format(' %<n>i netht', n: dml(netht_ins)) if apies.novtx.count.positive?
90
- str += format(' %<n>i nethi', n: dml(nethi_ins)) if apies.novix.count.positive?
91
- str += format(' %<n>i nethp', n: dml(nethp_ins)) if apies.novpx.count.positive?
92
- str += format(' %<n>i nethw', n: dml(nethw_ins)) if apies.novwx.count.positive?
93
- str += format(' %<n>i nethk', n: dml(nethk_ins)) if apies.novkx.count.positive?
94
- str
98
+ tabelas_eth(apies, 'netb')
95
99
  end
96
100
 
97
101
  # insere transacoes blockchain novas nas tabelas netht (norml), nethi (internas), nethp (block), nethw (withdrawals), nethk (token)
98
102
  #
99
103
  # @return [String] linhas & tabelas afetadas
100
104
  def processa_ethc
101
- str = 'ETH'
102
- str += format(' %<n>i netht', n: dml(netbt_ins)) if apiesc.novtx.count.positive?
103
- str += format(' %<n>i nethi', n: dml(netbi_ins)) if apiesc.novix.count.positive?
104
- str += format(' %<n>i nethp', n: dml(netbp_ins)) if apiesc.novpx.count.positive?
105
- str += format(' %<n>i nethw', n: dml(netbw_ins)) if apiesc.novwx.count.positive?
106
- str += format(' %<n>i nethk', n: dml(netbk_ins)) if apiesc.novkx.count.positive?
107
- str
105
+ tabelas_eth(apiesc, 'netc')
108
106
  end
109
107
 
110
108
  # insere transacoes exchange kraken novas nas tabelas ust (trades), usl (ledger)
@@ -143,9 +141,11 @@ module Cns
143
141
  def job?(cmd)
144
142
  @job = api.query_job(cmd)
145
143
  job.wait_until_done!
146
- fld = job.failed?
147
- puts(job.error['message']) if fld
148
- fld
144
+
145
+ return false unless job.failed?
146
+
147
+ puts("BigQuery Error: #{job.error['message']}")
148
+ true
149
149
  end
150
150
 
151
151
  # cria Structured Query Language (SQL) job bigquery
@@ -165,34 +165,28 @@ module Cns
165
165
  job?(cmd) ? 0 : job.num_dml_affected_rows
166
166
  end
167
167
 
168
- # @return [Etherscan] API blockchain ETH
169
- def apies
170
- @apies ||= Etherscan.new(
168
+ def initialize_etherscan_client(prx)
169
+ Etherscan.new(
171
170
  {
172
- wb: sql("select * from #{BD}.wetb order by ax"),
173
- ni: sql("select * from #{BD}.netbi"),
174
- nk: sql("select * from #{BD}.netbk"),
175
- np: sql("select * from #{BD}.netbp"),
176
- nt: sql("select * from #{BD}.netbt"),
177
- nw: sql("select * from #{BD}.netbw")
171
+ wb: sql("SELECT * FROM #{BD}.wet#{prx[-1]} ORDER BY ax"),
172
+ ni: sql("SELECT * FROM #{BD}.#{prx}i"),
173
+ nk: sql("SELECT * FROM #{BD}.#{prx}k"),
174
+ np: sql("SELECT * FROM #{BD}.#{prx}p"),
175
+ nt: sql("SELECT * FROM #{BD}.#{prx}t"),
176
+ nw: sql("SELECT * FROM #{BD}.#{prx}w")
178
177
  },
179
178
  ops
180
179
  )
181
180
  end
182
181
 
182
+ # @return [Etherscan] API blockchain ETH
183
+ def apies
184
+ @apies ||= initialize_etherscan_client('netb')
185
+ end
186
+
183
187
  # @return [Etherscan] API blockchain ETH
184
188
  def apiesc
185
- @apiesc ||= Etherscan.new(
186
- {
187
- wb: sql("select * from #{BD}.wetc order by ax"),
188
- ni: sql("select * from #{BD}.netci"),
189
- nk: sql("select * from #{BD}.netck"),
190
- np: sql("select * from #{BD}.netcp"),
191
- nt: sql("select * from #{BD}.netct"),
192
- nw: sql("select * from #{BD}.netcw")
193
- },
194
- ops
195
- )
189
+ @apiesc ||= initialize_etherscan_client('netc')
196
190
  end
197
191
 
198
192
  # @return [Greymass] API blockchain EOS
@@ -224,140 +218,92 @@ module Cns
224
218
  )
225
219
  end
226
220
 
227
- # @return [String] comando insert SQL formatado netht (norml)
228
- def bnetht_ins
229
- "insert #{BD}.netht(blocknumber,timestamp,txhash,nonce,blockhash,transactionindex,axfrom,axto,iax," \
230
- 'value,gas,gasprice,gasused,iserror,txreceipt_status,input,contractaddress,dias) VALUES'
231
- end
232
-
233
- # @return [String] comando insert SQL formatado nethi (internas)
234
- def bnethi_ins
235
- "insert #{BD}.nethi(blocknumber,timestamp,txhash,axfrom,axto,iax," \
236
- 'value,contractaddress,input,type,gas,gasused,traceid,iserror,errcode) VALUES'
237
- end
238
-
239
- # @return [String] comando insert SQL formatado nethp (block)
240
- def bnethp_ins
241
- "insert #{BD}.nethp(blocknumber,timestamp,blockreward,iax) VALUES"
242
- end
243
-
244
- # @return [String] comando insert SQL formatado nethw (withdrawals)
245
- def bnethw_ins
246
- "insert #{BD}.nethw(withdrawalindex,validatorindex,address,amount,blocknumber,timestamp) VALUES"
247
- end
248
-
249
- # @return [String] comando insert SQL formatado nethk (token)
250
- def bnethk_ins
251
- "insert #{BD}.nethk(blocknumber,timestamp,txhash,nonce,blockhash,transactionindex,axfrom,axto,iax," \
252
- 'value,tokenname,tokensymbol,tokendecimal,gas,gasprice,gasused,input,contractaddress,dias) VALUES'
253
- end
254
-
255
- # @return [String] comando insert SQL formatado netht (norml)
256
- def netht_ins
257
- "#{bnetht_ins}#{apies.novtx.map { |obj| netht_val(obj) }.join(',')}"
258
- end
259
-
260
- # @return [String] comando insert SQL formatado nethi (internas)
261
- def nethi_ins
262
- "#{bnethi_ins}#{apies.novix.map { |obj| nethi_val(obj) }.join(',')}"
263
- end
221
+ # Generic ETH data processor
222
+ def tabelas_eth(src, prx)
223
+ str = ['ETH']
224
+ %i[t i p w k].each do |typ|
225
+ novx = src.send("nov#{typ}x")
226
+ next if novx.empty?
264
227
 
265
- # @return [String] comando insert SQL formatado nethp (block)
266
- def nethp_ins
267
- "#{bnethp_ins}#{apies.novpx.map { |obj| nethp_val(obj) }.join(',')}"
228
+ str << format(' %<n>i %<t>s', n: dml(insert_eht(typ, novx)), t: "#{prx.chop}h#{typ}")
229
+ end
230
+ str.join
268
231
  end
269
232
 
270
- # @return [String] comando insert SQL formatado nethw (withdrawals)
271
- def nethw_ins
272
- "#{bnethw_ins}#{apies.novwx.map { |obj| nethw_val(obj) }.join(',')}"
273
- end
274
-
275
- # @return [String] comando insert SQL formatado nethk (token)
276
- def nethk_ins
277
- "#{bnethk_ins}#{apies.novkx.map { |obj| nethk_val(obj) }.join(',')}"
278
- end
279
-
280
- # @return [String] comando insert SQL formatado netht (norml)
281
- def netbt_ins
282
- "#{bnetht_ins}#{apiesc.novtx.map { |obj| netht_val(obj) }.join(',')}"
283
- end
284
-
285
- # @return [String] comando insert SQL formatado nethi (internas)
286
- def netbi_ins
287
- "#{bnethi_ins}#{apiesc.novix.map { |obj| nethi_val(obj) }.join(',')}"
288
- end
289
-
290
- # @return [String] comando insert SQL formatado nethp (block)
291
- def netbp_ins
292
- "#{bnethp_ins}#{apiesc.novpx.map { |obj| nethp_val(obj) }.join(',')}"
293
- end
294
-
295
- # @return [String] comando insert SQL formatado nethw (withdrawals)
296
- def netbw_ins
297
- "#{bnethw_ins}#{apiesc.novwx.map { |obj| nethw_val(obj) }.join(',')}"
298
- end
299
-
300
- # @return [String] comando insert SQL formatado nethk (token)
301
- def netbk_ins
302
- "#{bnethk_ins}#{apiesc.novkx.map { |obj| nethk_val(obj) }.join(',')}"
233
+ def insert_eht(typ, lin)
234
+ "INSERT #{BD}.neth#{typ} (#{TC[typ].join(',')}) VALUES #{lin.map { |itm| send("neth#{typ}_val", itm) }.join(',')}"
303
235
  end
304
236
 
305
237
  # @return [String] comando insert SQL formatado eos
306
238
  def eost_ins
307
- "insert #{BD}.neost(gseq,aseq,bnum,time,contract,action,acfrom,acto,iax,amount,moeda,memo,dias" \
308
- ") VALUES#{apigm.novax.map { |obj| eost_val(obj) }.join(',')}"
239
+ "insert #{BD}.neost(#{TC[:neost].join(',')}) VALUES#{apigm.novax.map { |obj| eost_val(obj) }.join(',')}"
309
240
  end
310
241
 
311
242
  # @return [String] comando insert SQL formatado det (trades)
312
243
  def det_ins
313
- "insert #{BD}.cdet(txid,time,tp,user,btc,eur,dtc,dias) VALUES#{apide.trades.map { |obj| det_val(obj) }.join(',')}"
244
+ "insert #{BD}.cdet(#{TC[:cdet].join(',')}) VALUES#{apide.trades.map { |obj| det_val(obj) }.join(',')}"
314
245
  end
315
246
 
316
247
  # @return [String] comando insert SQL formatado del (ledger)
317
248
  def del_ins
318
- "insert #{BD}.cdel(txid,time,tp,add,moe,qt,fee) VALUES#{apide.ledger.map { |obj| del_val(obj) }.join(',')}"
249
+ "insert #{BD}.cdel(#{TC[:cdel].join(',')}) VALUES#{apide.ledger.map { |obj| del_val(obj) }.join(',')}"
319
250
  end
320
251
 
321
252
  # @return [String] comando insert SQL formatado ust (trades)
322
253
  def ust_ins
323
- "insert #{BD}.cust(txid,ordertxid,pair,time,type,ordertype,price,cost,fee,vol,margin,misc,ledgers,dias) " \
324
- "VALUES#{apius.trades.map { |key, val| ust_val(key, val) }.join(',')}"
254
+ "insert #{BD}.cust(#{TC[:cust].join(',')}) VALUES#{apius.trades.map { |key, val| ust_val(key, val) }.join(',')}"
325
255
  end
326
256
 
327
257
  # @return [String] comando insert SQL formatado usl (ledger)
328
258
  def usl_ins
329
- "insert #{BD}.cusl(txid,refid,time,type,aclass,asset,amount,fee) " \
330
- "VALUES#{apius.ledger.map { |key, val| usl_val(key, val) }.join(',')}"
259
+ "insert #{BD}.cusl(#{TC[:cusl].join(',')}) VALUES#{apius.ledger.map { |key, val| usl_val(key, val) }.join(',')}"
260
+ end
261
+
262
+ # SQL value formatting methods with improved safety
263
+ def quote(value)
264
+ return 'null' if value.nil? || value.empty?
265
+
266
+ "'#{value.gsub('\'', "''")}'" # Escape single quotes
267
+ end
268
+
269
+ def numeric(value)
270
+ "CAST('#{value}' AS NUMERIC)"
271
+ end
272
+
273
+ def integer(value)
274
+ Integer(value).to_s
275
+ rescue StandardError
276
+ 'null'
331
277
  end
332
278
 
333
- # @example (see Apibc#norml_es)
334
279
  # @param [Hash] htx transacao norml etherscan
335
280
  # @return [String] valores formatados netht (norml parte1)
336
281
  def netht_val(htx)
337
282
  txr = htx[:txreceipt_status]
338
- cta = htx[:contractAddress]
339
283
  inp = htx[:input]
340
- "(#{Integer(htx[:blockNumber])}," \
341
- "#{Integer(htx[:timeStamp])}," \
342
- "'#{htx[:hash]}'," \
343
- "#{Integer(htx[:nonce])}," \
344
- "'#{htx[:blockHash]}'," \
345
- "#{Integer(htx[:transactionIndex])}," \
346
- "'#{htx[:from]}'," \
347
- "'#{htx[:to]}'," \
348
- "'#{htx[:iax]}'," \
349
- "cast('#{htx[:value]}' as numeric)," \
350
- "cast('#{htx[:gas]}' as numeric)," \
351
- "cast('#{htx[:gasPrice]}' as numeric)," \
352
- "cast('#{htx[:gasUsed]}' as numeric)," \
353
- "#{Integer(htx[:isError])}," \
354
- "#{txr.empty? ? 'null' : txr}," \
355
- "#{inp.empty? ? 'null' : "'#{inp}'"}," \
356
- "#{cta.empty? ? 'null' : "'#{cta}'"}," \
357
- "#{Integer(ops[:h][htx[:blockNumber]] || 0)})"
358
- end
359
-
360
- # @example (see Apibc#inter_es)
284
+ cta = htx[:contractAddress]
285
+ "(#{[
286
+ integer(htx[:blockNumber]),
287
+ integer(htx[:timeStamp]),
288
+ quote(htx[:hash]),
289
+ integer(htx[:nonce]),
290
+ quote(htx[:blockHash]),
291
+ integer(htx[:transactionIndex]),
292
+ quote(htx[:from]),
293
+ quote(htx[:to]),
294
+ quote(htx[:iax]),
295
+ numeric(htx[:value]),
296
+ numeric(htx[:gas]),
297
+ numeric(htx[:gasPrice]),
298
+ numeric(htx[:gasUsed]),
299
+ integer(htx[:isError]),
300
+ txr.empty? ? 'null' : integer(txr),
301
+ inp.empty? ? 'null' : quote(inp),
302
+ cta.empty? ? 'null' : quote(cta),
303
+ integer(ops.dig(:h, htx[:blockNumber]) || 0)
304
+ ].join(',')})"
305
+ end
306
+
361
307
  # @param [Hash] htx transacao internas etherscan
362
308
  # @return [String] valores formatados nethi (internas parte1)
363
309
  def nethi_val(htx)
@@ -365,70 +311,70 @@ module Cns
365
311
  inp = htx[:input]
366
312
  tid = htx[:traceId]
367
313
  txr = htx[:errCode]
368
- "(#{Integer(htx[:blockNumber])}," \
369
- "#{Integer(htx[:timeStamp])}," \
370
- "'#{htx[:hash]}'," \
371
- "'#{htx[:from]}'," \
372
- "'#{htx[:to]}'," \
373
- "'#{htx[:iax]}'," \
374
- "cast('#{htx[:value]}' as numeric)," \
375
- "#{cta.empty? ? 'null' : "'#{cta}'"}," \
376
- "#{inp.empty? ? 'null' : "'#{inp}'"}," \
377
- "'#{htx[:type]}'," \
378
- "cast('#{htx[:gas]}' as numeric)," \
379
- "cast('#{htx[:gasUsed]}' as numeric)," \
380
- "#{tid.empty? ? 'null' : "'#{tid}'"}," \
381
- "#{Integer(htx[:isError])}," \
382
- "#{txr.empty? ? 'null' : txr})"
314
+ "(#{[
315
+ integer(htx[:blockNumber]),
316
+ integer(htx[:timeStamp]),
317
+ quote(htx[:hash]),
318
+ quote(htx[:from]),
319
+ quote(htx[:to]),
320
+ quote(htx[:iax]),
321
+ numeric(htx[:value]),
322
+ cta.empty? ? 'null' : quote(cta),
323
+ inp.empty? ? 'null' : quote(inp),
324
+ quote(htx[:type]),
325
+ numeric(htx[:gas]),
326
+ numeric(htx[:gasUsed]),
327
+ tid.empty? ? 'null' : quote(tid),
328
+ integer(htx[:isError]),
329
+ txr.empty? ? 'null' : integer(txr)
330
+ ].join(',')})"
383
331
  end
384
332
 
385
- # @example (see Apibc#block_es)
386
333
  # @param [Hash] htx transacao block etherscan
387
334
  # @return [String] valores formatados nethi (block parte1)
388
335
  def nethp_val(htx)
389
- "(#{Integer(htx[:blockNumber])}," \
390
- "#{Integer(htx[:timeStamp])}," \
391
- "cast('#{htx[:blockReward]}' as numeric)," \
392
- "'#{htx[:iax]}')"
336
+ "(#{[integer(htx[:blockNumber]), integer(htx[:timeStamp]), numeric(htx[:blockReward]), quote(htx[:iax])].join(',')})"
393
337
  end
394
338
 
395
- # @example (see Apibc#block_es)
396
339
  # @param [Hash] htx transacao withdrawals etherscan
397
340
  # @return [String] valores formatados nethi (withdrawals parte1)
398
341
  def nethw_val(htx)
399
- "(#{Integer(htx[:withdrawalIndex])}," \
400
- "#{Integer(htx[:validatorIndex])}," \
401
- "'#{htx[:address]}'," \
402
- "cast('#{htx[:amount]}' as numeric)," \
403
- "#{Integer(htx[:blockNumber])}," \
404
- "#{Integer(htx[:timestamp])})"
342
+ "(#{[
343
+ integer(htx[:withdrawalIndex]),
344
+ integer(htx[:validatorIndex]),
345
+ quote(htx[:address]),
346
+ numeric(htx[:amount]),
347
+ integer(htx[:blockNumber]),
348
+ integer(htx[:timestamp])
349
+ ].join(',')})"
405
350
  end
406
351
 
407
- # @example (see Apibc#token_es)
408
352
  # @param [Hash] hkx token event etherscan
409
353
  # @return [String] valores formatados nethk (token parte1)
410
- def nethk_val(hkx)
411
- cta = hkx[:contractAddress]
412
- inp = hkx[:input]
413
- "(#{Integer(hkx[:blockNumber])}," \
414
- "#{Integer(hkx[:timeStamp])}," \
415
- "'#{hkx[:hash]}'," \
416
- "#{Integer(hkx[:nonce])}," \
417
- "'#{hkx[:blockHash]}'," \
418
- "#{Integer(hkx[:transactionIndex])}," \
419
- "'#{hkx[:from]}'," \
420
- "'#{hkx[:to]}'," \
421
- "'#{hkx[:iax]}'," \
422
- "cast('#{hkx[:value]}' as numeric)," \
423
- "'#{hkx[:tokenName]}'," \
424
- "'#{hkx[:tokenSymbol]}'," \
425
- "#{Integer(hkx[:tokenDecimal])}," \
426
- "cast('#{hkx[:gas]}' as numeric)," \
427
- "cast('#{hkx[:gasPrice]}' as numeric)," \
428
- "cast('#{hkx[:gasUsed]}' as numeric)," \
429
- "#{inp.empty? ? 'null' : "'#{inp}'"}," \
430
- "#{cta.empty? ? 'null' : "'#{cta}'"}," \
431
- "#{Integer(ops[:h][hkx[:blockNumber]] || 0)})"
354
+ def nethk_val(htx)
355
+ inp = htx[:input]
356
+ cta = htx[:contractAddress]
357
+ "(#{[
358
+ integer(htx[:blockNumber]),
359
+ integer(htx[:timeStamp]),
360
+ quote(htx[:hash]),
361
+ integer(htx[:nonce]),
362
+ quote(htx[:blockHash]),
363
+ integer(htx[:transactionIndex]),
364
+ quote(htx[:from]),
365
+ quote(htx[:to]),
366
+ quote(htx[:iax]),
367
+ numeric(htx[:value]),
368
+ quote(htx[:tokenName]),
369
+ quote(htx[:tokenSymbol]),
370
+ integer(htx[:tokenDecimal]),
371
+ numeric(htx[:gas]),
372
+ numeric(htx[:gasPrice]),
373
+ numeric(htx[:gasUsed]),
374
+ inp.empty? ? 'null' : quote(inp),
375
+ cta.empty? ? 'null' : quote(cta),
376
+ integer(ops.dig(:h, htx[:blockNumber]) || 0)
377
+ ].join(',')})"
432
378
  end
433
379
 
434
380
  # @example (see Apibc#ledger_gm)
data/lib/cns/etherscan.rb CHANGED
@@ -29,27 +29,27 @@ module Cns
29
29
 
30
30
  # @return [Array<Hash>] lista transacoes normais novas
31
31
  def novtx
32
- @novtx ||= bcd.map { |obc| obc[:tx].select { |obj| idt.include?(obj[:itx]) } }.flatten
32
+ @novtx ||= bcd.map { |obc| obc[:tx].select { |obj| idt.include?(obj[:itx]) } }.flatten.uniq { |itm| itm[:itx] }
33
33
  end
34
34
 
35
35
  # @return [Array<Hash>] lista transacoes internas novas
36
36
  def novix
37
- @novix ||= bcd.map { |obc| obc[:ix].select { |obj| idi.include?(obj[:itx]) } }.flatten
37
+ @novix ||= bcd.map { |obc| obc[:ix].select { |obj| idi.include?(obj[:itx]) } }.flatten.uniq { |itm| itm[:itx] }
38
38
  end
39
39
 
40
40
  # @return [Array<Hash>] lista transacoes block novas
41
41
  def novpx
42
- @novpx ||= bcd.map { |obc| obc[:px].select { |obj| idp.include?(obj[:itx]) } }.flatten
42
+ @novpx ||= bcd.map { |obc| obc[:px].select { |obj| idp.include?(obj[:itx]) } }.flatten.uniq { |itm| itm[:itx] }
43
43
  end
44
44
 
45
45
  # @return [Array<Hash>] lista transacoes withdrawals novas
46
46
  def novwx
47
- @novwx ||= bcd.map { |obc| obc[:wx].select { |obj| idw.include?(obj[:itx]) } }.flatten
47
+ @novwx ||= bcd.map { |obc| obc[:wx].select { |obj| idw.include?(obj[:itx]) } }.flatten.uniq { |itm| itm[:itx] }
48
48
  end
49
49
 
50
50
  # @return [Array<Hash>] lista transacoes token novas
51
51
  def novkx
52
- @novkx ||= bcd.map { |obc| obc[:kx].select { |obj| idk.include?(obj[:itx]) } }.flatten
52
+ @novkx ||= bcd.map { |obc| obc[:kx].select { |obj| idk.include?(obj[:itx]) } }.flatten.uniq { |itm| itm[:itx] }
53
53
  end
54
54
 
55
55
  # @return [Array<String>] lista dos meus enderecos
@@ -108,7 +108,7 @@ module Cns
108
108
  tx: filtrar_tx(acc, api.norml_es(acc)),
109
109
  ix: filtrar_tx(acc, api.inter_es(acc)),
110
110
  px: filtrar_px(acc, api.block_es(acc)),
111
- wx: filtrar_px(acc, api.withw_es(acc)),
111
+ wx: filtrar_wx(acc, api.withw_es(acc)),
112
112
  kx: filtrar_tx(acc, api.token_es(acc))
113
113
  }
114
114
  end
@@ -153,6 +153,14 @@ module Cns
153
153
  ary.map { |omp| omp.merge(itx: Integer(omp[:blockNumber]), iax: add) }
154
154
  end
155
155
 
156
+ # @param add (see Apibc#norml_es)
157
+ # @param [Array<Hash>] ary lista blocks events
158
+ # @return [Array<Hash>] lista blocks events filtrada
159
+ def filtrar_wx(add, ary)
160
+ # adiciona chave indice itx & adiciona identificador da carteira iax
161
+ ary.map { |omp| omp.merge(itx: Integer(omp[:withdrawalIndex]), iax: add) }
162
+ end
163
+
156
164
  # dt: Time.at(Integer(htx[:timeStamp])),
157
165
  # @return [Array<Hash>] lista ordenada transacoes normais novas
158
166
  def sortx
@@ -339,9 +347,9 @@ module Cns
339
347
  # @return [String] texto formatado transacao withdrawals etherscan
340
348
  def formata_transacao_withw(htx)
341
349
  format(
342
- '%<vi>9i %<bn>9i %<dt>10.10s %<vl>10.6f',
350
+ '%<vi>9i %<bn>10i %<dt>10.10s %<vl>10.6f',
343
351
  vi: htx[:validatorIndex],
344
- bn: htx[:blockNumber],
352
+ bn: htx[:withdrawalIndex],
345
353
  dt: Time.at(Integer(htx[:timestamp])),
346
354
  vl: (htx[:amount].to_d / (10**9)).round(10)
347
355
  )
@@ -383,7 +391,7 @@ module Cns
383
391
  def mostra_transacao_withw
384
392
  return unless ops[:v] && novwx.count.positive?
385
393
 
386
- puts("\nvalidator block data valor")
394
+ puts("\nvalidator withdrawal data valor")
387
395
  sorwx.each { |obj| puts(formata_transacao_withw(obj)) }
388
396
  end
389
397
 
data/lib/cns/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cns
4
- VERSION = '0.8.3'
4
+ VERSION = '0.8.4'
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernâni Rodrigues Vaz
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-02-18 00:00:00.000000000 Z
10
+ date: 2025-02-22 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bundler