bitcoin-client 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2a2785fa846dc9f20ccf3182be415da192ab0d7c
4
+ data.tar.gz: e20b1f1b80be6e339d8d3f736c642f09ad38a58a
5
+ SHA512:
6
+ metadata.gz: 3f2b6b13d4ef46bb59341526715ce88bebe0ba1058f3914b0e4c8ed24b458277e637e0c7b5d345d32bdf17653095336ad07409565fc2bcec7fb8c21a9900b7c5
7
+ data.tar.gz: cc5a52df9d85050c486ebb7a4f4ab71c183ecdf52bb05cc3882fb141144bc5a7316784d1b700ba813dafbbdfd3918d047d3f33847c961de8d9bc01c23d07d3be
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ coverage
@@ -0,0 +1,18 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - ree
7
+ - jruby
8
+ - ruby-head
9
+ - rbx-2.0
10
+
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: rbx-2.0
14
+ - rvm: jruby
15
+ - rvm: ruby-head
16
+ - rvm: 1.8.7
17
+ - rvm: ree
18
+ - rvm: 1.9.2
data/Gemfile CHANGED
@@ -2,3 +2,12 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in bitcoind-client.gemspec
4
4
  gemspec
5
+
6
+ platforms :ruby_18 do
7
+ gem 'json', '~> 1.5.3'
8
+ end
9
+
10
+ platforms :jruby do
11
+ gem 'json', '~> 1.5.3'
12
+ gem 'jruby-openssl'
13
+ end
@@ -1,9 +1,18 @@
1
- = bitcoin-client
1
+ = bitcoin-client {<img src="https://travis-ci.org/sinisterchipmunk/bitcoin-client.png?branch=master" alt="Build Status" />}[https://travis-ci.org/sinisterchipmunk/bitcoin-client] {<img src="https://codeclimate.com/github/sinisterchipmunk/bitcoin-client.png" />}[https://codeclimate.com/github/sinisterchipmunk/bitcoin-client] {<img src="https://coveralls.io/repos/sinisterchipmunk/bitcoin-client/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/sinisterchipmunk/bitcoin-client]
2
2
 
3
3
  Provides a Ruby library to the complete Bitcoin JSON-RPC API. Implements all methods listed
4
4
  at {https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list}[https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list].
5
5
  Also supports customizing the host and port number to connect to.
6
6
 
7
+ == Installation
8
+
9
+ On Ruby 1.9, you can just install the gem and start using it. On 1.8, the 'json' gem is also required, so you'll need to install that first:
10
+
11
+ gem install json
12
+
13
+ Or, if you're using Bundler (and you should be), just add it to the Gemfile:
14
+
15
+ gem 'json', '~> 1.5.3'
7
16
 
8
17
  == Usage
9
18
 
data/Rakefile CHANGED
@@ -1,9 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
2
3
 
3
- gem 'rdoc', '~> 3.9.2'
4
- require 'rdoc/task'
4
+ desc 'Default: run specs.'
5
+ task :default => :spec
5
6
 
6
- RDoc::Task.new do |t|
7
- t.main = "README.rdoc"
8
- t.rdoc_files.include "README.rdoc", "lib/**/*.rb"
9
- end
7
+ desc "Run specs"
8
+ RSpec::Core::RakeTask.new
@@ -21,8 +21,10 @@ Gem::Specification.new do |s|
21
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
22
  s.require_paths = ["lib"]
23
23
 
24
- # specify any dependencies here; for example:
25
- s.add_development_dependency "rspec", '2.6.0'
26
- s.add_development_dependency "fakeweb", '1.3.0'
27
- s.add_runtime_dependency "rest-client", '1.6.3'
24
+ s.add_development_dependency "rake", '~> 0.9'
25
+ s.add_development_dependency "bundler"
26
+ s.add_development_dependency "rspec", '~> 2.6'
27
+ s.add_development_dependency "fakeweb", '~> 1.3'
28
+ s.add_development_dependency "coveralls"
29
+ s.add_runtime_dependency "rest-client"
28
30
  end
@@ -11,128 +11,140 @@ class Bitcoin::Client
11
11
  def host=(a); api.host = a; end
12
12
  def port=(a); api.port = a; end
13
13
  def ssl=(a); api.ssl = a; end
14
-
14
+
15
15
  def options
16
16
  api.options
17
17
  end
18
-
18
+
19
19
  def initialize(user, pass, options = {})
20
20
  @api = Bitcoin::API.new({ :user => user, :pass => pass }.merge(options))
21
21
  end
22
-
23
- # Safely copies wallet.dat to destination, which can be a directory or a path with filename.
22
+
23
+ # Safely copies wallet.dat to destination, which can be a directory or a path with filename.
24
24
  def backupwallet(destination)
25
25
  @api.request 'backupwallet', destination
26
26
  end
27
-
28
- # Returns the account associated with the given address.
27
+
28
+ # Returns the account associated with the given address.
29
29
  def getaccount(bitcoinaddress)
30
30
  @api.request 'getaccount', bitcoinaddress
31
31
  end
32
-
33
- # Returns the current bitcoin address for receiving payments to this account.
32
+
33
+ # Returns the current bitcoin address for receiving payments to this account.
34
34
  def getaccountaddress(account)
35
35
  @api.request 'getaccountaddress', account
36
36
  end
37
-
38
- # Returns the list of addresses for the given account.
37
+
38
+ # Returns the list of addresses for the given account.
39
39
  def getaddressesbyaccount(account)
40
40
  @api.request 'getaddressesbyaccount', account
41
41
  end
42
-
42
+
43
43
  # If +account+ is not specified, returns the server's total available balance.
44
44
  # If +account+ is specified, returns the balance in the account.
45
45
  def getbalance(account = nil, minconf = 1)
46
46
  @api.request 'getbalance', account, minconf
47
47
  end
48
-
48
+
49
49
  # Dumps the block existing at specified height.
50
50
  # Note: this is not available in the official release
51
51
  def getblockbycount(height)
52
52
  @api.request 'getblockbycount', height
53
53
  end
54
-
54
+
55
+ # Dumps the block existing with specified hash.
56
+ def getblock(hash)
57
+ block = @api.request 'getblock', hash
58
+ block["time"] = Time.at(block["time"]).utc
59
+ block
60
+ end
61
+
55
62
  # Returns the number of blocks in the longest block chain.
56
63
  def getblockcount
57
64
  @api.request 'getblockcount'
58
65
  end
59
-
60
- # Returns the block number of the latest block in the longest block chain.
66
+
67
+ # Returns the block number of the latest block in the longest block chain.
61
68
  def getblocknumber
62
69
  @api.request 'getblocknumber'
63
70
  end
64
-
71
+
65
72
  # Returns the number of connections to other nodes.
66
73
  def getconnectioncount
67
74
  @api.request 'getconnectioncount'
68
75
  end
69
-
70
- # Returns the proof-of-work difficulty as a multiple of the minimum difficulty.
76
+
77
+ # Returns the proof-of-work difficulty as a multiple of the minimum difficulty.
71
78
  def getdifficulty
72
79
  @api.request 'getdifficulty'
73
80
  end
74
-
75
- # Returns true or false whether bitcoind is currently generating hashes
81
+
82
+ # Returns true or false whether bitcoind is currently generating hashes
76
83
  def getgenerate
77
84
  @api.request 'getgenerate'
78
85
  end
79
-
80
- # Returns a recent hashes per second performance measurement while generating.
86
+
87
+ # Returns a recent hashes per second performance measurement while generating.
81
88
  def gethashespersec
82
89
  @api.request 'gethashespersec'
83
90
  end
84
91
 
85
- # Returns an object containing various state info.
92
+ # Returns an object containing various state info.
86
93
  def getinfo
87
94
  @api.request 'getinfo'
88
95
  end
89
-
96
+
97
+ # Returns an object containing mining info.
98
+ def getmininginfo
99
+ @api.request 'getmininginfo'
100
+ end
101
+
90
102
  # Returns a new bitcoin address for receiving payments. If +account+ is specified (recommended),
91
103
  # it is added to the address book so payments received with the address will be credited to +account+.
92
104
  def getnewaddress(account = nil)
93
105
  @api.request 'getnewaddress', account
94
106
  end
95
-
107
+
96
108
  # Returns the total amount received by addresses with +account+ in transactions
97
- # with at least +minconf+ confirmations.
109
+ # with at least +minconf+ confirmations.
98
110
  def getreceivedbyaccount(account, minconf = 1)
99
111
  @api.request 'getreceivedbyaccount', account, minconf
100
112
  end
101
-
102
- # Returns the total amount received by +bitcoinaddress+ in transactions with at least +minconf+ confirmations.
113
+
114
+ # Returns the total amount received by +bitcoinaddress+ in transactions with at least +minconf+ confirmations.
103
115
  def getreceivedbyaddress(bitcoinaddress, minconf = 1)
104
116
  @api.request 'getreceivedbyaddress', bitcoinaddress, minconf
105
117
  end
106
-
107
- # Get detailed information about +txid+
118
+
119
+ # Get detailed information about +txid+
108
120
  def gettransaction(txid)
109
121
  @api.request 'gettransaction', txid
110
122
  end
111
-
123
+
112
124
  # If +data+ is not specified, returns formatted hash data to work on:
113
125
  #
114
126
  # :midstate => precomputed hash state after hashing the first half of the data
115
127
  # :data => block data
116
128
  # :hash1 => formatted hash buffer for second hash
117
- # :target => little endian hash target
129
+ # :target => little endian hash target
118
130
  #
119
131
  # If +data+ is specified, tries to solve the block and returns true if it was successful.
120
132
  def getwork(data = nil)
121
133
  @api.request 'getwork', data
122
134
  end
123
-
124
- # List commands, or get help for a command.
135
+
136
+ # List commands, or get help for a command.
125
137
  def help(command = nil)
126
138
  @api.request 'help', command
127
139
  end
128
-
129
- # Returns Object that has account names as keys, account balances as values.
140
+
141
+ # Returns Object that has account names as keys, account balances as values.
130
142
  def listaccounts(minconf = 1)
131
143
  @api.request 'listaccounts', minconf
132
144
  end
133
-
145
+
134
146
  # Returns an array of objects containing:
135
- #
147
+ #
136
148
  # :account => the account of the receiving addresses
137
149
  # :amount => total amount received by addresses with this account
138
150
  # :confirmations => number of confirmations of the most recent transaction included
@@ -140,60 +152,87 @@ class Bitcoin::Client
140
152
  def listreceivedbyaccount(minconf = 1, includeempty = false)
141
153
  @api.request 'listreceivedbyaccount', minconf, includeempty
142
154
  end
143
-
155
+
144
156
  # Returns an array of objects containing:
145
- #
157
+ #
146
158
  # :address => receiving address
147
159
  # :account => the account of the receiving address
148
160
  # :amount => total amount received by the address
149
- # :confirmations => number of confirmations of the most recent transaction included
150
- #
161
+ # :confirmations => number of confirmations of the most recent transaction included
162
+ #
151
163
  # To get a list of accounts on the system, execute bitcoind listreceivedbyaddress 0 true
152
164
  def listreceivedbyaddress(minconf = 1, includeempty = false)
153
165
  @api.request 'listreceivedbyaddress', minconf, includeempty
154
166
  end
155
-
156
- # Returns up to +count+ most recent transactions for account +account+.
167
+
168
+ # Returns up to +count+ most recent transactions for account +account+.
157
169
  def listtransactions(account, count = 10)
158
170
  @api.request 'listtransactions', account, count
159
171
  end
160
-
161
- # Move from one account in your wallet to another.
172
+
173
+ # Move from one account in your wallet to another.
162
174
  def move(fromaccount, toaccount, amount, minconf = 1, comment = nil)
163
175
  @api.request 'move', fromaccount, toaccount, amount, minconf, comment
164
176
  end
165
-
166
- # +amount+ is a real and is rounded to 8 decimal places. Returns the transaction ID if successful.
177
+
178
+ # +amount+ is a real and is rounded to 8 decimal places. Returns the transaction ID if successful.
167
179
  def sendfrom(fromaccount, tobitcoinaddress, amount, minconf = 1, comment = nil, comment_to = nil)
168
180
  @api.request 'sendfrom', fromaccount, tobitcoinaddress, amount, minconf, comment, comment_to
169
181
  end
170
-
171
- # +amount+ is a real and is rounded to 8 decimal places
182
+
183
+ # +amount+ is a real and is rounded to 8 decimal places
172
184
  def sendtoaddress(bitcoinaddress, amount, comment = nil, comment_to = nil)
173
185
  @api.request 'sendtoaddress', bitcoinaddress, amount, comment, comment_to
174
186
  end
175
-
176
- # Sets the account associated with the given address.
187
+
188
+ def sendmany(fromaccount, addresses_amounts, minconf = 1, comment = nil)
189
+ @api.request 'sendmany', fromaccount, addresses_amounts, minconf, comment
190
+ end
191
+
192
+ # Sets the account associated with the given address.
177
193
  def setaccount(bitcoinaddress, account)
178
- @api.request 'setaccoint', bitcoinaddress, account
194
+ @api.request 'setaccount', bitcoinaddress, account
179
195
  end
180
-
196
+
181
197
  # +generate+ is true or false to turn generation on or off.
182
198
  # Generation is limited to +genproclimit+ processors, -1 is unlimited.
183
199
  def setgenerate(generate, genproclimit = -1)
184
200
  @api.request 'setgenerate', generate, genproclimit
185
201
  end
186
-
187
- # Stop bitcoin server.
202
+
203
+ # Stop bitcoin server.
188
204
  def stop
189
205
  @api.request 'stop'
190
206
  end
191
-
192
- # Return information about +bitcoinaddress+.
207
+
208
+ # Return information about +bitcoinaddress+.
193
209
  def validateaddress(bitcoinaddress)
194
210
  @api.request 'validateaddress', bitcoinaddress
195
211
  end
196
-
212
+
213
+ # Sign a message using +bitcoinaddress+.
214
+ def signmessage(bitcoinaddress, message)
215
+ @api.request 'signmessage', bitcoinaddress, message
216
+ end
217
+
218
+ # Verify signature made by +bitcoinaddress+.
219
+ def verifymessage(bitcoinaddress, signature, message)
220
+ @api.request 'verifymessage', bitcoinaddress, signature, message
221
+ end
222
+
223
+ # Stores the wallet decryption key in memory for +timeout+ seconds.
224
+ def walletpassphrase(passphrase, timeout)
225
+ @api.request 'walletpassphrase', passphrase, timeout
226
+ end
227
+
228
+ # Removes the wallet encryption key from memory, locking the wallet.
229
+ # After calling this method, you will need to call walletpassphrase again
230
+ # before being able to call any methods which require the wallet to be
231
+ # unlocked.
232
+ def walletlock
233
+ @api.request 'walletlock'
234
+ end
235
+
197
236
  alias account getaccount
198
237
  alias account_address getaccountaddress
199
238
  alias addresses_by_account getaddressesbyaccount
@@ -219,9 +258,12 @@ class Bitcoin::Client
219
258
  alias list_transactions listtransactions
220
259
  alias send_from sendfrom
221
260
  alias send_to_address sendtoaddress
261
+ alias send_many sendmany
222
262
  alias account= setaccount
223
263
  alias set_account setaccount
224
264
  alias generate= setgenerate
225
265
  alias set_generate setgenerate
226
266
  alias validate_address validateaddress
267
+ alias sign_message signmessage
268
+ alias verify_message verifymessage
227
269
  end
@@ -84,6 +84,11 @@ module Bitcoin::DSL
84
84
  bitcoin.getblockbycount height
85
85
  end
86
86
 
87
+ # Dumps the block existing with specified hash.
88
+ def getblock(hash)
89
+ bitcoin.getblock hash
90
+ end
91
+
87
92
  # Returns the number of blocks in the longest block chain.
88
93
  def getblockcount
89
94
  bitcoin.getblockcount
@@ -118,7 +123,12 @@ module Bitcoin::DSL
118
123
  def getinfo
119
124
  bitcoin.getinfo
120
125
  end
121
-
126
+
127
+ # Returns an object containing various mining info.
128
+ def getmininginfo
129
+ bitcoin.getmininginfo
130
+ end
131
+
122
132
  # Returns a new bitcoin address for receiving payments. If +account+ is specified (recommended),
123
133
  # it is added to the address book so payments received with the address will be credited to +account+.
124
134
  def getnewaddress(account = nil)
@@ -238,6 +248,7 @@ module Bitcoin::DSL
238
248
  alias generate? getgenerate
239
249
  alias hashes_per_sec gethashespersec
240
250
  alias info getinfo
251
+ alias mininginfo getmininginfo
241
252
  alias new_address getnewaddress
242
253
  alias received_by_account getreceivedbyaccount
243
254
  alias received_by_address getreceivedbyaddress
@@ -23,10 +23,11 @@ class Bitcoin::RPC
23
23
  end
24
24
 
25
25
  def dispatch(request)
26
- respdata = RestClient.post service_url, request.to_post_data
27
- response = JSON.parse(respdata)
28
- raise Bitcoin::Errors::RPCError, response['error'] if response['error']
29
- response['result']
26
+ RestClient.post(service_url, request.to_post_data) do |respdata, request, result|
27
+ response = JSON.parse(respdata)
28
+ raise Bitcoin::Errors::RPCError, response['error'] if response['error']
29
+ response['result']
30
+ end
30
31
  end
31
32
 
32
33
  private
@@ -2,7 +2,7 @@ module Bitcoin
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- PATCH = 1
5
+ PATCH = 2
6
6
  REL = nil
7
7
 
8
8
  STRING = REL ? [MAJOR, MINOR, PATCH, REL].join('.') : [MAJOR, MINOR, PATCH].join('.')
@@ -10,7 +10,7 @@ params = ARGV[2..-1].collect { |y| y == '_nil' ? nil : YAML::load(y) }
10
10
  file_name << ".json" unless file_name =~ /\.json$/
11
11
 
12
12
  data = { 'jsonrpc' => '1.0', 'id' => 'curltest', 'method' => service_name, 'params' => params }
13
- command = "curl --user cm4:H2na-92D --data-binary '#{data.to_json}' -H 'content-type: text/plain;' http://127.0.0.1:8332/ -i"
13
+ command = "curl --user LovleOdnu:NajOij6DriWokEjEinaw --data-binary '#{data.to_json}' -H 'content-type: text/plain;' http://127.0.0.1:8332/ -i"
14
14
 
15
15
  puts command, nil
16
16
  result = %x[#{command}]
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Mon, 10 Jun 2013 08:36:04 +0000
3
+ Connection: keep-alive
4
+ Content-Length: 1657
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.8.1-beta
7
+
8
+ {"result":{"hash":"0000000000000002e004985f39f929d001448623b312185bf5e4ab50e5a8e60a","confirmations":19,"size":5227,"height":240707,"version":2,"merkleroot":"18b914e2d6bd4c3118a936af75afbd230611edb6929a607302c0d591ef49b24e","tx":["cutforsimplicity","27f99033bdcea87b07f8eea4279d7ce24e479fcb49e9f54e9ffb3721e29838ed"],"time":1370842803,"nonce":3937756309,"bits":"1a011337","difficulty":15605632.68128593,"previousblockhash":"000000000000003fa76b2abdd3036d183d7e24cfb6b543781d59cdca289f6053","nextblockhash":"0000000000000087a1e962f618f757393930e58a745165033fc9d281b7bb568a"},"error":null,"id":"curltest"}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Mon, 10 Jun 2013 07:49:23 +0000
3
+ Connection: keep-alive
4
+ Content-Length: 222
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.8.1-beta
7
+
8
+ {"result":{"blocks":237338,"currentblocksize":0,"currentblocktx":0,"difficulty":11187257.46136079,"errors":"","generate":false,"genproclimit":-1,"hashespersec":0,"pooledtx":0,"testnet":false},"error":null,"id":"curltest"}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 500 Internal Server Error
2
+ Date: Sun, 21 Aug 2011 22:53:05 +0000
3
+ Connection: close
4
+ Content-Length: 16
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/0.3.24-beta
7
+
8
+ {"result":null}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 500 Internal Server Error
2
+ Date: Sun, 26 Aug 2012 23:58:59 +0000
3
+ Connection: close
4
+ Content-Length: 80
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.6.3-beta
7
+
8
+ {"result":null,"error":{"code":-3,"message":"Invalid address"},"id":"curltest"}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Sun, 26 Aug 2012 23:58:30 +0000
3
+ Connection: close
4
+ Content-Length: 131
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.6.3-beta
7
+
8
+ {"result":"Gwz2BAaqdsLTqJsh5a4","error":null,"id":"curltest"}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Sun, 26 Aug 2012 23:40:37 +0000
3
+ Connection: close
4
+ Content-Length: 46
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.6.3-beta
7
+
8
+ {"result":false,"error":null,"id":"curltest"}
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Sun, 26 Aug 2012 23:40:26 +0000
3
+ Connection: close
4
+ Content-Length: 45
5
+ Content-Type: application/json
6
+ Server: bitcoin-json-rpc/v0.6.3-beta
7
+
8
+ {"result":true,"error":null,"id":"curltest"}
@@ -2,18 +2,18 @@ require 'spec_helper'
2
2
 
3
3
  describe Bitcoin::Client do
4
4
  subject { Bitcoin::Client.new($user, $pass) }
5
-
5
+
6
6
  it "defaults" do
7
7
  subject.user.should == $user
8
8
  subject.pass.should == $pass
9
9
  subject.host.should == 'localhost'
10
10
  subject.port.should == 8332
11
- subject.ssl?.should_not be_true
11
+ subject.should_not be_ssl
12
12
  end
13
-
13
+
14
14
  context "RPC" do
15
15
  extend RPCServiceHelper
16
-
16
+
17
17
  service 'getinfo' do
18
18
  it "should produce the expected result" do
19
19
  result.should == {
@@ -33,7 +33,47 @@ describe Bitcoin::Client do
33
33
  }
34
34
  end
35
35
  end
36
-
36
+
37
+ service 'getmininginfo' do
38
+ it "should produce the expected result" do
39
+ result.should == {
40
+ 'blocks' => 237338,
41
+ 'currentblocksize' => 0,
42
+ 'currentblocktx' => 0,
43
+ 'difficulty' => 11187257.46136079,
44
+ 'errors' => "",
45
+ 'generate' => false,
46
+ 'genproclimit' => -1,
47
+ 'hashespersec' => 0,
48
+ 'pooledtx' => 0,
49
+ 'testnet' => false
50
+ }
51
+ end
52
+ end
53
+
54
+ service 'getblock' do
55
+ it "should produce the expected result" do
56
+ result("0000000000000002e004985f39f929d001448623b312185bf5e4ab50e5a8e60a").should == {
57
+ 'hash' => "0000000000000002e004985f39f929d001448623b312185bf5e4ab50e5a8e60a",
58
+ 'confirmations' => 19,
59
+ 'size' => 5227,
60
+ 'height' => 240707,
61
+ 'version' => 2,
62
+ 'merkleroot' => "18b914e2d6bd4c3118a936af75afbd230611edb6929a607302c0d591ef49b24e",
63
+ 'tx' => [
64
+ "cutforsimplicity",
65
+ "27f99033bdcea87b07f8eea4279d7ce24e479fcb49e9f54e9ffb3721e29838ed"
66
+ ],
67
+ 'time' => Time.utc(2013, 6, 10, 5, 40, 3),
68
+ 'nonce' => 3937756309,
69
+ "bits" => "1a011337",
70
+ "difficulty" => 15605632.68128593,
71
+ "previousblockhash" => "000000000000003fa76b2abdd3036d183d7e24cfb6b543781d59cdca289f6053",
72
+ "nextblockhash" => "0000000000000087a1e962f618f757393930e58a745165033fc9d281b7bb568a"
73
+ }
74
+ end
75
+ end
76
+
37
77
  service 'getblockcount' do
38
78
  it "should produce the expected result" do
39
79
  result.should == 141972
@@ -45,50 +85,50 @@ describe Bitcoin::Client do
45
85
  result.should == 141972
46
86
  end
47
87
  end
48
-
88
+
49
89
  service 'getconnectioncount' do
50
90
  it "should produce the expected result" do
51
91
  result.should == 8
52
92
  end
53
93
  end
54
-
94
+
55
95
  service 'getdifficulty' do
56
96
  it "should produce the expected result" do
57
97
  result.should == 1805700.83619367
58
98
  end
59
99
  end
60
-
100
+
61
101
  service 'getgenerate' do
62
102
  it "should produce the expected result" do
63
103
  result.should be_false
64
104
  end
65
105
  end
66
-
106
+
67
107
  service 'gethashespersec' do
68
108
  it "should produce the expected result" do
69
109
  result.should == 0
70
110
  end
71
111
  end
72
-
112
+
73
113
  service 'listreceivedbyaddress' do
74
114
  context 'without params' do
75
115
  it "should produce the expected result" do
76
116
  result.should == [{
77
117
  'address' => "1234",
78
- 'account' => "",
118
+ 'account' => "",
79
119
  'label' => "",
80
- 'amount' => 0.001,
120
+ 'amount' => 0.001,
81
121
  'confirmations' => 180}]
82
122
  end
83
123
  end
84
-
124
+
85
125
  context 'with minconf 0' do
86
126
  it "should produce the expected result" do
87
127
  result(0).should == [{
88
128
  'address' => "1234",
89
- 'account' => "",
129
+ 'account' => "",
90
130
  'label' => "",
91
- 'amount' => 0.001,
131
+ 'amount' => 0.001,
92
132
  'confirmations' => 180}]
93
133
  end
94
134
  end
@@ -97,12 +137,48 @@ describe Bitcoin::Client do
97
137
  it "should produce the expected result" do
98
138
  result(0, true).should == [{
99
139
  'address' => "1234",
100
- 'account' => "",
140
+ 'account' => "",
101
141
  'label' => "",
102
- 'amount' => 0.001,
142
+ 'amount' => 0.001,
103
143
  'confirmations' => 180}]
104
144
  end
105
145
  end
106
146
  end
147
+
148
+ service 'setaccount' do
149
+ it 'maps the call correctly' do
150
+ subject.api.should_receive(:request).with(*%w(setaccount bitcoinaddress account))
151
+ result('bitcoinaddress', 'account').should be_nil
152
+ end
153
+ end
154
+
155
+ service 'signmessage' do
156
+ context 'success' do
157
+ it "should produce the expected result" do
158
+ result('valid_address', 'message').should == 'Gwz2BAaqdsLTqJsh5a4'
159
+ end
160
+ end
161
+
162
+ context 'invalid address' do
163
+ it "should produce the expected result" do
164
+ lambda { result('invalid_address', 'message').should }.should \
165
+ raise_error Bitcoin::Errors::RPCError
166
+ end
167
+ end
168
+ end
169
+
170
+ service 'verifymessage' do
171
+ context 'success' do
172
+ it "should produce the expected result" do
173
+ result('address', 'message', 'signature').should be_true
174
+ end
175
+ end
176
+
177
+ context 'failure' do
178
+ it "should produce the expected result" do
179
+ result('address', 'message', 'signature').should be_false
180
+ end
181
+ end
182
+ end
107
183
  end
108
184
  end
@@ -1,3 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require 'fakeweb'
2
5
 
3
6
  # bitcoin user settings
@@ -8,8 +11,8 @@ require File.expand_path('../lib/bitcoin-client', File.dirname(__FILE__))
8
11
 
9
12
  Dir[File.expand_path("support/**/*.rb", File.dirname(__FILE__))].each { |f| require f }
10
13
 
11
- FakeWeb.allow_net_connect = false
12
-
13
14
  RSpec.configure do |c|
14
15
  c.include FixturesHelper
16
+ c.before { FakeWeb.allow_net_connect = false }
17
+ c.after { FakeWeb.allow_net_connect = true }
15
18
  end
metadata CHANGED
@@ -1,65 +1,114 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: bitcoin-client
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Colin MacKenzie IV
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-08-22 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rspec
11
+ date: 2013-11-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ type: :development
17
21
  prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - "="
22
- - !ruby/object:Gem::Version
23
- version: 2.6.0
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '0.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.6'
24
48
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
55
+ - !ruby/object:Gem::Dependency
27
56
  name: fakeweb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
28
63
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
32
- - - "="
33
- - !ruby/object:Gem::Version
34
- version: 1.3.0
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
35
76
  type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: rest-client
39
77
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - "="
44
- - !ruby/object:Gem::Version
45
- version: 1.6.3
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rest-client
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
46
90
  type: :runtime
47
- version_requirements: *id003
48
- description: Provides a Ruby library to the complete Bitcoin JSON-RPC API. Implements all methods listed at https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list and lets you set options such as the host and port number, and whether to use SSL.
49
- email:
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Provides a Ruby library to the complete Bitcoin JSON-RPC API. Implements
98
+ all methods listed at https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list
99
+ and lets you set options such as the host and port number, and whether to use SSL.
100
+ email:
50
101
  - sinisterchipmunk@gmail.com
51
102
  executables: []
52
-
53
103
  extensions: []
54
-
55
104
  extra_rdoc_files: []
56
-
57
- files:
105
+ files:
58
106
  - .gitignore
107
+ - .travis.yml
59
108
  - Gemfile
60
109
  - README.rdoc
61
110
  - Rakefile
62
- - bitcoind-client.gemspec
111
+ - bitcoin-client.gemspec
63
112
  - lib/bitcoin-client.rb
64
113
  - lib/bitcoin.rb
65
114
  - lib/bitcoin/api.rb
@@ -72,6 +121,7 @@ files:
72
121
  - spec/fixtures/backupwallet_without_params.json
73
122
  - spec/fixtures/build_fixture.rb
74
123
  - spec/fixtures/getbalance.json
124
+ - spec/fixtures/getblock.json
75
125
  - spec/fixtures/getblockcount.json
76
126
  - spec/fixtures/getblocknumber.json
77
127
  - spec/fixtures/getconnectioncount.json
@@ -79,10 +129,16 @@ files:
79
129
  - spec/fixtures/getgenerate.json
80
130
  - spec/fixtures/gethashespersec.json
81
131
  - spec/fixtures/getinfo.json
132
+ - spec/fixtures/getmininginfo.json
82
133
  - spec/fixtures/help.json
83
134
  - spec/fixtures/listreceivedbyaddress_with_minconf_0.json
84
135
  - spec/fixtures/listreceivedbyaddress_with_minconf_0_and_includeempty_true.json
85
136
  - spec/fixtures/listreceivedbyaddress_without_params.json
137
+ - spec/fixtures/setaccount.json
138
+ - spec/fixtures/signmessage_invalid_address.json
139
+ - spec/fixtures/signmessage_success.json
140
+ - spec/fixtures/verifymessage_failure.json
141
+ - spec/fixtures/verifymessage_success.json
86
142
  - spec/lib/bitcoin/api_spec.rb
87
143
  - spec/lib/bitcoin/client_spec.rb
88
144
  - spec/lib/bitcoin/request_spec.rb
@@ -92,35 +148,32 @@ files:
92
148
  - spec/support/rpc_service_helper.rb
93
149
  homepage: http://github.com/sinisterchipmunk/bitcoin-client
94
150
  licenses: []
95
-
151
+ metadata: {}
96
152
  post_install_message:
97
153
  rdoc_options: []
98
-
99
- require_paths:
154
+ require_paths:
100
155
  - lib
101
- required_ruby_version: !ruby/object:Gem::Requirement
102
- none: false
103
- requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- version: "0"
107
- required_rubygems_version: !ruby/object:Gem::Requirement
108
- none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: "0"
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
113
166
  requirements: []
114
-
115
167
  rubyforge_project: bitcoin-client
116
- rubygems_version: 1.8.5
168
+ rubygems_version: 2.0.3
117
169
  signing_key:
118
- specification_version: 3
170
+ specification_version: 4
119
171
  summary: Provides a Ruby library to the complete Bitcoin JSON-RPC API.
120
- test_files:
172
+ test_files:
121
173
  - spec/fixtures/backupwallet_without_params.json
122
174
  - spec/fixtures/build_fixture.rb
123
175
  - spec/fixtures/getbalance.json
176
+ - spec/fixtures/getblock.json
124
177
  - spec/fixtures/getblockcount.json
125
178
  - spec/fixtures/getblocknumber.json
126
179
  - spec/fixtures/getconnectioncount.json
@@ -128,10 +181,16 @@ test_files:
128
181
  - spec/fixtures/getgenerate.json
129
182
  - spec/fixtures/gethashespersec.json
130
183
  - spec/fixtures/getinfo.json
184
+ - spec/fixtures/getmininginfo.json
131
185
  - spec/fixtures/help.json
132
186
  - spec/fixtures/listreceivedbyaddress_with_minconf_0.json
133
187
  - spec/fixtures/listreceivedbyaddress_with_minconf_0_and_includeempty_true.json
134
188
  - spec/fixtures/listreceivedbyaddress_without_params.json
189
+ - spec/fixtures/setaccount.json
190
+ - spec/fixtures/signmessage_invalid_address.json
191
+ - spec/fixtures/signmessage_success.json
192
+ - spec/fixtures/verifymessage_failure.json
193
+ - spec/fixtures/verifymessage_success.json
135
194
  - spec/lib/bitcoin/api_spec.rb
136
195
  - spec/lib/bitcoin/client_spec.rb
137
196
  - spec/lib/bitcoin/request_spec.rb