bittrex-pro 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +58 -0
  3. data/.gitignore +28 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +53 -0
  8. data/Rakefile +11 -0
  9. data/bittrex-pro.gemspec +30 -0
  10. data/config/application.yml.example +2 -0
  11. data/lib/bittrex.rb +32 -0
  12. data/lib/bittrex/client.rb +46 -0
  13. data/lib/bittrex/configuration.rb +33 -0
  14. data/lib/bittrex/currency.rb +27 -0
  15. data/lib/bittrex/deposit.rb +29 -0
  16. data/lib/bittrex/helpers.rb +10 -0
  17. data/lib/bittrex/market.rb +31 -0
  18. data/lib/bittrex/order.rb +94 -0
  19. data/lib/bittrex/quote.rb +26 -0
  20. data/lib/bittrex/summary.rb +38 -0
  21. data/lib/bittrex/version.rb +3 -0
  22. data/lib/bittrex/wallet.rb +32 -0
  23. data/lib/bittrex/withdrawal.rb +42 -0
  24. data/spec/fixtures/currency.json +7 -0
  25. data/spec/fixtures/deposit.json +9 -0
  26. data/spec/fixtures/market.json +12 -0
  27. data/spec/fixtures/open_order.json +17 -0
  28. data/spec/fixtures/order.json +16 -0
  29. data/spec/fixtures/quote.json +5 -0
  30. data/spec/fixtures/summary.json +16 -0
  31. data/spec/fixtures/wallet.json +9 -0
  32. data/spec/fixtures/withdrawal.json +13 -0
  33. data/spec/models/configuration_spec.rb +27 -0
  34. data/spec/models/currency_spec.rb +14 -0
  35. data/spec/models/deposit_spec.rb +16 -0
  36. data/spec/models/helper_spec.rb +36 -0
  37. data/spec/models/market_spec.rb +17 -0
  38. data/spec/models/order_spec.rb +45 -0
  39. data/spec/models/quote_spec.rb +13 -0
  40. data/spec/models/summary_spec.rb +22 -0
  41. data/spec/models/wallet_spec.rb +16 -0
  42. data/spec/models/withdrawal_spec.rb +20 -0
  43. data/spec/spec_helper.rb +24 -0
  44. data/spec/support/api_helper.rb +9 -0
  45. metadata +220 -0
@@ -0,0 +1,94 @@
1
+ module Bittrex
2
+ class Order
3
+ include Helpers
4
+
5
+ attr_reader :type, :id, :limit, :opened_at, :closed_at,
6
+ :exchange, :price, :quantity, :remaining, :commission,
7
+ :total, :fill, :executed_at, :raw
8
+
9
+ def initialize(attrs = {})
10
+ @id = attrs['Id'] || attrs['OrderUuid']
11
+ @type = (attrs['Type'] || attrs['OrderType']).to_s.capitalize
12
+ @exchange = attrs['Exchange']
13
+ @quantity = attrs['Quantity']
14
+ @remaining = attrs['QuantityRemaining']
15
+ @price = attrs['Rate'] || attrs['Price']
16
+ @total = attrs['Total']
17
+ @fill = attrs['FillType']
18
+ @limit = attrs['Limit']
19
+ @commission = (attrs['Commission'] || attrs['CommissionPaid']).to_f
20
+ @raw = attrs
21
+ @opened_at = extract_timestamp(attrs['Opened'])
22
+ @executed_at = extract_timestamp(attrs['TimeStamp'])
23
+ @closed_at = extract_timestamp(attrs['Closed'])
24
+ end
25
+
26
+ def self.book(market, type, depth = 50)
27
+ orders = []
28
+
29
+ if type.to_sym == :both
30
+ orderbook(market, type.downcase, depth).each_pair do |type, values|
31
+ values.each do |data|
32
+ orders << new(data.merge('Type' => type))
33
+ end
34
+ end
35
+ else
36
+ orderbook(market, type.downcase, depth).each do |data|
37
+ orders << new(data.merge('Type' => type))
38
+ end
39
+ end
40
+
41
+ orders
42
+ end
43
+
44
+ def self.buy_limit(market, amount, price)
45
+ client.get('market/buylimit', {
46
+ market: market,
47
+ quantity: amount,
48
+ rate: price
49
+ })
50
+ end
51
+
52
+ def self.sell_limit(market, amount, price)
53
+ client.get('market/selllimit', {
54
+ market: market,
55
+ quantity: amount,
56
+ rate: price
57
+ })
58
+ end
59
+
60
+ def self.info(order_id)
61
+ client.get('account/getorder', {
62
+ uuid: order_id
63
+ })
64
+ end
65
+
66
+ def self.cancel(order_id)
67
+ client.get('market/cancel', {
68
+ uuid: order_id
69
+ })
70
+ end
71
+
72
+ def self.open
73
+ client.get('market/getopenorders').map{|data| new(data) }
74
+ end
75
+
76
+ def self.history
77
+ client.get('account/getorderhistory').map{|data| new(data) }
78
+ end
79
+
80
+ private
81
+
82
+ def self.orderbook(market, type, depth)
83
+ client.get('public/getorderbook', {
84
+ market: market,
85
+ type: type,
86
+ depth: depth
87
+ })
88
+ end
89
+
90
+ def self.client
91
+ @client ||= Bittrex.client
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,26 @@
1
+ module Bittrex
2
+ class Quote
3
+ attr_reader :market, :bid, :ask, :last, :raw
4
+
5
+ def initialize(market, attrs = {})
6
+ @market = market
7
+ return if attrs.nil?
8
+ @bid = attrs['Bid']
9
+ @ask = attrs['Ask']
10
+ @last = attrs['Last']
11
+ @raw = attrs
12
+ end
13
+
14
+ # Example:
15
+ # BiitrexPro::Quote.current('BTC-HPY')
16
+ def self.current(market)
17
+ new(market, client.get('public/getticker', market: market))
18
+ end
19
+
20
+ private
21
+
22
+ def self.client
23
+ @client ||= Bittrex.client
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ module Bittrex
2
+ class Summary
3
+ include Helpers
4
+
5
+ attr_reader :name, :high, :low, :volume, :last, :base_volume, :raw, :created_at
6
+ attr_reader :bid, :ask, :open_buy_orders, :open_sell_orders, :previous_day, :updated_at
7
+
8
+ alias_method :vol, :volume
9
+ alias_method :base_vol, :base_volume
10
+
11
+ def initialize(attrs = {})
12
+ @name = attrs['MarketName']
13
+ @high = attrs['High']
14
+ @low = attrs['Low']
15
+ @volume = attrs['Volume']
16
+ @last = attrs['Last']
17
+ @base_volume = attrs['BaseVolume']
18
+ @bid = attrs['Bid']
19
+ @ask = attrs['Ask']
20
+ @open_buy_orders = attrs['OpenBuyOrders']
21
+ @open_sell_orders = attrs['OpenSellOrders']
22
+ @previous_day = attrs['PrevDay']
23
+ @updated_at = extract_timestamp(attrs['TimeStamp'])
24
+ @created_at = extract_timestamp(attrs['Created'])
25
+ @raw = attrs
26
+ end
27
+
28
+ def self.all
29
+ client.get('public/getmarketsummaries').map{|data| new(data) }
30
+ end
31
+
32
+ private
33
+
34
+ def self.client
35
+ @client ||= Bittrex.client
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module Bittrex
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,32 @@
1
+ module Bittrex
2
+ class Wallet
3
+ attr_reader :id, :currency, :balance, :available, :pending, :address, :requested, :raw
4
+
5
+ def initialize(attrs = {})
6
+ @id = attrs['Uuid'].to_s
7
+ @address = attrs['CryptoAddress']
8
+ @currency = attrs['Currency']
9
+ @balance = attrs['Balance']
10
+ @available = attrs['Available']
11
+ @pending = attrs['Pending']
12
+ @raw = attrs
13
+ @requested = attrs['Requested']
14
+ end
15
+
16
+ def self.all
17
+ client.get('account/getbalances').map{|data| new(data) }
18
+ end
19
+
20
+ def self.balance(currency)
21
+ client.get('account/getbalance', {
22
+ currency: currency
23
+ })
24
+ end
25
+
26
+ private
27
+
28
+ def self.client
29
+ @client ||= Bittrex.client
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,42 @@
1
+ module Bittrex
2
+ class Withdrawal
3
+ include Helpers
4
+
5
+ attr_reader :id, :currency, :quantity, :address, :authorized,
6
+ :pending, :canceled, :invalid_address,
7
+ :transaction_cost, :transaction_id, :executed_at, :raw
8
+
9
+ def initialize(attrs = {})
10
+ @id = attrs['PaymentUuid']
11
+ @currency = attrs['Currency']
12
+ @quantity = attrs['Amount']
13
+ @address = attrs['Address']
14
+ @authorized = attrs['Authorized']
15
+ @pending = attrs['PendingPayment']
16
+ @canceled = attrs['Canceled']
17
+ @invalid_address = attrs['Canceled']
18
+ @transaction_cost = attrs['TxCost']
19
+ @transaction_id = attrs['TxId']
20
+ @executed_at = extract_timestamp(attrs['Opened'])
21
+ @raw = attrs
22
+ end
23
+
24
+ def self.all
25
+ client.get('account/getwithdrawalhistory').map{|data| new(data) }
26
+ end
27
+
28
+ def self.single(currency, quantity, address)
29
+ client.get('account/withdraw', {
30
+ currency: currency,
31
+ quantity: quantity,
32
+ address: address
33
+ })
34
+ end
35
+
36
+ private
37
+
38
+ def self.client
39
+ @client ||= Bittrex.client
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,7 @@
1
+ {
2
+ "CurrencyLong": "Bitcoin",
3
+ "Currency": "BTC",
4
+ "TxFee": 8.0e-08,
5
+ "MinConfirmation": 5,
6
+ "IsActive": true
7
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "Id": 2045339,
3
+ "Amount": 0.31074098,
4
+ "Currency": "BTC",
5
+ "Confirmations": 2,
6
+ "LastUpdated": "2014-06-16T22:57:17.457",
7
+ "TxId": "416ba84218c178e7befbe22b23bf1123a23ec2bc68678586a27cebdxxxb6",
8
+ "CryptoAddress": "17m3mcA3wo5kk637TgEysxxx2c89SDCRZDB"
9
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "MarketCurrency": "LTC",
3
+ "BaseCurrency": "BTC",
4
+ "MarketCurrencyLong": "Litecoin",
5
+ "BaseCurrencyLong": "Bitcoin",
6
+ "MinTradeSize": 0.01,
7
+ "MarketName": "BTC-LTC",
8
+ "IsActive": true,
9
+ "Created": "2014-02-13T00:00:00",
10
+ "DisplayMarketCurrency": null,
11
+ "DisplayMarketName": null
12
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "OrderUuid": "1af0399d-e845-4xxx-9d85-aa332d831e95",
3
+ "Exchange": "BTC-HPY",
4
+ "Opened": "2014-06-21T04:08:08.75",
5
+ "Closed": "2014-06-22T04:08:08.75",
6
+ "OrderType": "LIMIT_SELL",
7
+ "Limit": 1.6E-7,
8
+ "Quantity": 371810.26006413,
9
+ "QuantityRemaining": 371810.26006413,
10
+ "Price": 0.0,
11
+ "PricePerUnit": null,
12
+ "CancelInitiated": false,
13
+ "IsConditional": false,
14
+ "Condition": "NONE",
15
+ "ConditionTarget": null,
16
+ "ImmediateOrCancel": false
17
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "OrderUuid": "1af0399d-e845-4xxx-9d85-aa332d831e95",
3
+ "Exchange": "BTC-HPY",
4
+ "TimeStamp": "2014-06-21T04:08:08.75",
5
+ "OrderType": "LIMIT_SELL",
6
+ "Limit": 1.6E-7,
7
+ "Quantity": 371810.26006413,
8
+ "QuantityRemaining": 371810.26006413,
9
+ "Price": 0.0,
10
+ "PricePerUnit": null,
11
+ "CancelInitiated": false,
12
+ "IsConditional": false,
13
+ "Condition": "NONE",
14
+ "ConditionTarget": null,
15
+ "ImmediateOrCancel": false
16
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "Bid": 0.01607601,
3
+ "Ask": 0.01633299,
4
+ "Last": 0.01635099
5
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "MarketName": "LTC-ZEIT",
3
+ "High": 2.3E-7,
4
+ "Low": 2.0E-7,
5
+ "Volume": 1406611.43827056,
6
+ "Last": 2.0E-7,
7
+ "BaseVolume": 0.30179011,
8
+ "TimeStamp": "2014-06-26T05:22:57.673",
9
+ "Bid": 2.0E-7,
10
+ "Ask": 2.3E-7,
11
+ "OpenBuyOrders": 7,
12
+ "OpenSellOrders": 8,
13
+ "PrevDay": 2.2E-7,
14
+ "Created": "2014-03-01T21:00:00",
15
+ "DisplayMarketName": null
16
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "Currency": "CRYPT",
3
+ "Balance": 115.0,
4
+ "Available": 0.0,
5
+ "Pending": 0.0,
6
+ "CryptoAddress": null,
7
+ "Requested": false,
8
+ "Uuid": "3dab465d-d0f2-4xxx-819f-aafad450f05b"
9
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "PaymentUuid": "c7f7b806-36cf-4xxx-b198-fcdeb1220762",
3
+ "Currency": "BTC",
4
+ "Amount": 0.0098,
5
+ "Address": "14UKkY9xxxvk79X7u1zYpxxxRUEQ8F7Lh5",
6
+ "Opened": "2014-06-26T05:37:55.083",
7
+ "Authorized": true,
8
+ "PendingPayment": false,
9
+ "TxCost": 0.0002,
10
+ "TxId": "0b34fc4xxx102d0f80efddafexxx6b77c6ce170100b2a579ab5b5f493a383392",
11
+ "Canceled": false,
12
+ "InvalidAddress": false
13
+ }
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bittrex::Configuration do
4
+ context 'defaults' do
5
+ it 'is a hash of default configuration' do
6
+ expect(Bittrex::Configuration.defaults).to be_kind_of(Hash)
7
+ end
8
+ end
9
+
10
+ context 'access' do
11
+ it 'is callable from .config' do
12
+ Bittrex.config do |c|
13
+ expect(c).to be_kind_of(Bittrex::Configuration)
14
+ end
15
+ end
16
+
17
+ context 'options' do
18
+ let(:map) { { 'user' => { a: 1 } } }
19
+ let(:api_key) { 'my_special_key' }
20
+
21
+ it 'is able to set the options_key' do
22
+ Bittrex.config { |config| config.key = api_key }
23
+ expect(Bittrex.configuration.key).to eq(api_key)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bittrex::Currency do
4
+ let(:data){ fixture(:currency) }
5
+ let(:subject){ Bittrex::Currency.new(data) }
6
+
7
+ describe '#initialization' do
8
+ it { should_assign_attribute(subject, :name, 'Bitcoin') }
9
+ it { should_assign_attribute(subject, :abbreviation, 'BTC') }
10
+ it { should_assign_attribute(subject, :transaction_fee, 0.00000008) }
11
+ it { should_assign_attribute(subject, :minimum_confirmation, 5) }
12
+ it { should_assign_attribute(subject, :active, true) }
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bittrex::Deposit do
4
+ let(:data){ fixture(:deposit) }
5
+ let(:subject){ Bittrex::Deposit.new(data) }
6
+
7
+ describe '#initialization' do
8
+ it { should_assign_attribute(subject, :id, 2045339) }
9
+ it { should_assign_attribute(subject, :currency, 'BTC') }
10
+ it { should_assign_attribute(subject, :quantity, 0.31074098) }
11
+ it { should_assign_attribute(subject, :address, '17m3mcA3wo5kk637TgEysxxx2c89SDCRZDB') }
12
+ it { should_assign_attribute(subject, :transaction_id, '416ba84218c178e7befbe22b23bf1123a23ec2bc68678586a27cebdxxxb6') }
13
+ it { should_assign_attribute(subject, :confirmations, 2) }
14
+ it { should_assign_attribute(subject, :executed_at, DateTime.parse('2014-06-16T22:57:17.457')) }
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bittrex::Helpers do
4
+ include Bittrex::Helpers
5
+ describe '#extract_timestamp' do
6
+ context 'when the argument is empty' do
7
+ it 'returns nil' do
8
+ expect(extract_timestamp(nil)).to be(nil)
9
+ end
10
+ end
11
+
12
+ context 'when the argument is an empty string' do
13
+ it 'returns nil' do
14
+ expect(extract_timestamp('')).to be(nil)
15
+ end
16
+ end
17
+
18
+ context 'when the argument is a string of spaces' do
19
+ it 'returns nil' do
20
+ expect(extract_timestamp(' ')).to be(nil)
21
+ end
22
+ end
23
+
24
+ context 'when the argument is datetime string' do
25
+ it 'returns a datetime object' do
26
+ expected_time_object = DateTime.now
27
+ time_string = expected_time_object.to_s
28
+ strftime_format = '%B %d, %Y %H %M %S'
29
+ expect(extract_timestamp(time_string).class).to eql(DateTime)
30
+ expect(
31
+ extract_timestamp(time_string).strftime(strftime_format)
32
+ ).to eql(expected_time_object.strftime(strftime_format))
33
+ end
34
+ end
35
+ end
36
+ end