krkt 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 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