rbtc_arbitrage_simple 1.2.3

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +23 -0
  5. data/Gemfile +18 -0
  6. data/Gemfile.lock +156 -0
  7. data/Guardfile +8 -0
  8. data/LICENSE.txt +22 -0
  9. data/Procfile +1 -0
  10. data/README.md +88 -0
  11. data/Rakefile +10 -0
  12. data/bin/rbtc_simple +4 -0
  13. data/dummy_web_server.rb +9 -0
  14. data/lib/rbtc_arbitrage.rb +15 -0
  15. data/lib/rbtc_arbitrage/campbx.rb +98 -0
  16. data/lib/rbtc_arbitrage/cli.rb +19 -0
  17. data/lib/rbtc_arbitrage/client.rb +48 -0
  18. data/lib/rbtc_arbitrage/clients/btce_client.rb +62 -0
  19. data/lib/rbtc_arbitrage/clients/campbx_client.rb +48 -0
  20. data/lib/rbtc_arbitrage/clients/client.rb.example +46 -0
  21. data/lib/rbtc_arbitrage/clients/coinbase_client.rb +63 -0
  22. data/lib/rbtc_arbitrage/clients/mtgox_client.rb +56 -0
  23. data/lib/rbtc_arbitrage/trader.rb +123 -0
  24. data/lib/rbtc_arbitrage/version.rb +3 -0
  25. data/rbtc_arbitrage.gemspec +30 -0
  26. data/spec/cli_spec.rb +8 -0
  27. data/spec/client_spec.rb +33 -0
  28. data/spec/clients/btce_client_spec.rb +93 -0
  29. data/spec/clients/campbx_client_spec.rb +66 -0
  30. data/spec/clients/coinbase_client_spec.rb +66 -0
  31. data/spec/clients/mtgox_client_spec.rb +53 -0
  32. data/spec/rbtc_arbitrage_spec.rb +11 -0
  33. data/spec/spec_helper.rb +34 -0
  34. data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_balance/fetches_the_balance_correctly.yml +96 -0
  35. data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_buy_correctly.yml +52 -0
  36. data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_price_for_sell_correctly.yml +52 -0
  37. data/spec/support/cassettes/RbtcArbitrage_Clients_BitstampClient/_price/fetches_prices_correctly.yml +44 -0
  38. data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_balance/should_raise_if_bad_API_keys.yml +53 -0
  39. data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/calls_btc-e.yml +91 -0
  40. data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_buy_correctly.yml +47 -0
  41. data/spec/support/cassettes/RbtcArbitrage_Clients_BtceClient/_price/fetches_price_for_sell_correctly.yml +47 -0
  42. data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_balance/fetches_the_balance_correctly.yml +95 -0
  43. data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_buy_correctly.yml +49 -0
  44. data/spec/support/cassettes/RbtcArbitrage_Clients_CampbxClient/_price/fetches_price_for_sell_correctly.yml +49 -0
  45. data/spec/support/cassettes/RbtcArbitrage_Clients_CoinbaseClient/_balance/fetches_the_balance_correctly.yml +109 -0
  46. data/spec/support/cassettes/RbtcArbitrage_Clients_CoinbaseClient/_price/calls_coinbase.yml +215 -0
  47. data/spec/support/cassettes/RbtcArbitrage_Clients_CoinbaseClient/_price/fetches_price_for_buy_correctly.yml +56 -0
  48. data/spec/support/cassettes/RbtcArbitrage_Clients_CoinbaseClient/_price/fetches_price_for_sell_correctly.yml +56 -0
  49. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_balance/fetches_the_balance_correctly.yml +77 -0
  50. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_buy_correctly.yml +44 -0
  51. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_price_for_sell_correctly.yml +44 -0
  52. data/spec/support/cassettes/RbtcArbitrage_Clients_MtGoxClient/_price/fetches_prices_correctly.yml +85 -0
  53. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/should_raise_SecurityError_if_not_live.yml +88 -0
  54. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_BTC.yml +81 -0
  55. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/raises_SecurityError_if_not_enough_USD.yml +81 -0
  56. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/should_fetch_balance.yml +88 -0
  57. data/spec/support/cassettes/RbtcArbitrage_Trader/_execute_trade/when_live/shouldn_t_raise_security_error.yml +166 -0
  58. data/spec/support/cassettes/RbtcArbitrage_Trader/_fetch_prices/gets_the_right_price_set.yml +173 -0
  59. data/spec/trader_spec.rb +228 -0
  60. metadata +249 -0
@@ -0,0 +1,3 @@
1
+ module RbtcArbitrage
2
+ VERSION = "1.2.3"
3
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rbtc_arbitrage/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rbtc_arbitrage_simple"
8
+ spec.version = RbtcArbitrage::VERSION
9
+ spec.authors = ["Hank Stoever"]
10
+ spec.email = ["hstove@gmail.com"]
11
+ spec.description = %q{A gem for conducting arbitrage with Bitcoin.}
12
+ spec.summary = %q{A gem for conducting arbitrage with Bitcoin.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency "mtgox"
25
+ spec.add_dependency "activemodel", ">= 3.1"
26
+ spec.add_dependency "activesupport", ">= 3.1"
27
+ spec.add_dependency "thor"
28
+ spec.add_dependency "btce", '0.2.4'
29
+ spec.add_dependency "coinbase", '1.2.4'
30
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage::CLI do
4
+ it "calls trade on new trader" do
5
+ RbtcArbitrage::Trader.any_instance.should_receive(:trade)
6
+ RbtcArbitrage::CLI.new.trade
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeClient
4
+ include RbtcArbitrage::Client
5
+
6
+ def trade action
7
+ end
8
+ end
9
+
10
+ describe RbtcArbitrage::Client do
11
+ let(:client) { FakeClient.new }
12
+ it "aliases buy and sell" do
13
+ client.should_receive(:trade).with(:sell)
14
+ client.sell
15
+ client.should_receive(:trade).with(:buy)
16
+ client.buy
17
+ end
18
+
19
+ describe RbtcArbitrage::Clients do
20
+ RbtcArbitrage.clients.each do |client|
21
+ required_methods = [:trade, :balance, :validate_env, :exchange]
22
+ required_methods << [:price, :transfer, :address]
23
+ required_methods.flatten!
24
+ describe client do
25
+ it "has all requred methods" do
26
+ required_methods.each do |meth|
27
+ client.new.methods.should include(meth)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage::Clients::BtceClient do
4
+ let(:client) { RbtcArbitrage::Clients::BtceClient.new(verbose: false) }
5
+ let(:btce) { client.interface }
6
+
7
+ it { client.exchange.should == :btce }
8
+
9
+ before(:each) do
10
+ btce.stub(:get_info) {
11
+ {
12
+ "success" => 1,
13
+ "return" => {
14
+ "funds" => {
15
+ "usd" => 2.57460659,
16
+ "btc" => 0.00012226,
17
+ "ltc" => 3.00815559,
18
+ "nmc" => 0,
19
+ "rur" => 8.0116908,
20
+ "eur" => 0,
21
+ "nvc" => 0,
22
+ "trc" => 0,
23
+ "ppc" => 0,
24
+ "ftc" => 0,
25
+ "xpm" => 0},
26
+ "rights" => {
27
+ "info" => 1,
28
+ "trade" => 0,
29
+ "withdraw" => 0
30
+ },
31
+ "transaction_count" => 120,
32
+ "open_orders" => 1,
33
+ "server_time"=>1385947487
34
+ }
35
+ }
36
+ }
37
+ end
38
+
39
+ describe "#balance" do
40
+ it "fetches the balance correctly" do
41
+ balances = btce.get_info["return"]["funds"]
42
+ expected = [balances["btc"], balances["usd"]]
43
+ client.balance.should eql(expected)
44
+ client.balance.each do |b|
45
+ b.should be_a(Float)
46
+ end
47
+ end
48
+
49
+ it "should raise if bad API keys", :vcr do
50
+ btce.unstub(:get_info)
51
+ expect { client.balance }.to raise_error(SecurityError)
52
+ end
53
+ end
54
+
55
+ describe "#price" do
56
+ [:buy, :sell].each do |action|
57
+ it "fetches price for #{action} correctly", :vcr do
58
+ client.price(action).should be_a(Float)
59
+ end
60
+ end
61
+
62
+ it "calls btc-e", :vcr do
63
+ ticker = Btce::Ticker.new("btc_usd").json["ticker"]
64
+ client.price(:sell).should == ticker["sell"]
65
+ client.price(:buy).should == ticker["buy"]
66
+ end
67
+ end
68
+
69
+ describe "#trade" do
70
+ it "calls CampBX" do
71
+ client.stub(:gets) { 'accept' }
72
+
73
+ client.instance_variable_set(:@ticker, {"sell" => 10, "buy" => 11})
74
+ opts = {pair: "btc_usd", type: :sell, rate: 10, amount: 0.01}
75
+ btce.should_receive(:trade).with(opts)
76
+ client.trade(:sell)
77
+
78
+ opts[:type] = :buy
79
+ opts[:rate] = 11
80
+ btce.should_receive(:trade).with(opts)
81
+ client.trade(:buy)
82
+ end
83
+ end
84
+
85
+ describe "#transfer" do
86
+ it "calls CampBX correctly" do
87
+ client.options[:verbose] = true
88
+ sell_client = RbtcArbitrage::Clients::BtceClient.new
89
+ client.options[:logger].should_receive(:error)
90
+ client.transfer(sell_client)
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage::Clients::CampbxClient do
4
+ let(:client) { RbtcArbitrage::Clients::CampbxClient.new }
5
+ let(:campbx) { client.interface }
6
+
7
+ before(:each) { client.validate_env }
8
+
9
+ it { client.exchange.should == :campbx }
10
+
11
+ describe "#balance" do
12
+ it "fetches the balance correctly", :vcr do
13
+ balances = campbx.my_funds
14
+ expected = [balances["Total BTC"].to_f, balances["Total USD"].to_f]
15
+ client.balance.should == expected
16
+ end
17
+ end
18
+
19
+ describe "#price" do
20
+ [:buy, :sell].each do |action|
21
+ it "fetches price for #{action} correctly", :vcr do
22
+ client.price(action).should be_a(Float)
23
+ end
24
+ end
25
+
26
+ it "calls CampBX" do
27
+ hash = Hashie::Mash.new("Best Bid" => 10)
28
+ hash.should_receive(:[]).with("Best Bid")
29
+ campbx.should_receive(:xticker) { hash }
30
+ client.price(:sell)
31
+
32
+ client.instance_variable_set(:@price, nil)
33
+ hash = Hashie::Mash.new("Best Ask" => 10)
34
+ hash.should_receive(:[]).with("Best Ask")
35
+ campbx.should_receive(:xticker) { hash }
36
+ client.price(:buy)
37
+ end
38
+ end
39
+
40
+ describe "#trade" do
41
+ it "calls CampBX" do
42
+ client.instance_variable_set(:@price, 10)
43
+ campbx.should_receive(:trade_enter).with("QuickSell",0.01,10)
44
+ client.trade(:sell)
45
+
46
+ client.instance_variable_set(:@price, 11)
47
+ campbx.should_receive(:trade_enter).with("QuickBuy",0.01,11)
48
+ client.trade(:buy)
49
+ end
50
+ end
51
+
52
+ describe "#transfer" do
53
+ it "calls CampBX correctly" do
54
+ sell_client = RbtcArbitrage::Clients::BtceClient.new
55
+ campbx.should_receive(:send_btc).with(sell_client.address, 0.01)
56
+ client.transfer sell_client
57
+ end
58
+ end
59
+
60
+ describe "#address" do
61
+ it "calls campbx" do
62
+ campbx.should_receive(:get_btc_address)
63
+ client.address
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage::Clients::CoinbaseClient do
4
+ let(:client) { RbtcArbitrage::Clients::CoinbaseClient.new }
5
+ let(:coinbase) { client.interface }
6
+
7
+ it { client.exchange.should == :coinbase }
8
+
9
+ describe "#balance" do
10
+ it "fetches the balance correctly", :vcr do
11
+ balance = coinbase.balance.to_f
12
+ expected = [balance, Float::MAX]
13
+ client.balance.should eql(expected)
14
+ client.balance.each do |b|
15
+ b.should be_a(Float)
16
+ end
17
+ end
18
+
19
+ it "should warn about USD balance" do
20
+ client.options[:verbose] = true
21
+ client.options[:logger].should_receive :warn
22
+ client.instance_variable_set :@balance, [1, 1]
23
+ client.balance
24
+ end
25
+ end
26
+
27
+ describe "#price" do
28
+ [:buy, :sell].each do |action|
29
+ it "fetches price for #{action} correctly", :vcr do
30
+ client.price(action).should be_a(Float)
31
+ end
32
+ end
33
+
34
+ it "calls coinbase", :vcr do
35
+ client.price(:buy).should == coinbase.buy_price.to_f
36
+ client.instance_variable_set :@price, nil
37
+ client.price(:sell).should == coinbase.sell_price.to_f
38
+ end
39
+ end
40
+
41
+ describe "#trade" do
42
+ it "calls coinbase" do
43
+ coinbase.should_receive(:sell!).with(0.01)
44
+ client.trade(:sell)
45
+
46
+ coinbase.should_receive(:buy!).with(0.01)
47
+ client.trade(:buy)
48
+ end
49
+ end
50
+
51
+ describe "#transfer" do
52
+ it "calls coinbase correctly" do
53
+ sell_client = RbtcArbitrage::Clients::BtceClient.new
54
+ coinbase.should_receive(:send_money).with(sell_client.address, 0.01)
55
+ client.transfer(sell_client)
56
+ end
57
+ end
58
+
59
+ describe "#address" do
60
+ it "calls coinbase correctly" do
61
+ response = Hashie::Mash.new(address: "hi")
62
+ coinbase.should_receive(:receive_address) { response }
63
+ client.address
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage::Clients::MtGoxClient do
4
+ let(:client) { RbtcArbitrage::Clients::MtGoxClient.new }
5
+ before(:each) { client.validate_env }
6
+
7
+ describe "#balance" do
8
+ it "fetches the balance correctly", :vcr do
9
+ balances = MtGox.balance
10
+ balance = client.balance
11
+ balance.should == [balances[0].amount.to_f, balances[1].amount.to_f]
12
+ end
13
+ end
14
+
15
+ describe "#price" do
16
+ [:buy, :sell].each do |action|
17
+ it "fetches price for #{action} correctly", :vcr do
18
+ client.price(action).should be_a(BigDecimal)
19
+ end
20
+ end
21
+
22
+ it "calls MtGox" do
23
+ hash = Hashie::Mash.new(buy: 10)
24
+ hash.should_receive(:buy)
25
+ MtGox.should_receive(:ticker) { hash }
26
+ client.price(:sell)
27
+
28
+ client.instance_variable_set(:@price, nil)
29
+ hash = Hashie::Mash.new(sell: 10)
30
+ hash.should_receive(:sell)
31
+ MtGox.should_receive(:ticker) { hash }
32
+ client.price(:buy)
33
+ end
34
+ end
35
+
36
+ describe "#trade" do
37
+ it "calls MtGox" do
38
+ MtGox.should_receive(:sell!).with(0.01, :market)
39
+ client.trade(:sell)
40
+
41
+ MtGox.should_receive(:buy!).with(0.01, :market)
42
+ client.trade(:buy)
43
+ end
44
+ end
45
+
46
+ describe "#transfer" do
47
+ it "calls MtGox correctly" do
48
+ sell_client = RbtcArbitrage::Clients::BtceClient.new
49
+ MtGox.should_receive(:withdraw!).with(0.01, sell_client.address)
50
+ client.transfer sell_client
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe RbtcArbitrage do
4
+ describe ".clients" do
5
+ it "includes clients" do
6
+ clients = RbtcArbitrage.clients
7
+ clients.should include(RbtcArbitrage::Clients::MtGoxClient)
8
+ clients.should include(RbtcArbitrage::Clients::BtceClient)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+ require 'codeclimate-test-reporter'
4
+
5
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
+ SimpleCov::Formatter::HTMLFormatter,
7
+ Coveralls::SimpleCov::Formatter,
8
+ # CodeClimate::TestReporter::Formatter
9
+ ]
10
+ SimpleCov.start do
11
+ add_filter "/spec/"
12
+ add_filter "/lib/rbtc_arbitrage/campbx.rb"
13
+ end
14
+
15
+ require 'bundler'
16
+ require './lib/rbtc_arbitrage'
17
+ Bundler.require
18
+
19
+ VCR.configure do |c|
20
+ c.cassette_library_dir = 'spec/support/cassettes'
21
+ c.hook_into :webmock # or :fakeweb
22
+ c.ignore_localhost = true
23
+ c.ignore_hosts 'codeclimate.com'
24
+ c.ignore_request do |request|
25
+ # true
26
+ end
27
+ c.configure_rspec_metadata!
28
+ end
29
+
30
+ RSpec.configure do |config|
31
+ config.run_all_when_everything_filtered = true
32
+ config.filter_run :focus
33
+ config.order = 'random'
34
+ end
@@ -0,0 +1,96 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://www.bitstamp.net/api/balance/
6
+ body:
7
+ headers: {}
8
+ response:
9
+ status:
10
+ code: 200
11
+ message: OK
12
+ headers:
13
+ Date:
14
+ - Tue, 17 Dec 2013 18:40:02 GMT
15
+ Server:
16
+ - Apache
17
+ Content-Language:
18
+ - en
19
+ Expires:
20
+ - Tue, 17 Dec 2013 18:40:02 GMT
21
+ Vary:
22
+ - Accept-Language
23
+ Cache-Control:
24
+ - max-age=0
25
+ Last-Modified:
26
+ - Tue, 17 Dec 2013 18:40:02 GMT
27
+ Connection:
28
+ - close
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Content-Type:
32
+ - application/json
33
+ Set-Cookie:
34
+ - incap_ses_124_99025=/U1EcazP+UfdRdBvBoq4AYKasFIAAAAAdb3zOl4ewZCjqVwIQR8HRg==;
35
+ path=/; Domain=.bitstamp.net
36
+ - nlbi_99025=6To6TWWds1Vw9zhaItob8gAAAABgpcZ6AsnAXA2RDnqQ2T1z; path=/; Domain=.bitstamp.net
37
+ - visid_incap_99025=MMLr1fRQQF+jMYOwRSsxz4GasFIAAAAAQUIPAAAAAABoL4fhNvllL6g2wd8gq/Zs;
38
+ expires=Thu, 17 Dec 2015 17:12:31 GMT; path=/; Domain=.bitstamp.net
39
+ X-Iinfo:
40
+ - 6-3497408-3497716 NNNY CT(200 202 0) RT(1387305600895 539) q(0 0 4 0) r(4
41
+ 7) U6
42
+ X-Cdn:
43
+ - Incapsula
44
+ body:
45
+ encoding: ASCII-8BIT
46
+ string: '{"btc_reserved": "0", "fee": "0.5000", "btc_available": "0", "usd_reserved":
47
+ "0", "btc_balance": "0", "usd_balance": "0.00", "usd_available": "0.00"}'
48
+ http_version:
49
+ recorded_at: Tue, 17 Dec 2013 18:40:03 GMT
50
+ - request:
51
+ method: post
52
+ uri: https://www.bitstamp.net/api/balance/
53
+ headers: {}
54
+ response:
55
+ status:
56
+ code: 200
57
+ message: OK
58
+ headers:
59
+ Date:
60
+ - Tue, 17 Dec 2013 18:40:03 GMT
61
+ Server:
62
+ - Apache
63
+ Content-Language:
64
+ - en
65
+ Expires:
66
+ - Tue, 17 Dec 2013 18:40:03 GMT
67
+ Vary:
68
+ - Accept-Language
69
+ Cache-Control:
70
+ - max-age=0
71
+ Last-Modified:
72
+ - Tue, 17 Dec 2013 18:40:03 GMT
73
+ Connection:
74
+ - close
75
+ Transfer-Encoding:
76
+ - chunked
77
+ Content-Type:
78
+ - application/json
79
+ Set-Cookie:
80
+ - incap_ses_124_99025=LlOzDxXjiiDdRdBvBoq4AYOasFIAAAAAjKStMu6sRoI8G9vBobzXaw==;
81
+ path=/; Domain=.bitstamp.net
82
+ - nlbi_99025=iC3WZwFDbyNNIFu9Itob8gAAAABlF1MNYf5CBe4QsTL4PfH8; path=/; Domain=.bitstamp.net
83
+ - visid_incap_99025=MMLr1fRQQF+jMYOwRSsxz4GasFIAAAAAQUIPAAAAAABoL4fhNvllL6g2wd8gq/Zs;
84
+ expires=Thu, 17 Dec 2015 17:12:31 GMT; path=/; Domain=.bitstamp.net
85
+ X-Iinfo:
86
+ - 6-3498335-3498462 NNNY CT(193 217 0) RT(1387305602232 162) q(0 0 5 0) r(5
87
+ 7) U6
88
+ X-Cdn:
89
+ - Incapsula
90
+ body:
91
+ encoding: ASCII-8BIT
92
+ string: '{"btc_reserved": "0", "fee": "0.5000", "btc_available": "0", "usd_reserved":
93
+ "0", "btc_balance": "0", "usd_balance": "0.00", "usd_available": "0.00"}'
94
+ http_version:
95
+ recorded_at: Tue, 17 Dec 2013 18:40:04 GMT
96
+ recorded_with: VCR 2.7.0