max_exchange_api 1.3.0 → 2.0.0

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +43 -46
  3. data/.gitignore +62 -62
  4. data/.rubocop.yml +1227 -1227
  5. data/CHANGELOG.md +5 -0
  6. data/CODE_OF_CONDUCT.md +49 -49
  7. data/LICENSE +21 -21
  8. data/README.md +993 -368
  9. data/Rakefile +10 -10
  10. data/bin/console +14 -14
  11. data/bin/setup +0 -0
  12. data/gemfiles/2.2.gemfile +11 -0
  13. data/gemfiles/Gemfile +10 -10
  14. data/lib/max_exchange_api/base_api.rb +52 -52
  15. data/lib/max_exchange_api/config.rb +26 -26
  16. data/lib/max_exchange_api/helper.rb +9 -2
  17. data/lib/max_exchange_api/private_api.rb +4 -218
  18. data/lib/max_exchange_api/private_v2/account_api.rb +15 -0
  19. data/lib/max_exchange_api/private_v2/deposit_api.rb +75 -0
  20. data/lib/max_exchange_api/private_v2/internal_transfer_api.rb +26 -0
  21. data/lib/max_exchange_api/private_v2/order_api.rb +55 -0
  22. data/lib/max_exchange_api/private_v2/reward_api.rb +40 -0
  23. data/lib/max_exchange_api/private_v2/trade_api.rb +28 -0
  24. data/lib/max_exchange_api/private_v2/user_api.rb +19 -0
  25. data/lib/max_exchange_api/private_v2/withdraw_api.rb +42 -0
  26. data/lib/max_exchange_api/private_v2_api.rb +26 -0
  27. data/lib/max_exchange_api/private_v3/account_api.rb +15 -0
  28. data/lib/max_exchange_api/private_v3/convert_api.rb +29 -0
  29. data/lib/max_exchange_api/private_v3/deposit_api.rb +26 -0
  30. data/lib/max_exchange_api/private_v3/internal_transfer_api.rb +19 -0
  31. data/lib/max_exchange_api/private_v3/m_wallet_api.rb +76 -0
  32. data/lib/max_exchange_api/private_v3/order_api.rb +82 -0
  33. data/lib/max_exchange_api/private_v3/reward_api.rb +19 -0
  34. data/lib/max_exchange_api/private_v3/sub_account_api.rb +31 -0
  35. data/lib/max_exchange_api/private_v3/trade_api.rb +27 -0
  36. data/lib/max_exchange_api/private_v3/user_api.rb +11 -0
  37. data/lib/max_exchange_api/private_v3/withdraw_api.rb +35 -0
  38. data/lib/max_exchange_api/private_v3_api.rb +32 -0
  39. data/lib/max_exchange_api/public_api.rb +13 -72
  40. data/lib/max_exchange_api/public_v2_api.rb +65 -0
  41. data/lib/max_exchange_api/public_v3_api.rb +69 -0
  42. data/lib/max_exchange_api/version.rb +3 -3
  43. data/lib/max_exchange_api.rb +4 -2
  44. data/max_exchange_api.gemspec +42 -43
  45. metadata +28 -21
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
- require 'bundler/gem_tasks'
2
- require 'rake/testtask'
3
-
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << 'test'
6
- t.libs << 'lib'
7
- t.test_files = FileList['test/**/*_test.rb']
8
- end
9
-
10
- task default: :test
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task default: :test
data/bin/console CHANGED
@@ -1,14 +1,14 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'bundler/setup'
4
- require 'max_exchange_api'
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require 'irb'
14
- IRB.start
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'max_exchange_api'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/setup CHANGED
File without changes
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_or.gemspec
4
+
5
+ group :test do
6
+ gem 'simplecov', '< 0.18'
7
+ gem 'httparty', '< 0.19'
8
+ gem 'logger', '< 1.3.0'
9
+ end
10
+
11
+ gemspec path: '../'
data/gemfiles/Gemfile CHANGED
@@ -1,10 +1,10 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rails_or.gemspec
4
-
5
- group :test do
6
- gem 'simplecov', '< 0.18'
7
- gem 'httparty', '< 0.19'
8
- end
9
-
10
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_or.gemspec
4
+
5
+ group :test do
6
+ gem 'simplecov', '< 0.18'
7
+ gem 'httparty', '< 0.19'
8
+ end
9
+
10
+ gemspec path: '../'
@@ -1,52 +1,52 @@
1
- # frozen_string_literal: true
2
-
3
- require 'httparty'
4
- require 'max_exchange_api/helper'
5
-
6
- module MaxExchangeApi
7
- class BaseApi
8
- include HTTParty
9
-
10
- attr_reader :config
11
-
12
- def initialize(config: nil)
13
- @config = Config.new(config)
14
- @config.reverse_merge!(MaxExchangeApi.default_config)
15
- end
16
-
17
- protected
18
-
19
- def send_request(method, path, headers, query)
20
- uuid = SecureRandom.uuid
21
- print_log(:info, "[API] #{uuid} #{method.upcase} '#{path}' query = #{query}")
22
-
23
- body_or_query = method == :get ? :query : :body
24
-
25
- begin
26
- response = self.class.send(
27
- method,
28
- path,
29
- headers: headers.merge(
30
- 'Accept' => 'application/json',
31
- 'User-Agent' => "max_exchange_api (#{MaxExchangeApi::VERSION})",
32
- ),
33
- timeout: @config.timeout,
34
- body_or_query => query,
35
- ).parsed_response
36
-
37
- print_log(:info, "[API] #{uuid} response #{response}")
38
- return response
39
- rescue => error
40
- print_log(:error, "[API] #{uuid} raise exception #{error.message}")
41
- raise error
42
- end
43
- end
44
-
45
- private
46
-
47
- def print_log(method, message)
48
- logger = @config.logger
49
- logger.send(method, message) if logger
50
- end
51
- end
52
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'httparty'
4
+ require 'max_exchange_api/helper'
5
+
6
+ module MaxExchangeApi
7
+ class BaseApi
8
+ include HTTParty
9
+
10
+ attr_reader :config
11
+
12
+ def initialize(config: nil)
13
+ @config = Config.new(config)
14
+ @config.reverse_merge!(MaxExchangeApi.default_config)
15
+ end
16
+
17
+ protected
18
+
19
+ def send_request(method, path, headers, query)
20
+ uuid = SecureRandom.uuid
21
+ print_log(:info, "[API] #{uuid} #{method.upcase} '#{path}' query = #{query}")
22
+
23
+ body_or_query = method == :get ? :query : :body
24
+
25
+ begin
26
+ response = self.class.send(
27
+ method,
28
+ path,
29
+ headers: headers.merge(
30
+ 'Accept' => 'application/json',
31
+ 'User-Agent' => "max_exchange_api (#{MaxExchangeApi::VERSION})",
32
+ ),
33
+ timeout: @config.timeout,
34
+ body_or_query => query,
35
+ ).parsed_response
36
+
37
+ print_log(:info, "[API] #{uuid} response #{response}")
38
+ return response
39
+ rescue => error
40
+ print_log(:error, "[API] #{uuid} raise exception #{error.message}")
41
+ raise error
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def print_log(method, message)
48
+ logger = @config.logger
49
+ logger.send(method, message) if logger
50
+ end
51
+ end
52
+ end
@@ -1,26 +1,26 @@
1
- # frozen_string_literal: true
2
-
3
- module MaxExchangeApi
4
- class Config
5
- attr_accessor :timeout
6
- attr_accessor :logger
7
-
8
- def initialize(data = nil)
9
- data ||= {}
10
- @timeout = data[:timeout]
11
- @logger = data[:logger]
12
- end
13
-
14
- def reverse_merge!(other)
15
- @timeout ||= other.timeout
16
- @logger ||= other.logger
17
- end
18
- end
19
-
20
- @default_config = Config.new
21
- @default_config.timeout = 3
22
-
23
- class << self
24
- attr_reader :default_config
25
- end
26
- end
1
+ # frozen_string_literal: true
2
+
3
+ module MaxExchangeApi
4
+ class Config
5
+ attr_accessor :timeout
6
+ attr_accessor :logger
7
+
8
+ def initialize(data = nil)
9
+ data ||= {}
10
+ @timeout = data[:timeout]
11
+ @logger = data[:logger]
12
+ end
13
+
14
+ def reverse_merge!(other)
15
+ @timeout ||= other.timeout
16
+ @logger ||= other.logger
17
+ end
18
+ end
19
+
20
+ @default_config = Config.new
21
+ @default_config.timeout = 3
22
+
23
+ class << self
24
+ attr_reader :default_config
25
+ end
26
+ end
@@ -1,16 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
4
+ require 'json'
5
+
3
6
  module MaxExchangeApi
4
7
  module Helper
5
8
  class << self
6
- def gen_headers(payload, access_key, secret_key)
9
+ def gen_headers(payload, access_key, secret_key, sub_account_sn: nil)
7
10
  encoded_payload = encode(payload)
8
11
 
9
- return {
12
+ headers = {
10
13
  'X-MAX-ACCESSKEY' => access_key,
11
14
  'X-MAX-PAYLOAD' => encoded_payload,
12
15
  'X-MAX-SIGNATURE' => encrypt(encoded_payload, secret_key),
13
16
  }
17
+
18
+ headers['X-Sub-Account'] = sub_account_sn if sub_account_sn
19
+
20
+ return headers
14
21
  end
15
22
 
16
23
  private
@@ -4,236 +4,22 @@ require 'max_exchange_api/base_api'
4
4
 
5
5
  module MaxExchangeApi
6
6
  class PrivateApi < BaseApi
7
- base_uri 'https://max-api.maicoin.com/api/v2'
7
+ attr_accessor :current_sub_account_sn
8
8
 
9
9
  def initialize(access_key, secret_key, config: nil)
10
10
  super(config: config)
11
11
 
12
12
  @access_key = access_key
13
13
  @secret_key = secret_key
14
- end
15
-
16
- def my_trades_of_order(order_id, use_client_id: false)
17
- id_params_key = use_client_id ? :client_oid : :id
18
- send_request(:get, '/trades/my/of_order', id_params_key => order_id)
19
- end
20
-
21
- def my_trades(market, timestamp: nil, from: nil, to: nil, order_by: 'desc', pagination: true, page: 1, limit: 50,
22
- offset: 0)
23
- send_request(
24
- :get,
25
- '/trades/my',
26
- market: market,
27
- timestamp: timestamp,
28
- from: from,
29
- to: to,
30
- order_by: order_by,
31
- pagination: pagination,
32
- page: page,
33
- limit: limit,
34
- offset: offset,
35
- )
36
- end
37
-
38
- def member_profile
39
- send_request(:get, '/members/profile', {})
40
- end
41
-
42
- def me
43
- send_request(:get, '/members/me', {})
44
- end
45
-
46
- def vip_level
47
- send_request(:get, '/members/vip_level', {})
48
- end
49
-
50
- def accounts
51
- send_request(:get, '/members/accounts', {})
52
- end
53
-
54
- def account(currency)
55
- send_request(:get, "/members/accounts/#{currency}", {})
56
- end
57
-
58
- def deposits(currency, from: nil, to: nil, state: nil, pagination: nil, page: 1, limit: 50,
59
- offset: 0)
60
- send_request(
61
- :get,
62
- '/deposits',
63
- currency: currency,
64
- from: from,
65
- to: to,
66
- state: state,
67
- pagination: pagination,
68
- page: page,
69
- limit: limit,
70
- offset: offset,
71
- )
72
- end
73
-
74
- def deposit(transaction_id)
75
- send_request(:get, '/deposit', txid: transaction_id)
76
- end
77
-
78
- def deposit_addresses(currency: nil, pagination: nil, page: 1, limit: 50, offset: 0)
79
- send_request(
80
- :get,
81
- '/deposit_addresses',
82
- currency: currency,
83
- pagination: pagination,
84
- page: page,
85
- limit: limit,
86
- offset: offset,
87
- )
88
- end
89
-
90
- def create_deposit_addresses!(currency)
91
- send_request(:post, '/deposit_addresses', currency: currency)
92
- end
93
-
94
- def withdraw_addresses(currency, pagination: nil, page: 1, limit: 50, offset: 0)
95
- send_request(
96
- :get,
97
- '/withdraw_addresses',
98
- currency: currency,
99
- pagination: pagination,
100
- page: page,
101
- limit: limit,
102
- offset: offset,
103
- )
104
- end
105
-
106
- def withdrawal(withdraw_id)
107
- send_request(:get, '/withdrawal', uuid: withdraw_id)
108
- end
109
-
110
- def withdrawals(currency, from: nil, to: nil, state: nil, pagination: nil, page: 1, limit: 50,
111
- offset: 0)
112
- send_request(
113
- :get,
114
- '/withdrawals',
115
- currency: currency,
116
- from: from,
117
- to: to,
118
- state: state,
119
- pagination: pagination,
120
- page: page,
121
- limit: limit,
122
- offset: offset,
123
- )
124
- end
125
-
126
- def create_withdrawal!(currency, withdraw_address_id, amount)
127
- send_request(:post, '/withdrawal', currency: currency, withdraw_address_uuid: withdraw_address_id, amount: amount)
128
- end
129
-
130
- def internal_transfers(currency: nil, side: 'in', from: nil, to: nil, pagination: nil, page: 1, limit: 50,
131
- offset: 0)
132
- send_request(
133
- :get,
134
- '/internal_transfers',
135
- currency: currency,
136
- side: side,
137
- from: from,
138
- to: to,
139
- pagination: pagination,
140
- page: page,
141
- limit: limit,
142
- offset: offset,
143
- )
144
- end
145
-
146
- def internal_transfer(internal_transfer_id)
147
- send_request(:get, '/internal_transfer', uuid: internal_transfer_id)
148
- end
149
-
150
- def rewards(reward_type: nil, currency: nil, from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
151
- path = reward_type ? "/rewards/#{reward_type}" : '/rewards'
152
- send_request(
153
- :get,
154
- path,
155
- currency: currency,
156
- from: from,
157
- to: to,
158
- pagination: pagination,
159
- page: page,
160
- limit: limit,
161
- offset: offset,
162
- )
163
- end
164
-
165
- def yields(currency: nil, from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
166
- send_request(
167
- :get,
168
- '/yields',
169
- currency: currency,
170
- from: from,
171
- to: to,
172
- pagination: pagination,
173
- page: page,
174
- limit: limit,
175
- offset: offset,
176
- )
177
- end
178
-
179
- def max_rewards_yesterday
180
- send_request(:get, '/max_rewards/yesterday', {})
181
- end
182
-
183
- def orders(market, state: nil, order_by: 'asc', group_id: nil, pagination: nil, page: 1, limit: 50, offset: 0)
184
- send_request(
185
- :get,
186
- '/orders',
187
- market: market,
188
- state: state,
189
- order_by: order_by,
190
- group_id: group_id,
191
- pagination: pagination,
192
- page: page,
193
- limit: limit,
194
- offset: offset,
195
- )
196
- end
197
-
198
- def order(order_id, use_client_id: false)
199
- id_params_key = use_client_id ? :client_oid : :id
200
- send_request(:get, '/order', id_params_key => order_id)
201
- end
202
-
203
- def cancel_orders!(market: nil, side: nil, group_id: nil)
204
- send_request(:post, '/orders/clear', market: market, side: side, group_id: group_id)
205
- end
206
-
207
- def cancel_order!(order_id, use_client_id: false)
208
- id_params_key = use_client_id ? :client_oid : :id
209
- send_request(:post, '/order/delete', id_params_key => order_id)
210
- end
211
-
212
- def create_order!(market, side, volume, price: nil, client_oid: nil, stop_price: nil, ord_type: nil, group_id: nil)
213
- send_request(
214
- :post,
215
- '/orders',
216
- market: market,
217
- side: side,
218
- volume: volume,
219
- price: price,
220
- client_oid: client_oid,
221
- stop_price: stop_price,
222
- ord_type: ord_type,
223
- group_id: group_id,
224
- )
225
- end
226
-
227
- def create_orders!(market, orders, group_id: nil)
228
- send_request(:post, '/orders/multi/onebyone', market: market, orders: orders, group_id: group_id)
14
+ @base_path = URI.parse(self.class.base_uri).path
229
15
  end
230
16
 
231
17
  protected
232
18
 
233
19
  def send_request(method, path, query)
234
20
  query = query.compact
235
- query.merge!(path: "/api/v2#{path}", nonce: (Time.now.to_f * 1000).to_i)
236
- return super(method, path, Helper.gen_headers(query, @access_key, @secret_key), query)
21
+ query.merge!(path: "#{@base_path}#{path}", nonce: (Time.now.to_f * 1000).to_i)
22
+ return super(method, path, Helper.gen_headers(query, @access_key, @secret_key, sub_account_sn: current_sub_account_sn), query)
237
23
  end
238
24
  end
239
25
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MaxExchangeApi
4
+ module PrivateV2
5
+ module AccountApi
6
+ def accounts
7
+ send_request(:get, '/members/accounts', {})
8
+ end
9
+
10
+ def account(currency)
11
+ send_request(:get, "/members/accounts/#{currency}", {})
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MaxExchangeApi
4
+ module PrivateV2
5
+ module DepositApi
6
+ def deposits(currency, from: nil, to: nil, state: nil, pagination: nil, page: 1, limit: 50, offset: 0)
7
+ send_request(
8
+ :get,
9
+ '/deposits',
10
+ currency: currency,
11
+ from: from,
12
+ to: to,
13
+ state: state,
14
+ pagination: pagination,
15
+ page: page,
16
+ limit: limit,
17
+ offset: offset,
18
+ )
19
+ end
20
+
21
+ def deposit(transaction_id)
22
+ send_request(:get, '/deposit', txid: transaction_id)
23
+ end
24
+
25
+ def deposit_addresses(currency: nil, pagination: nil, page: 1, limit: 50, offset: 0)
26
+ send_request(
27
+ :get,
28
+ '/deposit_addresses',
29
+ currency: currency,
30
+ pagination: pagination,
31
+ page: page,
32
+ limit: limit,
33
+ offset: offset,
34
+ )
35
+ end
36
+
37
+ def create_deposit_addresses!(currency)
38
+ send_request(:post, '/deposit_addresses', currency: currency)
39
+ end
40
+
41
+ def rewards(reward_type: nil, currency: nil, from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
42
+ path = reward_type ? "/rewards/#{reward_type}" : '/rewards'
43
+ send_request(
44
+ :get,
45
+ path,
46
+ currency: currency,
47
+ from: from,
48
+ to: to,
49
+ pagination: pagination,
50
+ page: page,
51
+ limit: limit,
52
+ offset: offset,
53
+ )
54
+ end
55
+
56
+ def yields(currency: nil, from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
57
+ send_request(
58
+ :get,
59
+ '/yields',
60
+ currency: currency,
61
+ from: from,
62
+ to: to,
63
+ pagination: pagination,
64
+ page: page,
65
+ limit: limit,
66
+ offset: offset,
67
+ )
68
+ end
69
+
70
+ def max_rewards_yesterday
71
+ send_request(:get, '/max_rewards/yesterday', {})
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MaxExchangeApi
4
+ module PrivateV2
5
+ module InternalTransferApi
6
+ def internal_transfers(currency: nil, side: 'in', from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
7
+ send_request(
8
+ :get,
9
+ '/internal_transfers',
10
+ currency: currency,
11
+ side: side,
12
+ from: from,
13
+ to: to,
14
+ pagination: pagination,
15
+ page: page,
16
+ limit: limit,
17
+ offset: offset,
18
+ )
19
+ end
20
+
21
+ def internal_transfer(internal_transfer_id)
22
+ send_request(:get, '/internal_transfer', uuid: internal_transfer_id)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MaxExchangeApi
4
+ module PrivateV2
5
+ module OrderApi
6
+ def orders(market, state: nil, order_by: 'asc', group_id: nil, pagination: nil, page: 1, limit: 50, offset: 0)
7
+ send_request(
8
+ :get,
9
+ '/orders',
10
+ market: market,
11
+ state: state,
12
+ order_by: order_by,
13
+ group_id: group_id,
14
+ pagination: pagination,
15
+ page: page,
16
+ limit: limit,
17
+ offset: offset,
18
+ )
19
+ end
20
+
21
+ def order(order_id, use_client_id: false)
22
+ id_params_key = use_client_id ? :client_oid : :id
23
+ send_request(:get, '/order', id_params_key => order_id)
24
+ end
25
+
26
+ def cancel_orders!(market: nil, side: nil, group_id: nil)
27
+ send_request(:post, '/orders/clear', market: market, side: side, group_id: group_id)
28
+ end
29
+
30
+ def cancel_order!(order_id, use_client_id: false)
31
+ id_params_key = use_client_id ? :client_oid : :id
32
+ send_request(:post, '/order/delete', id_params_key => order_id)
33
+ end
34
+
35
+ def create_order!(market, side, volume, price: nil, client_oid: nil, stop_price: nil, ord_type: nil, group_id: nil)
36
+ send_request(
37
+ :post,
38
+ '/orders',
39
+ market: market,
40
+ side: side,
41
+ volume: volume,
42
+ price: price,
43
+ client_oid: client_oid,
44
+ stop_price: stop_price,
45
+ ord_type: ord_type,
46
+ group_id: group_id,
47
+ )
48
+ end
49
+
50
+ def create_orders!(market, orders, group_id: nil)
51
+ send_request(:post, '/orders/multi/onebyone', market: market, orders: orders, group_id: group_id)
52
+ end
53
+ end
54
+ end
55
+ end