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 +4 -4
- data/Gemfile.lock +1 -4
- data/krkt.gemspec +0 -2
- data/lib/krkt.rb +2 -10
- data/lib/krkt/bigquery.rb +7 -7
- data/lib/krkt/client.rb +79 -53
- data/lib/krkt/kraken.rb +19 -13
- data/lib/krkt/version.rb +1 -1
- metadata +1 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e77ce587432e90cad0d143296824dc047f9c2d625740726a1718195e7e5ed9f
|
4
|
+
data.tar.gz: c6e54c032fdaf6b4b5b93d6c4e44485f29c136a9258df66c76425a5179735426
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c95f8a46d51664fed210e8b39ff2c3dcf8f13306bc1df591e8ad566f20e1be5c873af3586201e12cddbc3c8aa3fa2ee6f350dc4e27c1cec1a24de4d68bde2805
|
7
|
+
data.tar.gz: 85b8362ebb1dbf177513440b80383b9ab080c526cb5b63b5a1677a473f79f27c49e5f6401ebc9d1e4bbfabe37611f86956298b14a50c39562ace62e776147e55
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
krkt (0.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)
|
data/krkt.gemspec
CHANGED
@@ -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
|
data/lib/krkt.rb
CHANGED
@@ -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
|
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
|
data/lib/krkt/bigquery.rb
CHANGED
@@ -7,7 +7,7 @@ require('bigdecimal/util')
|
|
7
7
|
module Krkt
|
8
8
|
BD = 'hernanirvaz.coins'
|
9
9
|
|
10
|
-
# classe para processar
|
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
|
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 &
|
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 -
|
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|
|
83
|
+
") VALUES#{transacoes.ledger.map { |k, v| usl_val(k, v) }.join(',')}"
|
84
84
|
end
|
85
85
|
|
86
|
-
# @return [String] valores formatados usl (ledger
|
87
|
-
def
|
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)}')," \
|
data/lib/krkt/client.rb
CHANGED
@@ -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
|
-
#
|
10
|
+
# classe para processar dados no kraken
|
10
11
|
class Client
|
11
12
|
# @return [String] API key
|
12
|
-
attr_reader :
|
13
|
+
attr_reader :aky
|
13
14
|
# @return [String] API secret
|
14
|
-
attr_reader :
|
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
|
-
#
|
23
|
-
|
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
|
-
@
|
27
|
-
@
|
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
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
|
55
|
-
|
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
|
-
#
|
63
|
-
|
64
|
-
|
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
|
-
#
|
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
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
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
|
-
|
119
|
+
opts.merge!({ nonce: Integer(Time.now) * 1_000_000 })
|
94
120
|
|
95
|
-
parse_response(Curl.post("#{pru}#{method}",
|
121
|
+
parse_response(Curl.post("#{pru}#{method}", opts) do |r|
|
96
122
|
r.headers = {
|
97
|
-
'api-key':
|
98
|
-
'api-sign': authenticate(method, opts[:nonce],
|
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
|
105
|
-
raise(ArgumentError, 'API Secret is not set') unless
|
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(
|
135
|
+
Base64.decode64(asc),
|
110
136
|
"#{pth}#{method}#{Digest::SHA256.digest("#{nonce}#{params}")}"
|
111
137
|
))
|
112
138
|
end
|
data/lib/krkt/kraken.rb
CHANGED
@@ -4,7 +4,7 @@ require('bigdecimal/util')
|
|
4
4
|
|
5
5
|
# @author Hernani Rodrigues Vaz
|
6
6
|
module Krkt
|
7
|
-
# classe para processar
|
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
|
20
|
-
# @
|
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 [
|
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.
|
34
|
+
kl: api.ledger
|
33
35
|
}
|
34
36
|
end
|
35
37
|
|
36
|
-
# @return [Array<
|
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<
|
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 [
|
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 [
|
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
|
-
#
|
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 [
|
69
|
-
# @
|
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
|
115
|
+
# @return [String] texto transacoes trades
|
110
116
|
def mostra_trades
|
111
117
|
return unless ops[:v] && trades.count.positive?
|
112
118
|
|
data/lib/krkt/version.rb
CHANGED
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.
|
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
|