module Bitfinex::RESTClient

Public Instance Methods

check_params(params, allowed_params) click to toggle source
# File lib/rest/rest_client.rb, line 5
def check_params(params, allowed_params)
  if (params.keys - allowed_params).empty?
    return params
  else
    raise Bitfinex::ParamsError
  end
end

Private Instance Methods

authenticated_post(url, options = {}) click to toggle source
# File lib/rest/rest_client.rb, line 51
def authenticated_post(url, options = {})
  raise Bitfinex::InvalidAuthKeyError unless valid_key?
  complete_url = build_url(url)
  body = options[:params] || {}
  nonce = new_nonce

  payload = if config[:api_version] == 1
    build_payload("/v1/#{url}", options[:params], nonce)
  else
    "/api/v2/#{url}#{nonce}#{body.to_json}"
  end

  response = rest_connection.post do |req|
    req.url complete_url
    req.body = body.to_json
    req.options.timeout = config[:rest_timeout]
    req.options.open_timeout = config[:rest_open_timeout]
    req.headers['Content-Type'] = 'application/json'
    req.headers['Accept'] = 'application/json'

    if config[:api_version] == 1
      req.headers['X-BFX-PAYLOAD'] = payload
      req.headers['X-BFX-SIGNATURE'] = sign(payload)
      req.headers['X-BFX-APIKEY'] = config[:api_key]
    else
      req.headers['bfx-nonce'] = nonce
      req.headers['bfx-signature'] = sign(payload)
      req.headers['bfx-apikey'] = config[:api_key]
    end
  end
end
base_api_endpoint() click to toggle source
# File lib/rest/rest_client.rb, line 46
def base_api_endpoint
  config[:api_endpoint]
end
build_payload(url, params = {}, nonce) click to toggle source
# File lib/rest/rest_client.rb, line 83
def build_payload(url, params = {}, nonce)
  payload = {}
  payload['nonce'] = nonce
  payload['request'] = url
  payload.merge!(params) if params
  Base64.strict_encode64(payload.to_json)
end
build_url(url) click to toggle source
# File lib/rest/rest_client.rb, line 33
def build_url(url)
  URI.join(base_api_endpoint, url)
end
get(url, params={}) click to toggle source
# File lib/rest/rest_client.rb, line 14
def get(url, params={})
  rest_connection.get do |req|
    req.url build_url(url)
    req.headers['Content-Type'] = 'application/json'
    req.headers['Accept'] = 'application/json'

    params.each do |k,v|
      req.params[k] = v
    end

    req.options.timeout = config[:rest_timeout]
    req.options.open_timeout = config[:rest_open_timeout]
  end
end
new_nonce() click to toggle source
# File lib/rest/rest_client.rb, line 91
def new_nonce
  (Time.now.to_f * 1000).floor.to_s
end
new_rest_connection() click to toggle source
# File lib/rest/rest_client.rb, line 37
def new_rest_connection
  Faraday.new(url: base_api_endpoint, :proxy => config[:proxy]) do |conn|
    conn.use Bitfinex::CustomErrors
    conn.response :logger, Logger.new(STDOUT), bodies: true  if config[:debug_connection]
    conn.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
    conn.adapter :net_http_socks
  end
end
rest_connection() click to toggle source
# File lib/rest/rest_client.rb, line 29
def rest_connection
  @conn ||= new_rest_connection
end
sign(payload) click to toggle source
# File lib/rest/rest_client.rb, line 95
def sign(payload)
  OpenSSL::HMAC.hexdigest('sha384', config[:api_secret], payload)
end
valid_key?() click to toggle source
# File lib/rest/rest_client.rb, line 99
def valid_key?
  !! (config[:api_key] && config[:api_secret])
end