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