Class: Deribit::API

Inherits:
Object
  • Object
show all
Defined in:
lib/deribit/api.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key, secret, test_server: false) ⇒ API

Returns a new instance of API.



9
10
11
12
13
# File 'lib/deribit/api.rb', line 9

def initialize(key, secret, test_server: false)
  @key = key
  @secret = secret
  @server = set_server_uri(test_server)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, **params, &block) ⇒ Object

For direct calls like deribit.get_account_summary Trying to find API method in Deribit::REST_METHODS



17
18
19
20
# File 'lib/deribit/api.rb', line 17

def method_missing(name, **params, &block)
  method = Deribit.find_method(name, params)
  send(method[:path], params)
end

Instance Attribute Details

#keyObject

Returns the value of attribute key.



7
8
9
# File 'lib/deribit/api.rb', line 7

def key
  @key
end

#secretObject

Returns the value of attribute secret.



7
8
9
# File 'lib/deribit/api.rb', line 7

def secret
  @secret
end

Instance Method Details

#generate_signature(uri, params = {}) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/deribit/api.rb', line 63

def generate_signature(uri, params = {})
  timestamp = (Time.now.utc.to_f * 1000).to_i
  nonce = rand(100000000)
  http_method = "GET"
  path = uri.path
  path << "?" << uri.query if uri.query
  body = ""
  data = [timestamp, nonce, http_method, path, body, ""].join("\n")
  sig = OpenSSL::HMAC.hexdigest("SHA256", secret, data)

  {
    signature: sig,
    header: "deri-hmac-sha256 id=#{key},ts=#{timestamp},sig=#{sig},nonce=#{nonce}",
  }
end

#get_tokenObject



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/deribit/api.rb', line 22

def get_token
  return @token if @token

  params = { grant_type: "client_credentials", client_id: key, client_secret: secret, scope: "session:default" }
  result = send "public/auth", params
  puts "Auth result: #{result.inspect}"

  @refresh_token = result[:refresh_token]
  @expires = result[:expires_in]
  @token = result[:access_token]
end

#is_error_response?(response) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/deribit/api.rb', line 79

def is_error_response?(response)
  response.code.to_i.yield_self { |code| code == 0 || code >= 400 }
end

#process(response) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/deribit/api.rb', line 49

def process(response)
  json = JSON.parse(response.body, symbolize_names: true)

  if json.include?(:error)
    raise Error.new(message: "Failed for #{key}. " + json[:error])
  elsif json.include?(:result)
    json[:result]
  elsif json.include?(:message)
    json[:message]
  else
    "ok"
  end
end

#send(route, params = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/deribit/api.rb', line 34

def send(route, params = {})
  uri = URI(@server + route.to_s)
  response = get(uri, params)

  if is_error_response?(response)
    json = JSON.parse(response.body) rescue nil
    message = "Failed for #{key}. "
    message << json["error"].to_s if json

    raise Error.new(code: response.code, message: message)
  else
    process(response)
  end
end