X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=tests.js;h=8965f80a8d3935ad0da5bfb333dc77eec6c2327e;hp=13f2c76d4271e1fc28321609b8d3e022560fffc9;hb=d933c3f731ba0f854e07dda73f60c39c70b11526;hpb=bbc29c80f429d7493fdb9cb7987000d633734db5 diff --git a/tests.js b/tests.js index 13f2c76..8965f80 100644 --- a/tests.js +++ b/tests.js @@ -4,7 +4,12 @@ var page = require('webpage').create(); var url = 'src/index.html'; -var testMaxTime = 10000; +var testMaxTime = 20000; + +page.viewportSize = { + width: 1024, + height: 720 +}; page.onResourceError = function(e) { console.log("Error loading " + e.url); @@ -275,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 @@ -303,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 @@ -322,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) { @@ -331,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 @@ -359,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 @@ -387,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 @@ -415,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 @@ -443,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 @@ -471,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 @@ -499,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 @@ -518,16 +571,18 @@ page.open(url, function(status) { }); }, -// Network can be set to dash +// Network can be set to crown function() { page.open(url, function(status) { // set the phrase and coin - var expected = "XdbhtMuGsPSkE6bPdNTHoFSszQKmK4S5LT"; + var expected = "18pWSwSUAQdiwMHUfFZB1fM2xue9X1FqE5"; page.evaluate(function() { $(".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() == "CRW - Crown"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -536,7 +591,7 @@ page.open(url, function(status) { return $(".address:first").text(); }); if (actual != expected) { - console.log("DASH address is incorrect"); + console.log("CRW address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -546,16 +601,18 @@ page.open(url, function(status) { }); }, -// Network can be set to namecoin +// Network can be set to dash function() { page.open(url, function(status) { // set the phrase and coin - var expected = "Mw2vK2Bvex1yYtYF6sfbEg2YGoUc98YUD2"; + var expected = "XdbhtMuGsPSkE6bPdNTHoFSszQKmK4S5LT"; page.evaluate(function() { $(".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() == "DASH - Dash"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -564,7 +621,7 @@ page.open(url, function(status) { return $(".address:first").text(); }); if (actual != expected) { - console.log("Namecoin address is incorrect"); + console.log("DASH address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -574,16 +631,17 @@ page.open(url, function(status) { }); }, -// Network can be set to peercoin function() { page.open(url, function(status) { // set the phrase and coin - var expected = "PVAiioTaK2eDHSEo3tppT9AVdBYqxRTBAm"; + var expected = "yaR52EN4oojdJfBgzWJTymC4uuCLPT29Gw"; page.evaluate(function() { $(".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() == "DASH - Dash Testnet"; + }).prop("selected", true); $(".network").trigger("change"); }); // check the address is generated correctly @@ -592,7 +650,7 @@ page.open(url, function(status) { return $(".address:first").text(); }); if (actual != expected) { - console.log("Peercoin address is incorrect"); + console.log("DASH Testnet address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -602,22 +660,27 @@ page.open(url, function(status) { }); }, -// BIP39 seed is set from phrase +// Network can be set to game function() { page.open(url, function(status) { - // set the phrase - var expected = "20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3"; + // 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 $(".seed").val(); + return $(".address:first").text(); }); if (actual != expected) { - console.log("BIP39 seed is incorrectly generated from mnemonic"); + console.log("GAME address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -627,22 +690,27 @@ page.open(url, function(status) { }); }, -// BIP32 root key is set from phrase +// Network can be set to namecoin function() { page.open(url, function(status) { - // set the phrase - var expected = "xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi"; + // set the phrase and coin + var expected = "Mw2vK2Bvex1yYtYF6sfbEg2YGoUc98YUD2"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "NMC - Namecoin"; + }).prop("selected", true); + $(".network").trigger("change"); }); // check the address is generated correctly waitForGenerate(function() { var actual = page.evaluate(function() { - return $(".root-key").val(); + return $(".address:first").text(); }); if (actual != expected) { - console.log("Root key is incorrectly generated from mnemonic"); + console.log("Namecoin address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -652,78 +720,119 @@ page.open(url, function(status) { }); }, -// Tabs show correct addresses when changed +// Network can be set to peercoin function() { page.open(url, function(status) { - // set the phrase - var expected = "17uQ7s2izWPwBmEVFikTmZUjbBKWYdJchz"; + // set the phrase and coin + var expected = "PVAiioTaK2eDHSEo3tppT9AVdBYqxRTBAm"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "PPC - Peercoin"; + }).prop("selected", true); + $(".network").trigger("change"); }); - // change tabs + // check the address is generated correctly waitForGenerate(function() { - page.evaluate(function() { - $("#bip32-tab a").click(); - }); - // check the address is generated correctly - waitForGenerate(function() { - var actual = page.evaluate(function() { - return $(".address:first").text(); - }); - if (actual != expected) { - console.log("Clicking tab generates incorrect address"); - console.log("Expected: " + expected); - console.log("Actual: " + actual); - fail(); - } - next(); + var actual = page.evaluate(function() { + return $(".address:first").text(); }); + if (actual != expected) { + console.log("Peercoin address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); }); }); }, -// BIP44 derivation path is shown +// Network can be set to ethereum function() { + page.open(url, function(status) { - // set the phrase - var expected = "m/44'/0'/0'/0"; + + // 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"); }); - // check the derivation path of the first address 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 $("#bip44 .path").val(); + return $(".address:first").text(); }); if (actual != expected) { - console.log("BIP44 derivation path is incorrect"); + 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(); }); }); }, -// BIP44 extended private key is shown +// Network can be set to Slimcoin function() { page.open(url, function(status) { - // set the phrase - var expected = "xprvA2DxxvPZcyRvYgZMGS53nadR32mVDeCyqQYyFhrCVbJNjPoxMeVf7QT5g7mQASbTf9Kp4cryvcXnu2qurjWKcrdsr91jXymdCDNxKgLFKJG"; + // 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 BIP44 extended private key + // check the address is generated correctly waitForGenerate(function() { var actual = page.evaluate(function() { - return $(".extended-priv-key").val(); + return $(".address:first").text(); }); if (actual != expected) { - console.log("BIP44 extended private key is incorrect"); + console.log("Slimcoin address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -733,22 +842,27 @@ page.open(url, function(status) { }); }, -// BIP44 extended public key is shown +// Network can be set to Slimcointn function() { page.open(url, function(status) { - // set the phrase - var expected = "xpub6FDKNRvTTLzDmAdpNTc49ia9b4byd6vqCdUa46Fp3vqMcC96uBoufCmZXQLiN5AK3iSCJMhf9gT2sxkpyaPepRuA7W3MujV5tGmF5VfbueM"; + // 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 BIP44 extended public key + // check the address is generated correctly waitForGenerate(function() { var actual = page.evaluate(function() { - return $(".extended-pub-key").val(); + return $(".address:first").text(); }); if (actual != expected) { - console.log("BIP44 extended public key is incorrect"); + console.log("Slimcoin testnet address is incorrect"); console.log("Expected: " + expected); console.log("Actual: " + actual); fail(); @@ -758,139 +872,381 @@ page.open(url, function(status) { }); }, -// BIP44 purpose field changes address list +// Network can be set to bitcoin cash function() { page.open(url, function(status) { - // set the phrase - var expected = "1JbDzRJ2cDT8aat2xwKd6Pb2zzavow5MhF"; + // set the phrase and coin + var expected = "1JKvb6wKtsjNoCRxpZ4DGrbniML7z5U16A"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "BCH - Bitcoin Cash"; + }).prop("selected", true); + $(".network").trigger("change"); }); + // check the address is generated correctly 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(); + var actual = page.evaluate(function() { + return $(".address:first").text(); }); + if (actual != expected) { + console.log("Bitcoin Cash address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); }); }); }, -// BIP44 coin field changes address list +// Network can be set to myriadcoin function() { page.open(url, function(status) { - // set the phrase - var expected = "1F6dB2djQYrxoyfZZmfr6D5voH8GkJTghk"; + // set the phrase and coin + var expected = "MJEswvRR46wh9BoiVj9DzKYMBkCramhoBV"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "XMY - Myriadcoin"; + }).prop("selected", true); + $(".network").trigger("change"); }); + // check the address is generated correctly 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(); + var actual = page.evaluate(function() { + return $(".address:first").text(); }); + if (actual != expected) { + console.log("Myriadcoin address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); }); }); }, -// BIP44 account field changes address list +// Network can be set to pivx function() { page.open(url, function(status) { - // set the phrase - var expected = "1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H"; + // set the phrase and coin + var expected = "DBxgT7faCuno7jmtKuu6KWCiwqsVPqh1tS"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "PIVX - PIVX"; + }).prop("selected", true); + $(".network").trigger("change"); }); + // check the address is generated correctly waitForGenerate(function() { - // change the bip44 purpose field to 45 - page.evaluate(function() { - $("#bip44 .account").val("1"); - $("#bip44 .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("BIP44 account field generates incorrect address"); - console.log("Expected: " + expected); - console.log("Actual: " + actual); - fail(); - } - next(); + var actual = page.evaluate(function() { + return $(".address:first").text(); }); + if (actual != expected) { + console.log("PIVX address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); }); }); }, -// BIP44 change field changes address list +// Network can be set to pivx testnet function() { page.open(url, function(status) { - // set the phrase - var expected = "1KAGfWgqfVbSSXY56fNQ7YnhyKuoskHtYo"; + // set the phrase and coin + var expected = "yB5U384n6dGkVE3by5y9VdvHHPwPg68fQj"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "PIVX - PIVX Testnet"; + }).prop("selected", true); + $(".network").trigger("change"); }); + // check the address is generated correctly waitForGenerate(function() { - // change the bip44 purpose field to 45 - page.evaluate(function() { - $("#bip44 .change").val("1"); - $("#bip44 .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("BIP44 change field generates incorrect address"); - console.log("Expected: " + expected); - console.log("Actual: " + actual); - fail(); - } - next(); + var actual = page.evaluate(function() { + return $(".address:first").text(); }); + if (actual != expected) { + console.log("PIVX Testnet address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); }); }); }, -// BIP32 derivation path can be set +// Network can be set to maza function() { page.open(url, function(status) { - // set the phrase - var expected = "16pYQQdLD1hH4hwTGLXBaZ9Teboi1AGL8L"; + // set the phrase and coin + var expected = "MGW4Bmi2NEm4PxSjgeFwhP9vg18JHoRnfw"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "MAZA - Maza"; + }).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("Maza 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) { + // set the phrase + var expected = "20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".seed").val(); + }); + if (actual != expected) { + console.log("BIP39 seed is incorrectly generated from mnemonic"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP32 root key is set from phrase +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".root-key").val(); + }); + if (actual != expected) { + console.log("Root key is incorrectly generated from mnemonic"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// Tabs show correct addresses when changed +function() { +page.open(url, function(status) { + // set the phrase + var expected = "17uQ7s2izWPwBmEVFikTmZUjbBKWYdJchz"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // change tabs + waitForGenerate(function() { + page.evaluate(function() { + $("#bip32-tab a").click(); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Clicking tab generates incorrect address"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); + }); +}); +}, + +// BIP44 derivation path is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "m/44'/0'/0'/0"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the derivation path of the first address + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip44 .path").val(); + }); + if (actual != expected) { + console.log("BIP44 derivation path is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP44 extended private key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xprvA2DxxvPZcyRvYgZMGS53nadR32mVDeCyqQYyFhrCVbJNjPoxMeVf7QT5g7mQASbTf9Kp4cryvcXnu2qurjWKcrdsr91jXymdCDNxKgLFKJG"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP44 extended private key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".extended-priv-key").val(); + }); + if (actual != expected) { + console.log("BIP44 extended private key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP44 extended public key is shown +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xpub6FDKNRvTTLzDmAdpNTc49ia9b4byd6vqCdUa46Fp3vqMcC96uBoufCmZXQLiN5AK3iSCJMhf9gT2sxkpyaPepRuA7W3MujV5tGmF5VfbueM"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP44 extended public key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".extended-pub-key").val(); + }); + if (actual != expected) { + console.log("BIP44 extended public key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP44 account field changes address list +function() { +page.open(url, function(status) { + // set the phrase + var expected = "1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + waitForGenerate(function() { + // change the bip44 purpose field to 45 + page.evaluate(function() { + $("#bip44 .account").val("1"); + $("#bip44 .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("BIP44 account field generates incorrect address"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); + }); +}); +}, + +// BIP44 change field changes address list +function() { +page.open(url, function(status) { + // set the phrase + var expected = "1KAGfWgqfVbSSXY56fNQ7YnhyKuoskHtYo"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + waitForGenerate(function() { + // change the bip44 purpose field to 45 + page.evaluate(function() { + $("#bip44 .change").val("1"); + $("#bip44 .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("BIP44 change field generates incorrect address"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); + }); +}); +}, + +// BIP32 derivation path can be set +function() { +page.open(url, function(status) { + // set the phrase + var expected = "16pYQQdLD1hH4hwTGLXBaZ9Teboi1AGL8L"; page.evaluate(function() { $(".phrase").val("abandon abandon ability"); $(".phrase").trigger("input"); @@ -1557,20 +1913,23 @@ page.open(url, function(status) { }); }, -// Incorrect BIP32 root key shows error +// Github pull request 48 +// First four letters of word shows that word, not closest +// since first four letters gives unique word in BIP39 wordlist +// eg ille should show illegal, not idle function() { page.open(url, function(status) { - // set the root key + // set the incomplete word page.evaluate(function() { - $(".root-key").val("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpj").trigger("input"); + $(".phrase").val("ille").trigger("input"); }); - // check there is an error shown + // check there is a suggestion shown waitForFeedback(function() { var feedback = page.evaluate(function() { return $(".feedback").text(); }); - if (feedback != "Invalid root key") { - console.log("Invalid root key does not show error"); + if (feedback.indexOf("did you mean illegal?") < 0) { + console.log("Start of word does not show correct suggestion"); console.log("Error: " + error); fail(); } @@ -1579,10 +1938,32 @@ page.open(url, function(status) { }); }, -// Derivation path not starting with m shows error +// Incorrect BIP32 root key shows error function() { page.open(url, function(status) { - // set the mnemonic phrase + // set the root key + page.evaluate(function() { + $(".root-key").val("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpj").trigger("input"); + }); + // check there is an error shown + waitForFeedback(function() { + var feedback = page.evaluate(function() { + return $(".feedback").text(); + }); + if (feedback != "Invalid root key") { + console.log("Invalid root key does not show error"); + console.log("Error: " + error); + fail(); + } + next(); + }); +}); +}, + +// Derivation path not starting with m shows error +function() { +page.open(url, function(status) { + // set the mnemonic phrase page.evaluate(function() { $(".phrase").val("abandon abandon ability").trigger("input"); }); @@ -1748,7 +2129,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 @@ -1791,7 +2175,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 @@ -1822,7 +2209,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 @@ -2149,10 +2539,11 @@ page.open(url, function(status) { catch (e) { return e.message; } - // Leading zeros for card entropy as binary string + // Leading zeros for card entropy as binary string. + // Card entropy is hashed so 2c does not necessarily produce leading zeros. try { e = Entropy.fromString("2c"); - if (e.binaryStr != "00001") { + if (e.binaryStr != "0010") { return "Card entropy as binary has leading zeros"; } } @@ -2184,25 +2575,24 @@ page.open(url, function(status) { // [ cards, binary ] try { var cards = [ - [ "ac", "00000" ], - [ "acac", "00000000000" ], - [ "acac2c", "00000000000000001" ], - [ "acks", "00000110011" ], - [ "acacks", "00000000000110011" ], - [ "2c", "00001" ], - [ "3d", "01111" ], - [ "4h", "11101" ], - [ "5s", "101011" ], - [ "6c", "00101" ], - [ "7d", "10011" ], - [ "8h", "100001" ], - [ "9s", "101111" ], - [ "tc", "01001" ], - [ "jd", "10111" ], - [ "qh", "100101" ], - [ "ks", "110011" ], - [ "ks2c", "101001011101" ], - [ "KS2C", "101001011101" ], + [ "ac", "0101" ], + [ "acqs", "11011100" ], + [ "acks", "01011100" ], + [ "2cac", "11111000" ], + [ "2c", "0010" ], + [ "3d", "0001" ], + [ "4h", "1001" ], + [ "5s", "1001" ], + [ "6c", "0000" ], + [ "7d", "0001" ], + [ "8h", "1011" ], + [ "9s", "0010" ], + [ "tc", "1001" ], + [ "jd", "1111" ], + [ "qh", "0010" ], + [ "ks", "0101" ], + [ "ks2c", "01010100" ], + [ "KS2C", "01010100" ], ]; for (var i=0; i 0) { console.log("Mnemonic length for " + test.strength + " strength is not " + test.words); + console.log("Entropy: " + test.entropy); console.log("Mnemonic: " + mnemonic); fail(); } } - else { + else if ("words" in test) { if (mnemonic.split(" ").length != test.words) { console.log("Mnemonic length for " + test.strength + " strength is not " + test.words); + console.log("Entropy: " + test.entropy); console.log("Mnemonic: " + mnemonic); fail(); } @@ -2946,6 +3386,926 @@ page.open(url, function(status) { }); }, +// Github issue 33 +// https://github.com/iancoleman/bip39/issues/33 +// Final cards should contribute entropy +function() { +page.open(url, function(status) { + // use entropy + page.evaluate(function() { + $(".use-entropy").prop("checked", true).trigger("change"); + $(".entropy").val("7S 9H 9S QH 8C KS AS 7D 7C QD 4S 4D TC 2D 5S JS 3D 8S 8H 4C 3C AC 3S QC 9C JC 7H AD TD JD 6D KH 5C QS 2S 6S 6H JH KD 9D-6C TS TH 4H KC 5H 2H AH 2C 8D 3H 5D").trigger("input"); + }); + // get the mnemonic + waitForGenerate(function() { + var originalPhrase = page.evaluate(function() { + return $(".phrase").val(); + }); + // Set the last 12 cards to be AS + page.evaluate(function() { + $(".addresses").empty(); + $(".entropy").val("7S 9H 9S QH 8C KS AS 7D 7C QD 4S 4D TC 2D 5S JS 3D 8S 8H 4C 3C AC 3S QC 9C JC 7H AD TD JD 6D KH 5C QS 2S 6S 6H JH KD 9D-AS AS AS AS AS AS AS AS AS AS AS AS").trigger("input"); + }); + // get the new mnemonic + waitForGenerate(function() { + var newPhrase = page.evaluate(function() { + return $(".phrase").val(); + }); + // check the phrase has changed + if (newPhrase == originalPhrase) { + console.log("Changing last 12 cards does not change mnemonic"); + console.log("Original:"); + console.log(originalPhrase); + console.log("New:"); + console.log(newPhrase); + fail(); + } + next(); + }); + }); +}); +}, + +// Github issue 35 +// https://github.com/iancoleman/bip39/issues/35 +// QR Code support +function() { +page.open(url, function(status) { + // use entropy + page.evaluate(function() { + $(".generate").click(); + }); + waitForGenerate(function() { + var p = page.evaluate(function() { + // get position of mnemonic element + return $(".phrase").offset(); + }); + p.top = Math.ceil(p.top); + p.left = Math.ceil(p.left); + // check the qr code shows + page.sendEvent("mousemove", p.left+4, p.top+4); + var qrShowing = page.evaluate(function() { + return $(".qr-container").find("canvas").length > 0; + }); + if (!qrShowing) { + console.log("QR Code does not show"); + fail(); + } + // check the qr code hides + page.sendEvent("mousemove", p.left-4, p.top-4); + var qrHidden = page.evaluate(function() { + return $(".qr-container").find("canvas").length == 0; + }); + if (!qrHidden) { + console.log("QR Code does not hide"); + fail(); + } + next(); + }); +}); +}, + +// BIP44 account extendend private key is shown +// github issue 37 - compatibility with electrum +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xprv9yzrnt4zWVJUr1k2VxSPy9ettKz5PpeDMgaVG7UKedhqnw1tDkxP2UyYNhuNSumk2sLE5ctwKZs9vwjsq3e1vo9egCK6CzP87H2cVYXpfwQ"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP44 account extended private key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip44 .account-xprv").val(); + }); + if (actual != expected) { + console.log("BIP44 account extended private key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// BIP44 account extendend public key is shown +// github issue 37 - compatibility with electrum +function() { +page.open(url, function(status) { + // set the phrase + var expected = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf"; + page.evaluate(function() { + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + }); + // check the BIP44 account extended public key + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $("#bip44 .account-xpub").val(); + }); + if (actual != expected) { + console.log("BIP44 account extended public key is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + +// 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