bitmex-api 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []