X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=tests%2Fspec%2Ftests.js;h=80add739b978ad652968fcd1080c0fe17306c7bc;hp=0b07b4c90c3d1fd4e3f8e8c874d862255ff28187;hb=680b94c1efc9a70d82f611de3e0c3043b395b9dc;hpb=1f354b0390a77992424be11f225ab1827b64ef0e diff --git a/tests/spec/tests.js b/tests/spec/tests.js index 0b07b4c..80add73 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -30,9 +30,10 @@ var until = webdriver.until; var newDriver = null; var driver = null; // Delays in ms -var generateDelay = 1000; +var generateDelay = 1500; var feedbackDelay = 500; var entropyFeedbackDelay = 500; +var bip38delay = 15000; // url uses file:// scheme var path = require('path') @@ -422,6 +423,13 @@ it('Allows selection of dogecoin', function(done) { }; testNetwork(done, params); }); +it('Allows selection of denarius', function(done) { + var params = { + selectText: "DNR - Denarius", + firstAddress: "DFdFMVUMzU9xX88EywXvAGwjiwpxyh9vKb", + }; + testNetwork(done, params); +}); it('Allows selection of shadowcash', function(done) { var params = { selectText: "SDC - ShadowCash", @@ -492,6 +500,13 @@ it('Allows selection of game', function(done) { }; testNetwork(done, params); }); +it('Allows selection of komodo', function(done) { + var params = { + selectText: "KMD - Komodo", + firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t", + }; + testNetwork(done, params); +}); it('Allows selection of namecoin', function(done) { var params = { selectText: "NMC - Namecoin", @@ -499,6 +514,13 @@ it('Allows selection of namecoin', function(done) { }; testNetwork(done, params); }); +it('Allows selection of onixcoin', function(done) { + var params = { + selectText: "ONX - Onixcoin", + firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk", + }; + testNetwork(done, params); +}); it('Allows selection of peercoin', function(done) { var params = { selectText: "PPC - Peercoin", @@ -580,7 +602,42 @@ it('Allows selection of nubits', function(done) { it('Allows selection of bitcoin gold', function(done) { var params = { selectText: "BTG - Bitcoin Gold", - firstAddress: "GWYxuwSqANWGV3WT7Gpr6HE91euYXBqtwQ", + firstAddress: "GdDqug4WUsn5syNbSTHatNn4XnuwZtzedx", + }; + testNetwork(done, params); +}); +it('Allows selection of monacoin', function(done) { + var params = { + selectText: "MONA - Monacoin", + firstAddress: "MKMiMr7MyjDKjJbCBzgF6u4ByqTS4NkRB1", + }; + testNetwork(done, params); +}); +it('Allows selection of AXE', function(done) { + var params = { + selectText: "AXE - Axe", + firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7", + }; + testNetwork(done, params); +}); +it('Allows selection of BlackCoin', function(done) { + var params = { + selectText: "BLK - BlackCoin", + firstAddress: "B5MznAKwj7uQ42vDz3w4onhBXPcqhTwJ9z", + }; + testNetwork(done, params); +}); +it('Allows selection of Neblio', function(done) { + var params = { + selectText: "NEBL - Neblio", + firstAddress: "NefkeEEvhusbHMmTRrxx7H9wFnUXd8qQsE", + }; + testNetwork(done, params); +}); +it('Allows selection of Beetlecoin', function(done) { + var params = { + selectText: "BEET - Beetlecoin", + firstAddress: "BVmtbEsGrjpknprmpHFq26z4kYHJUFHE71", }; testNetwork(done, params); }); @@ -912,13 +969,13 @@ it('Can generate more rows in the table', function(done) { // A custom number of additional addresses can be generated it('Can generate more rows in the table', function(done) { - driver.findElement(By.css('.rows-to-add')) - .clear(); - driver.findElement(By.css('.rows-to-add')) - .sendKeys('1'); driver.findElement(By.css('.phrase')) .sendKeys('abandon abandon ability'); driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.rows-to-add')) + .clear(); + driver.findElement(By.css('.rows-to-add')) + .sendKeys('1'); driver.findElement(By.css('.more')) .click(); driver.sleep(generateDelay).then(function() { @@ -2138,10 +2195,11 @@ it('Can change details while old addresses are still being generated', function( driver.findElement(By.css('.phrase')) .sendKeys("abandon abandon ability"); driver.sleep(generateDelay).then(function() { - // generate more addresses - driver.findElement(By.css('.more')) - .click(); // change tabs which should cancel the previous generating + driver.findElement(By.css('.rows-to-add')) + .clear(); + driver.findElement(By.css('.rows-to-add')) + .sendKeys('20'); driver.findElement(By.css('#bip32-tab a')) .click() driver.sleep(generateDelay).then(function() { @@ -2154,7 +2212,7 @@ it('Can change details while old addresses are still being generated', function( }); }); }); -}); +}, generateDelay + 5000); // Github issue 49 // padding for binary should give length with multiple of 256 @@ -2466,11 +2524,11 @@ it('Shows error for hardened addresses with xpub root key', function(done) { }); }); -// Litecoin uses xprv by default, and can optionally be set to ltpv +// Litecoin uses ltub by default, and can optionally be set to xprv // github issue 96 // https://github.com/iancoleman/bip39/issues/96 // Issue with extended keys on Litecoin -it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) { +it('Uses ltub by default for litecoin, but can be set to xprv', function(done) { driver.findElement(By.css('.phrase')) .sendKeys("abandon abandon ability"); selectNetwork("LTC - Litecoin"); @@ -2479,17 +2537,17 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) { driver.findElement(By.css('.root-key')) .getAttribute("value") .then(function(rootKey) { - expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi"); + expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU"); // set litecoin to use ltub driver.executeScript(function() { - $(".litecoin-use-ltub").prop("checked", true); + $(".litecoin-use-ltub").prop("checked", false); $(".litecoin-use-ltub").trigger("change"); }); driver.sleep(generateDelay).then(function() { driver.findElement(By.css('.root-key')) .getAttribute("value") .then(function(rootKey) { - expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU"); + expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi"); done(); }); }) @@ -2497,31 +2555,6 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) { }); }); -// BIP32 tab can use P2WPKH Nested In P2SH -// github issue 91 part 2 -// https://github.com/iancoleman/bip39/issues/91 -// generate new addresses from xpub? -it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) { - // use p2wpkh addresses - driver.executeScript(function() { - $(".p2wpkh-nested-in-p2sh").prop("checked", true); - }); - // use bip32 tab - driver.findElement(By.css('#bip32-tab a')) - .click() - // use testnet - selectNetwork("BTC - Bitcoin Testnet"); - // Set root xpub to BIP49 official test vector account 0 - driver.findElement(By.css('.root-key')) - .sendKeys("tpubDD7tXK8KeQ3YY83yWq755fHY2JW8Ha8Q765tknUM5rSvjPcGWfUppDFMpQ1ScziKfW3ZNtZvAD7M3u7bSs7HofjTD3KP3YxPK7X6hwV8Rk2"); - driver.sleep(generateDelay).then(function() { - getFirstAddress(function(address) { - expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2"); - done(); - }); - }); -}); - // github issue 99 // https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159 // "warn me emphatically when they have detected invalid input" to the entropy field @@ -2570,4 +2603,369 @@ it('Can use bitpay format for bitcoin cash addresses', function(done) { }); }); +// End of tests ported from old suit, so no more comments above each test now + +it('Can generate more addresses from a custom index', function(done) { + var expectedIndexes = [ + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, + 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 + ]; + driver.findElement(By.css('.phrase')) + .sendKeys("abandon abandon ability"); + driver.sleep(generateDelay).then(function() { + // Set start of next lot of rows to be from index 40 + // which means indexes 20-39 will not be in the table. + driver.findElement(By.css('.more-rows-start-index')) + .sendKeys("40"); + driver.findElement(By.css('.more')) + .click(); + driver.sleep(generateDelay).then(function() { + // Check actual indexes in the table match the expected pattern + driver.findElements(By.css(".index")) + .then(function(els) { + expect(els.length).toBe(expectedIndexes.length); + var testRowAtIndex = function(i) { + if (i >= expectedIndexes.length) { + done(); + } + else { + els[i].getText() + .then(function(actualPath) { + var noHardened = actualPath.replace(/'/g, ""); + var pathBits = noHardened.split("/") + var lastBit = pathBits[pathBits.length-1]; + var actualIndex = parseInt(lastBit); + var expectedIndex = expectedIndexes[i]; + expect(actualIndex).toBe(expectedIndex); + testRowAtIndex(i+1); + }); + } + } + testRowAtIndex(0); + }); + }); + }); +}); + +it('Can generate BIP141 addresses with P2WPKH-in-P2SH semanitcs', function(done) { + // Sourced from BIP49 official test specs + driver.findElement(By.css('#bip141-tab a')) + .click(); + driver.findElement(By.css('.bip141-path')) + .clear(); + driver.findElement(By.css('.bip141-path')) + .sendKeys("m/49'/1'/0'/0"); + selectNetwork("BTC - Bitcoin Testnet"); + driver.findElement(By.css(".phrase")) + .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2"); + done(); + }); + }); +}); + +it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) { + // This result tested against bitcoinjs-lib test spec for segwit address + // using the first private key of this mnemonic and default path m/0 + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50 + // so whilst not directly comparable, substituting the private key produces + // identical results between this tool and the bitcoinjs-lib test. + // Private key generated is: + // L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP + driver.findElement(By.css('#bip141-tab a')) + .click(); + // Choose P2WPKH + driver.executeScript(function() { + $(".bip141-semantics option[selected]").removeAttr("selected"); + $(".bip141-semantics option").filter(function(i,e) { + return $(e).html() == "P2WPKH"; + }).prop("selected", true); + $(".bip141-semantics").trigger("change"); + }); + driver.findElement(By.css(".phrase")) + .sendKeys("abandon abandon ability"); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9"); + done(); + }); + }); +}); + +it('Shows the entropy used by the PRNG when clicking generate', function(done) { + driver.findElement(By.css('.generate')).click(); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.entropy')) + .getAttribute("value") + .then(function(entropy) { + expect(entropy).not.toBe(""); + done(); + }); + }); +}); + +it('Shows the index of each word in the mnemonic', function(done) { + driver.findElement(By.css('.phrase')) + .sendKeys("abandon abandon ability"); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.use-entropy')) + .click(); + driver.findElement(By.css('.word-indexes')) + .getText() + .then(function(indexes) { + expect(indexes).toBe("0, 0, 1"); + done(); + }); + }); +}); + +it('Shows the derivation path for bip84 tab', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('#bip84 .path')) + .getAttribute("value") + .then(function(path) { + expect(path).toBe("m/84'/0'/0'/0"); + done(); + }) + }); +}); + +it('Shows the extended private key for bip84 tab', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.extended-priv-key')) + .getAttribute("value") + .then(function(path) { + expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP"); + done(); + }) + }); +}); + +it('Shows the extended public key for bip84 tab', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.extended-pub-key')) + .getAttribute("value") + .then(function(path) { + expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx"); + done(); + }) + }); +}); + +it('Changes the address list if bip84 account is changed', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('#bip84 .account')) + .sendKeys('1'); + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662"); + done(); + }); + }); +}); + +it('Changes the address list if bip84 change is changed', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('#bip84 .change')) + .sendKeys('1'); + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2"); + done(); + }); + }); +}); + +it('Passes the official BIP84 test spec for rootpriv', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css(".root-key")) + .getAttribute("value") + .then(function(rootKey) { + expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5"); + done(); + }) + }); +}); + +it('Passes the official BIP84 test spec for account 0 xprv', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css("#bip84 .account-xprv")) + .getAttribute("value") + .then(function(rootKey) { + expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE"); + done(); + }) + }); +}); + +it('Passes the official BIP84 test spec for account 0 xpub', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css("#bip84 .account-xpub")) + .getAttribute("value") + .then(function(rootKey) { + expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs"); + done(); + }) + }); +}); + +it('Passes the official BIP84 test spec for account 0 first address', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu"); + done(); + }); + }); +}); + +it('Passes the official BIP84 test spec for account 0 first change address', function(done) { + driver.findElement(By.css('#bip84-tab a')) + .click() + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'); + driver.findElement(By.css('#bip84 .change')) + .sendKeys('1'); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el"); + done(); + }); + }); +}); + +it('Can display the table as csv', function(done) { + var headings = "path,address,public key,private key"; + var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE"; + var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab"; + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.csv')) + .getAttribute("value") + .then(function(csv) { + expect(csv).toContain(headings); + expect(csv).toContain(row1); + expect(csv).toContain(row20); + done(); + }); + }); +}); + +it('LeftPads ethereum keys that are less than 32 bytes', function(done) { + // see https://github.com/iancoleman/bip39/issues/155 + selectNetwork("ETH - Ethereum"); + driver.findElement(By.css('#bip32-tab a')) + .click() + driver.findElement(By.css('#bip32-path')) + .clear(); + driver.findElement(By.css('#bip32-path')) + .sendKeys("m/44'/60'/0'"); + driver.findElement(By.css('.phrase')) + .sendKeys('scout sort custom elite radar rare vivid thing trophy gesture cover snake change narrow kite list nation sustain buffalo erode open balance system young'); + driver.sleep(generateDelay).then(function() { + getFirstAddress(function(address) { + expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118"); + done(); + }); + }); +}); + +it('Can encrypt private keys using BIP38', function(done) { + // see https://github.com/iancoleman/bip39/issues/140 + driver.executeScript(function() { + $(".use-bip38").prop("checked", true); + }); + driver.findElement(By.css('.bip38-password')) + .sendKeys('bip38password'); + driver.findElement(By.css('.rows-to-add')) + .clear(); + driver.findElement(By.css('.rows-to-add')) + .sendKeys('1'); + driver.findElement(By.css('.phrase')) + .sendKeys('abandon abandon ability'); + driver.sleep(bip38delay).then(function() { + // address + getFirstRowValue(function(address) { + expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB"); + // pubkey + getFirstRowValue(function(pubkey) { + expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1"); + // privkey + getFirstRowValue(function(privkey) { + expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM"); + done(); + }, ".privkey"); + }, ".pubkey"); + }, ".address"); + }); +}, bip38delay + 5000); + +it('Shows the checksum for the entropy', function(done) { + driver.findElement(By.css('.use-entropy')) + .click(); + driver.findElement(By.css('.entropy')) + .sendKeys("00000000000000000000000000000000"); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.checksum')) + .getText() + .then(function(text) { + expect(text).toBe("1"); + done(); + }); + }); +}); + +it('Shows the checksum for the entropy with the correct groupings', function(done) { + driver.findElement(By.css('.use-entropy')) + .click(); + // create a checksum of 20 bits, which spans multiple words + driver.findElement(By.css('.entropy')) + .sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + driver.sleep(generateDelay).then(function() { + driver.findElement(By.css('.checksum')) + .getText() + .then(function(text) { + // first group is 9 bits, second group is 11 + expect(text).toBe("011010111 01110000110"); + done(); + }); + }); +}); + });