money-tree 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/money-tree.rb +11 -0
- data/lib/money-tree/address.rb +15 -0
- data/lib/money-tree/key.rb +200 -0
- data/lib/money-tree/networks.rb +15 -0
- data/lib/money-tree/node.rb +232 -0
- data/lib/money-tree/support.rb +109 -0
- data/lib/money-tree/version.rb +3 -0
- data/money-tree.gemspec +25 -0
- data/spec/lib/money-tree/address_spec.rb +52 -0
- data/spec/lib/money-tree/node_spec.rb +542 -0
- data/spec/lib/money-tree/private_key_spec.rb +65 -0
- data/spec/lib/money-tree/public_key_spec.rb +48 -0
- data/spec/lib/money-tree/support_spec.rb +26 -0
- metadata +123 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'money-tree'
|
2
|
+
|
3
|
+
describe MoneyTree::PrivateKey do
|
4
|
+
before do
|
5
|
+
@key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "to_hex" do
|
9
|
+
it "has 64 characters" do
|
10
|
+
@key.to_hex.length.should == 64
|
11
|
+
end
|
12
|
+
|
13
|
+
it "is a valid hex" do
|
14
|
+
@key.to_hex.should == '5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "to_wif" do
|
19
|
+
it "is a 52 character base58 key" do
|
20
|
+
@key.to_wif.length.should == 52
|
21
|
+
end
|
22
|
+
|
23
|
+
it "starts with K or L" do
|
24
|
+
@key.to_wif[0].should == 'K'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "is a valid compressed wif" do
|
28
|
+
@key.to_wif.should == 'KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "to_wif(compressed: false)" do
|
33
|
+
it "is a 51 character base58 key" do
|
34
|
+
@key.to_wif(compressed: false).length.should == 51
|
35
|
+
end
|
36
|
+
|
37
|
+
it "starts with 5" do
|
38
|
+
@key.to_wif(compressed: false)[0].should == '5'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is valid" do
|
42
|
+
@key.to_wif(compressed: false).should == '5JXz5ZyFk31oHVTQxqce7yitCmTAPxBqeGQ4b7H3Aj3L45wUhoa'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "from_wif(wif)" do
|
47
|
+
it "returns the key from a wif" do
|
48
|
+
@key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ").should == '0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "raises an error on bad checksum" do
|
52
|
+
lambda { @key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTBADTJ") }.should raise_error(MoneyTree::Key::InvalidWIFFormat)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "to_base64" do
|
57
|
+
it "has 44 characters" do
|
58
|
+
@key.to_base64.length.should == 44
|
59
|
+
end
|
60
|
+
|
61
|
+
it "is a valid base64" do
|
62
|
+
@key.to_base64.should == 'Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks='
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'money-tree'
|
2
|
+
|
3
|
+
describe MoneyTree::PublicKey do
|
4
|
+
before do
|
5
|
+
@private_key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
|
6
|
+
@key = MoneyTree::PublicKey.new @private_key
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "to_hex(compressed: false)" do
|
10
|
+
it "has 65 bytes" do
|
11
|
+
@key.to_hex(compressed: false).length.should == 130
|
12
|
+
end
|
13
|
+
|
14
|
+
it "is a valid hex" do
|
15
|
+
@key.to_hex(compressed: false).should == '042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "to_hex" do
|
20
|
+
it "has 33 bytes" do
|
21
|
+
@key.to_hex.length.should == 66
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is a valid compressed hex" do
|
25
|
+
@key.to_hex.should == '022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "to_address(compressed: false)" do
|
30
|
+
it "has 34 characters" do
|
31
|
+
@key.to_address(compressed: false).length.should == 34
|
32
|
+
end
|
33
|
+
|
34
|
+
it "is a valid bitcoin address" do
|
35
|
+
@key.to_address(compressed: false).should == '133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "to_compressed_address" do
|
40
|
+
it "has 34 characters" do
|
41
|
+
@key.to_address.length.should == 34
|
42
|
+
end
|
43
|
+
|
44
|
+
it "is a valid compressed bitcoin address" do
|
45
|
+
@key.to_address.should == '13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'money-tree'
|
2
|
+
include MoneyTree::Support
|
3
|
+
|
4
|
+
describe MoneyTree::Support do
|
5
|
+
|
6
|
+
describe "sha256(str)" do
|
7
|
+
it "properly calculates sha256 hash" do
|
8
|
+
sha256("abc", ascii: true).should == "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
9
|
+
sha256("800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d").should == "8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592"
|
10
|
+
sha256("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592").should == "507a5b8dfed0fc6fe8801743720cedec06aa5c6fca72b07c49964492fb98a714"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "ripemd160(str)" do
|
15
|
+
it "properly calculates ripemd160 hash" do
|
16
|
+
ripemd160("abc", ascii: true).should == "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"
|
17
|
+
ripemd160("e8026715af68676e0287ec9aa774f8103e4bddd5505b209263a8ff97c6ea29cc").should == "166db6510884918f31a9d246404760db8154bf84"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "hmac_sha512_hex(key, message)" do
|
22
|
+
it "properly calculates hmac sha512" do
|
23
|
+
hmac_sha512_hex("Jefe", "what do ya want for nothing?").should == "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: money-tree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Micah Winkelspecht
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-09 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'
|
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'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
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: '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'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: A Ruby Gem implementation of Bitcoin HD Wallets
|
70
|
+
email:
|
71
|
+
- winkelspecht@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE.txt
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- lib/money-tree.rb
|
82
|
+
- lib/money-tree/address.rb
|
83
|
+
- lib/money-tree/key.rb
|
84
|
+
- lib/money-tree/networks.rb
|
85
|
+
- lib/money-tree/node.rb
|
86
|
+
- lib/money-tree/support.rb
|
87
|
+
- lib/money-tree/version.rb
|
88
|
+
- money-tree.gemspec
|
89
|
+
- spec/lib/money-tree/address_spec.rb
|
90
|
+
- spec/lib/money-tree/node_spec.rb
|
91
|
+
- spec/lib/money-tree/private_key_spec.rb
|
92
|
+
- spec/lib/money-tree/public_key_spec.rb
|
93
|
+
- spec/lib/money-tree/support_spec.rb
|
94
|
+
homepage: ''
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 2.0.6
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: Bitcoin Hierarchical Deterministic Wallets in Ruby! (Bitcoin standard BIP0032)
|
118
|
+
test_files:
|
119
|
+
- spec/lib/money-tree/address_spec.rb
|
120
|
+
- spec/lib/money-tree/node_spec.rb
|
121
|
+
- spec/lib/money-tree/private_key_spec.rb
|
122
|
+
- spec/lib/money-tree/public_key_spec.rb
|
123
|
+
- spec/lib/money-tree/support_spec.rb
|