+// github issue 40
+// BIP32 root key can be set as an xpub
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ page.evaluate(function() {
+ // set xpub for account 0 of bip44 for 'abandon abandon ability'
+ var bip44AccountXpub = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
+ $("#root-key").val(bip44AccountXpub);
+ $("#root-key").trigger("input");
+ });
+ waitForFeedback(function() {
+ page.evaluate(function() {
+ // Use bip32 tab
+ $("#bip32-tab a").click();
+ });
+ waitForGenerate(function() {
+ page.evaluate(function() {
+ // derive external addresses for this xpub
+ var firstAccountDerivationPath = "m/0";
+ $("#bip32-path").val(firstAccountDerivationPath);
+ $("#bip32-path").trigger("input");
+ });
+ waitForGenerate(function() {
+ // check the addresses are generated
+ var expected = "1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug";
+ var actual = page.evaluate(function() {
+ return $(".address:first").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key does not generate addresses in table");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // check the xprv key is not set
+ var expected = "NA";
+ var actual = page.evaluate(function() {
+ return $(".extended-priv-key").val();
+ });
+ if (actual != expected) {
+ console.log("xpub key as root shows derived bip32 xprv key");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // check the private key is not set
+ var expected = "NA";
+ var actual = page.evaluate(function() {
+ return $(".privkey:first").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key generates private key in addresses table");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+ });
+ });
+});
+},
+
+// github issue 40
+// xpub for bip32 root key will not work with hardened derivation paths
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ page.evaluate(function() {
+ // set xpub for account 0 of bip44 for 'abandon abandon ability'
+ var bip44AccountXpub = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
+ $("#root-key").val(bip44AccountXpub);
+ $("#root-key").trigger("input");
+ });
+ waitForFeedback(function() {
+ // Check feedback is correct
+ var expected = "Hardened derivation path is invalid with xpub key";
+ var actual = page.evaluate(function() {
+ return $(".feedback").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key with hardened derivation path does not show feedback");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // Check no addresses are shown
+ var expected = 0;
+ var actual = page.evaluate(function() {
+ return $(".addresses tr").length;
+ });
+ if (actual != expected) {
+ console.log("addresses still show after setting xpub key with hardened derivation path");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},
+
+// github issue 39
+// no root key shows feedback
+function() {
+page.open(url, function(status) {
+ // click the bip32 tab on fresh page
+ page.evaluate(function() {
+ $("#bip32-tab a").click();
+ });
+ waitForFeedback(function() {
+ // Check feedback is correct
+ var expected = "No root key";
+ var actual = page.evaluate(function() {
+ return $(".feedback").text();
+ });
+ if (actual != expected) {
+ console.log("Blank root key not detected");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},
+
+// Github issue 44
+// display error switching tabs while addresses are generating
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ page.evaluate(function() {
+ $(".phrase").val("abandon abandon ability").trigger("input");
+ });
+ waitForGenerate(function() {
+ // set to generate 500 more addresses
+ // generate more addresses
+ // change tabs which should cancel the previous generating
+ page.evaluate(function() {
+ $(".rows-to-add").val("100");
+ $(".more").click();
+ $("#bip32-tab a").click();
+ });
+ // check the derivation paths are in order and of the right quantity
+ waitForGenerate(function() {
+ var paths = page.evaluate(function() {
+ return $(".index").map(function(i, e) {
+ return $(e).text();
+ });
+ });
+ for (var i=0; i<paths.length; i++) {
+ var expected = "m/0/" + i;
+ var actual = paths[i];
+ if (actual != expected) {
+ console.log("Path " + i + " is not in correct order");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ }
+ if (paths.length != 20) {
+ console.log("Generation was not cancelled by new action");
+ fail();
+ }
+ next();
+ });
+ });
+});
+},
+
+// Github issue 49
+// padding for binary should give length with multiple of 256
+// hashed entropy 1111 is length 252, so requires 4 leading zeros
+// prior to issue 49 it would only generate 2 leading zeros, ie missing 2
+function() {
+page.open(url, function(status) {
+ expected = "avocado valid quantum cross link predict excuse edit street able flame large galaxy ginger nuclear"
+ // use entropy
+ page.evaluate(function() {
+ $(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("15");
+ $(".entropy").val("1111").trigger("input");
+ });
+ waitForGenerate(function() {
+ // get the mnemonic
+ var actual = page.evaluate(function() {
+ return $(".phrase").val();
+ });
+ // check the mnemonic is correct
+ if (actual != expected) {
+ console.log("Left padding error for entropy");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},