X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=tests.js;h=b6713b040e371803fab23cd47b5b555d7750d6db;hb=6c08f364b30e711feac698546041388325a11834;hp=ace2fbb1f73e21be8692c34dbd351bace4158f26;hpb=5ed50bd903c6b7b45c3a9b831626a0f3d3a1d7d1;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/tests.js b/tests.js index ace2fbb..b6713b0 100644 --- a/tests.js +++ b/tests.js @@ -4,7 +4,7 @@ var page = require('webpage').create(); var url = 'src/index.html'; -var testMaxTime = 10000; +var testMaxTime = 20000; page.viewportSize = { width: 1024, @@ -280,7 +280,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=1]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "BTC - Bitcoin Testnet"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -308,7 +310,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=2]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "LTC - Litecoin"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -327,6 +331,36 @@ page.open(url, function(status) { }); }, +// Network can be set to ripple +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "rLTFnqbmCVPGx6VfaygdtuKWJgcN4v1zRS"; + page.evaluate(function() { + $(".phrase").val("ill clump only blind unit burden thing track silver cloth review awake useful craft whale all satisfy else trophy sunset walk vanish hope valve"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "XRP - Ripple"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Ripple address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + // Network can be set to dogecoin function() { page.open(url, function(status) { @@ -336,7 +370,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=3]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "DOGE - Dogecoin"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -364,7 +400,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=4]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "SDC - ShadowCash"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -392,7 +430,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=5]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "SDC - ShadowCash Testnet"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -420,7 +460,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=6]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "VIA - Viacoin"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -448,7 +490,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=7]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "VIA - Viacoin Testnet"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -476,7 +520,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=8]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "JBS - Jumbucks"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -504,7 +550,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=9]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "CLAM - Clams"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -523,6 +571,36 @@ page.open(url, function(status) { }); }, +// Network can be set to crown +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "18pWSwSUAQdiwMHUfFZB1fM2xue9X1FqE5"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "CRW - Crown"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("CRW address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + // Network can be set to dash function() { page.open(url, function(status) { @@ -532,7 +610,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=10]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "DASH - Dash"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -551,6 +631,65 @@ page.open(url, function(status) { }); }, +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "yaR52EN4oojdJfBgzWJTymC4uuCLPT29Gw"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "DASH - Dash Testnet"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("DASH Testnet address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// Network can be set to game +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "GSMY9bAp36cMR4zyT4uGVS7GFjpdXbao5Q"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "GAME - GameCredits"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("GAME address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + // Network can be set to namecoin function() { page.open(url, function(status) { @@ -560,7 +699,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=11]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "NMC - Namecoin"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -588,7 +729,9 @@ page.open(url, function(status) { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); $(".network option[selected]").removeAttr("selected"); - $(".network option[value=12]").prop("selected", true); + $(".network option").filter(function() { + return $(this).html() == "PPC - Peercoin"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -607,6 +750,128 @@ page.open(url, function(status) { }); }, +// Network can be set to ethereum +function() { + +page.open(url, function(status) { + + // set the phrase and coin + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "ETH - Ethereum"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + waitForGenerate(function() { + // check the address is generated correctly + // this value comes from + // https://www.myetherwallet.com/#view-wallet-info + // Unusual capitalization is due to checksum + var expected = "0xe5815d5902Ad612d49283DEdEc02100Bd44C2772"; + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Ethereum address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + // check the private key is correct + // this private key can be imported into + // https://www.myetherwallet.com/#view-wallet-info + // and it should correlate to the address above + var expected = "0x8f253078b73d7498302bb78c171b23ce7a8fb511987d2b2702b731638a4a15e7"; + var actual = page.evaluate(function() { + return $(".privkey:first").text(); + }); + if (actual != expected) { + console.log("Ethereum privkey is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + // check the public key is correct + // TODO + // don't have any third-party source to generate the expected value + //var expected = "?"; + //var actual = page.evaluate(function() { + // return $(".pubkey:first").text(); + //}); + //if (actual != expected) { + // console.log("Ethereum privkey is incorrect"); + // console.log("Expected: " + expected); + // console.log("Actual: " + actual); + // fail(); + //} + next(); + }); +}); +}, + +// Network can be set to Slimcoin +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "SLM - Slimcoin"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Slimcoin address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// Network can be set to Slimcointn +function() { +page.open(url, function(status) { + // set the phrase and coin + var expected = "n3nMgWufTek5QQAr6uwMhg5xbzj8xqc4Dq"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "SLM - Slimcoin Testnet"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Slimcoin testnet address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + // BIP39 seed is set from phrase function() { page.open(url, function(status) { @@ -763,70 +1028,6 @@ page.open(url, function(status) { }); }, -// BIP44 purpose field changes address list -function() { -page.open(url, function(status) { - // set the phrase - var expected = "1JbDzRJ2cDT8aat2xwKd6Pb2zzavow5MhF"; - page.evaluate(function() { - $(".phrase").val("abandon abandon ability"); - $(".phrase").trigger("input"); - }); - waitForGenerate(function() { - // change the bip44 purpose field to 45 - page.evaluate(function() { - $("#bip44 .purpose").val("45"); - $("#bip44 .purpose").trigger("input"); - }); - waitForGenerate(function() { - // check the address for the new derivation path - var actual = page.evaluate(function() { - return $(".address:first").text(); - }); - if (actual != expected) { - console.log("BIP44 purpose field generates incorrect address"); - console.log("Expected: " + expected); - console.log("Actual: " + actual); - fail(); - } - next(); - }); - }); -}); -}, - -// BIP44 coin field changes address list -function() { -page.open(url, function(status) { - // set the phrase - var expected = "1F6dB2djQYrxoyfZZmfr6D5voH8GkJTghk"; - page.evaluate(function() { - $(".phrase").val("abandon abandon ability"); - $(".phrase").trigger("input"); - }); - waitForGenerate(function() { - // change the bip44 purpose field to 45 - page.evaluate(function() { - $("#bip44 .coin").val("1"); - $("#bip44 .coin").trigger("input"); - }); - waitForGenerate(function() { - // check the address for the new derivation path - var actual = page.evaluate(function() { - return $(".address:first").text(); - }); - if (actual != expected) { - console.log("BIP44 coin field generates incorrect address"); - console.log("Expected: " + expected); - console.log("Actual: " + actual); - fail(); - } - next(); - }); - }); -}); -}, - // BIP44 account field changes address list function() { page.open(url, function(status) { @@ -1778,7 +1979,10 @@ page.open(url, function(status) { waitForGenerate(function() { // 4) switch from bitcoin to litecoin page.evaluate(function() { - $(".network").val("2").trigger("change"); + $(".network option").filter(function() { + return $(this).html() == "LTC - Litecoin"; + }).prop("selected", true); + $(".network").trigger("change"); }); waitForGenerate(function() { // 5) Check derivation path is displayed correctly @@ -1821,7 +2025,10 @@ page.open(url, function(status) { waitForGenerate(function() { // switch from bitcoin to clam page.evaluate(function() { - $(".network").val("9").trigger("change"); + $(".network option").filter(function() { + return $(this).html() == "CLAM - Clams"; + }).prop("selected", true); + $(".network").trigger("change"); }); waitForGenerate(function() { // check derivation path is displayed correctly @@ -1852,7 +2059,10 @@ page.open(url, function(status) { waitForGenerate(function() { // 4) switch from bitcoin to viacoin page.evaluate(function() { - $(".network").val("6").trigger("change"); + $(".network option").filter(function() { + return $(this).html() == "VIA - Viacoin"; + }).prop("selected", true); + $(".network").trigger("change"); }); waitForGenerate(function() { // 5) ensure the derived address is correct @@ -2580,7 +2790,7 @@ page.open(url, function(status) { events: 1, bits: 4, words: 0, - strength: "extremely weak", + strength: "less than a second", }, { entropy: "AAAAAAAA", @@ -2589,7 +2799,7 @@ page.open(url, function(status) { events: 8, bits: 32, words: 3, - strength: "extremely weak", + strength: "less than a second - Repeats like \"aaa\" are easy to guess", }, { entropy: "AAAAAAAA B", @@ -2598,7 +2808,7 @@ page.open(url, function(status) { events: 9, bits: 36, words: 3, - strength: "extremely weak", + strength: "less than a second - Repeats like \"aaa\" are easy to guess", }, { entropy: "AAAAAAAA BBBBBBBB", @@ -2607,7 +2817,7 @@ page.open(url, function(status) { events: 16, bits: 64, words: 6, - strength: "very weak", + strength: "less than a second - Repeats like \"aaa\" are easy to guess", }, { entropy: "AAAAAAAA BBBBBBBB CCCCCCCC", @@ -2616,7 +2826,7 @@ page.open(url, function(status) { events: 24, bits: 96, words: 9, - strength: "weak", + strength: "less than a second", }, { entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD", @@ -2625,7 +2835,7 @@ page.open(url, function(status) { events: 32, bits: 128, words: 12, - strength: "easily cracked", + strength: "2 minutes", }, { entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA", @@ -2634,7 +2844,7 @@ page.open(url, function(status) { events: 32, bits: 128, words: 12, - strength: "strong", + strength: "2 days", }, { entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE", @@ -2643,7 +2853,7 @@ page.open(url, function(status) { events: 40, bits: 160, words: 15, - strength: "very strong", + strength: "3 years", }, { entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF", @@ -2652,7 +2862,7 @@ page.open(url, function(status) { events: 48, bits: 192, words: 18, - strength: "extremely strong", + strength: "centuries", }, { entropy: "7d", @@ -2660,7 +2870,7 @@ page.open(url, function(status) { events: 1, bits: 5, words: 0, - strength: "extremely weak", + strength: "less than a second", }, { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", @@ -2668,7 +2878,7 @@ page.open(url, function(status) { events: 52, bits: 225, words: 21, - strength: "extremely strong", + strength: "centuries", }, { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d", @@ -2676,7 +2886,7 @@ page.open(url, function(status) { events: 53, bits: 254, words: 21, - strength: "extremely strong", + strength: "centuries", }, { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d", @@ -2684,7 +2894,7 @@ page.open(url, function(status) { events: 53, bits: 254, words: 21, - strength: "extremely strong", + strength: "centuries", }, { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d", @@ -2692,7 +2902,7 @@ page.open(url, function(status) { events: 53, bits: 264, words: 24, - strength: "extremely strong", + strength: "centuries", }, // Next test was throwing uncaught error in zxcvbn // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2 @@ -2702,7 +2912,7 @@ page.open(url, function(status) { events: 104, bits: 499, words: 45, - strength: "extremely strong", + strength: "centuries", }, // Case insensitivity to duplicate cards { @@ -2711,7 +2921,7 @@ page.open(url, function(status) { events: 2, bits: 9, words: 0, - strength: "extremely weak", + strength: "less than a second", }, { entropy: "ASas", @@ -2719,7 +2929,7 @@ page.open(url, function(status) { events: 2, bits: 9, words: 0, - strength: "extremely weak", + strength: "less than a second", }, // Missing cards are detected { @@ -2728,7 +2938,7 @@ page.open(url, function(status) { events: 51, bits: 221, words: 18, - strength: "extremely strong", + strength: "centuries", }, { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", @@ -2736,7 +2946,7 @@ page.open(url, function(status) { events: 50, bits: 216, words: 18, - strength: "extremely strong", + strength: "centuries", }, { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", @@ -2744,7 +2954,7 @@ page.open(url, function(status) { events: 48, bits: 208, words: 18, - strength: "extremely strong", + strength: "centuries", }, // More than six missing cards does not show message { @@ -2753,7 +2963,7 @@ page.open(url, function(status) { events: 45, bits: 195, words: 18, - strength: "extremely strong", + strength: "centuries", }, // Multiple decks of cards increases bits per event { @@ -2797,7 +3007,7 @@ page.open(url, function(status) { events: 33, bits: 184, bitsPerEvent: 5.59, - strength: 'easily cracked - Repeats like "abcabcabc" are only slightly harder to guess than "abc"', + strength: 'less than a second - Repeats like "abcabcabc" are only slightly harder to guess than "abc"', }, ]; // use entropy @@ -3118,7 +3328,7 @@ page.open(url, function(status) { // check the BIP44 account extended private key waitForGenerate(function() { var actual = page.evaluate(function() { - return $(".account-xprv").val(); + return $("#bip44 .account-xprv").val(); }); if (actual != expected) { console.log("BIP44 account extended private key is incorrect"); @@ -3144,7 +3354,7 @@ page.open(url, function(status) { // check the BIP44 account extended public key waitForGenerate(function() { var actual = page.evaluate(function() { - return $(".account-xpub").val(); + return $("#bip44 .account-xpub").val(); }); if (actual != expected) { console.log("BIP44 account extended public key is incorrect"); @@ -3359,6 +3569,437 @@ page.open(url, function(status) { }); }, +// Github pull request 55 +// https://github.com/iancoleman/bip39/pull/55 +// Client select +function() { +page.open(url, function(status) { + // set mnemonic and select bip32 tab + page.evaluate(function() { + $("#bip32-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + waitForGenerate(function() { + // BITCOIN CORE + // set bip32 client to bitcoin core + page.evaluate(function() { + var bitcoinCoreIndex = "0"; + $("#bip32-client").val(bitcoinCoreIndex).trigger("change"); + }); + waitForGenerate(function() { + // get the derivation path + var actual = page.evaluate(function() { + return $("#bip32-path").val(); + }); + // check the derivation path is correct + expected = "m/0'/0'" + if (actual != expected) { + console.log("Selecting Bitcoin Core client does not set correct derivation path"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + // get hardened addresses + var usesHardenedAddresses = page.evaluate(function() { + return $(".hardened-addresses").prop("checked"); + }); + // check hardened addresses is selected + if(!usesHardenedAddresses) { + console.log("Selecting Bitcoin Core client does not use hardened addresses"); + fail(); + } + // check input is readonly + var pathIsReadonly = page.evaluate(function() { + return $("#bip32-path").prop("readonly"); + }); + if (!pathIsReadonly) { + console.log("Selecting Bitcoin Core client does not set derivation path to readonly"); + fail(); + } + // MULTIBIT + // set bip32 client to multibit + page.evaluate(function() { + var multibitIndex = "2"; + $("#bip32-client").val(multibitIndex).trigger("change"); + }); + waitForGenerate(function() { + // get the derivation path + var actual = page.evaluate(function() { + return $("#bip32-path").val(); + }); + // check the derivation path is correct + expected = "m/0'/0" + if (actual != expected) { + console.log("Selecting Multibit client does not set correct derivation path"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + // get hardened addresses + var usesHardenedAddresses = page.evaluate(function() { + return $(".hardened-addresses").prop("checked"); + }); + // check hardened addresses is selected + if(usesHardenedAddresses) { + console.log("Selecting Multibit client does not uncheck hardened addresses"); + fail(); + } + // CUSTOM DERIVATION PATH + // check input is not readonly + page.evaluate(function() { + $("#bip32-client").val("custom").trigger("change"); + }); + // do not wait for generate, since there is no change to the + // derivation path there is no new generation performed + var pathIsReadonly = page.evaluate(function() { + return $("#bip32-path").prop("readonly"); + }); + if (pathIsReadonly) { + console.log("Selecting Custom Derivation Path does not allow derivation path input"); + fail(); + } + next(); + }); + }); + }); +}); +}, + +// github issue 58 +// https://github.com/iancoleman/bip39/issues/58 +// bip32 derivation is correct, does not drop leading zeros +// see also +// https://medium.com/@alexberegszaszi/why-do-my-bip32-wallets-disagree-6f3254cc5846 +function() { +page.open(url, function(status) { + // set the phrase and passphrase + var expected = "17rxURoF96VhmkcEGCj5LNQkmN9HVhWb7F"; + // Note that bitcore generates an incorrect address + // 13EuKhffWkBE2KUwcbkbELZb1MpzbimJ3Y + // see the medium.com link above for more details + page.evaluate(function() { + $(".phrase").val("fruit wave dwarf banana earth journey tattoo true farm silk olive fence"); + $(".passphrase").val("banana").trigger("input"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("BIP32 derivation is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + + +// github issue 60 +// Japanese mnemonics generate incorrect bip32 seed +// BIP39 seed is set from phrase +function() { +page.open(url, function(status) { + // set the phrase + var expected = "a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55"; + page.evaluate(function() { + $(".phrase").val("あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あおぞら"); + $("#passphrase").val("メートルガバヴァぱばぐゞちぢ十人十色"); + $("#passphrase").trigger("input"); + }); + // check the seed is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".seed").val(); + }); + if (actual != expected) { + console.log("BIP39 seed is incorrectly generated from Japanese mnemonic"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 official test vectors +// https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#test-vectors +function() { +page.open(url, function(status) { + // set the phrase and select bitcoin testnet + var expected = "2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "BTC - Bitcoin Testnet"; + }).prop("selected", true); + $(".network").trigger("change"); + $(".phrase").trigger("input"); + }); + // check the first address + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("BIP49 address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 derivation path is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "m/49'/0'/0'/0"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + // check the derivation path of the first address + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip49 .path").val(); + }); + if (actual != expected) { + console.log("BIP49 derivation path is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 extended private key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xprvA1hukYsW7QfX9CVsaDAKde4eryajKa4DKWb6m9YjSnqkiZHrahFwwTJfEQTwBQ5kptWT5pZMkkusT1oK8dc1efQ8VFfq4SLSPAWd7Cpt423"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + // check the BIP49 extended private key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".extended-priv-key").val(); + }); + if (actual != expected) { + console.log("BIP49 extended private key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 extended public key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xpub6EhGA4QPwnDpMgaLgEhKzn1PR1RDj2n4gjWhZXxM18NjbMd18EaCVFd95gkLARJaBD2rXAYJED2gdkUbGn1KkrSzCKR554AdABUELoainnt"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + // check the BIP49 extended public key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".extended-pub-key").val(); + }); + if (actual != expected) { + console.log("BIP49 extended public key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 account field changes address list +function() { +page.open(url, function(status) { + // set the phrase + var expected = "381wg1GGN4rP88rNC9v7QWsiww63yLVPsn"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + waitForGenerate(function() { + // change the bip49 account field to 1 + page.evaluate(function() { + $("#bip49 .account").val("1"); + $("#bip49 .account").trigger("input"); + }); + waitForGenerate(function() { + // check the address for the new derivation path + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("BIP49 account field generates incorrect address"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); + }); +}); +}, + +// BIP49 change field changes address list +function() { +page.open(url, function(status) { + // set the phrase + var expected = "3PEM7MiKed5konBoN66PQhK8r3hjGhy9dT"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability").trigger("input"); + }); + waitForGenerate(function() { + // change the bip49 change field to 1 + page.evaluate(function() { + $("#bip49 .change").val("1"); + $("#bip49 .change").trigger("input"); + }); + waitForGenerate(function() { + // check the address for the new derivation path + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("BIP49 change field generates incorrect address"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); + }); +}); +}, + +// BIP49 account extendend private key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xprv9y3uhgQbfQZbj3o98nfgLDwGGuCJjUn7GKArSAZXjKgMjSdYHjQmTyf78s22g6jsGrxXvHB6HJeFyvFSPkuYZajeTGMZVXV6aNLWw2fagCn"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP49 account extended private key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip49 .account-xprv").val(); + }); + if (actual != expected) { + console.log("BIP49 account extended private key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP49 account extendend public key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xpub6C3G7BwVVn7twXscEpCghMszpw2o8wVxdY6TEYy9HfDLcExgqGj21myazAiq6HSmW2F1cBiFqJa3D1cqcDpSh8pbZF5x4iqpd4PyJvd3gjB"; + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP49 account extended public key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip49 .account-xpub").val(); + }); + if (actual != expected) { + console.log("BIP49 account extended public key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// Test selecting coin where bip49 is unavailable (eg CLAM) +function() { +page.open(url, function(status) { + // set the phrase + page.evaluate(function() { + $("#bip49-tab a").click(); + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + waitForGenerate(function() { + // select non-bip49 network, ie CLAM network + page.evaluate(function() { + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "CLAM - Clams"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the BIP49 error is shown + var bip49ErrorShown = page.evaluate(function() { + var bip49hidden = $("#bip49 .available").hasClass("hidden"); + bip49hidden = bip49hidden && !($("#bip49 .unavailable").hasClass("hidden")); + return bip49hidden; + }); + if (!bip49ErrorShown) { + console.log("BIP49 error not shown for non-bip49 network"); + fail(); + } + // check there are no addresses shown + var addressCount = page.evaluate(function() { + return $(".address").length; + }); + if (addressCount != 0) { + console.log("BIP49 address count for non-bip49 network is " + addressCount); + fail(); + } + // check the derived keys are blank + var areBlank = page.evaluate(function() { + var prvKeyIsBlank = $(".extended-priv-key").val().length == 0; + var pubKeyIsBlank = $(".extended-pub-key").val().length == 0; + return prvKeyIsBlank && pubKeyIsBlank; + }); + if (!areBlank) { + console.log("BIP49 extended keys for non-bip49 network are not blank "); + fail(); + } + next(); + }); +}); +}, + // If you wish to add more tests, do so here... // Here is a blank test template