binance_client 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +7 -7
- data/README.md +21 -0
- data/binance_client.gemspec +1 -1
- data/lib/binance_client/client.rb +1 -0
- data/lib/binance_client/models/asset_balance.rb +21 -0
- data/lib/binance_client/requests/account_snapshot_request.rb +3 -17
- data/lib/binance_client/requests/authenticated_base_request.rb +34 -0
- data/lib/binance_client/requests/base_request.rb +0 -12
- data/lib/binance_client/requests/get_all_request.rb +1 -16
- data/lib/binance_client/requests/sub_account_assets_request.rb +15 -0
- data/lib/binance_client/responses/base_response.rb +18 -1
- data/lib/binance_client/responses/sub_account_assets_response.rb +16 -0
- data/lib/binance_client/version.rb +1 -1
- data/lib/binance_client.rb +4 -0
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65dba4f920f7c9e017d74cee2c972ae54af6f731faa17c6eb15c9602061e0bb7
|
4
|
+
data.tar.gz: 0aa2e07fac3321d91513d0ab3904e80f09351b538507d7b915cf20145166f13f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e72bc48d33af094253cbbe395f9bf8f6d67343a7bcc8cf912e69740e4733c4161f7a1d06fc4755f1ff236f214b8026c1f896b360b99204e9338b18c02e95b906
|
7
|
+
data.tar.gz: 43f1d01d8a1ac0ab5fd540f13933e4d5cd17d34f063ab1dc924372a0a94e74599c4672fbeb411e6378c97f86182eb61a46a8ee3285c1838f98ce11d17b3706cd
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [1.2.0] - 2021-11-26
|
8
|
+
### Added
|
9
|
+
- Allow easy access to the `used_weight` header in a response by calling `#used_weight(interval)`
|
10
|
+
- `#sub_account_assets` to get the assets of a sub-account
|
11
|
+
- `#body_code` to return the value of "code" in the body, if it exists
|
12
|
+
- `#message` to return the value of "message" in the body, if it exists
|
13
|
+
|
7
14
|
## [1.1.0]
|
8
15
|
### Added
|
9
16
|
- `order_book_depth` (`/api/v3/depth`) to get a snapshot of the order book
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
binance_client (1.
|
4
|
+
binance_client (1.2.0)
|
5
5
|
activesupport
|
6
|
-
api_client_base
|
6
|
+
api_client_base (~> 1.11)
|
7
7
|
typhoeus
|
8
8
|
|
9
9
|
GEM
|
@@ -17,7 +17,7 @@ GEM
|
|
17
17
|
zeitwerk (~> 2.3)
|
18
18
|
addressable (2.7.0)
|
19
19
|
public_suffix (>= 2.0.2, < 5.0)
|
20
|
-
api_client_base (1.
|
20
|
+
api_client_base (1.11.0)
|
21
21
|
activesupport (>= 3.0)
|
22
22
|
gem_config (>= 0.3.1)
|
23
23
|
virtus (>= 1.0)
|
@@ -35,12 +35,12 @@ GEM
|
|
35
35
|
descendants_tracker (0.0.4)
|
36
36
|
thread_safe (~> 0.3, >= 0.3.1)
|
37
37
|
diff-lcs (1.4.4)
|
38
|
-
ethon (0.
|
38
|
+
ethon (0.15.0)
|
39
39
|
ffi (>= 1.15.0)
|
40
40
|
ffi (1.15.4)
|
41
41
|
gem_config (0.3.2)
|
42
42
|
hashdiff (1.0.1)
|
43
|
-
i18n (1.8.
|
43
|
+
i18n (1.8.11)
|
44
44
|
concurrent-ruby (~> 1.0)
|
45
45
|
ice_nine (0.11.2)
|
46
46
|
method_source (1.0.0)
|
@@ -84,7 +84,7 @@ GEM
|
|
84
84
|
addressable (>= 2.3.6)
|
85
85
|
crack (>= 0.3.2)
|
86
86
|
hashdiff (>= 0.4.0, < 2.0.0)
|
87
|
-
zeitwerk (2.
|
87
|
+
zeitwerk (2.5.1)
|
88
88
|
|
89
89
|
PLATFORMS
|
90
90
|
ruby
|
@@ -99,4 +99,4 @@ DEPENDENCIES
|
|
99
99
|
webmock
|
100
100
|
|
101
101
|
BUNDLED WITH
|
102
|
-
2.2.
|
102
|
+
2.2.28
|
data/README.md
CHANGED
@@ -42,6 +42,27 @@ client.order_book_depth(symbol: "BTCUSDT", limit: 100)
|
|
42
42
|
## Responses
|
43
43
|
The default representation of response data is a JSON hash
|
44
44
|
|
45
|
+
## Hooks
|
46
|
+
You can set a hook to do application-specific things per request. This is useful when monitoring the rate limits:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
BinanceClient.after_request = DoSomethingAfterBinanceRequest
|
50
|
+
```
|
51
|
+
|
52
|
+
What you assign can be a proc -- it just needs to respond to `call` and accept the `BinanceClient` response object:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
class DoSomethingAfterBinanceRequest
|
56
|
+
|
57
|
+
def self.call(response)
|
58
|
+
one_minute_weight = response.used_weight("1m")
|
59
|
+
if one_minute_weight > 1200
|
60
|
+
Rails.logger.info "Looks like we've hit the request limit!"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
```
|
45
66
|
|
46
67
|
## Development
|
47
68
|
Edit the `config.yml.sample` with your own credentials for testing
|
data/binance_client.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
|
-
spec.add_dependency "api_client_base"
|
28
|
+
spec.add_dependency "api_client_base", "~> 1.11"
|
29
29
|
spec.add_dependency "activesupport"
|
30
30
|
spec.add_dependency "typhoeus"
|
31
31
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module BinanceClient
|
2
|
+
class AssetBalance
|
3
|
+
|
4
|
+
attr_reader :asset
|
5
|
+
|
6
|
+
def initialize(asset:, free:, locked:)
|
7
|
+
@asset = asset
|
8
|
+
@free = free
|
9
|
+
@locked = locked
|
10
|
+
end
|
11
|
+
|
12
|
+
def free
|
13
|
+
@free.to_d
|
14
|
+
end
|
15
|
+
|
16
|
+
def locked
|
17
|
+
@locked.to_d
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -1,28 +1,14 @@
|
|
1
1
|
module BinanceClient
|
2
|
-
class AccountSnapshotRequest <
|
2
|
+
class AccountSnapshotRequest < AuthenticatedBaseRequest
|
3
3
|
private
|
4
4
|
|
5
5
|
def path
|
6
6
|
"/sapi/v1/accountSnapshot"
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
type
|
11
|
-
limit = 30
|
12
|
-
query = query(type: type, limit: limit)
|
13
|
-
|
14
|
-
[
|
15
|
-
query,
|
16
|
-
"signature=#{signature(query)}"
|
17
|
-
].join("&")
|
9
|
+
def params_without_signature
|
10
|
+
{ type: "SPOT", limit: 30 }
|
18
11
|
end
|
19
12
|
|
20
|
-
def query(options={})
|
21
|
-
[
|
22
|
-
"type=#{options[:type]}",
|
23
|
-
"timestamp=#{timestamp}",
|
24
|
-
"limit=#{options[:limit]}",
|
25
|
-
].join("&")
|
26
|
-
end
|
27
13
|
end
|
28
14
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module BinanceClient
|
2
|
+
class AuthenticatedBaseRequest < BaseRequest
|
3
|
+
include APIClientBase::Request.module
|
4
|
+
|
5
|
+
def signature
|
6
|
+
OpenSSL::HMAC.hexdigest(
|
7
|
+
OpenSSL::Digest.new("sha256"),
|
8
|
+
api_secret,
|
9
|
+
params_without_signature_with_timestamp.to_query,
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
def signature_hash
|
14
|
+
{ signature: signature }
|
15
|
+
end
|
16
|
+
|
17
|
+
def timestamp
|
18
|
+
@timestamp ||= DateTime.now.strftime("%Q")
|
19
|
+
end
|
20
|
+
|
21
|
+
def params
|
22
|
+
params_without_signature_with_timestamp.merge(signature_hash).to_query
|
23
|
+
end
|
24
|
+
|
25
|
+
def params_without_signature_with_timestamp
|
26
|
+
params_without_signature.merge(timestamp: timestamp)
|
27
|
+
end
|
28
|
+
|
29
|
+
def params_without_signature
|
30
|
+
{}
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -4,7 +4,6 @@ module BinanceClient
|
|
4
4
|
|
5
5
|
attribute :api_key, String
|
6
6
|
attribute :api_secret, String
|
7
|
-
attribute :timestamp, Integer, lazy: true, default: :default_timestamp
|
8
7
|
|
9
8
|
def headers
|
10
9
|
{
|
@@ -13,16 +12,5 @@ module BinanceClient
|
|
13
12
|
}
|
14
13
|
end
|
15
14
|
|
16
|
-
def signature(query)
|
17
|
-
OpenSSL::HMAC.hexdigest(
|
18
|
-
OpenSSL::Digest.new("sha256"),
|
19
|
-
api_secret,
|
20
|
-
query,
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
def default_timestamp
|
25
|
-
DateTime.now.strftime("%Q")
|
26
|
-
end
|
27
15
|
end
|
28
16
|
end
|
@@ -1,25 +1,10 @@
|
|
1
1
|
module BinanceClient
|
2
|
-
class GetAllRequest <
|
2
|
+
class GetAllRequest < AuthenticatedBaseRequest
|
3
3
|
private
|
4
4
|
|
5
5
|
def path
|
6
6
|
"/sapi/v1/capital/config/getall"
|
7
7
|
end
|
8
8
|
|
9
|
-
def query
|
10
|
-
uri = Addressable::URI.new(query_values: {
|
11
|
-
timestamp: timestamp,
|
12
|
-
})
|
13
|
-
uri.normalized_query
|
14
|
-
end
|
15
|
-
|
16
|
-
def params
|
17
|
-
uri = Addressable::URI.new(query: query)
|
18
|
-
uri.query_values = [
|
19
|
-
uri.query,
|
20
|
-
["signature", signature(query)],
|
21
|
-
]
|
22
|
-
uri.normalized_query
|
23
|
-
end
|
24
9
|
end
|
25
10
|
end
|
@@ -2,12 +2,29 @@ module BinanceClient
|
|
2
2
|
class BaseResponse
|
3
3
|
include APIClientBase::Response.module
|
4
4
|
|
5
|
-
attribute :body, Object, default: :default_body
|
5
|
+
attribute :body, Object, lazy: true, default: :default_body
|
6
|
+
|
7
|
+
def used_weight(interval)
|
8
|
+
val = header("X-MBX-USED-WEIGHT-#{interval}")
|
9
|
+
return nil if val.nil?
|
10
|
+
val.to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
def message
|
14
|
+
body["message"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def body_code
|
18
|
+
val = body["code"]
|
19
|
+
return nil if val.nil?
|
20
|
+
val.to_i
|
21
|
+
end
|
6
22
|
|
7
23
|
private
|
8
24
|
|
9
25
|
def default_body
|
10
26
|
JSON.parse(raw_response.body)
|
11
27
|
end
|
28
|
+
|
12
29
|
end
|
13
30
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BinanceClient
|
2
|
+
class SubAccountAssetsResponse < BaseResponse
|
3
|
+
|
4
|
+
attribute(:balances, Array[BinanceClient::AssetBalance], {
|
5
|
+
lazy: true,
|
6
|
+
default: :default_balances,
|
7
|
+
})
|
8
|
+
|
9
|
+
def default_balances
|
10
|
+
body["balances"].map do |balance_hash|
|
11
|
+
AssetBalance.new(**balance_hash.symbolize_keys)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
data/lib/binance_client.rb
CHANGED
@@ -10,19 +10,23 @@ require "binance_client/client"
|
|
10
10
|
require "binance_client/models/base_model"
|
11
11
|
require "binance_client/models/order_book_entry"
|
12
12
|
require "binance_client/models/order_book"
|
13
|
+
require "binance_client/models/asset_balance"
|
13
14
|
|
14
15
|
require "binance_client/requests/base_request"
|
16
|
+
require "binance_client/requests/authenticated_base_request"
|
15
17
|
require "binance_client/responses/base_response"
|
16
18
|
require "binance_client/requests/system_status_request"
|
17
19
|
require "binance_client/requests/account_snapshot_request"
|
18
20
|
require "binance_client/requests/get_all_request"
|
19
21
|
require "binance_client/requests/book_ticker_request"
|
20
22
|
require "binance_client/requests/order_book_depth_request"
|
23
|
+
require "binance_client/requests/sub_account_assets_request"
|
21
24
|
require "binance_client/responses/system_status_response"
|
22
25
|
require "binance_client/responses/account_snapshot_response"
|
23
26
|
require "binance_client/responses/get_all_response"
|
24
27
|
require "binance_client/responses/book_ticker_response"
|
25
28
|
require "binance_client/responses/order_book_depth_response"
|
29
|
+
require "binance_client/responses/sub_account_assets_response"
|
26
30
|
|
27
31
|
module BinanceClient
|
28
32
|
class Error < StandardError; end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: binance_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AJ Villalobos
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: api_client_base
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.11'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,20 +116,24 @@ files:
|
|
116
116
|
- binance_client.gemspec
|
117
117
|
- lib/binance_client.rb
|
118
118
|
- lib/binance_client/client.rb
|
119
|
+
- lib/binance_client/models/asset_balance.rb
|
119
120
|
- lib/binance_client/models/base_model.rb
|
120
121
|
- lib/binance_client/models/order_book.rb
|
121
122
|
- lib/binance_client/models/order_book_entry.rb
|
122
123
|
- lib/binance_client/requests/account_snapshot_request.rb
|
124
|
+
- lib/binance_client/requests/authenticated_base_request.rb
|
123
125
|
- lib/binance_client/requests/base_request.rb
|
124
126
|
- lib/binance_client/requests/book_ticker_request.rb
|
125
127
|
- lib/binance_client/requests/get_all_request.rb
|
126
128
|
- lib/binance_client/requests/order_book_depth_request.rb
|
129
|
+
- lib/binance_client/requests/sub_account_assets_request.rb
|
127
130
|
- lib/binance_client/requests/system_status_request.rb
|
128
131
|
- lib/binance_client/responses/account_snapshot_response.rb
|
129
132
|
- lib/binance_client/responses/base_response.rb
|
130
133
|
- lib/binance_client/responses/book_ticker_response.rb
|
131
134
|
- lib/binance_client/responses/get_all_response.rb
|
132
135
|
- lib/binance_client/responses/order_book_depth_response.rb
|
136
|
+
- lib/binance_client/responses/sub_account_assets_response.rb
|
133
137
|
- lib/binance_client/responses/system_status_response.rb
|
134
138
|
- lib/binance_client/version.rb
|
135
139
|
homepage: https://github.com/bloom-solutions/binance_client-ruby
|