bitmex-api 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c0ad3797a640e5d993633783c03c687188c1f5e1501da09b31e2e2fae1eec50
4
- data.tar.gz: 550b4b07e4ff4a2db3521f5cdb7b0b4739fdfbdaa4f76298150325073e7af9cd
3
+ metadata.gz: 06e316d8a60be97f37a23ff0f9f7055d02fd1cd743a12f84c4982feff80ea476
4
+ data.tar.gz: 4868b686189f662a8b47e1305ac6c6f854922984256297b68531082571cb7afd
5
5
  SHA512:
6
- metadata.gz: 86357550081e44d06b37ec124b39389a491fa3811ae3a6dd6f9915f3d48ea4e989415f45dfb73c83ac30ba6ddd4ed6977b91dad967302c5171bd3366a9bccbeb
7
- data.tar.gz: 548fcc1d6dbf5e2027a448f8440dde290659ff699ec1db22610cf9f537dfc08aeffae98dd93e0368d1f9988b0229a99e5ce3e35f129b16bdd44f96df53fab74c
6
+ metadata.gz: 8ad1b9fbc349b5c8a80deb584c2bf61a5a62fbe744d8d2a4ff43b2b730f4b56aabcc92aa0175df962b785e257cecedb64da3b2eefc5a7f9f253795d670b2147e
7
+ data.tar.gz: 307c8ffd8cd00b41bd13c79e20533e1a64950fb7e8c229e917e1d161d8b08a63d8e470290cddeb13815768b111b2d712851b03f8555f34a583efdd9a1939ef55
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ /.env
@@ -5,6 +5,13 @@
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.0.2] - 2019-01-22
9
+ ### Added
10
+ - Initial Websocket API implementation
11
+ - Access private REST API
12
+ ### Changed
13
+ - Account operations
14
+
8
15
  ## [0.0.1] - 2019-01-03
9
16
  ### Added
10
- - Public REST API support
17
+ - Basic public REST API support
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bitmex-api (0.0.1)
4
+ bitmex-api (0.0.2)
5
5
  eventmachine
6
6
  faye-websocket
7
7
  hashie
@@ -14,6 +14,7 @@ GEM
14
14
  coderay (1.1.2)
15
15
  diff-lcs (1.3)
16
16
  docile (1.3.1)
17
+ dotenv (2.6.0)
17
18
  eventmachine (1.2.7)
18
19
  faye-websocket (0.10.7)
19
20
  eventmachine (>= 0.12.0)
@@ -61,6 +62,7 @@ DEPENDENCIES
61
62
  bitmex-api!
62
63
  bump
63
64
  bundler
65
+ dotenv
64
66
  pry
65
67
  rake
66
68
  rspec
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Test Coverage](https://api.codeclimate.com/v1/badges/85c3eb58ef31dabc9159/test_coverage)](https://codeclimate.com/github/icostan/bitmex-api-ruby/test_coverage)
6
6
  [![Gem Version](https://badge.fury.io/rb/bitmex-api.svg)](https://badge.fury.io/rb/bitmex-api)
7
7
 
8
- Ruby library for BitMEX [API](https://www.bitmex.com/app/apiOverview).
8
+ Idiomatic Ruby library for [BitMEX API](https://www.bitmex.com/app/apiOverview).
9
9
 
10
10
  ## Installation
11
11
 
@@ -25,20 +25,61 @@ Or install it yourself as:
25
25
 
26
26
  ## Usage
27
27
 
28
+ ### Bitmex client
29
+
28
30
  ```ruby
29
- require 'bitmex'
31
+ require 'bitmex-api'
30
32
 
31
33
  client = Bitmex::Client.new
32
34
 
33
- # first 10 trades after Jan 1st for XBTUSD product
34
- trades = client.trade symbol: 'XBTUSD', count: 10, startTime: '2019-01-01'
35
+ # or add key and secret args if you want to access private API
36
+ client = Bitmex::Client.new api_key: 'KEY', api_secret: 'SECRET'
37
+ ```
38
+
39
+ ### Trades
40
+
41
+ #### Using REST API
42
+
43
+ Load first 15 trades after Jan 1st for XBTUSD.
44
+
45
+ ```ruby
46
+ trades = client.trade symbol: 'XBTUSD', count: 15, startTime: '2019-01-01'
35
47
  trades.size
36
48
  trades.first
37
49
  ```
38
50
 
51
+ #### Using Websocket API
52
+
53
+ Listen for new trades and print the ones greater than 10 XBT.
54
+
55
+ ```ruby
56
+ client.listen trade: 'XBTUSD' do |trade|
57
+ puts trade if trade.homeNotional > 10
58
+
59
+ # when done call client.stop
60
+ # client.stop
61
+ end
62
+ ```
63
+
64
+ ### Account operations
65
+
66
+ Fetch user's preferences, wallet, history, events and much more.
67
+
68
+ ```ruby
69
+
70
+ user = client.user
71
+ puts user.firstname
72
+
73
+ wallet = client.user.wallet
74
+ puts wallet.amount
75
+
76
+ events = client.user.events
77
+ puts events.last.type
78
+ ```
79
+
39
80
  ## Development
40
81
 
41
- After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rake` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
82
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
42
83
 
43
84
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
44
85
 
@@ -0,0 +1,16 @@
1
+ * Tasks :BITMEX:
2
+ ** DONE initial gem release
3
+ SCHEDULED: <2019-01-03 Thu> CLOSED: <2019-01-03 Thu>
4
+ ** DONE websocket API
5
+ CLOSED: [2019-01-14] SCHEDULED: <2019-01-14 Fri>
6
+ ** DONE auth for REST-API endpoints
7
+ CLOSED: [2019-01-16 Wed] SCHEDULED: <2019-01-15 Tue> DEADLINE: <2019-01-16 Wed>
8
+ ** TODO auth for private subscription topics
9
+ DEADLINE: <2019-01-25 Fri>
10
+ ** move from rspec to minitest
11
+ ** configure autorun
12
+ ** TODO post/put rest-api endpoints
13
+ ** hearbeat, ping/pong
14
+ ** DONE implement user actions get/put/post
15
+ CLOSED: [2019-01-22 Tue] SCHEDULED: <2019-01-17 Thu>
16
+ ** order actions
@@ -1,36 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'json'
4
- require 'faye/websocket'
5
- require 'eventmachine'
3
+ require 'bundler/setup'
4
+ require 'bitmex'
6
5
 
7
- product = (ARGV.first || 'BTCUSD')
6
+ product = (ARGV.first || 'XBTUSD')
8
7
  limit = (ARGV[1] || 10).to_i
9
8
  puts "==> Filter trades > #{limit} #{product}"
10
9
 
11
- EM.run {
12
- ws = Faye::WebSocket::Client.new('wss://www.bitmex.com/realtime')
13
-
14
- ws.on :open do |event|
15
- p [:open]
16
- ws.send "{\"op\": \"subscribe\", \"args\": [\"trade:#{product}\"]}"
17
- end
18
-
19
- ws.on :message do |event|
20
- json = JSON.parse event.data
21
- data = json['data']
22
-
23
- data && data.select{ |trade| trade['homeNotional'].to_i > limit }.each do |trade|
24
- p trade
25
- end
26
- end
27
-
28
- ws.on :error do |event|
29
- p [:error, event.data]
30
- end
31
-
32
- ws.on :close do |event|
33
- p [:close, event.code, event.reason]
34
- ws = nil
35
- end
36
- }
10
+ client = Bitmex::Client.new
11
+ client.listen trade: product do |trade|
12
+ puts trade if trade.homeNotional > limit
13
+ end
@@ -46,4 +46,5 @@ Gem::Specification.new do |spec|
46
46
  spec.add_development_dependency 'bump'
47
47
  spec.add_development_dependency 'pry'
48
48
  spec.add_development_dependency 'simplecov'
49
+ spec.add_development_dependency 'dotenv'
49
50
  end
@@ -2,9 +2,18 @@ require 'httparty'
2
2
  require 'hashie'
3
3
 
4
4
  require 'bitmex/version'
5
+ require 'bitmex/mash'
6
+ require 'bitmex/user'
5
7
  require 'bitmex/client'
6
8
 
7
9
  module Bitmex
8
10
  class Error < StandardError; end
9
- # Your code goes here...
11
+
12
+ def self.signature(api_secret, verb, path, expires, params)
13
+ params = '' if params.nil?
14
+ params = params.to_s unless params.is_a? String
15
+
16
+ data = verb + path + expires.to_s + params
17
+ OpenSSL::HMAC.hexdigest 'SHA256', api_secret, data
18
+ end
10
19
  end
@@ -1,53 +1,124 @@
1
+ require 'json'
2
+ require 'faye/websocket'
3
+ require 'eventmachine'
4
+ require 'logger'
5
+
1
6
  module Bitmex
2
7
  class Client
3
8
  include HTTParty
9
+ # logger ::Logger.new(STDOUT), :debug, :curl
4
10
 
5
11
  ANNOUNCEMENT_ARGS = %w(urgent).freeze
6
- EXECUTION_ARGS = %w(tradeHistory).freeze
12
+ APIKEY_ARGS = %w().freeze
13
+ CHAT_ARGS = %w(channels connected).freeze
14
+ EXECUTION_ARGS = %w(tradehistory).freeze
7
15
  FUNDING_ARGS = %w().freeze
8
16
  GLOBALNOTIFICATION_ARGS = %w().freeze
9
- INSTRUMENT_ARGS = %w(active activeAndIndices activeIntervals compositeIndex indices).freeze
17
+ INSTRUMENT_ARGS = %w(active activeandindices activeintervals compositeindex indices).freeze
10
18
  INSURANCE_ARGS = %w().freeze
11
19
  LEADERBOARD_ARGS = %w().freeze
12
20
  LIQUIDATION_ARGS = %w().freeze
13
21
  ORDER_ARGS = %w().freeze
14
22
  ORDERBOOK_ARGS = %w(L2).freeze
23
+ POSITION_ARGS = %w().freeze
15
24
  QUOTE_ARGS = %w(bucketed).freeze
16
- SCHEMA_ARGS = %w(websocketHelp).freeze
25
+ SCHEMA_ARGS = %w(websockethelp).freeze
17
26
  SETTLEMENT_ARGS = %w().freeze
18
- STATS_ARGS = %w(history historyUSD).freeze
27
+ STATS_ARGS = %w(history historyusd).freeze
19
28
  TRADE_ARGS = %w(bucketed).freeze
20
29
 
21
- attr_reader :base_url
22
-
23
- def initialize(testnet: false)
24
- @base_url = testnet ? 'https://testnet.bitmex.com/api/v1' : 'https://www.bitmex.com/api/v1'
25
- end
30
+ TESTNET_HOST = 'testnet.bitmex.com'.freeze
31
+ MAINNET_HOST = 'www.bitmex.com'.freeze
26
32
 
27
- def global_notification
28
- end
33
+ AUTHORIZATIONS = %w(apikey execution position globalnotification order leaderboard quote user userevent)
29
34
 
30
- def leaderboard
31
- end
35
+ attr_reader :host, :api_key, :api_secret
32
36
 
33
- def order
37
+ def initialize(testnet: false, api_key: nil, api_secret: nil)
38
+ @host = testnet ? TESTNET_HOST : MAINNET_HOST
39
+ @api_key = api_key
40
+ @api_secret = api_secret
34
41
  end
35
42
 
36
- def order_book(symbol)
37
- execute 'orderbook', 'L2', ORDERBOOK_ARGS, symbol: symbol do |response|
43
+ def orderbook(symbol)
44
+ execute 'orderbook', 'L2', { symbol: symbol } do |response|
38
45
  response.to_a.map do |s|
39
- Hashie::Mash.new s
46
+ Bitmex::Mash.new s
40
47
  end
41
48
  end
42
49
  end
43
50
 
44
- def position
51
+ #
52
+ # WebSocket API
53
+ #
54
+ # https://www.bitmex.com/app/wsAPI
55
+ #
56
+ def listen(options, &ablock)
57
+ EM.run do
58
+ ws = Faye::WebSocket::Client.new realtime_url
59
+
60
+ topics = options.map{ |key, value| "#{key}:#{value}"}
61
+ subscription = { op: :subscribe, args: topics }
62
+ # puts subscription
63
+
64
+ ws.on :open do |event|
65
+ ws.send subscription.to_json.to_s
66
+ end
67
+
68
+ ws.on :message do |event|
69
+ json = JSON.parse event.data
70
+ data = json['data']
71
+
72
+ data&.each do |payload|
73
+ if block_given?
74
+ yield Bitmex::Mash.new(payload.merge topic: json['table'])
75
+ else
76
+ p value
77
+ end
78
+ end
79
+ end
80
+
81
+ ws.on :error do |event|
82
+ raise [:error, event.data]
83
+ end
84
+
85
+ ws.on :close do |event|
86
+ # p [:close, event.reason]
87
+ ws = nil
88
+ end
89
+ end
45
90
  end
46
91
 
47
92
  def user
93
+ Bitmex::User.new self
48
94
  end
49
95
 
50
- def user_event
96
+ #
97
+ # Stop websocket listener
98
+ #
99
+ def stop
100
+ EM.stop_event_loop
101
+ end
102
+
103
+ def get(path, params: {}, auth: false)
104
+ options = {}
105
+ options[:query] = params unless params.empty?
106
+ options[:headers] = headers 'GET', path, '' if auth
107
+
108
+ response = self.class.get "#{domain_url}#{path}", options
109
+ yield response
110
+ end
111
+
112
+ def put(path, params: {}, auth: true, json: true)
113
+ body = json ? params.to_json.to_s : URI.encode_www_form(params)
114
+
115
+ options = {}
116
+ options[:body] = body
117
+ options[:headers] = headers 'PUT', path, body, json: json if auth
118
+
119
+ response = self.class.put "#{domain_url}#{path}", options
120
+ puts response.body
121
+ yield response
51
122
  end
52
123
 
53
124
  private
@@ -55,31 +126,74 @@ module Bitmex
55
126
  def method_missing(m, *args, &ablock)
56
127
  name = m.to_s.gsub '_', ''
57
128
  params = args.first || {}
58
- type = params.delete :type
129
+ type = params&.delete :type
59
130
  types = self.class.const_get "#{name.upcase}_ARGS"
60
- execute name, type, types, params do |response|
131
+ check! type, types
132
+
133
+ params[:auth] = auth_required? name
134
+
135
+ execute name, type, params do |response|
136
+ # p response.body
61
137
  if response.parsed_response.is_a? Array
62
138
  response.to_a.map do |s|
63
- Hashie::Mash.new s
139
+ Bitmex::Mash.new s
64
140
  end
65
141
  else
66
- Hashie::Mash.new response
142
+ Bitmex::Mash.new response
67
143
  end
68
144
  end
69
145
  end
70
146
 
71
- def execute(endpoint, type, types, params, &ablock)
72
- check! type, types
147
+ def auth_required?(action)
148
+ AUTHORIZATIONS.include? action
149
+ end
150
+
151
+ def execute(endpoint, type, params, &ablock)
152
+ url = "#{rest_url}/#{endpoint}/#{type}"
153
+ path = "/api/v1/#{endpoint}/#{type}"
154
+ auth = params&.delete(:auth)
155
+ params = nil if params&.empty?
156
+
157
+ options = { query: params }
158
+ options[:headers] = headers 'GET', path, '' if auth
73
159
 
74
- url = "#{base_url}/#{endpoint}/#{type}"
75
- response = self.class.get url, query: params
76
- fail response.message unless response.success?
160
+ response = self.class.get url, options
161
+ fail response.body unless response.success?
77
162
  yield response
78
163
  end
79
164
 
165
+ def headers(verb, path, body, json: true)
166
+ raise 'api_key and api_secret are required' unless api_key || api_secret
167
+
168
+ expires = Time.now.utc.to_i + 60
169
+ headers = {
170
+ 'api-expires' => expires.to_s,
171
+ 'api-key' => api_key,
172
+ 'api-signature' => Bitmex.signature(api_secret, verb, path, expires, body)
173
+ }
174
+ if json
175
+ headers['Content-Type'] = 'application/json'
176
+ else
177
+ headers['Content-Type'] = 'application/x-www-form-urlencoded'
178
+ end
179
+ headers
180
+ end
181
+
80
182
  def check!(type, types)
81
183
  return true if type.nil? or type == ''
82
184
  raise ArgumentError, "invalid argument #{type}, only #{types} are supported" if !types.include?(type.to_s)
83
185
  end
186
+
187
+ def rest_url
188
+ "https://#{host}/api/v1"
189
+ end
190
+
191
+ def domain_url
192
+ "https://#{host}"
193
+ end
194
+
195
+ def realtime_url
196
+ "wss://#{host}/realtime"
197
+ end
84
198
  end
85
199
  end
@@ -0,0 +1,5 @@
1
+ module Bitmex
2
+ class Mash < Hashie::Mash
3
+ disable_warnings
4
+ end
5
+ end
@@ -0,0 +1,166 @@
1
+ module Bitmex
2
+ # Account Operations
3
+ #
4
+ # All read-only operations to load user's data are implemented and work as described in docs.
5
+ # Multiple PUT/POST endpoints return 'Access Denied' and are not implemented. It seems that they are meant to be used internally by BitMEX only.
6
+ #
7
+ # @author Iulian Costan
8
+ class User
9
+ attr_reader :client
10
+
11
+ # @param client [Bitmex::Client] the HTTP client
12
+ def initialize(client)
13
+ @client = client
14
+ end
15
+
16
+ # Get your current affiliate/referral status.
17
+ # @return [Hash] the affiliate status
18
+ def affiliate_status
19
+ get 'affiliateStatus'
20
+ end
21
+
22
+ # Check if a referral code is valid. If the code is valid, responds with the referral code's discount (e.g. 0.1 for 10%) and false otherwise
23
+ # @param referral code
24
+ # @return [Decimal, nil] the discount or nil
25
+ def check_referral_code(code)
26
+ get 'checkReferralCode', referralCode: code do |response|
27
+ return nil if !response.success? && [404, 451].include?(response.code)
28
+
29
+ response.to_f
30
+ end
31
+ end
32
+
33
+ # Get your account's commission status
34
+ # @return [Hash] the commission by each product
35
+ def commission
36
+ get 'commission'
37
+ end
38
+
39
+ # Get a deposit address
40
+ # @param currency [String] currency symbol
41
+ # @return [String] the address
42
+ def deposit_address(currency = 'XBt')
43
+ get 'depositAddress', currency: currency do |response|
44
+ fail response.body unless response.success?
45
+
46
+ response.to_s
47
+ end
48
+ end
49
+
50
+ # Get the execution history by day
51
+ # @param symbol [String] the symbol to get the history for
52
+ # @param timestamp [Datetime] the datetime to filter the history for
53
+ # @return [Array] the history
54
+ def execution_history(symbol = 'XBTUSD', timestamp = Date.today)
55
+ get 'executionHistory', symbol: symbol, timestamp: timestamp
56
+ end
57
+
58
+ # Get your account's margin status
59
+ # @param currency [String] the currency to filter by
60
+ # @return [Hash] the margin
61
+ def margin(currency = 'XBt')
62
+ get 'margin', currency: currency
63
+ end
64
+
65
+ # Get the minimum withdrawal fee for a currency
66
+ # This is changed based on network conditions to ensure timely withdrawals. During network congestion, this may be high. The fee is returned in the same currency.
67
+ # @param currency [String] the currency to get the fee for
68
+ # @return [Hash] the fee
69
+ def min_withdrawal_fee(currency = 'XBt')
70
+ get 'minWithdrawalFee', currency: currency
71
+ end
72
+
73
+ # Get your current wallet information
74
+ # @return [Hash] the current wallet
75
+ def wallet
76
+ get 'wallet'
77
+ end
78
+
79
+ # Get a history of all of your wallet transactions (deposits, withdrawals, PNL)
80
+ # @return [Array] the wallet history
81
+ def wallet_history
82
+ get 'walletHistory'
83
+ end
84
+
85
+ # Get a summary of all of your wallet transactions (deposits, withdrawals, PNL)
86
+ # @return [Array] the wallet summary
87
+ def wallet_summary
88
+ get 'walletSummary'
89
+ end
90
+
91
+ # Get your user events
92
+ # @return [Array] the events
93
+ def events
94
+ data = get '', resource: 'userEvent'
95
+ data.userEvents
96
+ end
97
+
98
+ private
99
+
100
+ def method_missing(m, *args, &ablock)
101
+ if @data.nil?
102
+ get '' do |response|
103
+ fail response.body unless response.success?
104
+
105
+ @data = Bitmex::Mash.new response
106
+ end
107
+ end
108
+ @data.send m
109
+ end
110
+
111
+ def put(resource, params, &ablock)
112
+ path = user_path resource
113
+ client.put path, params: params, auth: true do |response|
114
+ if block_given?
115
+ yield response
116
+ else
117
+ fail response.body unless response.success?
118
+
119
+ response_to_mash response
120
+ end
121
+ end
122
+ end
123
+
124
+ def get(resource, params = {}, &ablock)
125
+ path = user_path resource, params
126
+ client.get path, auth: true do |response|
127
+ if block_given?
128
+ yield response
129
+ else
130
+ fail response.body unless response.success?
131
+
132
+ response_to_mash response
133
+ end
134
+ end
135
+ end
136
+
137
+ def user_path(action, params = {})
138
+ resource = params.delete(:resource) || 'user'
139
+ path = "/api/v1/#{resource}/#{action}"
140
+ # TODO: find a better way to handle multiple parameters, dig into HTTParty
141
+ path += '?' if params.size.positive?
142
+ params.each do |key, value|
143
+ path += "#{key}=#{value}&"
144
+ end
145
+ path
146
+ end
147
+
148
+ def response_handler(response, ablock)
149
+ if ablock
150
+ ablock.yield response
151
+ else
152
+ fail response.body unless response.success?
153
+
154
+ response_to_mash response
155
+ end
156
+ end
157
+
158
+ def response_to_mash(response)
159
+ if response.parsed_response.is_a? Array
160
+ response.to_a.map { |s| Bitmex::Mash.new s }
161
+ else
162
+ Bitmex::Mash.new response
163
+ end
164
+ end
165
+ end
166
+ end
@@ -1,3 +1,3 @@
1
1
  module Bitmex
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitmex-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iulian Costan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-03 00:00:00.000000000 Z
11
+ date: 2019-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: dotenv
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  description: Ruby library for BitMEX API
154
168
  email:
155
169
  - iulian.costan@gmail.com
@@ -167,6 +181,7 @@ files:
167
181
  - Gemfile.lock
168
182
  - README.md
169
183
  - Rakefile
184
+ - TODOs.org
170
185
  - bin/console
171
186
  - bin/setup
172
187
  - bin/whales-watching.rb
@@ -174,6 +189,8 @@ files:
174
189
  - lib/bitmex-api.rb
175
190
  - lib/bitmex.rb
176
191
  - lib/bitmex/client.rb
192
+ - lib/bitmex/mash.rb
193
+ - lib/bitmex/user.rb
177
194
  - lib/bitmex/version.rb
178
195
  homepage: https://github.com/icostan/bitmex-api-ruby
179
196
  licenses: []