class Krkt::Client

classe para processar dados no kraken

Attributes

aky[R]

@return [String] API key

asc[R]

@return [String] API secret

pru[R]

@return [String] API private url

pth[R]

@return [String] API private path

puu[R]

@return [String] API public url

Public Class Methods

new(pky: ENV['KRAKEN_API_KEY'], psc: ENV['KRAKEN_API_SECRET'], options: {}) click to toggle source

@param [String] pky API key @param [String] psc API secret @return [Client] API kraken base

# File lib/krkt/client.rb, line 26
def initialize(pky: ENV['KRAKEN_API_KEY'], psc: ENV['KRAKEN_API_SECRET'], options: {})
  b = options.fetch(:base_uri, 'https://api.kraken.com')
  v = options.fetch(:version, 0)
  @aky = pky
  @asc = psc
  @puu = "#{b}/#{v}/public/"
  @pru = "#{b}/#{v}/private/"
  @pth = "/#{v}/private/"
end

Public Instance Methods

balance() click to toggle source

@return [Hash] saldos no kraken @example

{
  'ZEUR' => '0.0000',
  'XXBT' => '0.0000000000',
  'XETH' => '1.1806988100',
  'XETC' => '0.0000000000',
  'EOS' => '0.0000001700',
  'BCH' => '0.0000000000'
}
# File lib/krkt/client.rb, line 95
def balance
  post_private('Balance')['result']
end
ledger() click to toggle source

@return [Hash] resultados ultimas transacoes ledger no kraken @example

{
  'ledger' => {
    'LUK3QC-QW6TA-27B7NI' => {
      'refid' => 'A2BNCQS-CHCETZ-JYCER6',
      'time' => 1_584_349_306.9479,
      'type' => 'withdrawal',
      'subtype' => '',
      'aclass' => 'currency',
      'asset' => 'XETH',
      'amount' => '-29.2659039100',
      'fee' => '0.0050000000',
      'balance' => '1.1806988100'
    }
    ,
    ...
  },
  'count' => 373
}
# File lib/krkt/client.rb, line 81
def ledger
  post_private('Ledgers')['result']
end
server_time() click to toggle source

@return [Hash] data hora kraken @example

{
  'unixtime' => 1_598_956_727,
  'rfc1123' => 'Tue,  1 Sep 20 10:38:47 +0000'
}
# File lib/krkt/client.rb, line 105
def server_time
  get_public('Time')['result']
end
trades_history() click to toggle source

@return [Hash] resultados ultimas transacoes trades no kraken @example

{
  'trades' => {
    'TLADFV-QIUTN-QDNCBR' => {
      'ordertxid' => 'O2CRFG-5PCJA-EMX7VC',
      'pair' => 'XETHXXBT',
      'time' => 1_463_422_494.7069,
      'type' => 'buy',
      'ordertype' => 'market',
      'price' => '0.024400',
      'cost' => '1.358424',
      'fee' => '0.003532',
      'vol' => '55.67311475',
      'margin' => '0.000000',
      'misc' => ''
    },
    ...
  },
  'count' => 156
}
# File lib/krkt/client.rb, line 57
def trades_history
  post_private('TradesHistory')['result']
end

Private Instance Methods

authenticate(method, nonce, params) click to toggle source
# File lib/krkt/client.rb, line 129
def authenticate(method, nonce, params)
  raise(ArgumentError, 'API Key is not set') unless aky
  raise(ArgumentError, 'API Secret is not set') unless asc

  Base64.strict_encode64(OpenSSL::HMAC.digest(
                           'sha512',
                           Base64.decode64(asc),
                           "#{pth}#{method}#{Digest::SHA256.digest("#{nonce}#{params}")}"
                         ))
end
get_public(method, **opts) click to toggle source

HTTP GET request for public API queries.

# File lib/krkt/client.rb, line 112
def get_public(method, **opts)
  parse_response(Curl.get("#{puu}#{method}", opts))
end
parse_response(http) click to toggle source
# File lib/krkt/client.rb, line 140
def parse_response(http)
  # HTTP_SUCCESS = 200
  http.response_code == 200 ? JSON.parse(http.body) : http.status
rescue JSON::ParserError,
       EOFError,
       Errno::ECONNRESET,
       Errno::EINVAL,
       Net::HTTPBadResponse,
       Net::HTTPHeaderSyntaxError,
       Net::ProtocolError,
       Timeout::Error => e
  "Erro da API #{e.inspect}"
end
post_private(method, **opts) click to toggle source

HTTP POST request for private API queries involving user credentials.

# File lib/krkt/client.rb, line 117
def post_private(method, **opts)
  # Generate a continually-increasing unsigned 51-bit integer nonce from the current Unix Time.
  opts.merge!({ nonce: Integer(Time.now) * 1_000_000 })

  parse_response(Curl.post("#{pru}#{method}", opts) do |r|
                   r.headers = {
                     'api-key': aky,
                     'api-sign': authenticate(method, opts[:nonce], opts.map { |p| p.join('=') }.join('&'))
                   }
                 end)
end