spec/money-tree/node_spec.rb in money-tree-0.11.1 vs spec/money-tree/node_spec.rb in money-tree-0.11.2
- old
+ new
@@ -119,10 +119,108 @@
expect(@master.to_serialized_hex).to eql("0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2")
expect(@master.to_bip32).to eql("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8")
end
end
+ describe "m/2147483648" do
+ before do
+ @node = @master.node_for_path "m/2147483648"
+ end
+
+ it "has an index of 2147483648" do
+ expect(@node.index).to eql(2147483648)
+ end
+
+ it "is private" do
+ expect(@node.is_private?).to eql(true)
+ end
+
+ it "has a depth of 1" do
+ expect(@node.depth).to eql(1)
+ end
+
+ it "generates subnode" do
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
+ expect(@node.to_fingerprint).to eql("5c1bd648")
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
+ expect(@node.to_p2wpkh_p2sh).to eql("3AbBmNbPDSzeZKHywDrH3h5v2rL8xGfT7e")
+ expect(@node.to_bech32_address).to eql("bc1qtsdavj8dyw49l4gt554jg47pr60gpf48ww2ens")
+ end
+
+ it "generates a private key" do
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
+ expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
+ end
+
+ it "generates a public key" do
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
+ end
+
+ it "generates a chain code" do
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
+ end
+
+ it "generates a serialized private key" do
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
+ expect(@node.to_bip32(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
+ end
+
+ it "generates a serialized public_key" do
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
+ end
+ end
+
+ describe "m/-0" do
+ before do
+ @node = @master.node_for_path "m/-0"
+ end
+
+ it "has an index of 2147483648" do
+ expect(@node.index).to eql(2147483648)
+ end
+
+ it "is private" do
+ expect(@node.is_private?).to eql(true)
+ end
+
+ it "has a depth of 1" do
+ expect(@node.depth).to eql(1)
+ end
+
+ it "generates subnode" do
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
+ expect(@node.to_fingerprint).to eql("5c1bd648")
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
+ expect(@node.to_p2wpkh_p2sh).to eql("3AbBmNbPDSzeZKHywDrH3h5v2rL8xGfT7e")
+ expect(@node.to_bech32_address).to eql("bc1qtsdavj8dyw49l4gt554jg47pr60gpf48ww2ens")
+ end
+
+ it "generates a private key" do
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
+ expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
+ end
+
+ it "generates a public key" do
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
+ end
+
+ it "generates a chain code" do
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
+ end
+
+ it "generates a serialized private key" do
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
+ expect(@node.to_bip32(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
+ end
+
+ it "generates a serialized public_key" do
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
+ end
+ end
+
describe "m/0p" do
before do
@node = @master.node_for_path "m/0p"
end
@@ -1208,9 +1306,38 @@
describe "#node_for_path" do
it "correctly derives from a node with a chain code represented in 31 bytes" do
@node = MoneyTree::Node.from_bip32 "tpubD6NzVbkrYhZ4WM42MZZmUZ7LjxyjBf5bGjEeLf9nJnMZqocGJWu94drvpqWsE9jE7k3h22v6gjpPGnqgBrqwGsRYwDXVRfQ2M9dfHbXP5zA"
@subnode = @node.node_for_path("m/1")
expect(@subnode.to_bip32(network: :bitcoin_testnet)).to eql("tpubDA7bCxb3Nrcz2ChXyPqXxbG4q5oiAZUHR7wD3LAiXukuxmT65weWw84XYmjhkJTkJEM6LhNWioWTpKEkQp7j2fgVccj3PPc271xHDeMsaTY")
+ end
+ end
+ end
+
+ describe "deriving a parent node" do
+ before do
+ @master = MoneyTree::Master.new seed_hex: "000102030405060708090a0b0c0d0e0f"
+ @node = @master.node_for_path("m/101p")
+ @subnode = @node.node_for_path("1")
+ end
+ context "m/101'/1 -> m/101'" do
+ it "correctly derives from a subnode with priv key to a node knowing it's public key" do
+ node_priv_hex = @node.private_key.to_hex
+ @node.strip_private_info!
+ expect(@subnode.derive_parent_node(@node).private_key.to_hex).to eq(node_priv_hex)
+ end
+ end
+ context "m/101' -> master" do
+ it "unable to derive from a hardened node with priv key to a master node knowing it's public key" do
+ master_priv_hex = @master.private_key.to_hex
+ @master.strip_private_info!
+ expect(@node.derive_parent_node(@master).private_key.to_hex).to_not eq(master_priv_hex)
+ end
+ end
+ context "m/101 -> master" do
+ it "correctly derives from a non-hardened node with priv key to a master node knowing it's public key" do
+ @node = @master.node_for_path("m/101")
+ master_priv_hex = @master.private_key.to_hex
+ expect(@node.derive_parent_node(@master).private_key.to_hex).to eq(master_priv_hex)
end
end
end
end
end