vault_of_satoshi 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c1e875eb3e886544c86750cb12fb43185006a3d5
4
+ data.tar.gz: b5137743d6835cea4f328bc5db12438bc3ff818a
5
+ SHA512:
6
+ metadata.gz: 80af280d1bfc293b2b7fc611078e6cb279293cf300a9b5071434ceb68b25865fc98154b4d913336c74080ef67b34d96a06bc0841b42d413ac3659fc3ae21fc84
7
+ data.tar.gz: 0d17e8956ef6cc1cc5414c49f36b2c2bbdca9eb575560b8dc8b6458b1fd84ba6d43f24d0f9fcfa31e945bcf94498e25a5a7b17fe93e89a7de1409fb661784665
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ api_key.txt
19
+ api_secret.txt
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vault_of_satoshi.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Frank Bonetti
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ ## Installation
2
+
3
+ gem install 'vault_of_satoshi'
4
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,15 @@
1
+ require 'httparty'
2
+ require 'openssl'
3
+ require 'base64'
4
+ require 'uri'
5
+ require 'date'
6
+ require 'active_support/core_ext/hash'
7
+ require 'ostruct'
8
+
9
+ require 'vault_of_satoshi/version' unless defined?(VaultOfSatoshi::VERSION)
10
+ require 'vault_of_satoshi/api/base'
11
+ require 'vault_of_satoshi/api/client'
12
+ require 'vault_of_satoshi/api/error'
13
+ require 'vault_of_satoshi/api/info'
14
+ require 'vault_of_satoshi/api/public'
15
+ require 'vault_of_satoshi/api/trade'
@@ -0,0 +1,94 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Base
4
+ include HTTParty
5
+ base_uri 'https://api.vaultofsatoshi.com'
6
+
7
+ CRYPTO_CURRENCIES = [:BTC, :LTC, :PPC, :DOGE, :FTC, :XPM, :QRK]
8
+ FIAT_CURRENCIES = [:CAD, :USD]
9
+ ALL_CURRENCIES = CRYPTO_CURRENCIES + FIAT_CURRENCIES
10
+
11
+ def initialize(api_key, api_secret)
12
+ @api_key = api_key
13
+ @api_secret = api_secret
14
+ end
15
+
16
+ def inspect
17
+ "#<#{self.class}:#{self.object_id}>"
18
+ end
19
+
20
+ private
21
+
22
+ def nonce
23
+ sprintf("%0.6f", Time.now.to_f).gsub('.', '')
24
+ end
25
+
26
+ def headers(endpoint, params)
27
+ {
28
+ "Api-Key" => @api_key,
29
+ "Api-Sign" => generate_api_sign(endpoint, params)
30
+ }
31
+ end
32
+
33
+ def generate_api_sign(endpoint, params)
34
+ data = params.to_param
35
+ Base64.strict_encode64(OpenSSL::HMAC.hexdigest('sha512', @api_secret, endpoint + 0.chr + data))
36
+ end
37
+
38
+ def parse_data(data, options = {})
39
+ data = OpenStruct.new(data)
40
+
41
+ [*options[:unix_timestamps]].each do |unix_timestamp|
42
+ data[unix_timestamp] = parse_unix_timestamp(data[unix_timestamp])
43
+ end
44
+
45
+ [*options[:microsecond_timestamps]].each do |microsecond_timestamp|
46
+ data[microsecond_timestamp] = parse_microsecond_timestamp(data[microsecond_timestamp])
47
+ end
48
+
49
+ [*options[:currency_objects]].each do |currency_object|
50
+ data[currency_object] = parse_currency_object(data[currency_object])
51
+ end
52
+
53
+ [*options[:booleans]].each do |boolean|
54
+ data[boolean] = parse_boolean(data[boolean])
55
+ end
56
+
57
+ data
58
+ end
59
+
60
+ def parse_unix_timestamp(seconds_since_epoch)
61
+ DateTime.strptime(seconds_since_epoch.to_s, "%s")
62
+ end
63
+
64
+ def parse_microsecond_timestamp(micro_seconds_since_epoch)
65
+ seconds_since_epoch = BigDecimal.new(micro_seconds_since_epoch.to_s) / 1_000_000
66
+ DateTime.strptime(seconds_since_epoch.to_s("F"), "%s")
67
+ end
68
+
69
+ def parse_currency_object(object)
70
+ BigDecimal.new(object["value"]).round(object["precision"])
71
+ end
72
+
73
+ def parse_boolean(int)
74
+ int.to_i == 1
75
+ end
76
+
77
+ # Accepts a date_input in the form of a unix timestamp, Date object, or Time object
78
+ def date_input_to_microseconds(date_input)
79
+ DateTime.strptime(date_input.to_f.to_s, '%s').strftime("%s").to_i * 1_000_000
80
+ end
81
+
82
+ def generate_currency_object(number)
83
+ precision = 8
84
+ value = sprintf("%0.#{precision}f", number)
85
+ {
86
+ precision: precision,
87
+ value: value,
88
+ value_int: value.gsub('.', '').to_i
89
+ }
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,18 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Client
4
+ attr_reader :public, :info, :trade
5
+
6
+ def initialize(api_key, api_secret)
7
+ @public = VaultOfSatoshi::API::Public.new
8
+ @info = VaultOfSatoshi::API::Info.new(api_key, api_secret)
9
+ @trade = VaultOfSatoshi::API::Trade.new(api_key, api_secret)
10
+ end
11
+
12
+ def inspect
13
+ "#<#{self.class}:#{self.object_id}>"
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Error < StandardError
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,179 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Info < Base
4
+
5
+ def initialize(api_key, api_secret)
6
+ super
7
+ end
8
+
9
+ def currency(params = {})
10
+ params.slice!(:currency)
11
+ params.merge!(nonce: nonce)
12
+ endpoint = "/info/currency"
13
+
14
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
15
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
16
+
17
+ if params[:currency]
18
+ parse_data(response["data"], booleans: [:virtual, :tradeable])
19
+ else
20
+ response["data"].map do |element|
21
+ parse_data(element, booleans: [:virtual, :tradeable])
22
+ end
23
+ end
24
+ end
25
+
26
+ def account
27
+ params = {nonce: nonce}
28
+ endpoint = "/info/account"
29
+
30
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
31
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
32
+
33
+ response["data"]["trade_fee"] = parse_data(response["data"]["trade_fee"], currency_objects: CRYPTO_CURRENCIES)
34
+ response["data"]["monthly_volume"] = parse_data(response["data"]["monthly_volume"], currency_objects: CRYPTO_CURRENCIES)
35
+
36
+ response["data"]["wallets"].each do |currency_code, wallet|
37
+ response["data"]["wallets"][currency_code] = parse_data(
38
+ wallet, currency_objects: [:balance, :daily_withdrawal_limit, :monthly_withdrawal_limit]
39
+ )
40
+ end
41
+ response["data"]["wallets"] = parse_data(response["data"]["wallets"])
42
+
43
+ parse_data(response["data"], unix_timestamps: [:created, :last_login])
44
+ end
45
+
46
+ def balance(params = {})
47
+ params.slice!(:currency)
48
+ params.merge!(nonce: nonce)
49
+ endpoint = "/info/balance"
50
+
51
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
52
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
53
+
54
+ if params[:currency]
55
+ parse_currency_object(response["data"])
56
+ else
57
+ parse_data(response["data"], currency_objects: ALL_CURRENCIES)
58
+ end
59
+ end
60
+
61
+ def wallet_address(params = {})
62
+ params.slice!(:currency)
63
+ params.merge!(nonce: nonce)
64
+ endpoint = "/info/wallet_address"
65
+
66
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
67
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
68
+
69
+ parse_data(response["data"])
70
+ end
71
+
72
+ def wallet_history(params = {})
73
+ params.slice!(:currency, :count, :after)
74
+ params[:after] = date_input_to_microseconds(params[:after])
75
+ params.merge!(nonce: nonce)
76
+ endpoint = "/info/wallet_history"
77
+
78
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
79
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
80
+
81
+ parse_options = {
82
+ currency_objects: :units,
83
+ microsecond_timestamps: :transfer_date
84
+ }
85
+ response["data"].map do |element|
86
+ parse_data(element, parse_options)
87
+ end
88
+ end
89
+
90
+ def ticker(params = {})
91
+ params.slice!(:order_currency, :payment_currency)
92
+ params.merge!(nonce: nonce)
93
+ endpoint = "/info/ticker"
94
+
95
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
96
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
97
+
98
+ parse_options = {
99
+ unix_timestamps: :date,
100
+ currency_objects: [
101
+ :opening_price, :closing_price, :min_price, :max_price,
102
+ :average_price, :units_traded, :volume_1day, :volume_7day
103
+ ]
104
+ }
105
+ parse_data(response["data"], parse_options)
106
+ end
107
+
108
+ def quote(params = {})
109
+ params.slice!(:type, :order_currency, :units, :payment_currency, :price)
110
+ params[:units] = generate_currency_object(params[:units]) if params[:units]
111
+ params[:price] = generate_currency_object(params[:price]) if params[:price]
112
+ params.merge!(nonce: nonce)
113
+ endpoint = "/info/quote"
114
+
115
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
116
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
117
+
118
+ parse_options = {currency_objects: [:rate, :subtotal, :fee, :total]}
119
+ parse_data(response["data"], parse_options)
120
+ end
121
+
122
+ def orderbook(params = {})
123
+ params.slice!(:order_currency, :payment_currency, :group_orders, :round, :count)
124
+ params[:group_orders] = [1, "1", true, nil].include?(params[:group_orders]) ? 1 : 0
125
+ params.merge!(nonce: nonce)
126
+ endpoint = "/info/orderbook"
127
+
128
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
129
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
130
+
131
+ response["data"]["bids"].map! do |bid_object|
132
+ parse_data(bid_object, currency_objects: [:price, :quantity])
133
+ end
134
+ response["data"]["asks"].map! do |ask_object|
135
+ parse_data(ask_object, currency_objects: [:price, :quantity])
136
+ end
137
+ parse_data(response["data"], microsecond_timestamps: :timestamp)
138
+ end
139
+
140
+ def orders(params = {})
141
+ params.slice!(:count, :after, :open_only)
142
+ params[:after] = date_input_to_microseconds(params[:after])
143
+ params.merge!(nonce: nonce)
144
+ endpoint = "/info/orders"
145
+
146
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
147
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
148
+
149
+ parse_options = {
150
+ microsecond_timestamps: [:order_date, :date_completed],
151
+ currency_objects: [:units, :units_remaining, :price, :fee, :total]
152
+ }
153
+
154
+ response["data"].map do |element|
155
+ parse_data(element, parse_options)
156
+ end
157
+ end
158
+
159
+ def order_detail(params = {})
160
+ params.slice!(:order_id)
161
+ params.merge!(nonce: nonce)
162
+ endpoint = "/info/order_detail"
163
+
164
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
165
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
166
+
167
+ parse_options = {
168
+ microsecond_timestamps: :transaction_date,
169
+ currency_objects: [:units_traded, :price, :fee, :total]
170
+ }
171
+
172
+ response["data"].map do |element|
173
+ parse_data(element, parse_options)
174
+ end
175
+ end
176
+
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,44 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Public < Base
4
+
5
+ def initialize
6
+ end
7
+
8
+ def ticker(params = {})
9
+ params.slice!(:order_currency, :payment_currency)
10
+ endpoint = "/public/ticker"
11
+
12
+ response = self.class.get(endpoint, query: params).parsed_response
13
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
14
+
15
+ parse_options = {
16
+ timestamps: :date,
17
+ currency_objects: [
18
+ :opening_price, :closing_price, :min_price, :max_price,
19
+ :average_price, :units_traded, :volume_1day, :volume_7day
20
+ ]
21
+ }
22
+ parse_data(response["data"], parse_options)
23
+ end
24
+
25
+ def orderbook(params = {})
26
+ params.slice!(:order_currency, :payment_currency, :group_orders, :round, :count)
27
+ params[:group_orders] = [1, "1", true, nil].include?(params[:group_orders]) ? 1 : 0
28
+ endpoint = "/public/orderbook"
29
+
30
+ response = self.class.get(endpoint, query: params).parsed_response
31
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
32
+
33
+ response["data"]["bids"].map! do |bid_object|
34
+ parse_data(bid_object, currency_objects: [:price, :quantity])
35
+ end
36
+ response["data"]["asks"].map! do |ask_object|
37
+ parse_data(ask_object, currency_objects: [:price, :quantity])
38
+ end
39
+ parse_data(response["data"], timestamps: :timestamp)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ module VaultOfSatoshi
2
+ module API
3
+ class Trade < Base
4
+
5
+ def initialize(api_key, api_secret)
6
+ super
7
+ end
8
+
9
+ def place(params = {})
10
+ params.slice!(:type, :order_currency, :units, :payment_currency, :price)
11
+ params[:units] = generate_currency_object(params[:units])
12
+ params[:price] = generate_currency_object(params[:price])
13
+ params.merge!(nonce: nonce)
14
+ endpoint = "/trade/place"
15
+
16
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
17
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
18
+
19
+ parse_data(response["data"])
20
+ end
21
+
22
+ def cancel(params = {})
23
+ params.slice!(:order_id)
24
+ params.merge!(nonce: nonce)
25
+ endpoint = "/trade/cancel"
26
+
27
+ response = self.class.post(endpoint, body: params.to_param, headers: headers(endpoint, params)).parsed_response
28
+ raise VaultOfSatoshi::API::Error.new(response["message"]) if response["status"] == "error"
29
+
30
+ parse_data(response["data"])
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module VaultOfSatoshi
2
+ VERSION = "0.9.0"
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe VaultOfSatoshi::API::Info do
4
+
5
+ let(:api_client) { VaultOfSatoshi::API::Client.new(File.read("./api_key.txt"), File.read("./api_secret.txt")) }
6
+
7
+ describe "#currency" do
8
+ it "should return a list of currencies when no params are provided" do
9
+ data = api_client.info.currency
10
+ data.map(&:code).sort.should == VaultOfSatoshi::API::Base::ALL_CURRENCIES.map(&:to_s).sort
11
+ data.detect { |x| x.code == "BTC" }.virtual.should == true
12
+ end
13
+
14
+ it "should return one currency when the currency param is provided" do
15
+ data = api_client.info.currency(currency: "BTC")
16
+ data.code.should == "BTC"
17
+ end
18
+ end
19
+
20
+ describe "#account" do
21
+ it "should return the expected fields" do
22
+ data = api_client.info.account
23
+ data.to_h.keys.should include(:created, :account_id, :trade_fee, :monthly_volume, :wallets)
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+
3
+ require 'vault_of_satoshi'
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vault_of_satoshi/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vault_of_satoshi"
8
+ spec.version = VaultOfSatoshi::VERSION
9
+ spec.author = "Frank Bonetti"
10
+ spec.email = "frank.r.bonetti@gmail.com"
11
+ spec.description = "A Ruby wrapper for the Vault of Satoshi API"
12
+ spec.summary = "A Ruby wrapper for the Vault of Satoshi API"
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.5"
22
+ spec.add_development_dependency "rake", "~> 1.3.5"
23
+ spec.add_development_dependency 'httparty', "~> 0.13.0"
24
+ spec.add_development_dependency 'active_support', "~> 3.0.0"
25
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vault_of_satoshi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Frank Bonetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.5
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 0.13.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.13.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: active_support
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 3.0.0
69
+ description: A Ruby wrapper for the Vault of Satoshi API
70
+ email: frank.r.bonetti@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - .gitignore
76
+ - Gemfile
77
+ - LICENSE.txt
78
+ - README.md
79
+ - Rakefile
80
+ - lib/vault_of_satoshi.rb
81
+ - lib/vault_of_satoshi/api/base.rb
82
+ - lib/vault_of_satoshi/api/client.rb
83
+ - lib/vault_of_satoshi/api/error.rb
84
+ - lib/vault_of_satoshi/api/info.rb
85
+ - lib/vault_of_satoshi/api/public.rb
86
+ - lib/vault_of_satoshi/api/trade.rb
87
+ - lib/vault_of_satoshi/version.rb
88
+ - spec/api/info_spec.rb
89
+ - spec/spec_helper.rb
90
+ - vault_of_satoshi.gemspec
91
+ homepage: ''
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.1.11
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: A Ruby wrapper for the Vault of Satoshi API
115
+ test_files:
116
+ - spec/api/info_spec.rb
117
+ - spec/spec_helper.rb