cns 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/cns.rb +20 -2
- data/lib/cns/apide.rb +240 -0
- data/lib/cns/apies.rb +161 -0
- data/lib/cns/apifr.rb +139 -0
- data/lib/cns/apigm.rb +181 -0
- data/lib/cns/apimt.rb +138 -0
- data/lib/cns/apius.rb +167 -0
- data/lib/cns/bigquery1.rb +114 -0
- data/lib/cns/bigquery2.rb +76 -0
- data/lib/cns/bigquery3.rb +122 -0
- data/lib/cns/bigquery4.rb +151 -0
- data/lib/cns/bitcoinde.rb +135 -0
- data/lib/cns/etherscan1.rb +118 -0
- data/lib/cns/etherscan2.rb +110 -0
- data/lib/cns/greymass1.rb +104 -0
- data/lib/cns/greymass2.rb +85 -0
- data/lib/cns/kraken.rb +132 -0
- data/lib/cns/paymium.rb +106 -0
- data/lib/cns/therock.rb +95 -0
- data/lib/cns/version.rb +3 -1
- metadata +19 -1
data/lib/cns/apifr.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require('openssl')
|
4
|
+
require('base64')
|
5
|
+
require('curb')
|
6
|
+
require('json')
|
7
|
+
|
8
|
+
# @author Hernani Rodrigues Vaz
|
9
|
+
module Cns
|
10
|
+
# classe para processar dados no paymium
|
11
|
+
class Apifr
|
12
|
+
# @return [String] API key
|
13
|
+
attr_reader :aky
|
14
|
+
# @return [String] API secret
|
15
|
+
attr_reader :asc
|
16
|
+
# @return [String] API url base
|
17
|
+
attr_reader :urb
|
18
|
+
|
19
|
+
# @param [String] pky API key
|
20
|
+
# @param [String] psc API secret
|
21
|
+
# @param [Hash] ops parametrizacao base da API
|
22
|
+
# @return [Apius] API paymium base
|
23
|
+
def initialize(
|
24
|
+
pky: ENV['PAYMIUM_API_KEY'],
|
25
|
+
psc: ENV['PAYMIUM_API_SECRET'],
|
26
|
+
ops: { www: 'https://paymium.com', ver: 1 }
|
27
|
+
)
|
28
|
+
@aky = pky
|
29
|
+
@asc = psc
|
30
|
+
@urb = "#{ops[:www]}/api/v#{ops[:ver]}"
|
31
|
+
end
|
32
|
+
|
33
|
+
# @example
|
34
|
+
# {
|
35
|
+
# name: '...',
|
36
|
+
# email: '...',
|
37
|
+
# locale: 'en',
|
38
|
+
# channel_id: '...',
|
39
|
+
# meta_state: 'approved',
|
40
|
+
# balance_eur: '0.0',
|
41
|
+
# locked_eur: '0.0',
|
42
|
+
# balance_btc: '0.0',
|
43
|
+
# locked_btc: '0.0',
|
44
|
+
# balance_lbtc: '0.0',
|
45
|
+
# locked_lbtc: '0.0'
|
46
|
+
# }
|
47
|
+
# @return [Hash] saldos no paymium
|
48
|
+
def account
|
49
|
+
api_get('user')
|
50
|
+
end
|
51
|
+
|
52
|
+
# @example
|
53
|
+
# [
|
54
|
+
# {
|
55
|
+
# uuid: '50551e61-4e74-4ae7-85fd-9c2040542818',
|
56
|
+
# currency_amount: nil,
|
57
|
+
# state: 'executed',
|
58
|
+
# btc_fee: '0.0',
|
59
|
+
# currency_fee: '0.0',
|
60
|
+
# created_at: '2014-03-04T09:00Z',
|
61
|
+
# updated_at: '2014-03-04T09:00Z',
|
62
|
+
# currency: 'EUR',
|
63
|
+
# comment: '5723',
|
64
|
+
# amount: '100.0',
|
65
|
+
# type: 'WireDeposit',
|
66
|
+
# account_operations: [{
|
67
|
+
# uuid: 'b5058a68-cf99-4438-86d3-e773eba418ec',
|
68
|
+
# name: 'wire_deposit',
|
69
|
+
# amount: '100.0',
|
70
|
+
# currency: 'EUR',
|
71
|
+
# created_at: '2014-03-04T09:00Z',
|
72
|
+
# created_at_int: 1_393_923_644,
|
73
|
+
# is_trading_account: false
|
74
|
+
# }, {}]
|
75
|
+
# }, {}
|
76
|
+
# ]
|
77
|
+
# @return [Hash] ledger no paymium
|
78
|
+
def ledger(pag = 0, ary = [])
|
79
|
+
r = api_get('user/orders', offset: pag)
|
80
|
+
r.empty? ? ary : ledger(pag + r.size, ary + r)
|
81
|
+
rescue StandardError
|
82
|
+
ary
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
# HTTP GET request for public paymium API queries.
|
88
|
+
def api_get(uri, **ops)
|
89
|
+
resposta(Curl.get("#{urb}/#{uri}", ops) { |r| r.headers = hdrs(url(uri, ops), nonce, {}) })
|
90
|
+
end
|
91
|
+
|
92
|
+
# HTTP POST request for private paymium API queries involving user credentials.
|
93
|
+
def api_post(uri, **ops)
|
94
|
+
resposta(Curl.post("#{urb}/#{uri}", ops) { |r| r.headers = hdrs(uri, nonce, ops) })
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [String] URL do pedido formatado com todos os parametros
|
98
|
+
def url(uri, ops)
|
99
|
+
ops.empty? ? uri : "#{uri}?#{URI.encode_www_form(ops)}"
|
100
|
+
end
|
101
|
+
|
102
|
+
# @return [Hash] headers necessarios para pedido HTTP
|
103
|
+
def hdrs(qry, non, ops)
|
104
|
+
{
|
105
|
+
content_type: 'application/json',
|
106
|
+
'Api-Key': aky,
|
107
|
+
'Api-Nonce': non,
|
108
|
+
'Api-Signature': auth(qry, non, URI.encode_www_form(ops))
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
# @return [String] assinarura codificada dos pedidos HTTP
|
113
|
+
def auth(qry, non, par)
|
114
|
+
raise(ArgumentError, 'API Key is not set') unless aky
|
115
|
+
raise(ArgumentError, 'API Secret is not set') unless asc
|
116
|
+
|
117
|
+
OpenSSL::HMAC.hexdigest('sha256', asc, [non, "#{urb}/#{qry}", par].join)
|
118
|
+
end
|
119
|
+
|
120
|
+
# @return [Integer] continually-increasing unsigned integer nonce from the current Unix Time
|
121
|
+
def nonce
|
122
|
+
Integer(Float(Time.now) * 1e6)
|
123
|
+
end
|
124
|
+
|
125
|
+
# @return [Hash] resposta do pedido HTTP
|
126
|
+
def resposta(http)
|
127
|
+
http.response_code == 200 ? JSON.parse(http.body, symbolize_names: true) : http.status
|
128
|
+
rescue JSON::ParserError,
|
129
|
+
EOFError,
|
130
|
+
Errno::ECONNRESET,
|
131
|
+
Errno::EINVAL,
|
132
|
+
Net::HTTPBadResponse,
|
133
|
+
Net::HTTPHeaderSyntaxError,
|
134
|
+
Net::ProtocolError,
|
135
|
+
Timeout::Error => e
|
136
|
+
"Erro da API paymium #{e.inspect}"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/cns/apigm.rb
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require('faraday')
|
4
|
+
require('json')
|
5
|
+
|
6
|
+
module Cns
|
7
|
+
# classe para acesso dados blockchain EOS
|
8
|
+
class Apigm
|
9
|
+
# @return [String] base URL to use as a prefix for all requests
|
10
|
+
attr_reader :url
|
11
|
+
|
12
|
+
# @param [String] www base URL to use as a prefix for all requests
|
13
|
+
# @return [Apigm] acesso dados blockchain EOS
|
14
|
+
def initialize(www: 'https://eos.greymass.com')
|
15
|
+
@url = www
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [<Symbol>] adapter for the connection - default :net_http
|
19
|
+
def adapter
|
20
|
+
@adapter ||= Faraday.default_adapter
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [<Faraday::Connection>] connection object with an URL & adapter
|
24
|
+
def conn
|
25
|
+
@conn ||=
|
26
|
+
Faraday.new(url: url) do |c|
|
27
|
+
c.request(:url_encoded)
|
28
|
+
c.adapter(adapter)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @example
|
33
|
+
# {
|
34
|
+
# account_name: '...',
|
35
|
+
# head_block_num: 141_391_122,
|
36
|
+
# head_block_time: '2020-09-11T16:05:51.000',
|
37
|
+
# privileged: false,
|
38
|
+
# last_code_update: '1970-01-01T00:00:00.000',
|
39
|
+
# created: '2018-06-09T13:14:37.000',
|
40
|
+
# core_liquid_balance: '1232.0228 EOS',
|
41
|
+
# ram_quota: 9548,
|
42
|
+
# net_weight: 10_001_142,
|
43
|
+
# cpu_weight: 10_001_144,
|
44
|
+
# net_limit: { used: 0, available: 1_066_648_346, max: 1_066_648_346 },
|
45
|
+
# cpu_limit: { used: 338, available: 88_498, max: 88_836 },
|
46
|
+
# ram_usage: 3574,
|
47
|
+
# permissions: [
|
48
|
+
# {
|
49
|
+
# perm_name: 'active',
|
50
|
+
# parent: 'owner',
|
51
|
+
# required_auth: {
|
52
|
+
# threshold: 1, keys: [{ key: 'EOS...', weight: 1 }], accounts: [], waits: []
|
53
|
+
# }
|
54
|
+
# },
|
55
|
+
# {
|
56
|
+
# perm_name: 'owner',
|
57
|
+
# parent: '',
|
58
|
+
# required_auth: {
|
59
|
+
# threshold: 1, keys: [{ key: 'EOS...', weight: 1 }], accounts: [], waits: []
|
60
|
+
# }
|
61
|
+
# }
|
62
|
+
# ],
|
63
|
+
# total_resources: { owner: '...', net_weight: '1000.1142 EOS', cpu_weight: '1000.1144 EOS', ram_bytes: 8148 },
|
64
|
+
# self_delegated_bandwidth: { from: '...', to: '...', net_weight: '1000.1142 EOS', cpu_weight: '1000.1144 EOS' },
|
65
|
+
# refund_request: nil,
|
66
|
+
# voter_info: {
|
67
|
+
# owner: '...',
|
68
|
+
# proxy: '...',
|
69
|
+
# producers: [],
|
70
|
+
# staked: 20_002_286,
|
71
|
+
# last_vote_weight: '17172913021904.12109375000000000',
|
72
|
+
# proxied_vote_weight: '0.00000000000000000',
|
73
|
+
# is_proxy: 0,
|
74
|
+
# flags1: 0,
|
75
|
+
# reserved2: 0,
|
76
|
+
# reserved3: '0.0000 EOS'
|
77
|
+
# },
|
78
|
+
# rex_info: nil
|
79
|
+
# }
|
80
|
+
# @param [Hash] arg argumentos trabalho
|
81
|
+
# @option arg [String] :account_name endereco carteira EOS
|
82
|
+
# @return [Hash] dados & saldo duma carteira EOS
|
83
|
+
def account(**arg)
|
84
|
+
raise(Erro, 'endereco tem de ser definido') if arg[:account_name].nil? || arg[:account_name].empty?
|
85
|
+
|
86
|
+
get('/v1/chain/get_account', **arg)
|
87
|
+
end
|
88
|
+
|
89
|
+
# @example
|
90
|
+
# {
|
91
|
+
# actions: [
|
92
|
+
# {
|
93
|
+
# account_action_seq: 964,
|
94
|
+
# action_trace: {
|
95
|
+
# account_ram_deltas: [],
|
96
|
+
# act: {
|
97
|
+
# account: 'voicebestapp',
|
98
|
+
# authorization: [
|
99
|
+
# { actor: 'thetruevoice', permission: 'active' },
|
100
|
+
# { actor: 'voicebestapp', permission: 'active' }
|
101
|
+
# ],
|
102
|
+
# data: { from: 'voicebestapp', memo: '...', quantity: '1.0001 MESSAGE', to: '...' },
|
103
|
+
# hex_data: '...',
|
104
|
+
# name: 'transfer'
|
105
|
+
# },
|
106
|
+
# action_ordinal: 10,
|
107
|
+
# block_num: 141_345_345,
|
108
|
+
# block_time: '2020-09-11T09:44:04.500',
|
109
|
+
# closest_unnotified_ancestor_action_ordinal: 5,
|
110
|
+
# context_free: false,
|
111
|
+
# creator_action_ordinal: 5,
|
112
|
+
# elapsed: 6,
|
113
|
+
# producer_block_id: '...',
|
114
|
+
# receipt: {
|
115
|
+
# abi_sequence: 1,
|
116
|
+
# act_digest: '...',
|
117
|
+
# auth_sequence: [['thetruevoice', 6_778_215], ['voicebestapp', 435_346]],
|
118
|
+
# code_sequence: 1,
|
119
|
+
# global_sequence: 233_283_589_258,
|
120
|
+
# receiver: '...',
|
121
|
+
# recv_sequence: 927
|
122
|
+
# },
|
123
|
+
# receiver: '...',
|
124
|
+
# trx_id: '...'
|
125
|
+
# },
|
126
|
+
# block_num: 141_345_345,
|
127
|
+
# block_time: '2020-09-11T09:44:04.500',
|
128
|
+
# global_action_seq: 233_283_589_258,
|
129
|
+
# irreversible: true
|
130
|
+
# },
|
131
|
+
# {}
|
132
|
+
# ],
|
133
|
+
# head_block_num: 141_721_698,
|
134
|
+
# last_irreversible_block: 141_721_371
|
135
|
+
# }
|
136
|
+
# @param [String] add endereco carteira EOS
|
137
|
+
# @param [Hash] arg argumentos trabalho
|
138
|
+
# @option arg [String] :account_name endereco carteira EOS
|
139
|
+
# @option arg [Integer] :pos posicao da primeira transacao a devolver
|
140
|
+
# @option arg [Integer] :offset numero maximo transacoes a devolver
|
141
|
+
# @option arg [String] :filter filtro a aplicar na resposta
|
142
|
+
# @option arg [String] :sort ordenacao asc/desc
|
143
|
+
# @option arg [String] :after time inicio "2020-09-13T13:44:03.105Z"
|
144
|
+
# @option arg [String] :before time fim "2020-09-13T13:44:03.105Z"
|
145
|
+
# @option arg [Integer] :parent transacao pai
|
146
|
+
# @return [Array<Hash>] devolve lista de transacoes
|
147
|
+
def all_tx(add, **arg)
|
148
|
+
raise(Erro, 'endereco tem de ser definido') if add.nil? || add.empty?
|
149
|
+
|
150
|
+
ledger(**arg.merge(account_name: add))
|
151
|
+
end
|
152
|
+
|
153
|
+
# @param [Integer] pos posicao das transacoes a devolver
|
154
|
+
# @param [Array<Hash>] ary lista acumuladora das transacoes a devolver
|
155
|
+
# @param arg (see all_tx)
|
156
|
+
# @option arg (see all_tx)
|
157
|
+
# @return [Array<Hash>] lista das transacoes ligadas a uma carteira EOS
|
158
|
+
def ledger(pos = 0, ary = [], **arg)
|
159
|
+
r = get('/v1/history/get_actions', **arg.merge(pos: pos, offset: 100))[:actions]
|
160
|
+
ary += r
|
161
|
+
r.count < 100 ? ary : ledger(pos + r.count, ary, **arg)
|
162
|
+
rescue StandardError
|
163
|
+
ary
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
# @param [String] uri identificacao do recurso a questionar
|
169
|
+
# @param arg (see all_tx)
|
170
|
+
# @option arg (see all_tx)
|
171
|
+
# @return [Hash] resultado do HTTP request
|
172
|
+
def get(uri, **arg)
|
173
|
+
JSON.parse(
|
174
|
+
conn.post(uri, arg.to_json, content_type: 'application/json').body,
|
175
|
+
symbolize_names: true
|
176
|
+
)
|
177
|
+
rescue StandardError
|
178
|
+
{ actions: [] }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
data/lib/cns/apimt.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require('openssl')
|
4
|
+
require('base64')
|
5
|
+
require('curb')
|
6
|
+
require('json')
|
7
|
+
|
8
|
+
# @author Hernani Rodrigues Vaz
|
9
|
+
module Cns
|
10
|
+
DC = %w[LTC NMC PPC DOGE XRP Linden USD CAD GBP ZEC BCH EURN NOKU FDZ GUSD SEED USDC].freeze
|
11
|
+
|
12
|
+
# classe para processar dados no therock
|
13
|
+
class Apimt
|
14
|
+
# @return [String] API key
|
15
|
+
attr_reader :aky
|
16
|
+
# @return [String] API secret
|
17
|
+
attr_reader :asc
|
18
|
+
# @return [String] API url base
|
19
|
+
attr_reader :urb
|
20
|
+
|
21
|
+
# @param [String] pky API key
|
22
|
+
# @param [String] psc API secret
|
23
|
+
# @param [Hash] ops parametrizacao base da API
|
24
|
+
# @return [Apius] API therock base
|
25
|
+
def initialize(
|
26
|
+
pky: ENV['THEROCK_API_KEY'],
|
27
|
+
psc: ENV['THEROCK_API_SECRET'],
|
28
|
+
ops: { www: 'https://api.therocktrading.com', ver: 1 }
|
29
|
+
)
|
30
|
+
@aky = pky
|
31
|
+
@asc = psc
|
32
|
+
@urb = "#{ops[:www]}/v#{ops[:ver]}"
|
33
|
+
end
|
34
|
+
|
35
|
+
# @example
|
36
|
+
# {
|
37
|
+
# balances: [
|
38
|
+
# { currency: 'BTC', balance: 0.0, trading_balance: 0.0 },
|
39
|
+
# { currency: 'ETH', balance: 0.0, trading_balance: 0.0 },
|
40
|
+
# { currency: 'EUR', balance: 0.0, trading_balance: 0.0 },
|
41
|
+
# { currency: 'DAI', balance: 0.0, trading_balance: 0.0 },
|
42
|
+
# ]
|
43
|
+
# }
|
44
|
+
# @return [Hash] saldos no therock
|
45
|
+
def account
|
46
|
+
api_get('balances')[:balances].delete_if { |e| DC.include?(e[:currency]) }
|
47
|
+
.sort { |a, b| a[:currency] <=> b[:currency] }
|
48
|
+
end
|
49
|
+
|
50
|
+
# @example
|
51
|
+
# {
|
52
|
+
# transactions: [
|
53
|
+
# {
|
54
|
+
# id: 305_445,
|
55
|
+
# date: '2014-03-06T10:59:13.000Z',
|
56
|
+
# type: 'withdraw',
|
57
|
+
# price: 97.47,
|
58
|
+
# currency: 'EUR',
|
59
|
+
# fund_id: nil,
|
60
|
+
# order_id: nil,
|
61
|
+
# trade_id: nil,
|
62
|
+
# note: 'BOV withdraw',
|
63
|
+
# transfer_detail: nil
|
64
|
+
# },
|
65
|
+
# {}
|
66
|
+
# ],
|
67
|
+
# meta: {
|
68
|
+
# total_count: nil,
|
69
|
+
# first: { page: 1, href: 'https://api.therocktrading.com/v1/transactions?page=1' },
|
70
|
+
# previous: nil,
|
71
|
+
# current: { page: 1, href: 'https://api.therocktrading.com/v1/transactions?page=1' },
|
72
|
+
# next: { page: 2, href: 'https://api.therocktrading.com/v1/transactions?page=2' },
|
73
|
+
# last: nil
|
74
|
+
# }
|
75
|
+
# }
|
76
|
+
# @return [Hash] ledger no therock
|
77
|
+
def ledger(pag = 1, ary = [])
|
78
|
+
r = api_get('transactions', page: pag)[:transactions]
|
79
|
+
r.empty? ? ary : ledger(pag + r.size, ary + r)
|
80
|
+
rescue StandardError
|
81
|
+
ary
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
# HTTP GET request for public therock API queries.
|
87
|
+
def api_get(uri, **ops)
|
88
|
+
resposta(Curl.get("#{urb}/#{uri}", ops) { |r| r.headers = hdrs(url(uri, ops), nonce, {}) })
|
89
|
+
end
|
90
|
+
|
91
|
+
# HTTP POST request for private therock API queries involving user credentials.
|
92
|
+
def api_post(uri, **ops)
|
93
|
+
resposta(Curl.post("#{urb}/#{uri}", ops) { |r| r.headers = hdrs(uri, nonce, ops) })
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [String] URL do pedido formatado com todos os parametros
|
97
|
+
def url(uri, ops)
|
98
|
+
ops.empty? ? uri : "#{uri}?#{URI.encode_www_form(ops)}"
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [Hash] headers necessarios para pedido HTTP
|
102
|
+
def hdrs(qry, non, ops)
|
103
|
+
{
|
104
|
+
content_type: 'application/json',
|
105
|
+
'X-TRT-KEY': aky,
|
106
|
+
'X-TRT-NONCE': non,
|
107
|
+
'X-TRT-SIGN': auth(qry, non, URI.encode_www_form(ops))
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
# @return [String] assinarura codificada dos pedidos HTTP
|
112
|
+
def auth(qry, non, par)
|
113
|
+
raise(ArgumentError, 'API Key is not set') unless aky
|
114
|
+
raise(ArgumentError, 'API Secret is not set') unless asc
|
115
|
+
|
116
|
+
OpenSSL::HMAC.hexdigest('sha512', asc, [non, "#{urb}/#{qry}", par].join)
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [Integer] continually-increasing unsigned integer nonce from the current Unix Time
|
120
|
+
def nonce
|
121
|
+
Integer(Float(Time.now) * 1e6)
|
122
|
+
end
|
123
|
+
|
124
|
+
# @return [Hash] resposta do pedido HTTP
|
125
|
+
def resposta(http)
|
126
|
+
http.response_code == 200 ? JSON.parse(http.body, symbolize_names: true) : http.status
|
127
|
+
rescue JSON::ParserError,
|
128
|
+
EOFError,
|
129
|
+
Errno::ECONNRESET,
|
130
|
+
Errno::EINVAL,
|
131
|
+
Net::HTTPBadResponse,
|
132
|
+
Net::HTTPHeaderSyntaxError,
|
133
|
+
Net::ProtocolError,
|
134
|
+
Timeout::Error => e
|
135
|
+
"Erro da API therock #{e.inspect}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|