bitfinex-rb 0.1.0 → 1.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.
- checksums.yaml +4 -4
- data/lib/bitfinex.rb +28 -30
- data/lib/{bitfinex/errors.rb → errors.rb} +2 -2
- data/lib/models/alert.rb +27 -0
- data/lib/models/balance_info.rb +25 -0
- data/lib/models/candle.rb +29 -0
- data/lib/models/currency.rb +27 -0
- data/lib/models/funding_credit.rb +41 -0
- data/lib/models/funding_info.rb +40 -0
- data/lib/models/funding_loan.rb +40 -0
- data/lib/models/funding_offer.rb +38 -0
- data/lib/models/funding_ticker.rb +50 -0
- data/lib/models/funding_trade.rb +31 -0
- data/lib/models/ledger_entry.rb +33 -0
- data/lib/models/margin_info.rb +67 -0
- data/lib/models/model.rb +56 -0
- data/lib/models/movement.rb +33 -0
- data/lib/models/notification.rb +30 -0
- data/lib/models/order.rb +197 -0
- data/lib/models/order_book.rb +265 -0
- data/lib/models/position.rb +33 -0
- data/lib/models/public_trade.rb +27 -0
- data/lib/models/trade.rb +34 -0
- data/lib/models/trading_ticker.rb +33 -0
- data/lib/models/user_info.rb +27 -0
- data/lib/models/wallet.rb +28 -0
- data/lib/rest/rest_client.rb +103 -0
- data/lib/rest/v1.rb +63 -0
- data/lib/rest/v1/account_info.rb +23 -0
- data/lib/{bitfinex → rest}/v1/deposit.rb +2 -3
- data/lib/{bitfinex → rest}/v1/funding_book.rb +2 -4
- data/lib/{bitfinex → rest}/v1/historical_data.rb +2 -2
- data/lib/{bitfinex → rest}/v1/lends.rb +1 -2
- data/lib/{bitfinex → rest}/v1/margin_funding.rb +1 -2
- data/lib/rest/v1/order_book.rb +17 -0
- data/lib/{bitfinex → rest}/v1/orders.rb +6 -8
- data/lib/{bitfinex → rest}/v1/positions.rb +6 -2
- data/lib/{bitfinex → rest}/v1/stats.rb +1 -3
- data/lib/{bitfinex → rest}/v1/symbols.rb +1 -2
- data/lib/rest/v1/ticker.rb +13 -0
- data/lib/{bitfinex → rest}/v1/trades.rb +1 -16
- data/lib/{bitfinex → rest}/v1/wallet.rb +1 -2
- data/lib/rest/v2.rb +47 -0
- data/lib/{bitfinex → rest}/v2/margin.rb +1 -2
- data/lib/{bitfinex → rest}/v2/personal.rb +2 -18
- data/lib/{bitfinex → rest}/v2/stats.rb +1 -4
- data/lib/rest/v2/ticker.rb +20 -0
- data/lib/{bitfinex → rest}/v2/trading.rb +3 -49
- data/lib/{bitfinex → rest}/v2/utils.rb +1 -3
- data/lib/ws/ws2.rb +529 -0
- metadata +74 -56
- data/lib/bitfinex-api-rb.rb +0 -1
- data/lib/bitfinex-rb.rb +0 -1
- data/lib/bitfinex/api_versions.rb +0 -7
- data/lib/bitfinex/authenticated_rest.rb +0 -57
- data/lib/bitfinex/client.rb +0 -38
- data/lib/bitfinex/configurable.rb +0 -48
- data/lib/bitfinex/connection.rb +0 -52
- data/lib/bitfinex/v1/account_info.rb +0 -38
- data/lib/bitfinex/v1/orderbook.rb +0 -36
- data/lib/bitfinex/v1/ticker.rb +0 -27
- data/lib/bitfinex/v2/ticker.rb +0 -58
- data/lib/bitfinex/version.rb +0 -3
- data/lib/bitfinex/websocket_connection.rb +0 -231
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class Position < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
:symbol => 0,
|
9
|
+
:status => 1,
|
10
|
+
:amount => 2,
|
11
|
+
:base_price => 3,
|
12
|
+
:margin_funding => 4,
|
13
|
+
:margin_funding_type => 5,
|
14
|
+
:pl => 6,
|
15
|
+
:pl_perc => 7,
|
16
|
+
:liquidation_price => 8,
|
17
|
+
:leverage => 9
|
18
|
+
}
|
19
|
+
|
20
|
+
FIELDS.each do |key, index|
|
21
|
+
attr_accessor key
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize (data)
|
25
|
+
super(data, FIELDS, BOOL_FIELDS)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.unserialize (data)
|
29
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class PublicTrade < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
:id => 0,
|
9
|
+
:mts => 1,
|
10
|
+
:amount => 2,
|
11
|
+
:price => 3
|
12
|
+
}
|
13
|
+
|
14
|
+
FIELDS.each do |key, index|
|
15
|
+
attr_accessor key
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize (data)
|
19
|
+
super(data, FIELDS, BOOL_FIELDS)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.unserialize (data)
|
23
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/models/trade.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class Trade < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
id: 0,
|
9
|
+
symbol: 1,
|
10
|
+
mts_create: 2,
|
11
|
+
order_id: 3,
|
12
|
+
exec_amount: 4,
|
13
|
+
exec_price: 5,
|
14
|
+
order_type: 6,
|
15
|
+
order_price: 7,
|
16
|
+
maker: 8,
|
17
|
+
fee: 9,
|
18
|
+
fee_currency: 10
|
19
|
+
}
|
20
|
+
|
21
|
+
FIELDS.each do |key, index|
|
22
|
+
attr_accessor key
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize (data)
|
26
|
+
super(data, FIELDS, BOOL_FIELDS)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.unserialize (data)
|
30
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class TradingTicker < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
bid: 0,
|
9
|
+
bid_size: 1,
|
10
|
+
ask: 2,
|
11
|
+
ask_size: 3,
|
12
|
+
daily_change: 4,
|
13
|
+
daily_change_perc: 5,
|
14
|
+
last_price: 6,
|
15
|
+
volume: 7,
|
16
|
+
high: 8,
|
17
|
+
low: 9
|
18
|
+
}
|
19
|
+
|
20
|
+
FIELDS.each do |key, index|
|
21
|
+
attr_accessor key
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize (data)
|
25
|
+
super(data, FIELDS, BOOL_FIELDS)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.unserialize (data)
|
29
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class UserInfo < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
:id => 0,
|
9
|
+
:email => 1,
|
10
|
+
:username => 2,
|
11
|
+
:timezone => 7
|
12
|
+
}
|
13
|
+
|
14
|
+
FIELDS.each do |key, index|
|
15
|
+
attr_accessor key
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize (data)
|
19
|
+
super(data, FIELDS, BOOL_FIELDS)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.unserialize (data)
|
23
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative './model'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module Models
|
5
|
+
class Wallet < Model
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
:type => 0,
|
9
|
+
:currency => 1,
|
10
|
+
:balance => 2,
|
11
|
+
:unsettled_interest => 3,
|
12
|
+
:balance_available => 4
|
13
|
+
}
|
14
|
+
|
15
|
+
FIELDS.each do |key, index|
|
16
|
+
attr_accessor key
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize (data)
|
20
|
+
super(data, FIELDS, BOOL_FIELDS)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.unserialize (data)
|
24
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'faraday_adapter_socks'
|
2
|
+
|
3
|
+
module Bitfinex
|
4
|
+
module RESTClient
|
5
|
+
def check_params(params, allowed_params)
|
6
|
+
if (params.keys - allowed_params).empty?
|
7
|
+
return params
|
8
|
+
else
|
9
|
+
raise Bitfinex::ParamsError
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def get(url, params={})
|
15
|
+
rest_connection.get do |req|
|
16
|
+
req.url build_url(url)
|
17
|
+
req.headers['Content-Type'] = 'application/json'
|
18
|
+
req.headers['Accept'] = 'application/json'
|
19
|
+
|
20
|
+
params.each do |k,v|
|
21
|
+
req.params[k] = v
|
22
|
+
end
|
23
|
+
|
24
|
+
req.options.timeout = config[:rest_timeout]
|
25
|
+
req.options.open_timeout = config[:rest_open_timeout]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def rest_connection
|
30
|
+
@conn ||= new_rest_connection
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_url(url)
|
34
|
+
URI.join(base_api_endpoint, url)
|
35
|
+
end
|
36
|
+
|
37
|
+
def new_rest_connection
|
38
|
+
Faraday.new(url: base_api_endpoint, :proxy => config[:proxy]) do |conn|
|
39
|
+
conn.use Bitfinex::CustomErrors
|
40
|
+
conn.response :logger, Logger.new(STDOUT), bodies: true if config[:debug_connection]
|
41
|
+
conn.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
|
42
|
+
conn.adapter :net_http_socks
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def base_api_endpoint
|
47
|
+
config[:api_endpoint]
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def authenticated_post(url, options = {})
|
52
|
+
raise Bitfinex::InvalidAuthKeyError unless valid_key?
|
53
|
+
complete_url = build_url(url)
|
54
|
+
body = options[:params] || {}
|
55
|
+
nonce = new_nonce
|
56
|
+
|
57
|
+
payload = if config[:api_version] == 1
|
58
|
+
build_payload("/v1/#{url}", options[:params], nonce)
|
59
|
+
else
|
60
|
+
"/api/v2/#{url}#{nonce}#{body.to_json}"
|
61
|
+
end
|
62
|
+
|
63
|
+
response = rest_connection.post do |req|
|
64
|
+
req.url complete_url
|
65
|
+
req.body = body.to_json
|
66
|
+
req.options.timeout = config[:rest_timeout]
|
67
|
+
req.options.open_timeout = config[:rest_open_timeout]
|
68
|
+
req.headers['Content-Type'] = 'application/json'
|
69
|
+
req.headers['Accept'] = 'application/json'
|
70
|
+
|
71
|
+
if config[:api_version] == 1
|
72
|
+
req.headers['X-BFX-PAYLOAD'] = payload
|
73
|
+
req.headers['X-BFX-SIGNATURE'] = sign(payload)
|
74
|
+
req.headers['X-BFX-APIKEY'] = config[:api_key]
|
75
|
+
else
|
76
|
+
req.headers['bfx-nonce'] = nonce
|
77
|
+
req.headers['bfx-signature'] = sign(payload)
|
78
|
+
req.headers['bfx-apikey'] = config[:api_key]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_payload(url, params = {}, nonce)
|
84
|
+
payload = {}
|
85
|
+
payload['nonce'] = nonce
|
86
|
+
payload['request'] = url
|
87
|
+
payload.merge!(params) if params
|
88
|
+
Base64.strict_encode64(payload.to_json)
|
89
|
+
end
|
90
|
+
|
91
|
+
def new_nonce
|
92
|
+
Time.now.to_i.to_s
|
93
|
+
end
|
94
|
+
|
95
|
+
def sign(payload)
|
96
|
+
OpenSSL::HMAC.hexdigest('sha384', config[:api_secret], payload)
|
97
|
+
end
|
98
|
+
|
99
|
+
def valid_key?
|
100
|
+
!! (config[:api_key] && config[:api_secret])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/rest/v1.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative './rest_client'
|
2
|
+
require_relative './v1/account_info'
|
3
|
+
require_relative './v1/deposit'
|
4
|
+
require_relative './v1/funding_book'
|
5
|
+
require_relative './v1/historical_data'
|
6
|
+
require_relative './v1/lends'
|
7
|
+
require_relative './v1/margin_funding'
|
8
|
+
require_relative './v1/order_book'
|
9
|
+
require_relative './v1/orders'
|
10
|
+
require_relative './v1/positions'
|
11
|
+
require_relative './v1/stats'
|
12
|
+
require_relative './v1/symbols'
|
13
|
+
require_relative './v1/ticker'
|
14
|
+
require_relative './v1/trades'
|
15
|
+
require_relative './v1/wallet'
|
16
|
+
|
17
|
+
module Bitfinex
|
18
|
+
class RESTv1
|
19
|
+
attr_accessor :api_endpoint, :debug, :debug_connection, :api_version
|
20
|
+
attr_accessor :rest_timeout, :rest_open_timeout, :proxy
|
21
|
+
attr_accessor :api_key, :api_secret
|
22
|
+
|
23
|
+
include Bitfinex::RESTClient
|
24
|
+
include Bitfinex::RESTv1AccountInfo
|
25
|
+
include Bitfinex::RESTv1Deposit
|
26
|
+
include Bitfinex::RESTv1FundingBook
|
27
|
+
include Bitfinex::RESTv1HistoricalData
|
28
|
+
include Bitfinex::RESTv1Lends
|
29
|
+
include Bitfinex::RESTv1MarginFunding
|
30
|
+
include Bitfinex::RESTv1OrderBook
|
31
|
+
include Bitfinex::RESTv1Orders
|
32
|
+
include Bitfinex::RESTv1Positions
|
33
|
+
include Bitfinex::RESTv1Stats
|
34
|
+
include Bitfinex::RESTv1Symbols
|
35
|
+
include Bitfinex::RESTv1Ticker
|
36
|
+
include Bitfinex::RESTv1Trades
|
37
|
+
include Bitfinex::RESTv1Wallet
|
38
|
+
|
39
|
+
def initialize(args = {})
|
40
|
+
self.api_endpoint = args[:url] ? "#{args[:url]}/v1/" : "https://api.bitfinex.com/v1/"
|
41
|
+
self.proxy = args[:proxy] || nil
|
42
|
+
self.debug_connection = false
|
43
|
+
self.api_version = 1
|
44
|
+
self.rest_timeout = 30
|
45
|
+
self.rest_open_timeout = 30
|
46
|
+
self.api_key = args[:api_key]
|
47
|
+
self.api_secret = args[:api_secret]
|
48
|
+
end
|
49
|
+
|
50
|
+
def config
|
51
|
+
{
|
52
|
+
:api_endpoint => self.api_endpoint,
|
53
|
+
:debug_connection => self.debug_connection,
|
54
|
+
:api_version => self.api_version,
|
55
|
+
:rest_timeout => self.rest_timeout,
|
56
|
+
:rest_open_timeout => self.rest_open_timeout,
|
57
|
+
:proxy => self.proxy,
|
58
|
+
:api_key => self.api_key,
|
59
|
+
:api_secret => self.api_secret
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Bitfinex
|
2
|
+
module RESTv1AccountInfo
|
3
|
+
# Get account information
|
4
|
+
#
|
5
|
+
# @return [Hash] your account information
|
6
|
+
# @example:
|
7
|
+
# client.account_info
|
8
|
+
def account_info
|
9
|
+
resp = authenticated_post("account_infos")
|
10
|
+
resp.body
|
11
|
+
end
|
12
|
+
|
13
|
+
# See the fees applied to your withdrawals
|
14
|
+
#
|
15
|
+
# @return [Hash]
|
16
|
+
# @example:
|
17
|
+
# client.fees
|
18
|
+
def fees
|
19
|
+
resp = authenticated_post("account_fees")
|
20
|
+
resp.body
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Bitfinex
|
2
|
-
module
|
3
|
-
|
2
|
+
module RESTv1Deposit
|
4
3
|
# Return your deposit address to make a new deposit.
|
5
4
|
#
|
6
5
|
# @param method [string] Method of deposit (methods accepted: “bitcoin”, “litecoin”, “darkcoin”, “mastercoin” (tethers)).
|
@@ -10,7 +9,7 @@ module Bitfinex
|
|
10
9
|
# @return [Hash] confirmation of your deposit
|
11
10
|
# @example:
|
12
11
|
# client.deposit("bitcoin", "exchange")
|
13
|
-
def deposit method, wallet_name, renew=0
|
12
|
+
def deposit (method, wallet_name, renew=0)
|
14
13
|
params = {
|
15
14
|
method: method,
|
16
15
|
wallet_name: wallet_name,
|
@@ -1,8 +1,7 @@
|
|
1
1
|
module Bitfinex
|
2
|
-
module
|
3
|
-
|
2
|
+
module RESTv1FundingBook
|
4
3
|
# Get the full margin funding book
|
5
|
-
|
4
|
+
#
|
6
5
|
# @param currency [string] (optional) Speficy the currency, default "USD"
|
7
6
|
# @param params :limit_bids [int] (optional) Limit the number of funding bids returned. May be 0 in which case the array of bids is empty.
|
8
7
|
# @param params :limit_asks [int] (optional) Limit the number of funding offers returned. May be 0 in which case the array of asks is empty.
|
@@ -13,6 +12,5 @@ module Bitfinex
|
|
13
12
|
check_params(params, %i{limit_bids limit_asks})
|
14
13
|
get("lendbook/#{currency}", params: params).body
|
15
14
|
end
|
16
|
-
|
17
15
|
end
|
18
16
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Bitfinex
|
2
|
-
module
|
2
|
+
module RESTv1HistoricalData
|
3
3
|
|
4
4
|
# View all of your balance ledger entries.
|
5
5
|
#
|
@@ -28,7 +28,7 @@ module Bitfinex
|
|
28
28
|
# @example:
|
29
29
|
# client.movements
|
30
30
|
def movements(currency="usd", params = {})
|
31
|
-
check_params(params, %i{method since until limit})
|
31
|
+
check_params(params, %i{method since until limit since_movement until_movement})
|
32
32
|
params.merge!({currency: currency})
|
33
33
|
authenticated_post("history/movements", params: params).body
|
34
34
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Bitfinex
|
2
|
-
module
|
2
|
+
module RESTv1Lends
|
3
3
|
|
4
4
|
# Get a list of the most recent funding data for the given currency: total amount provided and Flash Return Rate (in % by 365 days) over time.
|
5
5
|
#
|
@@ -13,6 +13,5 @@ module Bitfinex
|
|
13
13
|
check_params(params, %i{timestamp limit_lends})
|
14
14
|
get("lends/#{currency}", params: params).body
|
15
15
|
end
|
16
|
-
|
17
16
|
end
|
18
17
|
end
|