viabtc 0.2.0 → 0.3.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/.editorconfig +17 -0
- data/.ruby-version +1 -1
- data/.travis.yml +3 -0
- data/Gemfile.lock +4 -4
- data/README.md +20 -43
- data/lib/viabtc.rb +2 -1
- data/lib/viabtc/config.rb +2 -2
- data/lib/viabtc/error.rb +6 -5
- data/lib/viabtc/helpers.rb +47 -0
- data/lib/viabtc/http.rb +201 -0
- data/lib/viabtc/version.rb +1 -1
- data/viabtc.gemspec +1 -1
- metadata +8 -7
- data/lib/viabtc/client.rb +0 -240
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bed0b4acacb8c5a6c55f73a06b8c70a06daec112400b0e185ad01bb6bd605900
|
4
|
+
data.tar.gz: 236ed2ed08255f325891d18dace3dd4807b7e845a014d5a3cb1c067b2cf76833
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 879fe516995d8a737092b59a54a8dc549c02a70fedb3ec2fe689b28a57064e5588097f27d17b4fdb899a198cfc54bc3e197fa5fc91867f6daaf6c642c349a5c7
|
7
|
+
data.tar.gz: 1dcc68642ebcd0b4a55992fa1a3b5cb61561f961e00c8aaec4f988b3c837ffe6c050b6385264c79d5782f404d36a3679e0bfccf305124f255c1e1480cc3dfd9f
|
data/.editorconfig
ADDED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.6.0
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
viabtc (0.
|
5
|
-
faraday (~> 0.15.
|
4
|
+
viabtc (0.3.0)
|
5
|
+
faraday (~> 0.15.4)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.3)
|
11
|
-
faraday (0.15.
|
11
|
+
faraday (0.15.4)
|
12
12
|
multipart-post (>= 1.2, < 3)
|
13
13
|
multipart-post (2.0.0)
|
14
14
|
rake (10.5.0)
|
@@ -36,4 +36,4 @@ DEPENDENCIES
|
|
36
36
|
viabtc!
|
37
37
|
|
38
38
|
BUNDLED WITH
|
39
|
-
1.17.
|
39
|
+
1.17.2
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# ViaBTC
|
1
|
+
# ViaBTC 📈
|
2
2
|
|
3
|
-
[](https://travis-ci.org/krmbzds/viabtc) [](https://rubygems.org/gems/viabtc) [](https://rubygems.org/gems/viabtc)
|
3
|
+
[](https://travis-ci.org/krmbzds/viabtc) [](https://rubygems.org/gems/viabtc) [](https://rubygems.org/gems/viabtc) [](https://www.rubydoc.info/gems/viabtc/)
|
4
4
|
|
5
|
-
An HTTP client to interface with the open-source [ViaBTC Exchange Server][ViaBTC Exchange Server Repo]
|
5
|
+
An HTTP & WebSocket client to interface with the open-source [ViaBTC Exchange Server][ViaBTC Exchange Server Repo].
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -14,64 +14,41 @@ If using **Rails**, create a file named `viabtc.rb` under `config/initializers`
|
|
14
14
|
|
15
15
|
```rb
|
16
16
|
ViaBTC.configure do |config|
|
17
|
-
config.
|
18
|
-
config.faraday_response = :logger
|
19
|
-
config.faraday_adapter = :net_http
|
17
|
+
config.http_base_url = 'http://localhost:18080'
|
20
18
|
end
|
21
19
|
```
|
22
20
|
|
23
|
-
If not, add it anywhere in your code that runs before a new client is initialized.
|
21
|
+
If not, add it anywhere in your code that runs before a new client is initialized. Read more at: 📖[Configuration Wiki](https://github.com/krmbzds/viabtc/wiki/Configuration)
|
24
22
|
|
25
23
|
## Usage
|
26
24
|
|
27
25
|
Create a new instance:
|
28
26
|
|
29
27
|
```rb
|
30
|
-
|
28
|
+
viabtc_http_client = ViaBTC::HTTP::Client.new
|
31
29
|
```
|
32
30
|
|
33
31
|
Make an API request:
|
34
32
|
|
35
33
|
```rb
|
36
|
-
|
37
|
-
```
|
34
|
+
viabtc_http_client.market_status(market: 'ETHBTC')
|
38
35
|
|
39
|
-
|
40
|
-
```rb
|
41
|
-
{"error"=>nil, "result"=>{"low"=>"0", "period"=>86400, "last"=>"0", "high"=>"0", "open"=>"0", "volume"=>"0", "close"=>"0", "deal"=>"0"}, "id"=>0}
|
36
|
+
#=> {"error"=>nil, "result"=>{"low"=>"0", "period"=>86400, "last"=>"0", "high"=>"0", "open"=>"0", "volume"=>"0", "close"=>"0", "deal"=>"0"}, "id"=>0}
|
42
37
|
```
|
43
38
|
|
44
39
|
## Support
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
| `order.put_limit` | `#limit_sell` `#limit_buy` |
|
58
|
-
| `order.put_market` | `#market_sell` `#market_buy` |
|
59
|
-
| `order.cancel` | `#cancel_order` |
|
60
|
-
| `order.deals` | `#order_deals` |
|
61
|
-
| `order.book` | `#sell_orders` `#buy_orders` |
|
62
|
-
| `order.depth` | `#order_depth` |
|
63
|
-
| `order.pending` | `#pending_orders` |
|
64
|
-
| `order.pending_detail` | `#pending_order_details` |
|
65
|
-
| `order.finished` | `#finished_orders` `#finished_sell_orders` `#finished_buy_orders` |
|
66
|
-
| `order.finished_detail` | `#finished_order_detail` |
|
67
|
-
| `market.last` | `#market_last` |
|
68
|
-
| `market.deals` | `#market_deals` |
|
69
|
-
| `market.user_deals` | `#user_executed_orders` |
|
70
|
-
| `market.kline` | `#market_kline` |
|
71
|
-
| `market.status` | `#market_status` |
|
72
|
-
| `market.status_today` | `#market_status_today` |
|
73
|
-
| `market.list` | `#market_list` |
|
74
|
-
| `market.summary` | `#market_summary` |
|
41
|
+
#### Ruby Versions Tested Against
|
42
|
+
|
43
|
+
- ✅ `2.6.0` (stable)
|
44
|
+
- ✅ `2.5.3` (stable)
|
45
|
+
- ✅ `2.4.5` (stable)
|
46
|
+
- ⏳ `2.3.8` (security maintenance phase)
|
47
|
+
|
48
|
+
#### ViaBTC Exchange Server API Support
|
49
|
+
|
50
|
+
- 📖 [HTTP Protocol](https://github.com/krmbzds/viabtc/wiki/API-Support#http-protocol)
|
51
|
+
- 📖 [WebSocket Protocol](https://github.com/krmbzds/viabtc/wiki/API-Support#websocket-protocol)
|
75
52
|
|
76
53
|
## Development
|
77
54
|
|
@@ -88,7 +65,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
88
65
|
5. Push to the branch (`git push origin my-new-feature`)
|
89
66
|
6. Create new Pull Request
|
90
67
|
|
91
|
-
### Donations
|
68
|
+
### Donations ❤️
|
92
69
|
|
93
70
|
You can donate me at [Librepay][Donation]. Thanks! ☕️
|
94
71
|
|
data/lib/viabtc.rb
CHANGED
data/lib/viabtc/config.rb
CHANGED
@@ -9,10 +9,10 @@ module ViaBTC
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class Configuration
|
12
|
-
attr_accessor :
|
12
|
+
attr_accessor :http_base_url, :http_response, :http_adapter
|
13
13
|
|
14
14
|
def initialize
|
15
|
-
@
|
15
|
+
@http_base_url = nil
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/viabtc/error.rb
CHANGED
@@ -16,11 +16,12 @@ module ViaBTC
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# ViaBTC Exchange Server General Error Codes
|
19
|
-
InvalidArgument
|
20
|
-
InternalError
|
21
|
-
ServiceUnavailable
|
22
|
-
MethodNotFound
|
23
|
-
ServiceTimeout
|
19
|
+
InvalidArgument = Class.new(ExchangeError) # 1: Invalid Argument
|
20
|
+
InternalError = Class.new(ExchangeError) # 2: Internal Error
|
21
|
+
ServiceUnavailable = Class.new(ExchangeError) # 3: Service Unavailable
|
22
|
+
MethodNotFound = Class.new(ExchangeError) # 4: Method Not Found
|
23
|
+
ServiceTimeout = Class.new(ExchangeError) # 5: Service Timeout
|
24
|
+
RequireAuthentication = Class.new(ExchangeError) # 6: Require Authentication
|
24
25
|
|
25
26
|
# ViaBTC Exchange Server Undocumented Error Codes with Gotchas
|
26
27
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ViaBTC
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
def response_invalid?(response)
|
5
|
+
!response['error'].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
def amount_valid?(amount)
|
9
|
+
amount.is_a?(Numeric) && amount.positive? && (amount.is_a?(Integer) || amount.is_a?(Float))
|
10
|
+
end
|
11
|
+
|
12
|
+
def fee_rate_valid?(fee_rate)
|
13
|
+
(0...1).cover?(fee_rate)
|
14
|
+
end
|
15
|
+
|
16
|
+
def now
|
17
|
+
Time.now.to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def raise_exchange_error(response)
|
21
|
+
error_code = response['error']['code']
|
22
|
+
error_message = response['error']['message']
|
23
|
+
|
24
|
+
case error_code
|
25
|
+
when 1 then raise ViaBTC::Error::InvalidArgument.new(response)
|
26
|
+
when 2 then raise ViaBTC::Error::InternalError.new(response)
|
27
|
+
when 3 then raise ViaBTC::Error::ServiceUnavailable.new(response)
|
28
|
+
when 4 then raise ViaBTC::Error::MethodNotFound.new(response)
|
29
|
+
when 5 then raise ViaBTC::Error::ServiceTimeout.new(response)
|
30
|
+
when 6 then raise ViaBTC::Error::RequireAuthentication.new(response)
|
31
|
+
when 10
|
32
|
+
case error_message
|
33
|
+
when 'balance not enough' then raise ViaBTC::Error::LimitOrderBalanceNotEnough.new(response)
|
34
|
+
when 'repeat update' then raise ViaBTC::Error::RepeatBalanceUpdate.new(response)
|
35
|
+
else raise ViaBTC::Error::ExchangeError.new(response)
|
36
|
+
end
|
37
|
+
when 11
|
38
|
+
case error_message
|
39
|
+
when 'amount too small' then raise ViaBTC::Error::LimitOrderAmountTooSmall.new(response)
|
40
|
+
when 'balance not enough' then raise ViaBTC::Error::BalanceNotEnough.new(response)
|
41
|
+
end
|
42
|
+
when 12 then raise ViaBTC::Error::LimitOrderNoEnoughTrader.new(response)
|
43
|
+
else raise ViaBTC::Error::ExchangeError.new(response)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/viabtc/http.rb
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
module ViaBTC
|
2
|
+
module HTTP
|
3
|
+
class Client
|
4
|
+
include ViaBTC::Helpers
|
5
|
+
|
6
|
+
def initialize(url: nil, http_response: nil, http_adapter: nil)
|
7
|
+
if ViaBTC.configuration
|
8
|
+
url ||= ViaBTC.configuration.http_base_url
|
9
|
+
http_response ||= ViaBTC.configuration.http_response
|
10
|
+
http_adapter ||= ViaBTC.configuration.http_adapter
|
11
|
+
end
|
12
|
+
|
13
|
+
@connection ||= connection(url, http_response, http_adapter)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Asset API
|
17
|
+
|
18
|
+
def balance(user_id:, id: 0)
|
19
|
+
request(id: id, method: 'balance.query', params: [user_id])
|
20
|
+
end
|
21
|
+
|
22
|
+
def withdraw(user_id:, asset:, withdraw_id:, amount:, source: 'web', id: 0)
|
23
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
24
|
+
request(
|
25
|
+
id: id,
|
26
|
+
method: 'balance.update',
|
27
|
+
params: [user_id, asset, 'withdraw', withdraw_id, amount, {source: source}]
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def deposit(user_id:, asset:, deposit_id:, amount:, source: 'web', id: 0)
|
32
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
33
|
+
request(
|
34
|
+
id: id,
|
35
|
+
method: 'balance.update',
|
36
|
+
params: [user_id, asset, 'deposit', deposit_id, amount, {source: source}]
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def balance_history(user_id:, asset:, business: '', start_time: 0, end_time: 0, offset: 0, limit: 100, id: 0)
|
41
|
+
request(id: id, method: 'balance.history', params: [user_id, asset, business, start_time, end_time, offset, limit])
|
42
|
+
end
|
43
|
+
|
44
|
+
def asset_list
|
45
|
+
request(method: 'asset.list', params: [])
|
46
|
+
end
|
47
|
+
|
48
|
+
def asset_summary
|
49
|
+
request(method: 'asset.summary', params: [])
|
50
|
+
end
|
51
|
+
|
52
|
+
# Trade API
|
53
|
+
|
54
|
+
def limit_sell(user_id:, market:, amount:, price:, taker_fee_rate:, maker_fee_rate:, source: 'web', id: 0)
|
55
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
56
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
57
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{maker_fee_rate}" unless fee_rate_valid?(maker_fee_rate)
|
58
|
+
request(
|
59
|
+
id: id,
|
60
|
+
method: 'order.put_limit',
|
61
|
+
params: [user_id, market, 1, amount, price, taker_fee_rate, maker_fee_rate, source]
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
def limit_buy(user_id:, market:, amount:, price:, taker_fee_rate:, maker_fee_rate:, source: 'web', id: 0)
|
66
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
67
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
68
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{maker_fee_rate}" unless fee_rate_valid?(maker_fee_rate)
|
69
|
+
request(
|
70
|
+
id: id,
|
71
|
+
method: 'order.put_limit',
|
72
|
+
params: [user_id, market, 2, amount, price, taker_fee_rate, maker_fee_rate, source]
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def market_sell(user_id:, market:, amount:, taker_fee_rate:, source: 'web', id: 0)
|
77
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
78
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
79
|
+
request(
|
80
|
+
id: id,
|
81
|
+
method: 'order.put_market',
|
82
|
+
params: [user_id, market, 1, amount, taker_fee_rate.to_s, source]
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def market_buy(user_id:, market:, amount:, taker_fee_rate:, source: 'web', id: 0)
|
87
|
+
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
88
|
+
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
89
|
+
request(
|
90
|
+
id: id,
|
91
|
+
method: 'order.put_market',
|
92
|
+
params: [user_id, market, 2, amount, taker_fee_rate.to_s, source]
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def cancel_order(user_id:, market:, order_id:, id: 0)
|
97
|
+
request(id: id, method: 'order.cancel', params: [user_id, market, order_id])
|
98
|
+
end
|
99
|
+
|
100
|
+
def order_deals(order_id:, offset: 0, limit: 100, id:0)
|
101
|
+
request(id: id, method: 'order.deals', params: [order_id, offset, limit])
|
102
|
+
end
|
103
|
+
|
104
|
+
def sell_orders(market:, offset: 0, limit: 100, id: 0)
|
105
|
+
request(id: id, method: 'order.book', params: [market, 1, offset, limit])
|
106
|
+
end
|
107
|
+
|
108
|
+
def buy_orders(market:, offset: 0, limit: 100, id: 0)
|
109
|
+
request(id: id, method: 'order.book', params: [market, 2, offset, limit])
|
110
|
+
end
|
111
|
+
|
112
|
+
def order_depth(market:, limit: 100, interval: '0', id: 0)
|
113
|
+
request(id: id, method: 'order.depth', params: [market, limit, interval])
|
114
|
+
end
|
115
|
+
|
116
|
+
def pending_orders(user_id:, market:, offset: 0, limit: 100, id: 0)
|
117
|
+
request(id: id, method: 'order.pending', params: [user_id, market, offset, limit])
|
118
|
+
end
|
119
|
+
|
120
|
+
def pending_order_details(order_id:, market:, id: 0)
|
121
|
+
request(id: id, method: 'order.pending_detail', params: [market, order_id])
|
122
|
+
end
|
123
|
+
|
124
|
+
def finished_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:0, id: 0)
|
125
|
+
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
126
|
+
end
|
127
|
+
|
128
|
+
def finished_sell_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:1, id: 0)
|
129
|
+
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
130
|
+
end
|
131
|
+
|
132
|
+
def finished_buy_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:2, id: 0)
|
133
|
+
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
134
|
+
end
|
135
|
+
|
136
|
+
def finished_order_detail(order_id:, id: 0)
|
137
|
+
request(id: id, method: 'order.finished_detail', params: [order_id])
|
138
|
+
end
|
139
|
+
|
140
|
+
# Market API
|
141
|
+
|
142
|
+
def market_last(market:, id: 0)
|
143
|
+
request(id: id, method: 'market.last', params: [market])
|
144
|
+
end
|
145
|
+
|
146
|
+
def market_deals(market:, limit: 10000, last_id: 0, id: 0)
|
147
|
+
request(id: id, method: 'market.deals', params: [market, limit, last_id])
|
148
|
+
end
|
149
|
+
|
150
|
+
def user_executed_orders(user_id:, market:, offset: 0, limit: 100, id: 0)
|
151
|
+
request(id: id, method: 'market.user_deals', params: [user_id, market, offset, limit])
|
152
|
+
end
|
153
|
+
|
154
|
+
def market_kline(market:, start_time: now - 86400, end_time: now, interval: 3600, id: 0)
|
155
|
+
request(id: id, method: 'market.kline', params: [market, start_time, end_time, interval])
|
156
|
+
end
|
157
|
+
|
158
|
+
def market_status(market:, period: 86400, id: 0)
|
159
|
+
request(id: id, method: 'market.status', params: [market, period])
|
160
|
+
end
|
161
|
+
|
162
|
+
def market_status_today(market:, id: 0)
|
163
|
+
market_status(market: market, period: 86400, id: id)
|
164
|
+
end
|
165
|
+
|
166
|
+
def market_list(id: 0)
|
167
|
+
request(id: id, method: 'market.list', params: [])
|
168
|
+
end
|
169
|
+
|
170
|
+
def market_summary(id: 0)
|
171
|
+
request(id: id, method: 'market.summary', params: [])
|
172
|
+
end
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
def connection(url, http_response, http_adapter)
|
177
|
+
raise ViaBTC::Error::Configuration, 'required: url' unless url
|
178
|
+
http_response ||= :logger
|
179
|
+
http_adapter ||= :net_http
|
180
|
+
Faraday.new(url) do |conn|
|
181
|
+
conn.response http_response
|
182
|
+
conn.adapter http_adapter
|
183
|
+
conn.headers['Content-Type'] = ['application/json']
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def request(method:, params:, id: 0)
|
188
|
+
response = @connection.post do |req|
|
189
|
+
req.body = {
|
190
|
+
'id' => id,
|
191
|
+
'method' => method,
|
192
|
+
'params' => params
|
193
|
+
}.to_json
|
194
|
+
end
|
195
|
+
response = JSON.parse(response.body)
|
196
|
+
raise_exchange_error(response) if response_invalid?(response)
|
197
|
+
response
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
data/lib/viabtc/version.rb
CHANGED
data/viabtc.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.required_ruby_version = '>= 2.1.0'
|
29
29
|
|
30
30
|
# Runtime dependencies
|
31
|
-
spec.add_dependency 'faraday', '~> 0.15.
|
31
|
+
spec.add_dependency 'faraday', '~> 0.15.4'
|
32
32
|
|
33
33
|
# Development dependencies
|
34
34
|
spec.add_development_dependency 'bundler', '~> 1.17'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: viabtc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kerem Bozdas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.15.
|
19
|
+
version: 0.15.4
|
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: 0.15.
|
26
|
+
version: 0.15.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,6 +73,7 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".editorconfig"
|
76
77
|
- ".gitignore"
|
77
78
|
- ".rspec"
|
78
79
|
- ".ruby-gemset"
|
@@ -86,9 +87,10 @@ files:
|
|
86
87
|
- bin/console
|
87
88
|
- bin/setup
|
88
89
|
- lib/viabtc.rb
|
89
|
-
- lib/viabtc/client.rb
|
90
90
|
- lib/viabtc/config.rb
|
91
91
|
- lib/viabtc/error.rb
|
92
|
+
- lib/viabtc/helpers.rb
|
93
|
+
- lib/viabtc/http.rb
|
92
94
|
- lib/viabtc/version.rb
|
93
95
|
- viabtc.gemspec
|
94
96
|
homepage: https://github.com/krmbzds/viabtc/
|
@@ -110,8 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
112
|
- !ruby/object:Gem::Version
|
111
113
|
version: '0'
|
112
114
|
requirements: []
|
113
|
-
|
114
|
-
rubygems_version: 2.7.6
|
115
|
+
rubygems_version: 3.0.1
|
115
116
|
signing_key:
|
116
117
|
specification_version: 4
|
117
118
|
summary: ViaBTC Exchange Server API Wrapper
|
data/lib/viabtc/client.rb
DELETED
@@ -1,240 +0,0 @@
|
|
1
|
-
module ViaBTC
|
2
|
-
class Client
|
3
|
-
def initialize(base_url: nil, faraday_response: nil, faraday_adapter: nil)
|
4
|
-
if ViaBTC.configuration
|
5
|
-
base_url ||= ViaBTC.configuration.base_url
|
6
|
-
faraday_response ||= ViaBTC.configuration.faraday_response
|
7
|
-
faraday_adapter ||= ViaBTC.configuration.faraday_adapter
|
8
|
-
end
|
9
|
-
|
10
|
-
@connection ||= connection(base_url, faraday_response, faraday_adapter)
|
11
|
-
end
|
12
|
-
|
13
|
-
# Asset API
|
14
|
-
|
15
|
-
def balance(user_id:, id: 0)
|
16
|
-
request(id: id, method: 'balance.query', params: [user_id])
|
17
|
-
end
|
18
|
-
|
19
|
-
def withdraw(user_id:, asset:, withdraw_id:, amount:, source: 'web', id: 0)
|
20
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
21
|
-
request(
|
22
|
-
id: id,
|
23
|
-
method: 'balance.update',
|
24
|
-
params: [user_id, asset, 'withdraw', withdraw_id, amount, {source: source}]
|
25
|
-
)
|
26
|
-
end
|
27
|
-
|
28
|
-
def deposit(user_id:, asset:, deposit_id:, amount:, source: 'web', id: 0)
|
29
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
30
|
-
request(
|
31
|
-
id: id,
|
32
|
-
method: 'balance.update',
|
33
|
-
params: [user_id, asset, 'deposit', deposit_id, amount, {source: source}]
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def balance_history(user_id:, asset:, business: '', start_time: 0, end_time: 0, offset: 0, limit: 100, id: 0)
|
38
|
-
request(id: id, method: 'balance.history', params: [user_id, asset, business, start_time, end_time, offset, limit])
|
39
|
-
end
|
40
|
-
|
41
|
-
def asset_list
|
42
|
-
request(method: 'asset.list', params: [])
|
43
|
-
end
|
44
|
-
|
45
|
-
def asset_summary
|
46
|
-
request(method: 'asset.summary', params: [])
|
47
|
-
end
|
48
|
-
|
49
|
-
# Trade API
|
50
|
-
|
51
|
-
def limit_sell(user_id:, market:, amount:, price:, taker_fee_rate:, maker_fee_rate:, source: 'web', id: 0)
|
52
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
53
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
54
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{maker_fee_rate}" unless fee_rate_valid?(maker_fee_rate)
|
55
|
-
request(
|
56
|
-
id: id,
|
57
|
-
method: 'order.put_limit',
|
58
|
-
params: [user_id, market, 1, amount, price, taker_fee_rate, maker_fee_rate, source]
|
59
|
-
)
|
60
|
-
end
|
61
|
-
|
62
|
-
def limit_buy(user_id:, market:, amount:, price:, taker_fee_rate:, maker_fee_rate:, source: 'web', id: 0)
|
63
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
64
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
65
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{maker_fee_rate}" unless fee_rate_valid?(maker_fee_rate)
|
66
|
-
request(
|
67
|
-
id: id,
|
68
|
-
method: 'order.put_limit',
|
69
|
-
params: [user_id, market, 2, amount, price, taker_fee_rate, maker_fee_rate, source]
|
70
|
-
)
|
71
|
-
end
|
72
|
-
|
73
|
-
def market_sell(user_id:, market:, amount:, taker_fee_rate:, source: 'web', id: 0)
|
74
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
75
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
76
|
-
request(
|
77
|
-
id: id,
|
78
|
-
method: 'order.put_market',
|
79
|
-
params: [user_id, market, 1, amount, taker_fee_rate.to_s, source]
|
80
|
-
)
|
81
|
-
end
|
82
|
-
|
83
|
-
def market_buy(user_id:, market:, amount:, taker_fee_rate:, source: 'web', id: 0)
|
84
|
-
raise ViaBTC::Error::InvalidParameter, "invalid amount: #{amount}" unless amount_valid?(amount)
|
85
|
-
raise ViaBTC::Error::InvalidParameter, "invalid fee rate #{taker_fee_rate}" unless fee_rate_valid?(taker_fee_rate)
|
86
|
-
request(
|
87
|
-
id: id,
|
88
|
-
method: 'order.put_market',
|
89
|
-
params: [user_id, market, 2, amount, taker_fee_rate.to_s, source]
|
90
|
-
)
|
91
|
-
end
|
92
|
-
|
93
|
-
def cancel_order(user_id:, market:, order_id:, id: 0)
|
94
|
-
request(id: id, method: 'order.cancel', params: [user_id, market, order_id])
|
95
|
-
end
|
96
|
-
|
97
|
-
def order_deals(order_id:, offset: 0, limit: 100, id:0)
|
98
|
-
request(id: id, method: 'order.deals', params: [order_id, offset, limit])
|
99
|
-
end
|
100
|
-
|
101
|
-
def sell_orders(market:, offset: 0, limit: 100, id: 0)
|
102
|
-
request(id: id, method: 'order.book', params: [market, 1, offset, limit])
|
103
|
-
end
|
104
|
-
|
105
|
-
def buy_orders(market:, offset: 0, limit: 100, id: 0)
|
106
|
-
request(id: id, method: 'order.book', params: [market, 2, offset, limit])
|
107
|
-
end
|
108
|
-
|
109
|
-
def order_depth(market:, limit: 100, interval: '0', id: 0)
|
110
|
-
request(id: id, method: 'order.depth', params: [market, limit, interval])
|
111
|
-
end
|
112
|
-
|
113
|
-
def pending_orders(user_id:, market:, offset: 0, limit: 100, id: 0)
|
114
|
-
request(id: id, method: 'order.pending', params: [user_id, market, offset, limit])
|
115
|
-
end
|
116
|
-
|
117
|
-
def pending_order_details(order_id:, market:, id: 0)
|
118
|
-
request(id: id, method: 'order.pending_detail', params: [market, order_id])
|
119
|
-
end
|
120
|
-
|
121
|
-
def finished_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:0, id: 0)
|
122
|
-
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
123
|
-
end
|
124
|
-
|
125
|
-
def finished_sell_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:1, id: 0)
|
126
|
-
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
127
|
-
end
|
128
|
-
|
129
|
-
def finished_buy_orders(user_id:, market:, start_time: 0, end_time: 0, offset: 0, limit: 100, side:2, id: 0)
|
130
|
-
request(id: id, method: 'order.finished', params: [user_id, market, start_time, end_time, offset, limit, side])
|
131
|
-
end
|
132
|
-
|
133
|
-
def finished_order_detail(order_id:, id: 0)
|
134
|
-
request(id: id, method: 'order.finished_detail', params: [order_id])
|
135
|
-
end
|
136
|
-
|
137
|
-
# Market API
|
138
|
-
|
139
|
-
def market_last(market:, id: 0)
|
140
|
-
request(id: id, method: 'market.last', params: [market])
|
141
|
-
end
|
142
|
-
|
143
|
-
def market_deals(market:, limit: 10000, last_id: 0, id: 0)
|
144
|
-
request(id: id, method: 'market.deals', params: [market, limit, last_id])
|
145
|
-
end
|
146
|
-
|
147
|
-
def user_executed_orders(user_id:, market:, offset: 0, limit: 100, id: 0)
|
148
|
-
request(id: id, method: 'market.user_deals', params: [user_id, market, offset, limit])
|
149
|
-
end
|
150
|
-
|
151
|
-
def market_kline(market:, start_time: now - 86400, end_time: now, interval: 3600, id: 0)
|
152
|
-
request(id: id, method: 'market.kline', params: [market, start_time, end_time, interval])
|
153
|
-
end
|
154
|
-
|
155
|
-
def market_status(market:, period: 86400, id: 0)
|
156
|
-
request(id: id, method: 'market.status', params: [market, period])
|
157
|
-
end
|
158
|
-
|
159
|
-
def market_status_today(market:, id: 0)
|
160
|
-
market_status(market: market, period: 86400, id: id)
|
161
|
-
end
|
162
|
-
|
163
|
-
def market_list(id: 0)
|
164
|
-
request(id: id, method: 'market.list', params: [])
|
165
|
-
end
|
166
|
-
|
167
|
-
def market_summary(id: 0)
|
168
|
-
request(id: id, method: 'market.summary', params: [])
|
169
|
-
end
|
170
|
-
|
171
|
-
private
|
172
|
-
|
173
|
-
def connection(base_url, faraday_response, faraday_adapter)
|
174
|
-
raise ViaBTC::Error::Configuration, 'required: base_url' unless base_url
|
175
|
-
faraday_response ||= :logger
|
176
|
-
faraday_adapter ||= :net_http
|
177
|
-
Faraday.new(base_url) do |conn|
|
178
|
-
conn.response faraday_response
|
179
|
-
conn.adapter faraday_adapter
|
180
|
-
conn.headers['Content-Type'] = ['application/json']
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def request(method:, params:, id: 0)
|
185
|
-
response = @connection.post do |req|
|
186
|
-
req.body = {
|
187
|
-
'id' => id,
|
188
|
-
'method' => method,
|
189
|
-
'params' => params
|
190
|
-
}.to_json
|
191
|
-
end
|
192
|
-
response = JSON.parse(response.body)
|
193
|
-
raise_exchange_error(response) if response_invalid?(response)
|
194
|
-
response
|
195
|
-
end
|
196
|
-
|
197
|
-
def response_invalid?(response)
|
198
|
-
!response['error'].nil?
|
199
|
-
end
|
200
|
-
|
201
|
-
def amount_valid?(amount)
|
202
|
-
amount.is_a?(Numeric) && amount.positive? && (amount.is_a?(Integer) || amount.is_a?(Float))
|
203
|
-
end
|
204
|
-
|
205
|
-
def fee_rate_valid?(fee_rate)
|
206
|
-
(0...1).cover?(fee_rate)
|
207
|
-
end
|
208
|
-
|
209
|
-
def now
|
210
|
-
Time.now.to_i
|
211
|
-
end
|
212
|
-
|
213
|
-
def raise_exchange_error(response)
|
214
|
-
error_code = response['error']['code']
|
215
|
-
error_message = response['error']['message']
|
216
|
-
|
217
|
-
case error_code
|
218
|
-
when 1 then raise ViaBTC::Error::InvalidArgument.new(response)
|
219
|
-
when 2 then raise ViaBTC::Error::InternalError.new(response)
|
220
|
-
when 3 then raise ViaBTC::Error::ServiceUnavailable.new(response)
|
221
|
-
when 4 then raise ViaBTC::Error::MethodNotFound.new(response)
|
222
|
-
when 5 then raise ViaBTC::Error::ServiceTimeout.new(response)
|
223
|
-
when 10
|
224
|
-
case error_message
|
225
|
-
when 'balance not enough' then raise ViaBTC::Error::LimitOrderBalanceNotEnough.new(response)
|
226
|
-
when 'repeat update' then raise ViaBTC::Error::RepeatBalanceUpdate.new(response)
|
227
|
-
else raise ViaBTC::Error::ExchangeError.new(response)
|
228
|
-
end
|
229
|
-
when 11
|
230
|
-
case error_message
|
231
|
-
when 'amount too small' then raise ViaBTC::Error::LimitOrderAmountTooSmall.new(response)
|
232
|
-
when 'balance not enough' then raise ViaBTC::Error::BalanceNotEnough.new(response)
|
233
|
-
end
|
234
|
-
when 12 then raise ViaBTC::Error::LimitOrderNoEnoughTrader.new(response)
|
235
|
-
else raise ViaBTC::Error::ExchangeError.new(response)
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
end
|
240
|
-
end
|