class Eost::Carteiras

classe para processar carteiras & transacoes

(see Carteiras)

Attributes

abn[R]

@return [Array<Integer>] lista blocknumbers transacoes no bigquery - condicionados por opcoes iniciais

api[R]

@return [Eosscan] API eosscan

dbq[R]

@return [Array<Hash>] todos os dados bigquery

ops[R]

@return [Thor::CoreExt::HashWithIndifferentAccess] opcoes trabalho

Public Class Methods

new(dad, pop) click to toggle source

@param [Hash] dad todos os dados bigquery @param [Thor::CoreExt::HashWithIndifferentAccess] pop opcoes trabalho @option pop [Hash] :h ({}) configuracao dias ajuste reposicionamento temporal @option pop [Boolean] :v (false) mostra dados transacoes? @option pop [Boolean] :t (false) mostra transacoes todas ou somente novas? @return [Carteiras] API eosscan - processar transacoes

# File lib/eost/carteiras.rb, line 24
def initialize(dad, pop)
  @api = Eosscan.new
  @dbq = dad
  @ops = pop
  @abn = (ops[:t] ? [] : dbq[:nt].map { |t| t[:blocknumber] })
end

Public Instance Methods

act_data(htx) click to toggle source

@param (see formata_transacao) @return [Hash] dados da acao

# File lib/eost/formatar.rb, line 37
def act_data(htx)
  htx['action_trace']['act']['data']
end
base_eosscan(hwb) click to toggle source

@param [Hash] hwb wallet bigquery eos @return [Hash] dados eosscan - address, saldo & transacoes

# File lib/eost/carteiras.rb, line 58
def base_eosscan(hwb)
  {
    ax: hwb[:ax],
    sl: eosscan_sl(hwb[:ax]).inject(:+),
    tx: eosscan_tx(hwb[:ax])
  }
end
bigquery_eosscan(hwb, hes) click to toggle source

@param hwb (see base_eosscan) @param [Hash] hes dados eosscan @return [Hash] dados juntos bigquery & eosscan

# File lib/eost/carteiras.rb, line 78
def bigquery_eosscan(hwb, hes)
  {
    id: hwb[:id],
    ax: hwb[:ax],
    bs: hwb[:sl],
    bt: dbq[:nt].select { |t| t[:iax] == hwb[:ax] },
    es: hes[:sl],
    et: hes[:tx]
  }.merge(novas_ok(hwb, hes))
end
bnn() click to toggle source

@return [Array<Integer>] lista blocknumbers de transacoes novas

# File lib/eost/carteiras.rb, line 42
def bnn
  @bnn ||= (des.map { |e| e[:tx].map { |n| Integer(n['block_num']) } }.flatten - abn)
end
des() click to toggle source

@return [Array<Hash>] todos os dados eosscan - saldos & transacoes

# File lib/eost/carteiras.rb, line 32
def des
  @des ||= dbq[:wb].map { |e| base_eosscan(e) }
end
djn() click to toggle source

@return [Array<Hash>] todos os dados juntos bigquery & eosscan

# File lib/eost/carteiras.rb, line 37
def djn
  @djn ||= dbq[:wb].map { |b| bigquery_eosscan(b, des.select { |s| b[:ax] == s[:ax] }.first) }
end
eosscan_sl(add) click to toggle source

@param [String] add endereco carteira EOS @return [Array<BigDecimal>] lista recursos - liquido, net, spu

# File lib/eost/carteiras.rb, line 91
def eosscan_sl(add)
  v = api.chain_get_account(account_name: add)
  [
    v['core_liquid_balance'].to_d,
    v['total_resources']['net_weight'].to_d,
    v['total_resources']['cpu_weight'].to_d
  ]
end
eosscan_tx(add) click to toggle source

@param (see eosscan_sl) @return [Array<Hash>] lista ultimas 100 transacoes ligadas a uma carteira - sem elementos irrelevantes

# File lib/eost/carteiras.rb, line 102
def eosscan_tx(add)
  api.history_get_actions(account_name: add, offset: -100)['actions'].map do |e|
    e.delete('global_action_seq')
    e
  end
end
formata_carteira(hjn) click to toggle source

@param [Hash] hjn dados juntos bigquery & eosscan @return [String] texto formatado duma carteira

# File lib/eost/formatar.rb, line 9
def formata_carteira(hjn)
  format(
    '%<s1>-12.12s %<v1>12.4f %<v2>12.4f %<nn>3i %<ok>-3s',
    s1: hjn[:ax],
    v1: hjn[:bs],
    v2: hjn[:es],
    nn: hjn[:nn].count,
    ok: hjn[:ok] ? 'OK' : 'NOK'
  )
end
formata_transacao(htx) click to toggle source

@param [Hash] htx transacao @return [String] texto formatado transacao

# File lib/eost/formatar.rb, line 22
def formata_transacao(htx)
  format(
    '%<bn>9i %<fr>-12.12s %<to>-12.12s %<ac>-12.12s %<dt>10.10s %<vl>13.4f %<sy>-6.6s',
    bn: htx['block_num'],
    fr: act_data(htx)['from'],
    to: act_data(htx)['to'],
    ac: htx['action_trace']['act']['name'],
    dt: Date.parse(htx['block_time']),
    vl: act_data(htx)['quantity'].to_d,
    sy: act_data(htx)['quantity'][/[[:upper:]]+/]
  )
end
mostra_configuracao_ajuste_dias() click to toggle source

@return [String] texto configuracao ajuste dias das transacoes

# File lib/eost/formatar.rb, line 60
def mostra_configuracao_ajuste_dias
  return unless novas.count.positive?

  puts("\nstring ajuste dias\n-h=#{novas_sort.map { |e| "#{e['block_num']}:0" }.join(' ')}")
end
mostra_resumo() click to toggle source

@return [String] texto carteiras & transacoes & ajuste dias

# File lib/eost/formatar.rb, line 42
def mostra_resumo
  return unless djn.count.positive?

  puts("\naddress      --bigquery-- --eosscans-- new")
  djn.each { |e| puts(formata_carteira(e)) }
  mostra_transacoes_novas
  mostra_configuracao_ajuste_dias
end
mostra_transacoes_novas() click to toggle source

@return [String] texto transacoes

# File lib/eost/formatar.rb, line 52
def mostra_transacoes_novas
  return unless ops[:v] && novas.count.positive?

  puts("\nblock num add from     add to       accao        ---data--- ----valor----")
  novas_sort.each { |e| puts(formata_transacao(e)) }
end
novas() click to toggle source

@return [Array<Hash>] lista transacoes novas

# File lib/eost/carteiras.rb, line 47
def novas
  @novas ||= des.map { |e| e[:tx].select { |s| bnn.include?(Integer(s['block_num'])) } }.flatten.uniq
end
novas_ok(hwb, hes) click to toggle source

@param (see bigquery_eosscan) @return [Hash<Array, Boolean>] lista blocknumbers novos & carteira ok?

# File lib/eost/carteiras.rb, line 68
def novas_ok(hwb, hes)
  # quando todas as transacoes obtidas da api vao ser inseridas,
  # entao podem ficar transacoes por inserir - api consegue apenas um maximo de 100 transacoes
  n = hes[:tx].map { |v| Integer(v['block_num']) } - abn
  { nn: n, ok: hwb[:sl] == hes[:sl] && n.count < hes[:tx].count }
end
novas_sort() click to toggle source

@return [Array<Hash>] lista ordenada transacoes novas

# File lib/eost/carteiras.rb, line 52
def novas_sort
  novas.sort { |a, b| Integer(a['block_num']) <=> Integer(b['block_num']) }
end