krkt 0.1.1 → 0.1.2

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: d7ecf13d81e36dc2d9295da177be307c1cb561cdc58b724f08c5dce8b908c077
4
- data.tar.gz: ec40bacfe8c616e1b7b87633e6f549c26879ea3362c3611b09c98b7046d4d90a
3
+ metadata.gz: 5e77ce587432e90cad0d143296824dc047f9c2d625740726a1718195e7e5ed9f
4
+ data.tar.gz: c6e54c032fdaf6b4b5b93d6c4e44485f29c136a9258df66c76425a5179735426
5
5
  SHA512:
6
- metadata.gz: 0b397260748d90b88bb7240f86b361c9e6f0f7faec26f13795e1edb279ae1375573d529b13b029df676e3b1eb791d22ffdd3017ba8280b7732194438384bd79c
7
- data.tar.gz: 4f3aa178068ff860ae858c8e23d0bd3fe0010821297bf850ebbd46ad6cc7cb80499e14e8dd95038adf077480124db692e8105ffb3951b3fa2429d36efe1dfa2e
6
+ metadata.gz: c95f8a46d51664fed210e8b39ff2c3dcf8f13306bc1df591e8ad566f20e1be5c873af3586201e12cddbc3c8aa3fa2ee6f350dc4e27c1cec1a24de4d68bde2805
7
+ data.tar.gz: 85b8362ebb1dbf177513440b80383b9ab080c526cb5b63b5a1677a473f79f27c49e5f6401ebc9d1e4bbfabe37611f86956298b14a50c39562ace62e776147e55
@@ -1,11 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- krkt (0.1.1)
4
+ krkt (0.1.2)
5
5
  curb
6
- faraday
7
6
  google-cloud-bigquery
8
- json
9
7
  thor
10
8
  yard
11
9
 
@@ -48,7 +46,6 @@ GEM
48
46
  os (>= 0.9, < 2.0)
49
47
  signet (~> 0.14)
50
48
  httpclient (2.8.3)
51
- json (2.3.1)
52
49
  jwt (2.2.2)
53
50
  memoist (0.16.2)
54
51
  mini_mime (1.0.2)
@@ -31,9 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency('rake')
32
32
 
33
33
  spec.add_dependency('curb')
34
- spec.add_dependency('faraday')
35
34
  spec.add_dependency('google-cloud-bigquery')
36
- spec.add_dependency('json')
37
35
  spec.add_dependency('thor')
38
36
  spec.add_dependency('yard')
39
37
  end
@@ -6,10 +6,11 @@ require('krkt/client')
6
6
  require('krkt/kraken')
7
7
  require('krkt/version')
8
8
 
9
+ # @author Hernani Rodrigues Vaz
9
10
  module Krkt
10
11
  class Error < ::StandardError; end
11
12
 
12
- # classe para carregar/mostrar dados comuns bigquery & etherscan
13
+ # classe para carregar/mostrar dados transacoes kraken no bigquery
13
14
  class CLI < Thor
14
15
  desc 'work', 'carrega transacoes novas no bigquery'
15
16
  option :h, type: :hash, default: {}, desc: 'configuracao ajuste reposicionamento temporal'
@@ -26,15 +27,6 @@ module Krkt
26
27
  Bigquery.new(options).transacoes.mostra_resumo
27
28
  end
28
29
 
29
- desc 'novo', 'mostra reumo carteiras & transacoes'
30
- # mostra reumo carteiras & transacoes
31
- def novo
32
- client = Client.new
33
- p(client.trades_history(start: 'TLADFV-QIUTN-QDNCBR')['trades'].keys)
34
- # p(client.ledgers(start: 'L4ZDDO-WUGC2-Z72VPW')['ledger'].keys)
35
- p(client.balance)
36
- end
37
-
38
30
  default_task :show
39
31
  end
40
32
  end
@@ -7,7 +7,7 @@ require('bigdecimal/util')
7
7
  module Krkt
8
8
  BD = 'hernanirvaz.coins'
9
9
 
10
- # classe para processar kraken & bigquery
10
+ # classe para processar bigquery & kraken
11
11
  class Bigquery
12
12
  # @return [Google::Cloud::Bigquery] API bigquery
13
13
  attr_reader :api
@@ -20,9 +20,9 @@ module Krkt
20
20
 
21
21
  # @param [Thor::CoreExt::HashWithIndifferentAccess] pop opcoes trabalho
22
22
  # @option pop [Hash] :h ({}) configuracao ajuste reposicionamento temporal
23
- # @option pop [Boolean] :v (false) mostra transacoes normais & ledger?
23
+ # @option pop [Boolean] :v (false) mostra transacoes trades & ledger?
24
24
  # @option pop [Boolean] :t (false) mostra transacoes todas ou somente novas?
25
- # @return [Bigquery] API bigquery & API kraken
25
+ # @return [Bigquery] API bigquery & kraken
26
26
  def initialize(pop)
27
27
  # usa env GOOGLE_APPLICATION_CREDENTIALS para obter credentials
28
28
  # @see https://cloud.google.com/bigquery/docs/authentication/getting-started
@@ -30,7 +30,7 @@ module Krkt
30
30
  @ops = pop
31
31
  end
32
32
 
33
- # @return [Kraken] API kraken - processar transacoes normais e ledgers
33
+ # @return [Kraken] API kraken - obter saldos & transacoes trades e ledger
34
34
  def transacoes
35
35
  @transacoes ||= Kraken.new(
36
36
  {
@@ -80,11 +80,11 @@ module Krkt
80
80
  # @return [String] comando insert SQL formatado usl (ledger)
81
81
  def usl_ins
82
82
  "insert #{BD}.usl(txid,refid,time,type,aclass,asset,amount,fee" \
83
- ") VALUES#{transacoes.ledger.map { |k, v| usl_val1(k, v) }.join(',')}"
83
+ ") VALUES#{transacoes.ledger.map { |k, v| usl_val(k, v) }.join(',')}"
84
84
  end
85
85
 
86
- # @return [String] valores formatados usl (ledger parte1)
87
- def usl_val1(idx, hes)
86
+ # @return [String] valores formatados usl (ledger)
87
+ def usl_val(idx, hes)
88
88
  "('#{idx}'," \
89
89
  "'#{hes['refid']}'," \
90
90
  "PARSE_DATETIME('%s', '#{String(hes['time'].round)}')," \
@@ -5,13 +5,14 @@ require('base64')
5
5
  require('curb')
6
6
  require('json')
7
7
 
8
+ # @author Hernani Rodrigues Vaz
8
9
  module Krkt
9
- # class Client
10
+ # classe para processar dados no kraken
10
11
  class Client
11
12
  # @return [String] API key
12
- attr_reader :key
13
+ attr_reader :aky
13
14
  # @return [String] API secret
14
- attr_reader :sec
15
+ attr_reader :asc
15
16
  # @return [String] API public url
16
17
  attr_reader :puu
17
18
  # @return [String] API private url
@@ -19,65 +20,90 @@ module Krkt
19
20
  # @return [String] API private path
20
21
  attr_reader :pth
21
22
 
22
- # def initialize(api_key: nil, api_secret: nil, options: {})
23
- def initialize(api_key: ENV['KRAKEN_API_KEY'], api_secret: ENV['KRAKEN_API_SECRET'], options: {})
23
+ # @param [String] pky API key
24
+ # @param [String] psc API secret
25
+ # @return [Client] API kraken base
26
+ def initialize(pky: ENV['KRAKEN_API_KEY'], psc: ENV['KRAKEN_API_SECRET'], options: {})
24
27
  b = options.fetch(:base_uri, 'https://api.kraken.com')
25
28
  v = options.fetch(:version, 0)
26
- @key = api_key
27
- @sec = api_secret
29
+ @aky = pky
30
+ @asc = psc
28
31
  @puu = "#{b}/#{v}/public/"
29
32
  @pru = "#{b}/#{v}/private/"
30
33
  @pth = "/#{v}/private/"
31
34
  end
32
35
 
33
- # type = type of trade (optional)
34
- # all = all types (default)
35
- # any position = any position (open or closed)
36
- # closed position = positions that have been closed
37
- # closing position = any trade closing all or part of a position
38
- # no position = non-positional trades
39
- # trades = whether or not to include trades related to position in output (optional. default = false)
40
- # start = starting unix timestamp or trade tx id of results (optional. exclusive)
41
- # end = ending unix timestamp or trade tx id of results (optional. inclusive)
42
- # ofs = result offset
43
- # Result: array of trade info
44
- # trades = array of trade info with txid as the key
45
- # ordertxid = order responsible for execution of trade
46
- # pair = asset pair
47
- # time = unix timestamp of trade
48
- # type = type of order (buy/sell)
49
- # ordertype = order type
50
- # price = average price order was executed at (quote currency)
51
- # cost = total cost of order (quote currency)
52
- # fee = total fee (quote currency)
53
- # vol = volume (base currency)
54
- # margin = initial margin (quote currency)
55
- # misc = comma delimited list of miscellaneous info
56
- # closing = trade closes all or part of a position
57
- # count = amount of available trades info matching criteria
58
- def trades_history(**opts)
59
- post_private('TradesHistory', **opts)['result']
36
+ # @return [Hash] resultados ultimas transacoes trades no kraken
37
+ # @example
38
+ # {
39
+ # 'trades' => {
40
+ # 'TLADFV-QIUTN-QDNCBR' => {
41
+ # 'ordertxid' => 'O2CRFG-5PCJA-EMX7VC',
42
+ # 'pair' => 'XETHXXBT',
43
+ # 'time' => 1_463_422_494.7069,
44
+ # 'type' => 'buy',
45
+ # 'ordertype' => 'market',
46
+ # 'price' => '0.024400',
47
+ # 'cost' => '1.358424',
48
+ # 'fee' => '0.003532',
49
+ # 'vol' => '55.67311475',
50
+ # 'margin' => '0.000000',
51
+ # 'misc' => ''
52
+ # },
53
+ # ...
54
+ # },
55
+ # 'count' => 156
56
+ # }
57
+ def trades_history
58
+ post_private('TradesHistory')['result']
60
59
  end
61
60
 
62
- # def ledgers
63
- def ledgers(**opts)
64
- post_private('Ledgers', **opts)['result']
61
+ # @return [Hash] resultados ultimas transacoes ledger no kraken
62
+ # @example
63
+ # {
64
+ # 'ledger' => {
65
+ # 'LUK3QC-QW6TA-27B7NI' => {
66
+ # 'refid' => 'A2BNCQS-CHCETZ-JYCER6',
67
+ # 'time' => 1_584_349_306.9479,
68
+ # 'type' => 'withdrawal',
69
+ # 'subtype' => '',
70
+ # 'aclass' => 'currency',
71
+ # 'asset' => 'XETH',
72
+ # 'amount' => '-29.2659039100',
73
+ # 'fee' => '0.0050000000',
74
+ # 'balance' => '1.1806988100'
75
+ # }
76
+ # ,
77
+ # ...
78
+ # },
79
+ # 'count' => 373
80
+ # }
81
+ def ledger
82
+ post_private('Ledgers')['result']
65
83
  end
66
84
 
67
- # def balance
85
+ # @return [Hash] saldos no kraken
86
+ # @example
87
+ # {
88
+ # 'ZEUR' => '0.0000',
89
+ # 'XXBT' => '0.0000000000',
90
+ # 'XETH' => '1.1806988100',
91
+ # 'XETC' => '0.0000000000',
92
+ # 'EOS' => '0.0000001700',
93
+ # 'BCH' => '0.0000000000'
94
+ # }
68
95
  def balance
69
96
  post_private('Balance')['result']
70
97
  end
71
98
 
72
- # Get server time
73
- # URL: https://api.kraken.com/0/public/Time
74
- # Returns a hash with keys +error+ and +result+.
75
- # +result+ is an array of hashes with keys:
76
- # +unixtime+ = unix timestamp
77
- # +rfc1123+ = RFC 1123 time format
78
- #
99
+ # @return [Hash] data hora kraken
100
+ # @example
101
+ # {
102
+ # 'unixtime' => 1_598_956_727,
103
+ # 'rfc1123' => 'Tue, 1 Sep 20 10:38:47 +0000'
104
+ # }
79
105
  def server_time
80
- get_public('Time')
106
+ get_public('Time')['result']
81
107
  end
82
108
 
83
109
  private
@@ -90,23 +116,23 @@ module Krkt
90
116
  # HTTP POST request for private API queries involving user credentials.
91
117
  def post_private(method, **opts)
92
118
  # Generate a continually-increasing unsigned 51-bit integer nonce from the current Unix Time.
93
- t = opts.merge!({ nonce: Integer(Time.now.to_f * 1_000_000) }).map { |p| p.join('=') }.join('&')
119
+ opts.merge!({ nonce: Integer(Time.now) * 1_000_000 })
94
120
 
95
- parse_response(Curl.post("#{pru}#{method}", t) do |r|
121
+ parse_response(Curl.post("#{pru}#{method}", opts) do |r|
96
122
  r.headers = {
97
- 'api-key': key,
98
- 'api-sign': authenticate(method, opts[:nonce], t)
123
+ 'api-key': aky,
124
+ 'api-sign': authenticate(method, opts[:nonce], opts.map { |p| p.join('=') }.join('&'))
99
125
  }
100
126
  end)
101
127
  end
102
128
 
103
129
  def authenticate(method, nonce, params)
104
- raise(ArgumentError, 'API Key is not set') unless key
105
- raise(ArgumentError, 'API Secret is not set') unless sec
130
+ raise(ArgumentError, 'API Key is not set') unless aky
131
+ raise(ArgumentError, 'API Secret is not set') unless asc
106
132
 
107
133
  Base64.strict_encode64(OpenSSL::HMAC.digest(
108
134
  'sha512',
109
- Base64.decode64(sec),
135
+ Base64.decode64(asc),
110
136
  "#{pth}#{method}#{Digest::SHA256.digest("#{nonce}#{params}")}"
111
137
  ))
112
138
  end
@@ -4,7 +4,7 @@ require('bigdecimal/util')
4
4
 
5
5
  # @author Hernani Rodrigues Vaz
6
6
  module Krkt
7
- # classe para processar carteiras & transacoes normais e ledgers
7
+ # classe para processar saldos & transacoes trades e ledger
8
8
  class Kraken
9
9
  # @return [Client] API kraken
10
10
  attr_reader :api
@@ -16,44 +16,48 @@ module Krkt
16
16
  # @param [Hash] dad todos os dados bigquery
17
17
  # @param [Thor::CoreExt::HashWithIndifferentAccess] pop opcoes trabalho
18
18
  # @option pop [Hash] :h ({}) configuracao dias ajuste reposicionamento temporal
19
- # @option pop [Boolean] :v (false) mostra dados transacoes normais & ledgers?
20
- # @return [Kraken] API kraken - processar transacoes normais e ledgers
19
+ # @option pop [Boolean] :v (false) mostra dados transacoes trades & ledger?
20
+ # @option pop [Boolean] :t (false) mostra transacoes todas ou somente novas?
21
+ # @return [Kraken] API kraken - obter saldos & transacoes trades e ledger
21
22
  def initialize(dad, pop)
23
+ # API kraken base
22
24
  @api = Client.new
23
25
  @dbq = dad
24
26
  @ops = pop
25
27
  end
26
28
 
27
- # @return [Array<Hash>] todos os dados kraken - saldos & transacoes
29
+ # @return [Hash] dados kraken - saldos & transacoes trades e ledger
28
30
  def dkr
29
31
  @dkr ||= {
30
32
  sl: api.balance,
31
33
  kt: api.trades_history,
32
- kl: api.ledgers
34
+ kl: api.ledger
33
35
  }
34
36
  end
35
37
 
36
- # @return [Array<Integer>] lista blocknumbers de transacoes normais
38
+ # @return [Array<String>] lista txid de transacoes trades
37
39
  def kyt
38
40
  @kyt ||= dkr[:kt]['trades'].keys - (ops[:t] ? [] : dbq[:nt].map { |e| e[:txid] })
39
41
  end
40
42
 
41
- # @return [Array<Integer>] lista blocknumbers de transacoes ledger
43
+ # @return [Array<String>] lista txid de transacoes ledger
42
44
  def kyl
43
45
  @kyl ||= dkr[:kl]['ledger'].keys - (ops[:t] ? [] : dbq[:nl].map { |e| e[:txid] })
44
46
  end
45
47
 
46
- # @return [Array<Hash>] lista transacoes novas trades
48
+ # @return [Hash] transacoes trades
47
49
  def trades
48
50
  @trades ||= dkr[:kt]['trades'].select { |k, _| kyt.include?(k) }
49
51
  end
50
52
 
51
- # @return [Array<Hash>] lista transacoes novas ledger
53
+ # @return [Hash] transacoes ledger
52
54
  def ledger
53
55
  @ledger ||= dkr[:kl]['ledger'].select { |k, _| kyl.include?(k) }
54
56
  end
55
57
 
56
- # def formata_saldos(moe, sal)
58
+ # @parm [String] moe codigo kraken da moeda
59
+ # @parm [String] moe saldo kraken da moeda
60
+ # @return [String] texto formatado saldos (kraken/bigquery) & iguais/ok/nok?
57
61
  def formata_saldos(moe, sal)
58
62
  t = dbq[:sl][moe.downcase.to_sym].to_d
59
63
  format(
@@ -65,8 +69,9 @@ module Krkt
65
69
  )
66
70
  end
67
71
 
68
- # @parm [Hash] htx transacao normal
69
- # @return [String] texto formatado transacao normal
72
+ # @parm [String] idx codigo transacao
73
+ # @parm [Hash] htx transacao trade
74
+ # @return [String] texto formatado transacao trade
70
75
  def formata_transacao_trades(idx, htx)
71
76
  format(
72
77
  '%<ky>-6.6s %<dt>19.19s %<ty>-10.10s %<mo>-8.8s %<pr>8.2f %<vl>15.7f %<co>8.2f',
@@ -80,6 +85,7 @@ module Krkt
80
85
  )
81
86
  end
82
87
 
88
+ # @parm idx (see formata_transacao_trades)
83
89
  # @parm [Hash] hlx transacao ledger
84
90
  # @return [String] texto formatado transacao ledger
85
91
  def formata_transacao_ledger(idx, hlx)
@@ -106,7 +112,7 @@ module Krkt
106
112
  puts("\nstring ajuste dias dos trades\n-h=#{kyt.map { |e| "#{e}:0" }.join(' ')}")
107
113
  end
108
114
 
109
- # @return [String] texto transacoes normais
115
+ # @return [String] texto transacoes trades
110
116
  def mostra_trades
111
117
  return unless ops[:v] && trades.count.positive?
112
118
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Krkt
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: krkt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernâni Rodrigues Vaz
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: faraday
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: google-cloud-bigquery
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +66,6 @@ dependencies:
80
66
  - - ">="
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: json
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: thor
99
71
  requirement: !ruby/object:Gem::Requirement