bitbank 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -2
- data/VERSION +1 -1
- data/bitbank.gemspec +3 -2
- data/lib/bitbank/account.rb +32 -5
- data/lib/bitbank/client.rb +20 -6
- data/spec/account_spec.rb +24 -1
- data/spec/client_spec.rb +15 -1
- data/spec/fixtures/vcr_cassettes/account/move.yml +59 -0
- data/spec/fixtures/vcr_cassettes/client/new_address.yml +1 -1
- metadata +30 -29
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
###
|
1
|
+
### 0.1.1 / 2011-07-11
|
2
|
+
|
3
|
+
* Added direct account lookup
|
4
|
+
* Added ability to move / transfer funds between accounts
|
5
|
+
|
6
|
+
### 0.1.0 / 2011-07-04
|
2
7
|
|
3
8
|
* get_work specifications added
|
4
9
|
* block_number
|
5
10
|
* connection_count
|
6
11
|
|
7
|
-
|
8
12
|
### 0.0.1 / 2011-06-13
|
9
13
|
|
10
14
|
* Initial release
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/bitbank.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bitbank}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nick Plante"]
|
12
|
-
s.date = %q{2011-07-
|
12
|
+
s.date = %q{2011-07-11}
|
13
13
|
s.description = %q{Easy to use Ruby interface to the Bitcoind JSON-RPC API}
|
14
14
|
s.email = %q{nap@zerosum.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"spec/client_spec.rb",
|
39
39
|
"spec/fixtures/vcr_cassettes/account/address.yml",
|
40
40
|
"spec/fixtures/vcr_cassettes/account/balance.yml",
|
41
|
+
"spec/fixtures/vcr_cassettes/account/move.yml",
|
41
42
|
"spec/fixtures/vcr_cassettes/account/new_address.yml",
|
42
43
|
"spec/fixtures/vcr_cassettes/account/pay.yml",
|
43
44
|
"spec/fixtures/vcr_cassettes/account/transactions.yml",
|
data/lib/bitbank/account.rb
CHANGED
@@ -1,32 +1,59 @@
|
|
1
1
|
module Bitbank
|
2
2
|
class Account
|
3
|
-
attr_reader :name
|
3
|
+
attr_reader :name
|
4
4
|
|
5
|
-
def initialize(client, name, balance=nil)
|
5
|
+
def initialize(client, name, balance=nil, check=false)
|
6
6
|
@client = client
|
7
7
|
@name = name
|
8
|
-
@balance = balance
|
8
|
+
@balance = balance # currently unused
|
9
|
+
|
10
|
+
# validate the address if a check is requested
|
11
|
+
# (bitcoind creates it if it didn't previous exist)
|
12
|
+
address if check
|
9
13
|
end
|
10
14
|
|
15
|
+
# Returns the current bitcoin address for receiving payments to this
|
16
|
+
# account.
|
11
17
|
def address
|
12
18
|
@client.request('getaccountaddress', name)
|
13
19
|
end
|
14
20
|
|
21
|
+
# Returns the balance in this account.
|
15
22
|
def balance
|
16
23
|
@client.balance(name)
|
17
24
|
end
|
18
25
|
|
26
|
+
# Move funds from one account in your wallet to another.
|
27
|
+
# First parameter can either by an account name or an actual account
|
28
|
+
# object.
|
29
|
+
def move(name_or_account, amount)
|
30
|
+
to_name = if name_or_account.is_a?(Bitbank::Account)
|
31
|
+
name_or_account.name
|
32
|
+
else
|
33
|
+
name_or_account
|
34
|
+
end
|
35
|
+
|
36
|
+
@client.request('move', name, to_name, amount)
|
37
|
+
end
|
38
|
+
|
39
|
+
alias :transfer :move
|
40
|
+
|
41
|
+
# Returns a new bitcoin address for receiving payments to this account.
|
19
42
|
def new_address
|
20
43
|
@client.new_address(name)
|
21
44
|
end
|
22
45
|
|
46
|
+
# Send funds from this account to the recipient identified by +address+.
|
47
|
+
# Note that +amount+ is a real and is rounded to 8 decimal places.
|
48
|
+
# Returns the transaction if successful.
|
23
49
|
def pay(address, amount)
|
24
50
|
txid = @client.request('sendfrom', name, address, amount)
|
25
51
|
Transaction.new(@client, txid)
|
26
52
|
end
|
27
53
|
|
28
|
-
|
29
|
-
|
54
|
+
# Returns a list of the most recent transactions for this account.
|
55
|
+
def transactions(count = 10)
|
56
|
+
@client.transactions(name, count)
|
30
57
|
end
|
31
58
|
|
32
59
|
def ==(other)
|
data/lib/bitbank/client.rb
CHANGED
@@ -6,15 +6,21 @@ module Bitbank
|
|
6
6
|
"@#{config[:host]}:#{config[:port]}"
|
7
7
|
end
|
8
8
|
|
9
|
+
# Retrieve a particular named account.
|
10
|
+
def account(name)
|
11
|
+
Bitbank::Account.new(self, name, nil, true)
|
12
|
+
end
|
13
|
+
|
9
14
|
# Returns a list of local accounts.
|
10
15
|
def accounts
|
11
16
|
account_data = request('listaccounts')
|
12
17
|
account_data.map do |account_name, account_value|
|
13
|
-
Account.new(self, account_name, account_value)
|
18
|
+
Account.new(self, account_name, account_value, false)
|
14
19
|
end
|
15
20
|
end
|
16
21
|
|
17
|
-
# If an account is not specified, returns the server's total available
|
22
|
+
# If an account is not specified, returns the server's total available
|
23
|
+
# balance.
|
18
24
|
#
|
19
25
|
# If an account is specified, returns the balance in the account.
|
20
26
|
def balance(account_name=nil)
|
@@ -36,15 +42,16 @@ module Bitbank
|
|
36
42
|
request('getconnectioncount')
|
37
43
|
end
|
38
44
|
|
39
|
-
# Returns the proof-of-work difficulty as a multiple of the minimum
|
45
|
+
# Returns the proof-of-work difficulty as a multiple of the minimum
|
46
|
+
# difficulty.
|
40
47
|
def difficulty
|
41
48
|
request('getdifficulty')
|
42
49
|
end
|
43
50
|
|
44
51
|
# If data is not specified, returns formatted hash data to work on.
|
45
52
|
#
|
46
|
-
# If data is specified, bitcoind will try to solve the block and will
|
47
|
-
# true or false indicating whether or not it was successful.
|
53
|
+
# If data is specified, bitcoind will try to solve the block and will
|
54
|
+
# return true or false indicating whether or not it was successful.
|
48
55
|
def get_work(data=nil)
|
49
56
|
request('getwork', data)
|
50
57
|
end
|
@@ -54,10 +61,17 @@ module Bitbank
|
|
54
61
|
request('getinfo')
|
55
62
|
end
|
56
63
|
|
64
|
+
# Returns a new bitcoin account for receiving payments (along with a new
|
65
|
+
# address).
|
66
|
+
def new_account(name)
|
67
|
+
account(name)
|
68
|
+
end
|
69
|
+
|
57
70
|
# Returns a new bitcoin address for receiving payments.
|
58
71
|
#
|
59
72
|
# If an account is specified (recommended), the new address is added to the
|
60
|
-
# address book so payments received with the address are credited to the
|
73
|
+
# address book so payments received with the address are credited to the
|
74
|
+
# account.
|
61
75
|
def new_address(account_name=nil)
|
62
76
|
request('getnewaddress', account_name)
|
63
77
|
end
|
data/spec/account_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Bitbank::Account" do
|
4
4
|
before(:each) do
|
5
5
|
@client = Bitbank.new(File.join(File.dirname(__FILE__), '..', 'config.yml'))
|
6
|
-
@account = Bitbank::Account.new(@client, 'adent'
|
6
|
+
@account = Bitbank::Account.new(@client, 'adent')
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'should have a name' do
|
@@ -16,6 +16,11 @@ describe "Bitbank::Account" do
|
|
16
16
|
it 'should retrieve the address for this account' do
|
17
17
|
@account.address.should == '1NqwGDRi9Gs4xm1BmPnGeMwgz1CowP6CeQ'
|
18
18
|
end
|
19
|
+
|
20
|
+
it 'should be validated on account creation if a check was requested (default)' do
|
21
|
+
Bitbank::Account.any_instance.expects(:address)
|
22
|
+
Bitbank::Account.new(@client, 'trill', nil, true)
|
23
|
+
end
|
19
24
|
end
|
20
25
|
|
21
26
|
describe 'balance' do
|
@@ -26,6 +31,24 @@ describe "Bitbank::Account" do
|
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
34
|
+
describe 'move' do
|
35
|
+
use_vcr_cassette 'account/move'
|
36
|
+
|
37
|
+
before(:each) do
|
38
|
+
@to_account = Bitbank::Account.new(@client, 'prefect')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should move funds between accounts using an account name' do
|
42
|
+
@account.move('prefect', 0.01).should be_true
|
43
|
+
@to_account.balance.should == 0.01
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should move funds between accounts using an account object' do
|
47
|
+
@account.move(@to_account, 0.01).should be_true
|
48
|
+
@to_account.balance.should == 0.01
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
29
52
|
describe 'new_address' do
|
30
53
|
use_vcr_cassette 'account/new_address'
|
31
54
|
|
data/spec/client_spec.rb
CHANGED
@@ -22,6 +22,13 @@ describe "Bitbank::Client" do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
describe 'account' do
|
26
|
+
it 'should retrieve a named account' do
|
27
|
+
Bitbank::Account.any_instance.expects(:address).returns(true) # check
|
28
|
+
@client.account('newaccount').should == Bitbank::Account.new(@client, 'newaccount')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
25
32
|
describe 'accounts' do
|
26
33
|
use_vcr_cassette 'client/accounts'
|
27
34
|
|
@@ -133,8 +140,15 @@ describe "Bitbank::Client" do
|
|
133
140
|
end
|
134
141
|
end
|
135
142
|
|
143
|
+
describe 'new_account' do
|
144
|
+
it 'should create a new account and a new address' do
|
145
|
+
Bitbank::Account.any_instance.expects(:address).returns(true) # check
|
146
|
+
@client.new_account('newname').should == Bitbank::Account.new(@client, 'newname')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
136
150
|
describe 'new_address' do
|
137
|
-
use_vcr_cassette 'client/new_address'
|
151
|
+
use_vcr_cassette 'client/new_address'
|
138
152
|
|
139
153
|
it 'should create a new address and return it' do
|
140
154
|
@client.new_address.should == '1EzxbYD4rFvZBjUEbtnKZ9KJdrqHB7mkZE'
|
@@ -0,0 +1,59 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: http://testuser:testpass@localhost:8332/
|
6
|
+
body: ! '{"id":"jsonrpc","method":"move","params":["adent","prefect",0.01]}'
|
7
|
+
headers:
|
8
|
+
accept:
|
9
|
+
- ! '*/*; q=0.5, application/xml'
|
10
|
+
accept-encoding:
|
11
|
+
- gzip, deflate
|
12
|
+
content-length:
|
13
|
+
- '66'
|
14
|
+
response: !ruby/struct:VCR::Response
|
15
|
+
status: !ruby/struct:VCR::ResponseStatus
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
date:
|
20
|
+
- Mon, 11 Jul 2011 14:40:40 +0000
|
21
|
+
content-length:
|
22
|
+
- '44'
|
23
|
+
content-type:
|
24
|
+
- application/json
|
25
|
+
server:
|
26
|
+
- bitcoin-json-rpc/0.3.21-beta
|
27
|
+
body: ! '{"result":true,"error":null,"id":"jsonrpc"}
|
28
|
+
|
29
|
+
'
|
30
|
+
http_version: '1.1'
|
31
|
+
- !ruby/struct:VCR::HTTPInteraction
|
32
|
+
request: !ruby/struct:VCR::Request
|
33
|
+
method: :post
|
34
|
+
uri: http://testuser:testpass@localhost:8332/
|
35
|
+
body: ! '{"id":"jsonrpc","method":"getbalance","params":["prefect"]}'
|
36
|
+
headers:
|
37
|
+
accept:
|
38
|
+
- ! '*/*; q=0.5, application/xml'
|
39
|
+
accept-encoding:
|
40
|
+
- gzip, deflate
|
41
|
+
content-length:
|
42
|
+
- '59'
|
43
|
+
response: !ruby/struct:VCR::Response
|
44
|
+
status: !ruby/struct:VCR::ResponseStatus
|
45
|
+
code: 200
|
46
|
+
message: OK
|
47
|
+
headers:
|
48
|
+
date:
|
49
|
+
- Mon, 11 Jul 2011 14:40:40 +0000
|
50
|
+
content-length:
|
51
|
+
- '50'
|
52
|
+
content-type:
|
53
|
+
- application/json
|
54
|
+
server:
|
55
|
+
- bitcoin-json-rpc/0.3.21-beta
|
56
|
+
body: ! '{"result":0.01000000,"error":null,"id":"jsonrpc"}
|
57
|
+
|
58
|
+
'
|
59
|
+
http_version: '1.1'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitbank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-07-
|
12
|
+
date: 2011-07-11 00:00:00.000000000 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
17
|
-
requirement: &
|
17
|
+
requirement: &2156535100 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 1.6.3
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2156535100
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activesupport
|
28
|
-
requirement: &
|
28
|
+
requirement: &2156533820 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 3.0.7
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2156533820
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: i18n
|
39
|
-
requirement: &
|
39
|
+
requirement: &2156532820 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.5.0
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2156532820
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rspec
|
50
|
-
requirement: &
|
50
|
+
requirement: &2156531960 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 2.6.0
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2156531960
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: yard
|
61
|
-
requirement: &
|
61
|
+
requirement: &2156530920 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.6.0
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2156530920
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: bundler
|
72
|
-
requirement: &
|
72
|
+
requirement: &2156529420 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: 1.0.0
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2156529420
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: jeweler
|
83
|
-
requirement: &
|
83
|
+
requirement: &2156527580 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ~>
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: 1.6.2
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *2156527580
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: webmock
|
94
|
-
requirement: &
|
94
|
+
requirement: &2156526680 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ~>
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: 1.6.4
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *2156526680
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: vcr
|
105
|
-
requirement: &
|
105
|
+
requirement: &2156525400 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
108
|
- - ! '>='
|
@@ -110,10 +110,10 @@ dependencies:
|
|
110
110
|
version: 1.10.0
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
|
-
version_requirements: *
|
113
|
+
version_requirements: *2156525400
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
115
|
name: mocha
|
116
|
-
requirement: &
|
116
|
+
requirement: &2156524120 !ruby/object:Gem::Requirement
|
117
117
|
none: false
|
118
118
|
requirements:
|
119
119
|
- - ! '>='
|
@@ -121,10 +121,10 @@ dependencies:
|
|
121
121
|
version: 0.9.12
|
122
122
|
type: :development
|
123
123
|
prerelease: false
|
124
|
-
version_requirements: *
|
124
|
+
version_requirements: *2156524120
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rcov
|
127
|
-
requirement: &
|
127
|
+
requirement: &2156522940 !ruby/object:Gem::Requirement
|
128
128
|
none: false
|
129
129
|
requirements:
|
130
130
|
- - ! '>='
|
@@ -132,10 +132,10 @@ dependencies:
|
|
132
132
|
version: '0'
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
|
-
version_requirements: *
|
135
|
+
version_requirements: *2156522940
|
136
136
|
- !ruby/object:Gem::Dependency
|
137
137
|
name: fuubar
|
138
|
-
requirement: &
|
138
|
+
requirement: &2156521480 !ruby/object:Gem::Requirement
|
139
139
|
none: false
|
140
140
|
requirements:
|
141
141
|
- - ! '>='
|
@@ -143,10 +143,10 @@ dependencies:
|
|
143
143
|
version: 0.0.5
|
144
144
|
type: :development
|
145
145
|
prerelease: false
|
146
|
-
version_requirements: *
|
146
|
+
version_requirements: *2156521480
|
147
147
|
- !ruby/object:Gem::Dependency
|
148
148
|
name: autotest
|
149
|
-
requirement: &
|
149
|
+
requirement: &2156520680 !ruby/object:Gem::Requirement
|
150
150
|
none: false
|
151
151
|
requirements:
|
152
152
|
- - ! '>='
|
@@ -154,7 +154,7 @@ dependencies:
|
|
154
154
|
version: 4.4.6
|
155
155
|
type: :development
|
156
156
|
prerelease: false
|
157
|
-
version_requirements: *
|
157
|
+
version_requirements: *2156520680
|
158
158
|
description: Easy to use Ruby interface to the Bitcoind JSON-RPC API
|
159
159
|
email: nap@zerosum.org
|
160
160
|
executables: []
|
@@ -184,6 +184,7 @@ files:
|
|
184
184
|
- spec/client_spec.rb
|
185
185
|
- spec/fixtures/vcr_cassettes/account/address.yml
|
186
186
|
- spec/fixtures/vcr_cassettes/account/balance.yml
|
187
|
+
- spec/fixtures/vcr_cassettes/account/move.yml
|
187
188
|
- spec/fixtures/vcr_cassettes/account/new_address.yml
|
188
189
|
- spec/fixtures/vcr_cassettes/account/pay.yml
|
189
190
|
- spec/fixtures/vcr_cassettes/account/transactions.yml
|
@@ -221,7 +222,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
221
222
|
version: '0'
|
222
223
|
segments:
|
223
224
|
- 0
|
224
|
-
hash:
|
225
|
+
hash: -404184776927923942
|
225
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
227
|
none: false
|
227
228
|
requirements:
|