]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blob - tests/spec/tests.js
Add Sugarchain support
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / tests / spec / tests.js
1 // Usage:
2 // cd /path/to/repo/tests
3 // jasmine spec/tests.js
4 //
5 // Dependencies:
6 // nodejs
7 // selenium
8 // jasmine
9 // see https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode#Automated_testing_with_headless_mode
10
11 // USER SPECIFIED OPTIONS
12 var browser = process.env.BROWSER; //"firefox"; // or "chrome"
13 if (!browser) {
14 console.log("Browser can be set via environment variable, eg");
15 console.log("BROWSER=firefox jasmine spec/tests.js");
16 console.log("Options for BROWSER are firefox chrome");
17 console.log("Using default browser: chrome");
18 browser = "chrome";
19 }
20 else {
21 console.log("Using browser: " + browser);
22 }
23
24 // Globals
25
26 var webdriver = require('selenium-webdriver');
27 var By = webdriver.By;
28 var Key = webdriver.Key;
29 var until = webdriver.until;
30 var newDriver = null;
31 var driver = null;
32 // Delays in ms
33 var generateDelay = 1500;
34 var feedbackDelay = 500;
35 var entropyFeedbackDelay = 500;
36 var bip38delay = 15000;
37
38 // url uses file:// scheme
39 var path = require('path')
40 var parentDir = path.resolve(process.cwd(), '..', 'src', 'index.html');
41 var url = "file://" + parentDir;
42 if (browser == "firefox") {
43 // TODO loading local html in firefox is broken
44 console.log("Loading local html in firefox is broken, see https://stackoverflow.com/q/46367054");
45 console.log("You must run a server in this case, ie do this:");
46 console.log("$ cd /path/to/bip39/src");
47 console.log("$ python -m http.server");
48 url = "http://localhost:8000";
49 }
50
51 // Variables dependent on specific browser selection
52
53 if (browser == "firefox") {
54 var firefox = require('selenium-webdriver/firefox');
55 var binary = new firefox.Binary(firefox.Channel.NIGHTLY);
56 binary.addArguments("-headless");
57 newDriver = function() {
58 return new webdriver.Builder()
59 .forBrowser('firefox')
60 .setFirefoxOptions(new firefox.Options().setBinary(binary))
61 .build();
62 }
63 }
64 else if (browser == "chrome") {
65 var chrome = require('selenium-webdriver/chrome');
66 newDriver = function() {
67 return new webdriver.Builder()
68 .forBrowser('chrome')
69 .setChromeOptions(new chrome.Options().addArguments("headless"))
70 .build();
71 }
72 }
73
74 // Helper functions
75
76 function testNetwork(done, params) {
77 var phrase = params.phrase || 'abandon abandon ability';
78 driver.findElement(By.css('.phrase'))
79 .sendKeys(phrase);
80 selectNetwork(params.selectText);
81 driver.sleep(generateDelay).then(function() {
82 getFirstAddress(function(address) {
83 getFirstPublicKey(function(pubkey) {
84 getFirstPrivateKey(function(privkey) {
85 if ("firstAddress" in params) {
86 expect(address).toBe(params.firstAddress);
87 }
88 if ("firstPubKey" in params) {
89 expect(pubkey).toBe(params.firstPubKey);
90 }
91 if ("firstPrivKey" in params) {
92 expect(privkey).toBe(params.firstPrivKey);
93 }
94 done();
95 });
96 });
97 });
98 });
99 }
100
101 function getFirstRowValue(handler, selector) {
102 driver.findElements(By.css(selector))
103 .then(function(els) {
104 els[0].getText()
105 .then(handler);
106 })
107 }
108
109 function getFirstAddress(handler) {
110 getFirstRowValue(handler, ".address");
111 }
112
113 function getFirstPublicKey(handler) {
114 getFirstRowValue(handler, ".pubkey");
115 }
116
117 function getFirstPrivateKey(handler) {
118 getFirstRowValue(handler, ".privkey");
119 }
120
121 function getFirstPath(handler) {
122 getFirstRowValue(handler, ".index");
123 }
124
125 function testColumnValuesAreInvisible(done, columnClassName) {
126 var selector = "." + columnClassName + " span";
127 driver.findElements(By.css(selector))
128 .then(function(els) {
129 els[0].getAttribute("class")
130 .then(function(classes) {
131 expect(classes).toContain("invisible");
132 done();
133 });
134 })
135 }
136
137 function testRowsAreInCorrectOrder(done) {
138 driver.findElements(By.css('.index'))
139 .then(function(els) {
140 var testRowAtIndex = function(i) {
141 if (i >= els.length) {
142 done();
143 }
144 else {
145 els[i].getText()
146 .then(function(actualPath) {
147 var noHardened = actualPath.replace(/'/g, "");
148 var pathBits = noHardened.split("/")
149 var lastBit = pathBits[pathBits.length-1];
150 var actualIndex = parseInt(lastBit);
151 expect(actualIndex).toBe(i);
152 testRowAtIndex(i+1);
153 });
154 }
155 }
156 testRowAtIndex(0);
157 });
158 }
159
160 function selectNetwork(name) {
161 driver.executeScript(function() {
162 var selectText = arguments[0];
163 $(".network option[selected]").removeAttr("selected");
164 $(".network option").filter(function(i,e) {
165 return $(e).html() == selectText;
166 }).prop("selected", true);
167 $(".network").trigger("change");
168 }, name);
169 }
170
171 function testEntropyType(done, entropyText, entropyTypeUnsafe) {
172 // entropy type is compiled into regexp so needs escaping
173 // see https://stackoverflow.com/a/2593661
174 var entropyType = (entropyTypeUnsafe+'').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
175 driver.findElement(By.css('.use-entropy'))
176 .click();
177 driver.findElement(By.css('.entropy'))
178 .sendKeys(entropyText);
179 driver.sleep(generateDelay).then(function() {
180 driver.findElement(By.css('.entropy-container'))
181 .getText()
182 .then(function(text) {
183 var re = new RegExp("Entropy Type\\s+" + entropyType);
184 expect(text).toMatch(re);
185 done();
186 });
187 });
188 }
189
190 function testEntropyBits(done, entropyText, entropyBits) {
191 driver.findElement(By.css('.use-entropy'))
192 .click();
193 driver.findElement(By.css('.entropy'))
194 .sendKeys(entropyText);
195 driver.sleep(generateDelay).then(function() {
196 driver.findElement(By.css('.entropy-container'))
197 .getText()
198 .then(function(text) {
199 var re = new RegExp("Total Bits\\s+" + entropyBits);
200 expect(text).toMatch(re);
201 done();
202 });
203 });
204 }
205
206 function testEntropyFeedback(done, entropyDetail) {
207 // entropy type is compiled into regexp so needs escaping
208 // see https://stackoverflow.com/a/2593661
209 if ("type" in entropyDetail) {
210 entropyDetail.type = (entropyDetail.type+'').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
211 }
212 driver.findElement(By.css('.use-entropy'))
213 .click();
214 driver.findElement(By.css('.entropy'))
215 .sendKeys(entropyDetail.entropy);
216 driver.sleep(entropyFeedbackDelay).then(function() {
217 driver.findElement(By.css('.entropy-container'))
218 .getText()
219 .then(function(text) {
220 driver.findElement(By.css('.phrase'))
221 .getAttribute("value")
222 .then(function(phrase) {
223 if ("filtered" in entropyDetail) {
224 var key = "Filtered Entropy";
225 var value = entropyDetail.filtered;
226 var reText = key + "\\s+" + value;
227 var re = new RegExp(reText);
228 expect(text).toMatch(re);
229 }
230 if ("type" in entropyDetail) {
231 var key = "Entropy Type";
232 var value = entropyDetail.type;
233 var reText = key + "\\s+" + value;
234 var re = new RegExp(reText);
235 expect(text).toMatch(re);
236 }
237 if ("events" in entropyDetail) {
238 var key = "Event Count";
239 var value = entropyDetail.events;
240 var reText = key + "\\s+" + value;
241 var re = new RegExp(reText);
242 expect(text).toMatch(re);
243 }
244 if ("bits" in entropyDetail) {
245 var key = "Total Bits";
246 var value = entropyDetail.bits;
247 var reText = key + "\\s+" + value;
248 var re = new RegExp(reText);
249 expect(text).toMatch(re);
250 }
251 if ("bitsPerEvent" in entropyDetail) {
252 var key = "Bits Per Event";
253 var value = entropyDetail.bitsPerEvent;
254 var reText = key + "\\s+" + value;
255 var re = new RegExp(reText);
256 expect(text).toMatch(re);
257 }
258 if ("words" in entropyDetail) {
259 var actualWords = phrase.split(/\s+/)
260 .filter(function(w) { return w.length > 0 })
261 .length;
262 expect(actualWords).toBe(entropyDetail.words);
263 }
264 if ("strength" in entropyDetail) {
265 var key = "Time To Crack";
266 var value = entropyDetail.strength;
267 var reText = key + "\\s+" + value;
268 var re = new RegExp(reText);
269 expect(text).toMatch(re);
270 }
271 done();
272 });
273 });
274 });
275 }
276
277 function testClientSelect(done, params) {
278 // set mnemonic and select bip32 tab
279 driver.findElement(By.css('#bip32-tab a'))
280 .click()
281 driver.findElement(By.css('.phrase'))
282 .sendKeys("abandon abandon ability");
283 driver.sleep(generateDelay).then(function() {
284 // BITCOIN CORE
285 // set bip32 client to bitcoin core
286 driver.executeScript(function() {
287 $("#bip32-client").val(arguments[0]).trigger("change");
288 }, params.selectValue);
289 driver.sleep(generateDelay).then(function() {
290 // check the derivation path is correct
291 driver.findElement(By.css("#bip32-path"))
292 .getAttribute("value")
293 .then(function(path) {
294 expect(path).toBe(params.bip32path);
295 // check hardened addresses is selected
296 driver.findElement(By.css(".hardened-addresses"))
297 .getAttribute("checked")
298 .then(function(isChecked) {
299 expect(isChecked).toBe(params.useHardenedAddresses);
300 // check input is readonly
301 driver.findElement(By.css("#bip32-path"))
302 .getAttribute("readonly")
303 .then(function(isReadonly) {
304 expect(isReadonly).toBe("true");
305 done();
306 });
307 });
308 });
309 });
310 });
311 }
312
313 // Tests
314
315 describe('BIP39 Tool Tests', function() {
316
317 beforeEach(function(done) {
318 driver = newDriver();
319 driver.get(url).then(done);
320 });
321
322 // Close the website after each test is run (so that it is opened fresh each time)
323 afterEach(function(done) {
324 driver.quit().then(done);
325 });
326
327 // BEGIN TESTS
328
329 // Page initially loads with blank phrase
330 it('Should load the page', function(done) {
331 driver.findElement(By.css('.phrase'))
332 .getAttribute('value').then(function(value) {
333 expect(value).toBe('');
334 done();
335 });
336 });
337
338 // Page has text
339 it('Should have text on the page', function(done) {
340 driver.findElement(By.css('body'))
341 .getText()
342 .then(function(text) {
343 var textToFind = "You can enter an existing BIP39 mnemonic";
344 expect(text).toContain(textToFind);
345 done();
346 });
347 });
348
349 // Entering mnemonic generates addresses
350 it('Should have a list of addresses', function(done) {
351 driver.findElement(By.css('.phrase'))
352 .sendKeys('abandon abandon ability');
353 driver.sleep(generateDelay).then(function() {
354 driver.findElements(By.css('.address'))
355 .then(function(els) {
356 expect(els.length).toBe(20);
357 done();
358 })
359 });
360 });
361
362 // Generate button generates random mnemonic
363 it('Should be able to generate a random mnemonic', function(done) {
364 // initial phrase is blank
365 driver.findElement(By.css('.phrase'))
366 .getAttribute("value")
367 .then(function(phrase) {
368 expect(phrase.length).toBe(0);
369 // press generate
370 driver.findElement(By.css('.generate')).click();
371 driver.sleep(generateDelay).then(function() {
372 // new phrase is not blank
373 driver.findElement(By.css('.phrase'))
374 .getAttribute("value")
375 .then(function(phrase) {
376 expect(phrase.length).toBeGreaterThan(0);
377 done();
378 });
379 });
380 });
381 });
382
383 // Mnemonic length can be customized
384 it('Should allow custom length mnemonics', function(done) {
385 // set strength to 6
386 driver.executeScript(function() {
387 $(".strength option[selected]").removeAttr("selected");
388 $(".strength option[value=6]").prop("selected", true);
389 });
390 driver.findElement(By.css('.generate')).click();
391 driver.sleep(generateDelay).then(function() {
392 driver.findElement(By.css('.phrase'))
393 .getAttribute("value")
394 .then(function(phrase) {
395 var words = phrase.split(" ");
396 expect(words.length).toBe(6);
397 done();
398 });
399 });
400 });
401
402 // Passphrase can be set
403 it('Allows a passphrase to be set', function(done) {
404 driver.findElement(By.css('.phrase'))
405 .sendKeys('abandon abandon ability');
406 driver.findElement(By.css('.passphrase'))
407 .sendKeys('secure_passphrase');
408 driver.sleep(generateDelay).then(function() {
409 getFirstAddress(function(address) {
410 expect(address).toBe("15pJzUWPGzR7avffV9nY5by4PSgSKG9rba");
411 done();
412 })
413 });
414 });
415
416 // Network can be set to networks other than bitcoin
417 it('Allows selection of bitcoin testnet', function(done) {
418 var params = {
419 selectText: "BTC - Bitcoin Testnet",
420 phrase: "abandon abandon ability",
421 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
422 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
423 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
424 };
425 testNetwork(done, params);
426 });
427 it('Allows selection of bitcoin regtest', function(done) {
428 var params = {
429 selectText: "BTC - Bitcoin RegTest",
430 phrase: "abandon abandon ability",
431 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
432 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
433 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
434 };
435 testNetwork(done, params);
436 });
437 it('Allows selection of litecoin', function(done) {
438 var params = {
439 selectText: "LTC - Litecoin",
440 phrase: "abandon abandon ability",
441 firstAddress: "LQ4XU8RX2ULPmPq9FcUHdVmPVchP9nwXdn",
442 firstPubKey: "028e27f074a8f4b85c07f944330bd59ec1b2dd7f88bb28182720cab6d2a5a5ff30",
443 firstPrivKey: "T9ShR6Z2vyEMHVgpeoif857LdMUZDKvzux3QMvD4EjpPYUV5TuEx",
444 };
445 testNetwork(done, params);
446 });
447 it('Allows selection of litecoin testnet', function(done) {
448 var params = {
449 selectText: "LTCt - Litecoin Testnet",
450 phrase: "abandon abandon ability",
451 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
452 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
453 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
454 };
455 testNetwork(done, params);
456 });
457 it('Allows selection of ripple', function(done) {
458 var params = {
459 selectText: "XRP - Ripple",
460 phrase: "ill clump only blind unit burden thing track silver cloth review awake useful craft whale all satisfy else trophy sunset walk vanish hope valve",
461 firstAddress: "rLTFnqbmCVPGx6VfaygdtuKWJgcN4v1zRS",
462 firstPubKey: "0393ebfc2f75dd5757456a7ff7b907571693c9e3807ea386be68688b9c5fac072e",
463 firstPrivKey: "a869f16215c3cd7b6c5f448344bc8688cba70b734bbe189b2c48098a2c15dd53",
464 };
465 testNetwork(done, params);
466 });
467 it('Allows selection of jingtum', function(done) {
468 var params = {
469 selectText: "SWTC - Jingtum",
470 phrase: "ill clump only blind unit burden thing track silver cloth review awake useful craft whale all satisfy else trophy sunset walk vanish hope valve",
471 firstAddress: "jffSYWyxcr9t6DHHdAj2yUXrCsioU66xjm",
472 firstPubKey: "029dfcb278148874dd7e7109001593d7f410909e7bbcbcc3cc19ecb476c8bf8d84",
473 firstPrivKey: "02bdfe14bdd75514e714db7b8cbbae87b2ab8d7a050c3e441d687b7c4ef17d1f",
474 };
475 testNetwork(done, params);
476 });
477 it('Allows selection of casinocoin', function(done) {
478 var params = {
479 selectText: "CSC - CasinoCoin",
480 phrase: "ill clump only blind unit burden thing track silver cloth review awake useful craft whale all satisfy else trophy sunset walk vanish hope valve",
481 firstAddress: "c3P5EUb27Pzk9dcGt4s7zQDQj4sC6Y81mT",
482 firstPubKey: "038ca5b4ff9d58059423b5a03deb2a9b755a311e97dc36ae8ab3d4ed93c808daf7",
483 firstPrivKey: "127fa93d8e4f434ce76faebc961df7ec081a68de19e96f36d38766e468b35920",
484 };
485 testNetwork(done, params);
486 });
487 it('Allows selection of dogecoin', function(done) {
488 var params = {
489 selectText: "DOGE - Dogecoin",
490 phrase: "abandon abandon ability",
491 firstAddress: "DPQH2AtuzkVSG6ovjKk4jbUmZ6iXLpgbJA",
492 firstPubKey: "02d3d540cc62d5102887d26f2b129947f2bd2306dd9b76242c61ca65e5ca408899",
493 firstPrivKey: "QNv5TAoR6EodkN86FXaLDosy4Rau4sJ46JxE9NtUYtmKPLTuRmpc",
494 };
495 testNetwork(done, params);
496 });
497 it('Allows selection of dogecoin testnet', function(done) {
498 var params = {
499 selectText: "DOGEt - Dogecoin Testnet",
500 phrase: "abandon abandon ability",
501 firstAddress: "niHnSJKHdwDyDxRMLBJrtNqpvHEsAFWe6B",
502 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
503 firstPrivKey: "cnCsx3G1NgXZGhijCRNupM1tts1aDNnQsr9e5jB5JnYv2yEDTwT5",
504 };
505 testNetwork(done, params);
506 });
507 it('Allows selection of denarius', function(done) {
508 var params = {
509 selectText: "DNR - Denarius",
510 phrase: "abandon abandon ability",
511 firstAddress: "DFdFMVUMzU9xX88EywXvAGwjiwpxyh9vKb",
512 firstPubKey: "0285cda45afbf0b8897a5cedf97cbb1e2b63b0ac28cd1e919ea60fb748bc61e8d5",
513 firstPrivKey: "QX3Dy3b7C3vNWYDBPk8Hewp3ii2NukAopsHFCCsLZ6Ss77vzdoMj",
514 };
515 testNetwork(done, params);
516 });
517 it('Allows selection of shadowcash', function(done) {
518 var params = {
519 selectText: "SDC - ShadowCash",
520 phrase: "abandon abandon ability",
521 firstAddress: "SiSZtfYAXEFvMm3XM8hmtkGDyViRwErtCG",
522 firstPubKey: "024d48659b83ff20fc250e7f111742e652aa71b73f3ff8d41b5f3ea99cb8ef9e3c",
523 firstPrivKey: "VJzJ98j5pdjzpY9DVRvU2RiRcvQ4t2oYYd9w9WUdiUJjvPs9X83v",
524 };
525 testNetwork(done, params);
526 });
527 it('Allows selection of shadowcash testnet', function(done) {
528 var params = {
529 selectText: "SDC - ShadowCash Testnet",
530 phrase: "abandon abandon ability",
531 firstAddress: "tM2EDpVKaTiEg2NZg3yKg8eqjLr55BErHe",
532 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
533 firstPrivKey: "erKhxJJbpqMUuwuUwUuQxnLiNwphuEabA2sTv62QBV6syc1coTeS",
534 };
535 testNetwork(done, params);
536 });
537 it('Allows selection of viacoin', function(done) {
538 var params = {
539 selectText: "VIA - Viacoin",
540 phrase: "abandon abandon ability",
541 firstAddress: "Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT",
542 firstPubKey: "0223abcae630e23afd7ce0dc399906ca00f984b3be475fbf3f3995e708b0b75392",
543 firstPrivKey: "WX5sbp26uyFDa4Bt5DgPqvQuRjrwc95DYzG7ZHXsdtooFAUhd3xV",
544 };
545 testNetwork(done, params);
546 });
547 it('Allows selection of viacoin testnet', function(done) {
548 var params = {
549 selectText: "VIA - Viacoin Testnet",
550 phrase: "abandon abandon ability",
551 firstAddress: "tM2EDpVKaTiEg2NZg3yKg8eqjLr55BErHe",
552 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
553 firstPrivKey: "erKhxJJbpqMUuwuUwUuQxnLiNwphuEabA2sTv62QBV6syc1coTeS",
554 };
555 testNetwork(done, params);
556 });
557 it('Allows selection of jumbucks', function(done) {
558 var params = {
559 selectText: "JBS - Jumbucks",
560 phrase: "abandon abandon ability",
561 firstAddress: "JLEXccwDXADK4RxBPkRez7mqsHVoJBEUew",
562 firstPubKey: "02e9e84c68e2247d87c863f5697676af9c0f2dacc3fe774a24188f37311b679059",
563 firstPrivKey: "SPcmbuyWp5ukQLbnDyaVr8WuPfmLUEVZN9e2r7X96i31twrn8BBQ",
564 };
565 testNetwork(done, params);
566 });
567 it('Allows selection of clam', function(done) {
568 var params = {
569 selectText: "CLAM - Clams",
570 phrase: "abandon abandon ability",
571 firstAddress: "xCp4sakjVx4pUAZ6cBCtuin8Ddb6U1sk9y",
572 firstPubKey: "03f6189ef4ae7f15ead1a579201c63845cf3efc4745d6abf58aa5584163b2dd070",
573 firstPrivKey: "LoqdpeyYzFoGqQag6Ya4BkMT9KQJK1ygQFbKj3x2meaWe6Xzen15",
574 };
575 testNetwork(done, params);
576 });
577 it('Allows selection of crown', function(done) {
578 var params = {
579 selectText: "CRW - Crown (Legacy)",
580 phrase: "abandon abandon ability",
581 firstAddress: "18pWSwSUAQdiwMHUfFZB1fM2xue9X1FqE5",
582 firstPubKey: "034246d561c53eb1a2afbd9df6403d6fd8a70b36016e0307eae28095a465eaa602",
583 firstPrivKey: "L2oSEFimb9QJB38eGD1xL8zKZAa1cTYGFGXMi4yJBqKmYvpjcuJs",
584 };
585 testNetwork(done, params);
586 });
587 it('Allows selection of crown', function(done) {
588 var params = {
589 selectText: "CRW - Crown",
590 phrase: "abandon abandon ability",
591 firstAddress: "CRWKnVmVhvH1KWTYe6sq8xV4dFGcFpBEEkPQ",
592 firstPubKey: "034246d561c53eb1a2afbd9df6403d6fd8a70b36016e0307eae28095a465eaa602",
593 firstPrivKey: "L2oSEFimb9QJB38eGD1xL8zKZAa1cTYGFGXMi4yJBqKmYvpjcuJs",
594 };
595 testNetwork(done, params);
596 });
597 it('Allows selection of dash', function(done) {
598 var params = {
599 selectText: "DASH - Dash",
600 phrase: "abandon abandon ability",
601 firstAddress: "XdbhtMuGsPSkE6bPdNTHoFSszQKmK4S5LT",
602 firstPubKey: "0270009f37337f15603103ce90111f32f44ddd87525017a93ec6170abb784be2ff",
603 firstPrivKey: "XGqEiiVo1w6Us3YN8KRthyLxdnBH1W6JpLkcxoX2w2zQMYFDKSua",
604 };
605 testNetwork(done, params);
606 });
607 it('Allows selection of dash testnet', function(done) {
608 var params = {
609 selectText: "DASH - Dash Testnet",
610 phrase: "abandon abandon ability",
611 firstAddress: "yaR52EN4oojdJfBgzWJTymC4uuCLPT29Gw",
612 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
613 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
614 };
615 testNetwork(done, params);
616 });
617 it('Allows selection of game', function(done) {
618 var params = {
619 selectText: "GAME - GameCredits",
620 phrase: "abandon abandon ability",
621 firstAddress: "GSMY9bAp36cMR4zyT4uGVS7GFjpdXbao5Q",
622 firstPubKey: "03d173ea00b6688f7d7c2afdcbc720b227aa8b9b87e5f7145139acaa9f0a0dc447",
623 firstPrivKey: "Raixm9wAKFjw9rnPKcXkymQ5iEdMZBRdrvjm8zLpqacS7LUeXBwZ",
624 };
625 testNetwork(done, params);
626 });
627 it('Allows selection of komodo', function(done) {
628 var params = {
629 selectText: "KMD - Komodo",
630 phrase: "abandon abandon ability",
631 firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
632 firstPubKey: "03bd652582a446ce9a697e74da9429eabe6e70bbe3d300b9ef227df7430e83b6fc",
633 firstPrivKey: "UxHzU8KCfSDrQgreujv1vGrqpbvx5jrjSz7bNWjWoT7D3V4uWo4i",
634 };
635 testNetwork(done, params);
636 });
637 it('Allows selection of namecoin', function(done) {
638 var params = {
639 selectText: "NMC - Namecoin",
640 phrase: "abandon abandon ability",
641 firstAddress: "Mw2vK2Bvex1yYtYF6sfbEg2YGoUc98YUD2",
642 firstPubKey: "0398066486fe87cbcb9da8e29d180b44937b6c43ad1ec4d3bddd77b7905765937e",
643 firstPrivKey: "L4A8sSkrGndiXyZdj6Fnju8Wu76s96cdHHmPxV3C5M2R2w4GVNco",
644 };
645 testNetwork(done, params);
646 });
647 it('Allows selection of onixcoin', function(done) {
648 var params = {
649 selectText: "ONX - Onixcoin",
650 phrase: "abandon abandon ability",
651 firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
652 firstPubKey: "035349f2912e3290898d6e00807704254f256127e59a2930367c403b3b9ae5afbd",
653 firstPrivKey: "X8hzuyWvi2F6UQQ5MNiQo2taYwKwZvJRurTBV6smahx2ikLksLPm",
654 };
655 testNetwork(done, params);
656 });
657 it('Allows selection of lkrcoin', function(done) {
658 var params = {
659 selectText: "LKR - Lkrcoin",
660 phrase: "abandon abandon ability",
661 firstAddress: "LfbT296e7AEEnn4bYDbL535Nd8P9g98CdJ",
662 firstPubKey: "03328d3800456372224ec54b033ace88bfd4c19a684204147404063839a02ab7e8",
663 firstPrivKey: "TANp1xRA3qCdRfZc8THM8HMKZivevNz8BEXmA8YxemqXj1YzHmDS",
664 };
665 testNetwork(done, params);
666 });
667 it('Allows selection of bolivarcoin', function(done) {
668 var params = {
669 selectText: "BOLI - Bolivarcoin",
670 phrase: "abandon abandon ability",
671 firstAddress: "bbKzCAUR7hZ3nqfffy7VgrSz8LmAP3S5mK",
672 firstPubKey: "0328a72574c709cc183ffccb8f17c0383caf937ce67e7c3411cdf8ca2e5fc2bf8f",
673 firstPrivKey: "YYwA99QgwZu9zNJBxYbG43GzeE8kEREb7S1dpnFcBJG1W5sR1W9T",
674 };
675 testNetwork(done, params);
676 });
677 it('Allows selection of peercoin', function(done) {
678 var params = {
679 selectText: "PPC - Peercoin",
680 phrase: "abandon abandon ability",
681 firstAddress: "PVAiioTaK2eDHSEo3tppT9AVdBYqxRTBAm",
682 firstPubKey: "02035b1d7f7683a03be1a6009c4572b24a3ba114afb8caff278881af77c4cba362",
683 firstPrivKey: "UCcQgeBjh7GpqukSRcXrx54Q41BJYkWY6PSdm6CtCUFYD5bS9qZS",
684 };
685 testNetwork(done, params);
686 });
687 it('Allows selection of ethereum', function(done) {
688 var params = {
689 selectText: "ETH - Ethereum",
690 phrase: "abandon abandon ability",
691 firstAddress: "0xe5815d5902Ad612d49283DEdEc02100Bd44C2772",
692 firstPubKey: "0x03e723e5b3aa7d72213f01139aa4783e1b34f74e1a04534e3fd8e29bfe2768af8a",
693 firstPrivKey: "0x8f253078b73d7498302bb78c171b23ce7a8fb511987d2b2702b731638a4a15e7",
694 };
695 testNetwork(done, params);
696 });
697 it('Allows selection of slimcoin', function(done) {
698 var params = {
699 selectText: "SLM - Slimcoin",
700 phrase: "abandon abandon ability",
701 firstAddress: "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww",
702 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
703 firstPrivKey: "BTPTMvgoTgsAxpoQE4VCJAq5TYMnLbX5mDodFSaF7ceq6suK13pk",
704 };
705 testNetwork(done, params);
706 });
707 it('Allows selection of slimcoin testnet', function(done) {
708 var params = {
709 selectText: "SLM - Slimcoin Testnet",
710 phrase: "abandon abandon ability",
711 firstAddress: "n3nMgWufTek5QQAr6uwMhg5xbzj8xqc4Dq",
712 firstPubKey: "024557a9693da0354c5f77e57a0b2aac9c20b15cc322bec85faa2ec45438415c90",
713 firstPrivKey: "DvJeEkHzJzysYFtUdgETgWHprG63ATFWRtG2R9xfBJ6bZ2fHcJSU",
714 };
715 testNetwork(done, params);
716 });
717 it('Allows selection of bitcoin cash', function(done) {
718 var params = {
719 selectText: "BCH - Bitcoin Cash",
720 phrase: "abandon abandon ability",
721 firstAddress: "bitcoincash:qzlquk7w4hkudxypl4fgv8x279r754dkvur7jpcsps",
722 firstPubKey: "02b1cbe8aba996d77d4c33fa2e3bf1f6ae80576aa587aa74d87092b1dbdf2aa067",
723 firstPrivKey: "KxbCheZjSzF48zyka4QK1ToSYmz3REZiePU6FPc99qqFs8WuHyVY",
724 };
725 testNetwork(done, params);
726 });
727
728 it('Allows selection of simpleledger(SLP)', function(done) {
729 var params = {
730 selectText: "SLP - Simple Ledger Protocol",
731 phrase: "abandon abandon ability",
732 firstAddress: "simpleledger:qrtffz6ajfsn74gpur7y3epjquz42pvww5acewqmre",
733 firstPubKey: "03c8310ef78a379ce91ed3d7998e1f356dbcb089869f9c9d8f8571b0d8414acbdc",
734 firstPrivKey: "L2q3Bvqe6kBRSqUaJpew7pLacnWjsJdUk7hwV1bTdDu665gXHDj6",
735 };
736 testNetwork(done, params);
737 });
738
739 it('Allows selection of myriadcoin', function(done) {
740 var params = {
741 selectText: "XMY - Myriadcoin",
742 phrase: "abandon abandon ability",
743 firstAddress: "MJEswvRR46wh9BoiVj9DzKYMBkCramhoBV",
744 firstPubKey: "037ad798b3173b0af46acddd1501ed53ce654840f29e4710c3081134b1193f811b",
745 firstPrivKey: "TMMUiQ3yqes7wjWvCro1Ghbu7eFXm8wQgX89v4Wgxm5qFZJAVEVD",
746 };
747 testNetwork(done, params);
748 });
749 it('Allows selection of pivx', function(done) {
750 var params = {
751 selectText: "PIVX - PIVX",
752 phrase: "abandon abandon ability",
753 firstAddress: "DBxgT7faCuno7jmtKuu6KWCiwqsVPqh1tS",
754 firstPubKey: "022583478df6a5ac35380e7cdcd9f7ab0d43f5eb82452d4aa1f74f04c810fcde8c",
755 firstPrivKey: "YVdYDdkuTbra4EVRLWoBUCCm9WMLuXZy3ZpK6iDBCi13ttreZ4cD",
756 };
757 testNetwork(done, params);
758 });
759 it('Allows selection of pivx testnet', function(done) {
760 var params = {
761 selectText: "PIVX - PIVX Testnet",
762 phrase: "abandon abandon ability",
763 firstAddress: "yB5U384n6dGkVE3by5y9VdvHHPwPg68fQj",
764 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
765 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
766 };
767 testNetwork(done, params);
768 });
769 it('Allows selection of maza', function(done) {
770 var params = {
771 selectText: "MAZA - Maza",
772 phrase: "abandon abandon ability",
773 firstAddress: "MGW4Bmi2NEm4PxSjgeFwhP9vg18JHoRnfw",
774 firstPubKey: "022b9d4376588a736d43301a659ef288302472aeff6344f5d8a5bfe376733e0da8",
775 firstPrivKey: "aH9R7KaHm6D3p44zDM2Vf6vY9x7bHVdaZGkBb2rHeXAZzEKnQ66G",
776 };
777 testNetwork(done, params);
778 });
779 it('Allows selection of FIX', function(done) {
780 var params = {
781 selectText: "FIX - FIX",
782 phrase: "abandon abandon ability",
783 firstAddress: "FS5MEU8fs5dUvsaSCSusV8RQtC8j2h3JEh",
784 firstPubKey: "026003e9a2bc6b9bd18bd7f8826cebbfd4d0554995141920eda2cb723ae53337ee",
785 firstPrivKey: "9uFsoZFuCUCMRF93aNKsLvYTX8jwYoKPbgENtdYURH1GCJvDNkps",
786 };
787 testNetwork(done, params);
788 });
789 it('Allows selection of FIX testnet', function(done) {
790 var params = {
791 selectText: "FIX - FIX Testnet",
792 phrase: "abandon abandon ability",
793 firstAddress: "XpnU1HHdNG5YxvG9Rez4wjmidchxqnZaNa",
794 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
795 firstPrivKey: "cBtMfPpQg4s1Ndfez7oLdedwu8CxshhWE5f7qunhLsY4ueNvKKyM",
796 };
797 testNetwork(done, params);
798 });
799 it('Allows selection of fujicoin', function(done) {
800 var params = {
801 selectText: "FJC - Fujicoin",
802 phrase: "abandon abandon ability",
803 firstAddress: "FgiaLpG7C99DyR4WnPxXedRVHXSfKzUDhF",
804 firstPubKey: "022b41c7ecbae94c0c926dda9304ccf6e6b22f6f6879e2fc52823b154d118a290e",
805 firstPrivKey: "RMFbyVXUF5Ndji4H75jXrnXi9KH6QFKgA6zDfuisa57BrHCN8MSG",
806 };
807 testNetwork(done, params);
808 });
809 it('Allows selection of nubits', function(done) {
810 var params = {
811 selectText: "USNBT - NuBits",
812 phrase: "abandon abandon ability",
813 firstAddress: "BLxkabXuZSJSdesLD7KxZdqovd4YwyBTU6",
814 firstPubKey: "03a37da71e839af0e3fc7cef0f3a82fbff64e372eb7fd067dc452d13b7b269e858",
815 firstPrivKey: "PJ9vZVjQWXNQDbfZbmFiDTcUGpJHiWc923LcX7oKSYHuLRvWhdJ3",
816 };
817 testNetwork(done, params);
818 });
819 it('Allows selection of bitcoin gold', function(done) {
820 var params = {
821 selectText: "BTG - Bitcoin Gold",
822 phrase: "abandon abandon ability",
823 firstAddress: "GdDqug4WUsn5syNbSTHatNn4XnuwZtzedx",
824 firstPubKey: "02e48e4053db573bb74fb67a47c91443ec7c0ed5f3f25aa8a408bad798f0230086",
825 firstPrivKey: "KwxCxhXq72JzuDNEj2VzzjKr1XU4tvpuksdEKBhngFuSEK8XWCBa",
826 };
827 testNetwork(done, params);
828 });
829 it('Allows selection of monacoin', function(done) {
830 var params = {
831 selectText: "MONA - Monacoin",
832 phrase: "abandon abandon ability",
833 firstAddress: "MKMiMr7MyjDKjJbCBzgF6u4ByqTS4NkRB1",
834 firstPubKey: "020b104320aaeb1ec921874e96cafd5add3c0de8d785cd01dc93e5f2b31fa352f4",
835 firstPrivKey: "T45jYrkbSutUvNF1cytpmbvyLR7qWWEXg5r7udj4mqrauzEsxHAG",
836 };
837 testNetwork(done, params);
838 });
839 it('Allows selection of AXE', function(done) {
840 var params = {
841 selectText: "AXE - Axe",
842 phrase: "abandon abandon ability",
843 firstAddress: "PScwtLUyPiGrqtKXrHF37DGETLXLZdw4up",
844 firstPubKey: "0288ea360af543ff72c79560f9f0ed8ed5386681fc3cc5edc84921c1118d989bce",
845 firstPrivKey: "XJKs1GN3sABamT6daKdRSjBgE2XPrnwBurWyBSVJht6zv5kS2dZd",
846 };
847 testNetwork(done, params);
848 });
849 it('Allows selection of BlackCoin', function(done) {
850 var params = {
851 selectText: "BLK - BlackCoin",
852 phrase: "abandon abandon ability",
853 firstAddress: "B5MznAKwj7uQ42vDz3w4onhBXPcqhTwJ9z",
854 firstPubKey: "03f500b73bad9955fbe26a27bbeefa4ec00119532449eeccfb1f021cafa638d046",
855 firstPrivKey: "Piyy1AGXZ9wRJdiUMPm97WAmN1DHvSxtjCpkYrtX2qyvc4huUxe9",
856 };
857 testNetwork(done, params);
858 });
859 it('Allows selection of Neblio', function(done) {
860 var params = {
861 selectText: "NEBL - Neblio",
862 phrase: "abandon abandon ability",
863 firstAddress: "NefkeEEvhusbHMmTRrxx7H9wFnUXd8qQsE",
864 firstPubKey: "0274d827c4aef5b009e0c5ddd3c852a9a0bd91cb37cfb72a5f07d570e4ce7e1569",
865 firstPrivKey: "TpEwnrinfiH7AMDJLvFzNoW1duU2rg7hox6tgF4wMmcnQSmNmQZM",
866 };
867 testNetwork(done, params);
868 });
869 it('Allows selection of Beetlecoin', function(done) {
870 var params = {
871 selectText: "BEET - Beetlecoin",
872 phrase: "abandon abandon ability",
873 firstAddress: "BVmtbEsGrjpknprmpHFq26z4kYHJUFHE71",
874 firstPubKey: "03e8e78daa2d96e390b55426d6b4cad887bdc028a394847308ad4910d00875b04c",
875 firstPrivKey: "Pkb5yU9mK1CzSQuYKm6CYmaJxDEiycipm426F3EhYtHPJdBJxViG",
876 };
877 testNetwork(done, params);
878 });
879 it('Allows selection of Adcoin', function(done) {
880 var params = {
881 selectText: "ACC - Adcoin",
882 phrase: "abandon abandon ability",
883 firstAddress: "AcEDM6V5sF4kFHC76MJjjfProtS5Sw2qcd",
884 firstPubKey: "026625ec7d1b747bd361a57c593fd8384fcdc65696aed5b72f64e73dbf2b24e854",
885 firstPrivKey: "T4B9YVUonpM7tQQEkqv4QjMxWJqxyqcJt78H7XqsRXRvuvd2XGog",
886 };
887 testNetwork(done, params);
888 });
889 it('Allows selection of Asiacoin', function(done) {
890 var params = {
891 selectText: "AC - Asiacoin",
892 phrase: "abandon abandon ability",
893 firstAddress: "ALupuEEz7kJjQTAvmtcBMBVuEjPa7GqZzE",
894 firstPubKey: "0338b40a58e69c087f5092223555c1ce48988e5b2b6bb15f42d881109aa1499d39",
895 firstPrivKey: "PNRyYtznRQBbD3GNCt86uHdWEHyeFr7ZszqckXCt7ZXEcRF29Z4X",
896 };
897 testNetwork(done, params);
898 });
899 it('Allows selection of Aryacoin', function(done) {
900 var params = {
901 selectText: "ARYA - Aryacoin",
902 phrase: "abandon abandon ability",
903 firstAddress: "Abr6gX25KaU9BpwD34UfsL3A4n89NvYYSf",
904 firstPubKey: "03973c0669f332a69e8f0661ffddc7fd86dd7fdb768a40608fcbf0efceebf900e0",
905 firstPrivKey: "PNukdY6bBGJhFDnJGeRFrJ5ptj3WD1xZHbPv8ubjMknFz2L6sZFi",
906 };
907 testNetwork(done, params);
908 });
909 it('Allows selection of Auroracoin', function(done) {
910 var params = {
911 selectText: "AUR - Auroracoin",
912 phrase: "abandon abandon ability",
913 firstAddress: "ANuraS6F4Jpi413FEnavjYkKYJJRHkgYCm",
914 firstPubKey: "03f843b9258aa001f24ebe3a77b6746a20ffda9f60934da8ed44f83d081977fe4b",
915 firstPrivKey: "PQyDA9ewjeMNvNy6ZaUEWVwTNHFPp2J3F131msPx4XFNgMuKMaXF",
916 };
917 testNetwork(done, params);
918 });
919 it('Allows selection of Bata', function(done) {
920 var params = {
921 selectText: "BTA - Bata",
922 phrase: "abandon abandon ability",
923 firstAddress: "BGxBdNeYPtF3GCuTtZBPQdFxCkdBYSF3fj",
924 firstPubKey: "033f35cba191c80f5246113ef33cd8a1e2449d304ad25afbd25e86aff333f07472",
925 firstPrivKey: "RKbjo1gnyFsuEimVGGybBfbvcp6fCCY35D9SY38xLAwrSrQ3B5v9",
926 };
927 testNetwork(done, params);
928 });
929 it('Allows selection of Belacoin', function(done) {
930 var params = {
931 selectText: "BELA - Belacoin",
932 phrase: "abandon abandon ability",
933 firstAddress: "BEeetqpNffdzeknSpNmQp5KAFh2KK1Qx7S",
934 firstPubKey: "039d895165f9c8218c12499820b783d920b632b49b0ca70b9352171b2f4273bf0b",
935 firstPrivKey: "PeicG333UdMZ1t5PoHCt2Yepc7X15wHPawvsusWWspKCw99Dfqmx",
936 };
937 testNetwork(done, params);
938 });
939 it('Allows selection of Bitcoin Atom', function(done) {
940 var params = {
941 selectText: "BCA - Bitcoin Atom",
942 phrase: "abandon abandon ability",
943 firstAddress: "AMy6qMbJeC4zsGRL6iWszmeCdQH65fgfih",
944 firstPubKey: "02efe1e4f85342c8c57c4d6e6f48758f7be4e059d61586f769e33dd5bf0aa78a04",
945 firstPrivKey: "Ky4hiMBLXZEj3TFknsuvceh16ttBfw9U7ReMgGWBtoYg1LPuxxUq",
946 };
947 testNetwork(done, params);
948 });
949 it('Allows selection of Bitcoinplus', function(done) {
950 var params = {
951 selectText: "XBC - Bitcoinplus",
952 phrase: "abandon abandon ability",
953 firstAddress: "B7FSynZoDbEwTCSgsXq9nJ5ue8owYLVL8r",
954 firstPubKey: "03ca81fbc766f6a38c7d122facd68c87ceeb57a0ee7d58927132a77704dfe88f92",
955 firstPrivKey: "Pjjssfh7oJnFZfcxxooUvUqqxtb35oiurrDm3rEHCGpyCW1tPEG2",
956 };
957 testNetwork(done, params);
958 });
959 it('Allows selection of Bitcoin Private', function(done) {
960 var params = {
961 selectText: "BTCP - Bitcoin Private",
962 phrase: "abandon abandon ability",
963 firstAddress: "b1M3PbiXXyN6Hdivdw5rJv5VKpLjPzhm4jM",
964 firstPubKey: "03b4dae910c8563ae77e4c665022f8afbf8bcc659ce3bc790a74956e5ebba932af",
965 firstPrivKey: "L5U3Rfy7otN5JQP9iveYkT1pB9va71uebx7VE8reBbiAofKCiCxk",
966 };
967 testNetwork(done, params);
968 });
969 it('Allows selection of Bitcoin SV', function(done) {
970 var params = {
971 selectText: "BSV - BitcoinSV",
972 phrase: "abandon abandon ability",
973 firstAddress: "1N4mgtE5yxifch9jWs7Sds6oVqxdy2t576",
974 firstPubKey: "0280bbf3fd6f1c7ab4b04cca0ab6e23487fafa9c5edea3d1882d8e967111ee8b38",
975 firstPrivKey: "L3oBCYKNpT6uc5qeYGN9NFNyvQsTUGBV7v2cqeB76GfWzuGJDYeY",
976 };
977 testNetwork(done, params);
978 });
979 it('Allows selection of Bitcoinz', function(done) {
980 var params = {
981 selectText: "BTCZ - Bitcoinz",
982 phrase: "abandon abandon ability",
983 firstAddress: "t1X2YQoxs8cYRo2oaBYgVEwW5QNjCC59NYc",
984 firstPubKey: "033eb18e80984fa3fbaeee1096977d6b169399123641dc97ceba00910c8ad211d4",
985 firstPrivKey: "L1qcDeAXPxMSgnXvquJo5Dd4myFxxxrWNgi99Ns26GPNyRW7eVuZ",
986 };
987 testNetwork(done, params);
988 });
989 it('Allows selection of BitCloud', function(done) {
990 var params = {
991 selectText: "BTDX - BitCloud",
992 phrase: "abandon abandon ability",
993 firstAddress: "BHbWitXCNgTf1BhsRDNMP186EeibuzmrBi",
994 firstPubKey: "032ca47d6a35bd01ba3832791bcb0ee5676b1a63a491b42c39a4b214d78bf64fd3",
995 firstPrivKey: "PgTZBt9exdzZSWfhdwXKVmz5WBFjAJFjNLa9552FCx1X6mnztNSL",
996 };
997 testNetwork(done, params);
998 });
999 it('Allows selection of Bitcore', function(done) {
1000 var params = {
1001 selectText: "BTX - Bitcore",
1002 phrase: "abandon abandon ability",
1003 firstAddress: "2Rgp5Znhpy34TK4QmPkfCiYs9r4KovfTH9",
1004 firstPubKey: "02caa73ee839b074c8d353f6869222bafd8ce5ad3bcb1c0bd404d108390b2a6438",
1005 firstPrivKey: "L4286qDXUJfVq4ebbHHUVDoFpEudJj81FUWkjwNeQ132gFCDGUBj",
1006 };
1007 testNetwork(done, params);
1008 });
1009 it('Allows selection of Bitsend', function(done) {
1010 var params = {
1011 selectText: "BSD - Bitsend",
1012 phrase: "abandon abandon ability",
1013 firstAddress: "iBPk7LYjDun3EPk7CRR8UUmnPoceVc1bp2",
1014 firstPubKey: "03e6b12ed885225302fc126980e42abfee1c3350b77b61b01abcf200b5e9a9fee5",
1015 firstPrivKey: "XCTxjfV68KfXKySGJyZTYvYMBDFKSPJu41W3SN1bRpJch5R498mC",
1016 };
1017 testNetwork(done, params);
1018 });
1019 it('Allows selection of Britcoin', function(done) {
1020 var params = {
1021 selectText: "BRIT - Britcoin",
1022 phrase: "abandon abandon ability",
1023 firstAddress: "B6Aue4J2XLs1f1dtD4H1SHYFfh4XrmEbrw",
1024 firstPubKey: "035dee3aad6f635aeffe61a28e82a58271b984d20cc3766f63d9acb29ecee91d3f",
1025 firstPrivKey: "PdyPdAngoD42Pe5qCd2en6nS1j4rqVyH6cFGkCDEu2nEMt8DHsoz",
1026 };
1027 testNetwork(done, params);
1028 });
1029 it('Allows selection of Canadaecoin', function(done) {
1030 var params = {
1031 selectText: "CDN - Canadaecoin",
1032 phrase: "abandon abandon ability",
1033 firstAddress: "CanAyCfd5Rj2CQVfaoAmvDUZunPM5W1AEQ",
1034 firstPubKey: "03124e22733a75beba1e4f2635d08e034772bf6cbe8102404226a9402e135ff7f6",
1035 firstPrivKey: "QCEMYNRcKqGgYXhxDNZfrF9m8sqd28NujXpjDNuN7r525rrXPnLm",
1036 };
1037 testNetwork(done, params);
1038 });
1039 it('Allows selection of Cannacoin', function(done) {
1040 var params = {
1041 selectText: "CCN - Cannacoin",
1042 phrase: "abandon abandon ability",
1043 firstAddress: "CYjW8xWB43g6krLJTmmrPk1PonoQX7h9Qd",
1044 firstPubKey: "03bd05a584f418aa8d65a05c7bcc301eb552f67aa380f15e4b29c0b8eec698b443",
1045 firstPrivKey: "QAM1aUWMGEDdcDsgaPQKXcMe8Z3vEfDaPSds3wTFz8USQ3yht7Kk",
1046 };
1047 testNetwork(done, params);
1048 });
1049 it('Allows selection of Clubcoin', function(done) {
1050 var params = {
1051 selectText: "CLUB - Clubcoin",
1052 phrase: "abandon abandon ability",
1053 firstAddress: "CHMDEXN4sihpSVX4GyAa2hZ62shnby7uyN",
1054 firstPubKey: "0356187f1336ac2e340145478f02024ce1c318e3648cbba38262afbde7f2dc0055",
1055 firstPrivKey: "PeJx6v8h1N6GvTj7VkK7vWqjdWJb4QXzfrDgJjFao8bkpRrDiymm",
1056 };
1057 testNetwork(done, params);
1058 });
1059 it('Allows selection of Compcoin', function(done) {
1060 var params = {
1061 selectText: "CMP - Compcoin",
1062 phrase: "abandon abandon ability",
1063 firstAddress: "CLshtw3zhxkseBJS46UF12v3AFy9Dx7JVv",
1064 firstPubKey: "027d1b4f1798882b8978eb3ab0e8b503aa1fb4cf058e0086cf25326fb6a8751aae",
1065 firstPrivKey: "QDq6KKEdmrzHbZHmgzsGcweUFwYA7mVvvfeAKsPSxfxHNv73ETr7",
1066 };
1067 testNetwork(done, params);
1068 });
1069 it('Allows selection of CPUchain', function(done) {
1070 var params = {
1071 selectText: "CPU - CPUchain",
1072 phrase: "abandon abandon ability",
1073 firstAddress: "CWSpLpW7jS4mBHJnkz3mmL5s3yQMg93zK8",
1074 firstPubKey: "0390845eef5c5993069211f94d9f3990c27c380700bb92ae629d2a5afae1c08806",
1075 firstPrivKey: "L378gxzvUEX9JUFnfXBik2H4gV7XM4dzXWKM9rvR8UZr2rBphL1t",
1076 };
1077 testNetwork(done, params);
1078 });
1079 it('Allows selection of Crave', function(done) {
1080 var params = {
1081 selectText: "CRAVE - Crave",
1082 phrase: "abandon abandon ability",
1083 firstAddress: "VCYJeti6uKMNBFKCL7eP96UwuFWYHM7c85",
1084 firstPubKey: "02c8938f30cc46013706586753d6dca3e4ac6b7d6924dfc35d444c3605f35da4c7",
1085 firstPrivKey: "PjRdEuhRZ6rufXAdU6amoaPDRZamWmxN46qbmSPyqUKsJzChCjZT",
1086 };
1087 testNetwork(done, params);
1088 });
1089 it('Allows selection of Defcoin', function(done) {
1090 var params = {
1091 selectText: "DFC - Defcoin",
1092 phrase: "abandon abandon ability",
1093 firstAddress: "D8swcgyaaFUrXZU3ATwbgy16buCpWqbG1M",
1094 firstPubKey: "02d02cc83ddfaa5aed4fb9b611b504cccbfa8397485411f16816fc28dccb51e609",
1095 firstPrivKey: "QSRhMr1B4tt7DEcgxji6NrEfS51wQ6GypfMkqgNDHuWVKo2RzTac",
1096 };
1097 testNetwork(done, params);
1098 });
1099 it('Allows selection of Diamond', function(done) {
1100 var params = {
1101 selectText: "DMD - Diamond",
1102 phrase: "abandon abandon ability",
1103 firstAddress: "dJnrVbLL9UPjdaVRz2C8VpqHZknqAqjLek",
1104 firstPubKey: "03750645ffc120a0ffda07f01b0cc0d321bccf02eaedc98907672d78f2b2ef20d6",
1105 firstPrivKey: "ZKnjDNkhgCwRs8KV5Mf33k1USiiiP8AuXKM2xR4zhd3PAhtVmkEg",
1106 };
1107 testNetwork(done, params);
1108 });
1109 it('Allows selection of Digibyte', function(done) {
1110 var params = {
1111 selectText: "DGB - Digibyte",
1112 phrase: "abandon abandon ability",
1113 firstAddress: "D85Rp9jwLtMdmP6wGjTiqHBdVQLST3YCEq",
1114 firstPubKey: "02f86cc0afd113956e995fb9cbe33b68e59e9175c0c89419efc4031f2e3c128288",
1115 firstPrivKey: "L1w9pD4XodykLEJxiK1R9SVELpftD9x1QtGjHEb1nWviAvYVZbwv",
1116 };
1117 testNetwork(done, params);
1118 });
1119 it('Allows selection of Digitalcoin', function(done) {
1120 var params = {
1121 selectText: "DGC - Digitalcoin",
1122 phrase: "abandon abandon ability",
1123 firstAddress: "DKw4UGKEAZWweDNEbBFNQx4EM8x1mpUdia",
1124 firstPubKey: "02148710e3f09fa9e108bd90a3d53e0eeea9b6ee929c4668a7d64732e3fc839ff7",
1125 firstPrivKey: "QVBstKEkSbT4M9aDbBTkqJkpLCaGjL5zYSiiufHwMxGCn2dunbYL",
1126 };
1127 testNetwork(done, params);
1128 });
1129 it('Allows selection of Ecoin', function(done) {
1130 var params = {
1131 selectText: "ECN - Ecoin",
1132 phrase: "abandon abandon ability",
1133 firstAddress: "e6WFPLG5gcXyF7cESFteH1hE2XSmowW5yB",
1134 firstPubKey: "03a74536710cba6aa02b543f1ac4a76d241b47a96e38cfd002eb975cdef4b9ec19",
1135 firstPrivKey: "ZZPUTdAqpJ3s6S6xe2RpZD3jyEqwGk5MRkJHSpar1rESp4BFEqLV",
1136 };
1137 testNetwork(done, params);
1138 });
1139 it('Allows selection of Edrcoin', function(done) {
1140 var params = {
1141 selectText: "EDRC - Edrcoin",
1142 phrase: "abandon abandon ability",
1143 firstAddress: "eh1nUJsvgKPFv6ebMBfcwJ299GMCpjeZUG",
1144 firstPubKey: "02b541bdd9ff6ffc03ec4749dbe1a8a4ac8b02dc528758acac43eb1f38b5f48f27",
1145 firstPrivKey: "ZjZir6LUrg6A8WqcCeCeM249TGCxJcgGkEL6VefJJV1mGsGb7MEb",
1146 };
1147 testNetwork(done, params);
1148 });
1149 it('Allows selection of Egulden', function(done) {
1150 var params = {
1151 selectText: "EFL - Egulden",
1152 phrase: "abandon abandon ability",
1153 firstAddress: "Lg66yt55R7edRM58cDhKzXik2kFme3viX7",
1154 firstPubKey: "02d8d54be535836e70b9feed7a2502c026d714894342746f15d21c6bc80e1f97e4",
1155 firstPrivKey: "T7NPtpaVXs7SBfsCzp3ooadkctNqcZW6HpNHeT3U8EAXc6NtDJ4c",
1156 };
1157 testNetwork(done, params);
1158 });
1159 it('Allows selection of Einsteinium', function(done) {
1160 var params = {
1161 selectText: "EMC2 - Einsteinium",
1162 phrase: "abandon abandon ability",
1163 firstAddress: "EVAABm9hXKHk2MpVMbwNakRubFnNha5m8m",
1164 firstPubKey: "02826e69c802fbf71ca8e7daf9fdac2e371b86847b5397422997785cefb973269b",
1165 firstPrivKey: "QwySA5DiFKbvMcm7H3xXfsDUdq1Q5RPYjBAcLjZKkESxmJMXBvL2",
1166 };
1167 testNetwork(done, params);
1168 });
1169 it('Allows selection of EOSIO', function(done) {
1170 var params = {
1171 selectText: "EOS - EOSIO",
1172 phrase: "abandon abandon ability",
1173 firstPubKey: "EOS692VJTBK3Rmw93onNnpnZ8ZtmE9PdxjDStArvbyzoe11QUTNoy",
1174 firstPrivKey: "5Jef4qXr3nF8cjudHNQBaComNB653dnQX4pWec32xXRVThBLiCM",
1175 };
1176 testNetwork(done, params);
1177 });
1178 it('Allows selection of Europecoin', function(done) {
1179 var params = {
1180 selectText: "ERC - Europecoin",
1181 phrase: "abandon abandon ability",
1182 firstAddress: "ESA2YwPYntAoaPrE8Fm5qkKRtkcwLcwD6R",
1183 firstPubKey: "038f16d567cdefac2813b64d465f5cd8d6d59df9dfe4d16302a19b5e0b7179d685",
1184 firstPrivKey: "RzXndDAzJ4Wft6HXkpopV7vRnRBeVw2o6dKp44FYQgriYWngseBu",
1185 };
1186 testNetwork(done, params);
1187 });
1188 it('Allows selection of Exclusivecoin', function(done) {
1189 var params = {
1190 selectText: "EXCL - Exclusivecoin",
1191 phrase: "abandon abandon ability",
1192 firstAddress: "EbUa6m8UZW6nTxsYZD2FsDjkadKbp5M6JT",
1193 firstPubKey: "0291a6b82197e13aa2fd65bd1f2a6e905a9a2baaa36dfb5da10690022f7f9e998d",
1194 firstPrivKey: "Qu6pr1srXmEFzWSa4Ry1sjV6qDj4TEf4q2CxHBSRByiSBLsm967z",
1195 };
1196 testNetwork(done, params);
1197 });
1198 it('Allows selection of Feathercoin', function(done) {
1199 var params = {
1200 selectText: "FTC - Feathercoin",
1201 phrase: "abandon abandon ability",
1202 firstAddress: "6gDdjAMoSgQaW8UhqK3oboHs6ftGAroKkM",
1203 firstPubKey: "02e9f5c37fba2b6457f3c59de5bf5be2efe524751a682a47765825cb9d82d339f3",
1204 firstPrivKey: "N5487NUGCd1JnWzZzhjX1uu6SNGnpQKjeWuK6Y1NzNHjGaLysCdi",
1205 };
1206 testNetwork(done, params);
1207 });
1208 it('Allows selection of Firstcoin', function(done) {
1209 var params = {
1210 selectText: "FRST - Firstcoin",
1211 phrase: "abandon abandon ability",
1212 firstAddress: "FJN9GzfMm7Q8R4DJwK1H9F6A1GTghvFiMJ",
1213 firstPubKey: "029300108c006d1dc75847fece915138747b7bc17b515eae7458da98d2f14d7178",
1214 firstPrivKey: "RDxAN3n3k2dEZ4Ln3bbozzZ3Jgg7CQdgzYDCURmPghKQdzctX7ck",
1215 };
1216 testNetwork(done, params);
1217 });
1218 it('Allows selection of Flashcoin', function(done) {
1219 var params = {
1220 selectText: "FLASH - Flashcoin",
1221 phrase: "abandon abandon ability",
1222 firstAddress: "UWfpf5LfMmLxZYooEb2EyvWhZ8NG7EZDRt",
1223 firstPubKey: "032d55eae8073e75f02e9674b0ac3f69190ad359ad37ee4c4c11d12bcfee13d439",
1224 firstPrivKey: "W6pedhBW35Twq8ZmgTQi7sHx6wczQanSk2FUpcFWtgEW29jowsvi",
1225 };
1226 testNetwork(done, params);
1227 });
1228 it('Allows selection of GCRCoin', function(done) {
1229 var params = {
1230 selectText: "GCR - GCRCoin",
1231 phrase: "abandon abandon ability",
1232 firstAddress: "GJjF5cLwyXLacpuvXAVksxGxKvHDjx58d6",
1233 firstPubKey: "0356187f1336ac2e340145478f02024ce1c318e3648cbba38262afbde7f2dc0055",
1234 firstPrivKey: "Pntag5VbBX1Qtyjt3pi1igwDswWEtpoiqHqosBbgHcMU6m2e7t9J",
1235 };
1236 testNetwork(done, params);
1237 });
1238 it('Allows selection of Gobyte', function(done) {
1239 var params = {
1240 selectText: "GBX - Gobyte",
1241 phrase: "abandon abandon ability",
1242 firstAddress: "GS813Ys2brkmvSUw1rUqGPm2HqQVDHJRyA",
1243 firstPubKey: "036f84f44e4c8bffe039c2d9da087b006ebbfcdcf24b32a6434b2fad708ef00ae0",
1244 firstPrivKey: "WLiSrhfqRwgNmw7rhGHFoXLEuNGXxQYuKb9PK84AZmTfiHN9dz22",
1245 };
1246 testNetwork(done, params);
1247 });
1248 it('Allows selection of Gridcoin', function(done) {
1249 var params = {
1250 selectText: "GRC - Gridcoin",
1251 phrase: "abandon abandon ability",
1252 firstAddress: "SGrWbBPvobgqKRF8td1Kdc9vbRY7MJ78Y9",
1253 firstPubKey: "0377436f8c4c4d96d5ddfe6875abeb589deec595331b9a915b7e8d81a4134926ce",
1254 firstPrivKey: "V7h5EhRuWGM8uqAouxHr9uNt8ZLCQ7kmpA27tvKDbUE3zBarH81n",
1255 };
1256 testNetwork(done, params);
1257 });
1258 it('Allows selection of Gulden', function(done) {
1259 var params = {
1260 selectText: "NLG - Gulden",
1261 phrase: "abandon abandon ability",
1262 firstAddress: "GcDP7cNEc33MPPdTFNJ8pZc6VMZJ2CbKxY",
1263 firstPubKey: "03ff51002146450eb68f294dbe34f3e208f8694b51079f81e3f7dbd403cc10df41",
1264 firstPrivKey: "Fc6gU4tscBk3pybMWU1ajS1tLvNerXC24hQJ1F944QqdgSSrr3XW",
1265 };
1266 testNetwork(done, params);
1267 });
1268 it('Allows selection of Helleniccoin', function(done) {
1269 var params = {
1270 selectText: "HNC - Helleniccoin",
1271 phrase: "abandon abandon ability",
1272 firstAddress: "LbHEKe5H72zp9G1fuWNiiNePTUfJb88915",
1273 firstPubKey: "02e602000d65b969ac27172297ee907684bfc606f457ef0bad62c229edb17d5cb2",
1274 firstPrivKey: "T6JEq9jKLvztjhg4tJMezy1L4NjnMfLDZJe1egVzPBU3Q5XPBFrz",
1275 };
1276 testNetwork(done, params);
1277 });
1278 it('Allows selection of Hempcoin', function(done) {
1279 var params = {
1280 selectText: "THC - Hempcoin",
1281 phrase: "abandon abandon ability",
1282 firstAddress: "H8sdWbZyJV4gyXyHtLXDaNnAuUDhK5mfTV",
1283 firstPubKey: "02e40aaa6bf20e32d9f5976f57e9bf7a8f75db36b96a9033c20b681c9d9454b617",
1284 firstPrivKey: "Ry5Dg2yR32uhbrPLdNmsK1TRbZ1bHLvFp7kcPgeMzVPN6ycu9Jj5",
1285 };
1286 testNetwork(done, params);
1287 });
1288 it('Allows selection of Insane', function(done) {
1289 var params = {
1290 selectText: "INSN - Insane",
1291 phrase: "abandon abandon ability",
1292 firstAddress: "iMPqEJMiXWuxC9U2NVinCCMr4t72h58EWx",
1293 firstPubKey: "036ec4cf4b92300f12ff824b1eca775b27b1a728f6b57c6354ce791fd8ea0f3497",
1294 firstPrivKey: "9HA4X5kXWKxLjybjko8Z5wDo19UUJKroRrZ1BuKCtsfcfNB48K61",
1295 };
1296 testNetwork(done, params);
1297 });
1298 it('Allows selection of Iop', function(done) {
1299 var params = {
1300 selectText: "IOP - Iop",
1301 phrase: "abandon abandon ability",
1302 firstAddress: "pGKQmcaPf95Ur5o6oHK4qdiZ52p1yaTvq1",
1303 firstPubKey: "02bbaa07f154d04b04dec0978a1655952e1a09a3c0e7798085902273965d93c2f6",
1304 firstPrivKey: "8MDnKDhVSp84AqzYN5g18MhMvHk3UMYnP51EVjidSas1pT62Sdpc",
1305 };
1306 testNetwork(done, params);
1307 });
1308 it('Allows selection of Ixcoin', function(done) {
1309 var params = {
1310 selectText: "IXC - Ixcoin",
1311 phrase: "abandon abandon ability",
1312 firstAddress: "xgE9bTZ6YypT3E6ByzkTt31Hq68E9BqywH",
1313 firstPubKey: "0257766cea209cf52ba08776b6dfa263a4759e1e148f25d0cab3a91a60b6a52062",
1314 firstPrivKey: "KxdDep6zGCWoRt6arat5DVR5s6a8vmZtuekwHafEwRc7VGxfeD4Y",
1315 };
1316 testNetwork(done, params);
1317 });
1318 it('Allows selection of Kobocoin', function(done) {
1319 var params = {
1320 selectText: "KOBO - Kobocoin",
1321 phrase: "abandon abandon ability",
1322 firstAddress: "FTVoNJETXDAM8x7MnmdE8RwWndSr9PQWhy",
1323 firstPubKey: "0225753a5e232b384dce73b58d25fb90172faaf4c83a8850189abd8cae86495601",
1324 firstPrivKey: "R7u1uvHmVGkGqjURaNoppFjPNBzPYt37QwttrJc6F2K1WRm1zKoQ",
1325 };
1326 testNetwork(done, params);
1327 });
1328 it('Allows selection of Landcoin', function(done) {
1329 var params = {
1330 selectText: "LDCN - Landcoin",
1331 phrase: "abandon abandon ability",
1332 firstAddress: "LLvLwNjG1aJcn1RS4W4GJUbv8fNaRATG7c",
1333 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1334 firstPrivKey: "T8rHy2tA1yykFgCpr6KrgcrhqbevpxG923qSZbJHALYGwy3M3qAw",
1335 };
1336 testNetwork(done, params);
1337 });
1338 it('Allows selection of Library Credits', function(done) {
1339 var params = {
1340 selectText: "LBC - Library Credits",
1341 phrase: "abandon abandon ability",
1342 firstAddress: "bQJEQrHDJyHdqycB32uysh1SWn8Ln8LMdg",
1343 firstPubKey: "02abd5018c033f59f49f28ee76d93c41323890928e25c171ccc7c61ed753cde8ad",
1344 firstPrivKey: "5CWjkFs7be8vPa3CZEodPDsMDSbvyT9gAC1n1w83znRz4poNK5nZ",
1345 };
1346 testNetwork(done, params);
1347 });
1348 it('Allows selection of Linx', function(done) {
1349 var params = {
1350 selectText: "LINX - Linx",
1351 phrase: "abandon abandon ability",
1352 firstAddress: "XGWQ3cb3LGUB3VnHmj6xYSMgnokNbf6dyk",
1353 firstPubKey: "0232edeec8e3e021b53982a01943dea4398e9cc4b177c5483cf0e7774be41ea094",
1354 firstPrivKey: "X8YJFxPPmwyCBQ7Rp5bqn3V8U9rsaba5Tftsh3j8qZX9hjTTURgL",
1355 };
1356 testNetwork(done, params);
1357 });
1358 it('Allows selection of Litecoincash', function(done) {
1359 var params = {
1360 selectText: "LCC - Litecoincash",
1361 phrase: "abandon abandon ability",
1362 firstAddress: "Ce5n7fjUuQPLutJ4W5nCCfQLKdKLE1mv9A",
1363 firstPubKey: "033af2daadddcc976ea61023783b350f9b1ac45a056dba2d3b8c6ceec9d5817a8d",
1364 firstPrivKey: "T6qztYVwa6onx5HjCB3XZcCtegpUjVKtocRCQ8daWj2b8tbrDZqp",
1365 };
1366 testNetwork(done, params);
1367 });
1368 it('Allows selection of Lynx', function(done) {
1369 var params = {
1370 selectText: "LYNX - Lynx",
1371 phrase: "abandon abandon ability",
1372 firstAddress: "KUeY3ZdZkg96p4W98pj1JjygCFU1XqWdw3",
1373 firstPubKey: "0340435307cc0831d85adb70ceb518297cdebee8f25574d8eca0ff94e35fa759da",
1374 firstPrivKey: "SdwVFsLjH2wbWziEZTLPQ2iCBrt9vXHWr7X333RbFZG7hZg88u5V",
1375 };
1376 testNetwork(done, params);
1377 });
1378 it('Allows selection of Megacoin', function(done) {
1379 var params = {
1380 selectText: "MEC - Megacoin",
1381 phrase: "abandon abandon ability",
1382 firstAddress: "MDfAj9CzkC1HpcUiVGnHp8yKTa7WXgu8AY",
1383 firstPubKey: "02e560b00165c939ba08f5096201794a32e6de66216cdc5763472abf09a5e62380",
1384 firstPrivKey: "TSw7if5qV6HzW2hKhPjVvQBVUXt5aD17mM34PkueLrHQiXwMwcp4",
1385 };
1386 testNetwork(done, params);
1387 });
1388 it('Allows selection of Minexcoin', function(done) {
1389 var params = {
1390 selectText: "MNX - Minexcoin",
1391 phrase: "abandon abandon ability",
1392 firstAddress: "XC1VnyJVfiMDwWgFtAHDp41cgY3AHk3dJT",
1393 firstPubKey: "0232a31bee17b806941c419cea385d427f0d6c6fbd564fb2f366faa008aa15822c",
1394 firstPrivKey: "KzouDFGCydewfP2pGdGv62vwP7KBtaaSgBW28B94YuksV5y8jGyE",
1395 };
1396 testNetwork(done, params);
1397 });
1398 it('Allows selection of Navcoin', function(done) {
1399 var params = {
1400 selectText: "NAV - Navcoin",
1401 phrase: "abandon abandon ability",
1402 firstAddress: "NTQVTPK3NWSQLKoffkiQw99T8PifkF1Y2U",
1403 firstPubKey: "0345105cc449c627cfee118bcd7804465669e6b32e751a61e39737f5693f56d5f4",
1404 firstPrivKey: "PKXWZeQCqutM4vawyuNAHuAAkfEuWLVhwtszCRuWTecyJ92EMEE2",
1405 };
1406 testNetwork(done, params);
1407 });
1408 it('Allows selection of Nebulas', function(done) {
1409 var params = {
1410 selectText: "NAS - Nebulas",
1411 phrase: "abandon abandon ability",
1412 firstAddress: "n1PbK61DGBfDoDusLw621G6sVSMfLLHdfnm",
1413 firstPubKey: "3a3ffb88114f54ed7525c987a3124dc5eefc221806bc049e1e08371cca5fbebea38c2ce791ee32912c1f7799fad99db91f6a3724def5e715b4ff64bc06fe4537",
1414 firstPrivKey: "78d2df373c54efe1bfda371ee7532892ea8ec046f45e5c7e2dfa8371ad190f8b",
1415 };
1416 testNetwork(done, params);
1417 });
1418 it('Allows selection of Neoscoin', function(done) {
1419 var params = {
1420 selectText: "NEOS - Neoscoin",
1421 phrase: "abandon abandon ability",
1422 firstAddress: "NgATz6QbQNXvayHQ4CpZayugb9HeaPDdby",
1423 firstPubKey: "021bf6bd94ac773ed78b6e682bf6509a08944b67925a3ea9ec94f500479f637f63",
1424 firstPrivKey: "TBebkUs87R1WLhMPHMzCYF2FmiHzuVcCrhgf2rRwsSpi35SGZPMc",
1425 };
1426 testNetwork(done, params);
1427 });
1428 it('Allows selection of Nix', function(done) {
1429 var params = {
1430 selectText: "NIX - NIX Platform",
1431 phrase: "abandon abandon ability",
1432 firstAddress: "GgcNW2SQQXB4LWHRQTHKkQF3GzXNSLqS8u",
1433 firstPubKey: "02438f5277bc74be69e99eee406cda968705a8ab26b9aecfaa1bbc9d3700fa2eae",
1434 firstPrivKey: "L44wVS6tPZhVGfnJhXTfEyBZwLggW61GKKRVDaEKSaWAt2HkALyT",
1435 };
1436 testNetwork(done, params);
1437 });
1438 it('Allows selection of Neurocoin', function(done) {
1439 var params = {
1440 selectText: "NRO - Neurocoin",
1441 phrase: "abandon abandon ability",
1442 firstAddress: "NVdYErQ3mFpDuF5DquW9WMiT7sLc8ufFTn",
1443 firstPubKey: "03a3690f587d97dee95393d6dfe9daa81d60354657f84a75fb6733335a1c0588db",
1444 firstPrivKey: "Tn3LK6WyQRczahRsf3cZCpS12VxvbdhM6zSARDvGxhNoxCCN7oKv",
1445 };
1446 testNetwork(done, params);
1447 });
1448 it('Allows selection of Newyorkc', function(done) {
1449 var params = {
1450 selectText: "NYC - Newyorkc",
1451 phrase: "abandon abandon ability",
1452 firstAddress: "RSVMfyH1fKfy3puADJEhut2vfkRyon6imm",
1453 firstPubKey: "02c1f71b4e74098cf6dc66c5c0e386c695002093e986698e53f50162493b2deec8",
1454 firstPrivKey: "UqWMjJsXSsC4X7vgCTxLwxV21yA8vDosyGW2rBTYnn7MfFUbKZFy",
1455 };
1456 testNetwork(done, params);
1457 });
1458 it('Allows selection of Novacoin', function(done) {
1459 var params = {
1460 selectText: "NVC - Novacoin",
1461 phrase: "abandon abandon ability",
1462 firstAddress: "4JRvUmxcKCJmaMXZyvRoSS1cmG2XvnZfHN",
1463 firstPubKey: "0252531247a5e26a866909467ce552a3433b00f86319446aa3584723ad637be28a",
1464 firstPrivKey: "MD2NsZQtBdXGvox6VzpZfnhHyDJ2NHzzdSE6jUeUjQuaBRQ3LXUg",
1465 };
1466 testNetwork(done, params);
1467 });
1468 it('Allows selection of Nushares', function(done) {
1469 var params = {
1470 selectText: "NSR - Nushares",
1471 phrase: "abandon abandon ability",
1472 firstAddress: "SecjXzU3c7EecdT7EbC4vvmbdtBBokWh6J",
1473 firstPubKey: "02e0e94d07415703fd89b8a72f22fc28e7b916c0649bea2c53e6600377a4d125b5",
1474 firstPrivKey: "P5SXdUhciyemKJojb5tBFPKjVyX4Ymf1wdKDPmYHRigxPAnDNudM",
1475 };
1476 testNetwork(done, params);
1477 });
1478 it('Allows selection of Okcash', function(done) {
1479 var params = {
1480 selectText: "OK - Okcash",
1481 phrase: "abandon abandon ability",
1482 firstAddress: "PV4Qp1TUYuGv4TqVtLZtqvrsWWRycfx1Yi",
1483 firstPubKey: "02ab6d1d1b2c6f19f9c13cf0cd48e352e04245026d25de014cde0493c773f27789",
1484 firstPrivKey: "WuuneUUV8naqRRs1mSAdSVfZ9g6VXLWRV7NVEYdugts8vT2iNXR",
1485 };
1486 testNetwork(done, params);
1487 });
1488 it('Allows selection of Omnicore', function(done) {
1489 var params = {
1490 selectText: "OMNI - Omnicore",
1491 phrase: "abandon abandon ability",
1492 firstAddress: "1Q1t3gonjCT3rW38TsTsCvgSc3hh7zBGbi",
1493 firstPubKey: "02a8cadac7ee1d034f968c1441481fc2c941c8f529a17b6810e917f9ccc893fa3a",
1494 firstPrivKey: "KyvFh1tWTBsLWxJTVjpTpfjJ7eha81iks7NiD6FvrC23o24oAhcs",
1495 };
1496 testNetwork(done, params);
1497 });
1498 it('Allows selection of DeepOnion', function(done) {
1499 var params = {
1500 selectText: "ONION - DeepOnion",
1501 phrase: "abandon abandon ability",
1502 firstAddress: "DYREY7XCFXVqJ3x5UuN43k2JwD2s1kif48",
1503 firstPubKey: "030ed256ea98edd15006a57fd4d3c60b2b811ecd74107c3fa1ac36558107c139b3",
1504 firstPrivKey: "QZZHsJF9C9okF5JV2qx4H1NgCCQqeio6k8cryKyrpU3TPnDhSzwV",
1505 };
1506 testNetwork(done, params);
1507 });
1508 it('Allows selection of Pesobit', function(done) {
1509 var params = {
1510 selectText: "PSB - Pesobit",
1511 phrase: "abandon abandon ability",
1512 firstAddress: "PDePsF7ALyXP7JaywokdYiRTDtKa14MAr1",
1513 firstPubKey: "023dd8af1b0196275ee2fb450279656ab16f86221d47f62094c78088200d67e90f",
1514 firstPrivKey: "U9eg6xGhoA9H4aHmQtXPP1uR3dR3EjbdmTr3ejVK5jdhWFoJotSj",
1515 };
1516 testNetwork(done, params);
1517 });
1518 it('Allows selection of Pinkcoin', function(done) {
1519 var params = {
1520 selectText: "PINK - Pinkcoin",
1521 phrase: "abandon abandon ability",
1522 firstAddress: "2TgjYQffjbzUHJghNaVbdsjHbRwruC3yzC",
1523 firstPubKey: "02fcc7a9d26b78c1ef3149dc3fcb9fbd68293fe5627a9099a01e5acf5f848d029d",
1524 firstPrivKey: "LX84Cjro1aRwwqTDu2jqNTPvproSm7VJCyMFLCeEKa4LTFGzXgks",
1525 };
1526 testNetwork(done, params);
1527 });
1528 it('Allows selection of POSWcoin', function(done) {
1529 var params = {
1530 selectText: "POSW - POSWcoin",
1531 phrase: "abandon abandon ability",
1532 firstAddress: "PNxewmZoPnGBvoEbH6hgQZCK1igDiBCdgC",
1533 firstPubKey: "0358e511140f2f2bc96debf22639b36cc9b12addc386ac7a1de7dca05896ec0162",
1534 firstPrivKey: "UCs7SQEhD8r3GwXL99M8sBuxcqB9uke6kRSh7qQfbH9VdS6g919B",
1535 };
1536 testNetwork(done, params);
1537 });
1538 it('Allows selection of Potcoin', function(done) {
1539 var params = {
1540 selectText: "POT - Potcoin",
1541 phrase: "abandon abandon ability",
1542 firstAddress: "PEo7Vg2ctXgpP4vuLPeY9aGJtZotyrmiHc",
1543 firstPubKey: "02b86d3f153eac657f140a8ce9ae530504eea3c9894e594b9c9ddf0cfe393dc8ab",
1544 firstPrivKey: "U89dfzjfUtTSEKaRzr3FPw7ark3bjZAzTVw5kedjBcFj1UAdBcdE",
1545 };
1546 testNetwork(done, params);
1547 });
1548 it('Allows selection of Putincoin', function(done) {
1549 var params = {
1550 selectText: "PUT - Putincoin",
1551 phrase: "abandon abandon ability",
1552 firstAddress: "PViWnfr2uFtovd6e7joM49C94CsGSnqJis",
1553 firstPubKey: "0387bbd868cb20682619733e63205c66d460014714db26593d55c916c34f7e7970",
1554 firstPrivKey: "UBB9nGXWEMjhmvWqta83YkSYLLc1vjkqsnP289jbwMPG72LpAiUg",
1555 };
1556 testNetwork(done, params);
1557 });
1558 it('Allows selection of Rapids', function(done) {
1559 var params = {
1560 selectText: "RPD - Rapids",
1561 phrase: "abandon abandon ability",
1562 firstAddress: "Ri8XxUdZaXS5LqxmFJcFEjFinkaMbmhSUp",
1563 firstPubKey: "03cf69b270c1d03bbedb39f21d70a0a2aa0192b7dfb26bff4bf9a4ed8315d90f4e",
1564 firstPrivKey: "7sgLTht7XHwAkEgEpm7FJE6Tkv7GqCXxSSKPsr4hWYDNePUhBx6t",
1565 };
1566 testNetwork(done, params);
1567 });
1568 it('Allows selection of Ravencoin', function(done) {
1569 var params = {
1570 selectText: "RVN - Ravencoin",
1571 phrase: "abandon abandon ability",
1572 firstAddress: "RBuDoVNnzvFsEcX8XKPm8ic4mgiCzjUCNk",
1573 firstPubKey: "02135446ddfa13617ada02187702b51c3ae17a671773aa7ab7100a3cb89b7c9eb1",
1574 firstPrivKey: "KwRpyD9EmoyjQQRKtFVYL1WkS9Ywue8zSpebRPtXViiGR8kWUEJV",
1575 };
1576 testNetwork(done, params);
1577 });
1578 it('Allows selection of Reddcoin', function(done) {
1579 var params = {
1580 selectText: "RDD - Reddcoin",
1581 phrase: "abandon abandon ability",
1582 firstAddress: "RtgRvXMBng1y51ftteveFqwNfyRG18HpxQ",
1583 firstPubKey: "026565dd8a2e6f75e6391fbe16e6fb7dfab8b9cba85ea56b63f015d98c13d8f46d",
1584 firstPrivKey: "V1cNKW3ZYbRXosccyG9d3t4g7nGCBGyQJi7zLe6WZ3tExXMUqqK1",
1585 };
1586 testNetwork(done, params);
1587 });
1588 it('Allows selection of RevolutionVR', function(done) {
1589 var params = {
1590 selectText: "RVR - RevolutionVR",
1591 phrase: "abandon abandon ability",
1592 firstAddress: "VXeeoP2jkzZnMFxtc66ZBZK1NHN5QJnnjL",
1593 firstPubKey: "03c107f37ffb305d70a690ecd89254a67099d8855a4162762c62e3ad72e78c50e4",
1594 firstPrivKey: "WQdDNS6ZPZcFfBn7AwFMu1GHkm5jScBwpVDqNjmC16PEU7yG97vP",
1595 };
1596 testNetwork(done, params);
1597 });
1598 it('Allows selection of Rubycoin', function(done) {
1599 var params = {
1600 selectText: "RBY - Rubycoin",
1601 phrase: "abandon abandon ability",
1602 firstAddress: "RV76JDtjTs11JdMDRToYn6CHecMRPLnKS6",
1603 firstPubKey: "037828022748cf1f2107e9d99f7a19b8b44ebb24b332c51c0ca1cecec301cf1797",
1604 firstPrivKey: "UwQPqs31g9AKQzLjHNqgXN66tout2i6F7VSiCsSsR3LVHq7aToVL",
1605 };
1606 testNetwork(done, params);
1607 });
1608 it('Allows selection of Salus', function(done) {
1609 var params = {
1610 selectText: "SLS - Salus",
1611 phrase: "abandon abandon ability",
1612 firstAddress: "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww",
1613 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1614 firstPrivKey: "VMYkYTHeeHiosSQM9EFFdEH1a7fiMEL3TgBPxQVhXWqxAvyQ3uJL",
1615 };
1616 testNetwork(done, params);
1617 });
1618 it('Allows selection of Smileycoin', function(done) {
1619 var params = {
1620 selectText: "SMLY - Smileycoin",
1621 phrase: "abandon abandon ability",
1622 firstAddress: "BEZVnEBCAyFByrgKpwAgYgtvP4rKAd9Sj2",
1623 firstPubKey: "02145f25ab87def3ce6decffc6bf740037dc467a32ff8e62f147c70f5092074f2b",
1624 firstPrivKey: "pC32pZDfv3L3vegrv8gptiyc3SkJEZ6BigioGjLmD3wFw2h1qcz",
1625 };
1626 testNetwork(done, params);
1627 });
1628 it('Allows selection of Solarcoin', function(done) {
1629 var params = {
1630 selectText: "SLR - Solarcoin",
1631 phrase: "abandon abandon ability",
1632 firstAddress: "8LZ13HbnjtaMJWSvvVFNTLf71zFfDrhwLu",
1633 firstPubKey: "0305dbadd4fd239ecfca9239c9405e3b12178d46bdaf7520d511339a05367a3c88",
1634 firstPrivKey: "NeNfMe2zy5R6eUVJ3pZ4hs17s4xtm7xHjLJoe1hgCwVoYsfHx5Jy",
1635 };
1636 testNetwork(done, params);
1637 });
1638 it('Allows selection of stash', function(done) {
1639 var params = {
1640 selectText: "STASH - Stash",
1641 phrase: "abandon abandon ability",
1642 firstAddress: "XxwAsWB7REDKmAvHA85SbEZQQtpxeUDxS3",
1643 firstPubKey: "030caa120ce0fbd2c2d08a24c15086bafcf55d3862f423b0e55fd376474a0e7160",
1644 firstPrivKey: "XF3r4xQozRKvRUNgQG1bx8MGCuSLzV82XrNfB52Utpaixm8tWmWz",
1645 };
1646 testNetwork(done, params);
1647 });
1648 it('Allows selection of stash testnet', function(done) {
1649 var params = {
1650 selectText: "STASH - Stash Testnet",
1651 phrase: "abandon abandon ability",
1652 firstAddress: "yWQCTSkUst7ddYuebKsqa1kSoXEjpCkGKR",
1653 firstPubKey: "02a709b853a4ac1739c036c3d2bcf03b3e8c54b64927c57a07ac05c8e903545dd0",
1654 firstPrivKey: "cNrt5ghh7pPGQZVZkL5FJFNsWQQTKQPtLJz2JT7KnsfpzeAPYSp3",
1655 };
1656 testNetwork(done, params);
1657 });
1658 it('Allows selection of Stratis', function(done) {
1659 var params = {
1660 selectText: "STRAT - Stratis",
1661 phrase: "abandon abandon ability",
1662 firstAddress: "ScfJnq3QDhKgDMEds6sqUE1ot6ShfhmXXq",
1663 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1664 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1665 };
1666 testNetwork(done, params);
1667 });
1668 it('Allows selection of Stratis Test', function(done) {
1669 var params = {
1670 selectText: "TSTRAT - Stratis Testnet",
1671 phrase: "abandon abandon ability",
1672 firstAddress: "TRLWm3dye4FRrDWouwYUSUZP96xb76mBE3",
1673 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1674 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1675 };
1676 testNetwork(done, params);
1677 });
1678 it('Allows selection of Sugarchain', function(done) {
1679 var params = {
1680 selectText: "SUGAR - Sugarchain",
1681 phrase: "abandon abandon ability",
1682 firstAddress: "SYnd31fYr39VgKju87Vz1sYBmEeHg5cudk",
1683 firstPubKey: "035bc9fa22eff2246ec07bb09c9e32f5f9fee517b4f49a8f117508f8fb41905b25",
1684 firstPrivKey: "L2G3axGdZv5EV8osAsBPMese74i4dTHaGvxDh7DsRF5Ky6hKkPDY",
1685 };
1686 testNetwork(done, params);
1687 });
1688 it('Allows selection of Syscoin', function(done) {
1689 var params = {
1690 selectText: "SYS - Syscoin",
1691 phrase: "abandon abandon ability",
1692 firstAddress: "SZwJi42Pst3VAMomyK5DG4157WM5ofRmSj",
1693 firstPubKey: "02219514722373a337c6425ca5ccc423e160f0abf66b57a71fba4db7aca6957f6a",
1694 firstPrivKey: "L36rm7aHFTz571YY87nA3ZLace8NcqPYZsyuyREuT4wXFtTBqLrc",
1695 };
1696 testNetwork(done, params);
1697 });
1698 it('Allows selection of Toa', function(done) {
1699 var params = {
1700 selectText: "TOA - Toa",
1701 phrase: "abandon abandon ability",
1702 firstAddress: "TSe1QAnUwQzUfbBusDzRJ9URttrRGKoNKF",
1703 firstPubKey: "0332facd2ea64c2f1e6152961340b7e51ca77f1bffa0f950442b4ef5021f7ee86c",
1704 firstPrivKey: "VdSdDaM1Kjw1SzzW7KCzFEFi7Zf5egUHVofSiLkrSh7K6bbYZhnb",
1705 };
1706 testNetwork(done, params);
1707 });
1708 it('Allows selection of TWINS', function(done) {
1709 var params = {
1710 selectText: "TWINS - TWINS",
1711 phrase: "abandon abandon ability",
1712 firstAddress: "WPpJnfLLubNmF7HLNxg8d8zH5haxn4wri8",
1713 firstPubKey: "02a4b9bda2a7a2e4540d54c4afb3a3007f6f22f8cd2df67d5c69388fd8ddc16a07",
1714 firstPrivKey: "Au5fg7nYMXHmNT9BSfQVNxaUduP9cgJASeNDMrP9qfoWi2ZTmR48",
1715 };
1716 testNetwork(done, params);
1717 });
1718 it('Allows selection of TWINS testnet', function(done) {
1719 var params = {
1720 selectText: "TWINS - TWINS Testnet",
1721 phrase: "abandon abandon ability",
1722 firstAddress: "XpnU1HHdNG5YxvG9Rez4wjmidchxqnZaNa",
1723 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
1724 firstPrivKey: "cBtMfPpQg4s1Ndfez7oLdedwu8CxshhWE5f7qunhLsY4ueNvKKyM",
1725 };
1726 testNetwork(done, params);
1727 });
1728 it('Allows selection of Ultimatesecurecash', function(done) {
1729 var params = {
1730 selectText: "USC - Ultimatesecurecash",
1731 phrase: "abandon abandon ability",
1732 firstAddress: "UPyLAZU2Che5fiy7Ed8xVJFmXAUhitA4ug",
1733 firstPubKey: "03a529111ee6d54965962b289f7537db1edb57863e2e10dd96939f8d3501ecebd4",
1734 firstPrivKey: "VG1ZbBExPyeeT72EL1jQU8SvXkpK6heTept76wLiGCuMgRHqrz9L",
1735 };
1736 testNetwork(done, params);
1737 });
1738 it('Allows selection of Unobtanium', function(done) {
1739 var params = {
1740 selectText: "UNO - Unobtanium",
1741 phrase: "abandon abandon ability",
1742 firstAddress: "uUBMPVMXrR6qhqornJqKTWgr8L69vihSL9",
1743 firstPubKey: "026dd108ff43d425ad923f2107f5fc166cbb90dd0bd04b157c1ebdc9c04a423e0f",
1744 firstPrivKey: "aAf6LmMJpWQMZbHVSHtkKDCNViknGD4TQ3y1rwvJe2L55dwpbqBV",
1745 };
1746 testNetwork(done, params);
1747 });
1748 it('Allows selection of Vcash', function(done) {
1749 var params = {
1750 selectText: "XVC - Vcash",
1751 phrase: "abandon abandon ability",
1752 firstAddress: "VuL53MSY6KjvAjKSeRkh3NDnKykacDVeps",
1753 firstPubKey: "03ab245795cf39c4084684d039a01c387472c3626d93d24289d229c27ce9eeeace",
1754 firstPrivKey: "WVC2yAf2rFHzjbKKJeZWNFjMqQ9ATRg3xdtG2FfVDQATpNj5fHy9",
1755 };
1756 testNetwork(done, params);
1757 });
1758 it('Allows selection of Verge', function(done) {
1759 var params = {
1760 selectText: "XVG - Verge",
1761 phrase: "abandon abandon ability",
1762 firstAddress: "DCrVuGkMjLJpTGgwAgv9AcMdeb1nkWbjZA",
1763 firstPubKey: "03cd21de72f291cd5a3632a23a710616416743f60b4667a0f8d3fc03c7fd6e0c77",
1764 firstPrivKey: "QRpRGbTRC7P12PyhiFqyZpVwK5XCGe5Lmr9hbV7ujcjg9cjUGqF7",
1765 };
1766 testNetwork(done, params);
1767 });
1768 it('Allows selection of Vertcoin', function(done) {
1769 var params = {
1770 selectText: "VTC - Vertcoin",
1771 phrase: "abandon abandon ability",
1772 firstAddress: "Vf6koGuiWdXQfx8tNqxoNeEDxh4xh5cxsG",
1773 firstPubKey: "02f15155bc5445fc764db199da5e7ac92112ab9f2a5e408904f145ea29d169010a",
1774 firstPrivKey: "Kxu4LwEJZooaVWGT9ZLzJBuaUFr1hLjuottjT7eTNNWJKk7Hur1u",
1775 };
1776 testNetwork(done, params);
1777 });
1778 it('Allows selection of Vivo', function(done) {
1779 var params = {
1780 selectText: "VIVO - Vivo",
1781 phrase: "abandon abandon ability",
1782 firstAddress: "VFmBwuXXGhJe7MarQG2GfzHMFebRHgfSpB",
1783 firstPubKey: "02d24546a74522e0dc8bbfde66e65201ae81b0f6e2b60239c8baf09c1a53b73f8c",
1784 firstPrivKey: "WLSLMqZjuwzibyhPfaYvxG4z1tRnmVX4yYFtbQmHhU4eKt12Nuqq",
1785 };
1786 testNetwork(done, params);
1787 });
1788 it('Allows selection of Vpncoin', function(done) {
1789 var params = {
1790 selectText: "VASH - Vpncoin",
1791 phrase: "abandon abandon ability",
1792 firstAddress: "VoEmH1qXC4TsSgBAStR21QYetwnFqbqCx9",
1793 firstPubKey: "039e579dd18157ef1dff74d46f0bdb95f729d3985f0d4f9167fed4095b1aba846c",
1794 firstPrivKey: "WTbS2wjqeTzs8nk1E1N8RxpPUow8wNkgCjfDCuvDLRHaWFuNhxMz",
1795 };
1796 testNetwork(done, params);
1797 });
1798 it('Allows selection of VeChain', function(done) {
1799 var params = {
1800 selectText: "VET - VeChain",
1801 phrase: "abandon abandon ability",
1802 firstAddress: "0xdba55B1B6070f3a733D5eDFf35F0da4A00E455F2",
1803 firstPubKey: "0x0386911777255ed1d57906dcc85ca7fd4ba9eb4c8160ced97817933919d1ffe7ad",
1804 firstPrivKey: "0x3ec2b392952fe8a82a319c8ca9a4bb9c1db7beb09c64799da7693615ba1a787e",
1805 };
1806 testNetwork(done, params);
1807 });
1808 it('Allows selection of Whitecoin', function(done) {
1809 var params = {
1810 selectText: "XWC - Whitecoin",
1811 phrase: "abandon abandon ability",
1812 firstAddress: "WcSwCAUqrSgeSYbsaS3SSWWhsx8KRYTFDR",
1813 firstPubKey: "03d3f4fa758f6260bfb39664d248a32258b53a90a71224db056ee79abaa3e9f208",
1814 firstPrivKey: "WrGUVSubUyDx5wzjfwi3EhhUwf5anHFW7Dv9kAaTu39CtDDBJWM9",
1815 };
1816 testNetwork(done, params);
1817 });
1818 it('Allows selection of Wincoin', function(done) {
1819 var params = {
1820 selectText: "WC - Wincoin",
1821 phrase: "abandon abandon ability",
1822 firstAddress: "WaDVCESMGgyKgNESdn3u43NnwmGSkZED3Z",
1823 firstPubKey: "02d10b29f6d88dd86f733b2140ba2207a9dfb5d014bb287541c66a41e467e231a7",
1824 firstPrivKey: "WmLWUvbz8UF1s7PrHyeQBMLbt4LpmQrwbzatvusvx6SRoNASbWtW",
1825 };
1826 testNetwork(done, params);
1827 });
1828 it('Allows selection of Zcoin', function(done) {
1829 var params = {
1830 selectText: "XZC - Zcoin",
1831 phrase: "abandon abandon ability",
1832 firstAddress: "a6VcMdP4XgAA9Tr7xNszmPG5FZpfRf17Cq",
1833 firstPubKey: "0236f2348c32dc62d69488b01988ed1154df261723ec60461cb6e62189984c62db",
1834 firstPrivKey: "Y8k3XQRQrJoABEao4Sw45s744g6xth7yviNqFcN7zqPqKUJrrKTQ",
1835 };
1836 testNetwork(done, params);
1837 });
1838 it('Allows selection of Zcash', function(done) {
1839 var params = {
1840 selectText: "ZEC - Zcash",
1841 phrase: "abandon abandon ability",
1842 firstAddress: "t1Sz8AneMcVuzUg3tPJ8et5AS5LFJ7K2EF9",
1843 firstPubKey: "035864cede8db462f7ccfda96bd7358156e198a894032cfc87505d82abb6d48b48",
1844 firstPrivKey: "L1eU2kCeBQBZTQKKt7uYu4pb6Z1ZMy1Km1VMznUvGyH64GTxMqfL",
1845 };
1846 testNetwork(done, params);
1847 });
1848 it('Allows selection of Zclassic', function(done) {
1849 var params = {
1850 selectText: "ZCL - Zclassic",
1851 phrase: "abandon abandon ability",
1852 firstAddress: "t1TBMxTvVJRybUbMLGWq8H4A8F4VUL7czEc",
1853 firstPubKey: "02fbdf32c4d9e692d4a94aa09f830a2a3b7b73f5c4f313b8234fc39a8b151c9ab7",
1854 firstPrivKey: "L5N7BBrrAweLcbAQGVDLZAaX9DnfAiD2VCZBBU1U3HBftFsRfHm7",
1855 };
1856 testNetwork(done, params);
1857 });
1858 it('Allows selection of Horizen', function(done) {
1859 var params = {
1860 selectText: "ZEN - Horizen",
1861 phrase: "abandon abandon ability",
1862 firstAddress: "znWh9XASyW2dZq5tck84wFjiwuqVysi7q3p",
1863 firstPubKey: "0326a78c08ef8a2b6c0d0d3959ffeddaad64fc921b0e714baeafff4785db31ff7a",
1864 firstPrivKey: "L25L6Ctvb4fr6fTaVVECE2CVoeGuttfUJqk1HQxfuejgb5QZHu8y",
1865 };
1866 testNetwork(done, params);
1867 });
1868 it('Allows selection of Energi', function(done) {
1869 var params = {
1870 selectText: "NRG - Energi",
1871 phrase: "abandon abandon ability",
1872 firstAddress: "EejRy4t4nidzhGGzkJUgFP3z4HYBjhTsRt",
1873 firstPubKey: "03a4aa1d4d5bdce7c18df69b123ef292e7e9b6069948b14bf3ee089188076e7c80",
1874 firstPrivKey: "GkMWjZtHh9RXFeNL2m5GKPp3wdNmiaSqqUWVLunR766TjbigK4FC",
1875 };
1876 testNetwork(done, params);
1877 });
1878 it('Allows selection of Ethereum Classic', function(done) {
1879 var params = {
1880 selectText: "ETC - Ethereum Classic",
1881 phrase: "abandon abandon ability",
1882 firstAddress: "0x3c05e5556693808367afB62eF3b63e35d6eD249A",
1883 firstPubKey: "0x02afa443029a20b62fe90c3eaa772d440d8e2ddc1ad247c3473b3ff34dc0583f3f",
1884 firstPrivKey: "0x5253e43358ddb97c8c710a2f51fcbdf7c07aad193ddd29c8b57dbab50d6141f2",
1885 };
1886 testNetwork(done, params);
1887 });
1888 it('Allows selection of Pirl', function(done) {
1889 var params = {
1890 selectText: "PIRL - Pirl",
1891 phrase: "abandon abandon ability",
1892 firstAddress: "0xe77FC0723dA122B5025CA79193c28563eB47e776",
1893 firstPubKey: "0x039b4d13ecf9ef299546ba0d486969e0b659baa0cb71278501a46dce4381f612de",
1894 firstPrivKey: "0xe76ed1cffd0572b31be2ada6848d46e267b8b2242b30f1a92142f64ee4772460",
1895 };
1896 testNetwork(done, params);
1897 });
1898 it('Allows selection of MIX', function(done) {
1899 var params = {
1900 selectText: "MIX - MIX",
1901 phrase: "abandon abandon ability",
1902 firstAddress: "0x98BC5e63aeb6A4e82d72850d20710F07E29A29F1",
1903 firstPubKey: "0x02686ad3d73950627c46b73cd0c0d3b17e0bdcb89c094ce68b2f4219c09016c547",
1904 firstPrivKey: "0x70deca38fff7d8a2490491deb1bb7fbc979d6a0b97000b9f1eddefdd214eb7da",
1905 };
1906 testNetwork(done, params);
1907 });
1908 it('Allows selection of Monkey Project', function(done) {
1909 var params = {
1910 selectText: "MONK - Monkey Project",
1911 phrase: "abandon abandon ability",
1912 firstAddress: "MnLrcnnUzKnf7TzufjRe5DLZqQJz18oYyu",
1913 firstPubKey: "03a3f72bd9023fa12b22e5255d74e80420a968b577efbc52cea283da0f6690d4fc",
1914 firstPrivKey: "9B4CknHTfmvPS3oEG6AjJUMz1SZtJKN6rmEoaFoZNCJd1EU1xVdS",
1915 };
1916 testNetwork(done, params);
1917 });
1918
1919 it('Allows selection of MOAC', function(done) {
1920 var params = {
1921 selectText: "MOAC - MOAC",
1922 phrase: "ill clump only blind unit burden thing track silver cloth review awake useful craft whale all satisfy else trophy sunset walk vanish hope valve",
1923 firstAddress: "0xa1350EA5707247e0092Ab780A0CDbeA9c8C7Acb5",
1924 firstPubKey: "0x0376b024c6068c9fda7e91779e115dcd3a70584fd6984e6dd25da144c46ca259c6",
1925 firstPrivKey: "0x2515f9db03c1e56de393648eabf35d288f730aadce5d30865c52e72b28e303c9",
1926 };
1927 testNetwork(done, params);
1928 });
1929 it('Allows selection of Musicoin', function(done) {
1930 var params = {
1931 selectText: "MUSIC - Musicoin",
1932 phrase: "abandon abandon ability",
1933 firstAddress: "0xDc060e4A0b0313ea83Cf6B3A39B9db2D29004897",
1934 firstPubKey: "0x02a17278d54548e7cf0c1e6120646174f42e380ae5a0080f1a0d09f118305d6f9f",
1935 firstPrivKey: "0xaea8683b8bfd56b6fc68c19b88eee4ccd2f00430bc466741d0297aa65c7b56a5",
1936 };
1937 testNetwork(done, params);
1938 });
1939 it('Allows selection of Poa', function(done) {
1940 var params = {
1941 selectText: "POA - Poa",
1942 phrase: "abandon abandon ability",
1943 firstAddress: "0x53aF28d754e106210C3d0467Dd581eaf7e3C5e60",
1944 firstPubKey: "0x02cda40cf7f21f370afe0206cbf219f963369d7c7229dc7ba64137358489d96567",
1945 firstPrivKey: "0xed0a44cff8e44fa978f339af3308ee439c30f4170671ad0e1ccd7e4bfff70ed9",
1946 };
1947 testNetwork(done, params);
1948 });
1949 it('Allows selection of Expanse', function(done) {
1950 var params = {
1951 selectText: "EXP - Expanse",
1952 phrase: "abandon abandon ability",
1953 firstAddress: "0xf57FeAbf26582b6E3E666559d3B1Cc6fB2b2c5F6",
1954 firstPubKey: "0x0232fa15f0971f93c182afea54cb28a3180f5a4c31759235ca6ceca47a5a777335",
1955 firstPrivKey: "0x9f96418f9ec3672b52c2a6421272650b2d5992d524a48905a4ff0ed9ce347c9b",
1956 };
1957 testNetwork(done, params);
1958 });
1959 it('Allows selection of Callisto', function(done) {
1960 var params = {
1961 selectText: "CLO - Callisto",
1962 phrase: "abandon abandon ability",
1963 firstAddress: "0x4f9364F7420B317266C51Dc8eB979717D4dE3f4E",
1964 firstPubKey: "0x0313d9db8d77249c768630a5a8315e08e3a3284d7e18774476d15e073931ddc15e",
1965 firstPrivKey: "0x02bbf00719f3730baf989f7392b8d55548dd349abd744c68242c69bd016ce28d",
1966 };
1967 testNetwork(done, params);
1968 });
1969 it('Allows selection of HUSH', function(done) {
1970 var params = {
1971 selectText: "HUSH - Hush (Legacy)",
1972 phrase: "abandon abandon ability",
1973 firstAddress: "t1g6rLXUnJaiJuu4q4zmJjoa9Gk4fwKpiuA",
1974 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
1975 firstPrivKey: "Kx99fhLCDHPsBsZAJDH7v8vgGDch4rNr9VjhAUMfVevJWnoGr8WD",
1976 };
1977 testNetwork(done, params);
1978 });
1979 it('Allows selection of HUSH3', function(done) {
1980 var params = {
1981 selectText: "HUSH - Hush3",
1982 phrase: "abandon abandon ability",
1983 firstAddress: "RXWSQhwvw5jHPGP8bjwJhWoRnMLBnuPDKD",
1984 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
1985 firstPrivKey: "UpvyyNxAiWN7evMFUkxhgabuCHfq9xeTv17Wjj9LxN91QegKs6RR",
1986 };
1987 testNetwork(done, params);
1988 });
1989 it('Allows selection of ExchangeCoin', function(done) {
1990 var params = {
1991 selectText: "EXCC - ExchangeCoin",
1992 phrase: "abandon abandon ability",
1993 firstAddress: "22txYKpFN5fwGwdSs2UBf7ywewbLM92YqK7E",
1994 firstPubKey: "033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3",
1995 firstPrivKey: "L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE",
1996 };
1997 testNetwork(done, params);
1998 });
1999 it('Allows selection of Artax', function(done) {
2000 var params = {
2001 selectText: "XAX - Artax",
2002 phrase: "abandon abandon ability",
2003 firstAddress: "AYxaQPY7XLidG31V7F3yNzwxPYpYzRqG4q",
2004 firstPubKey: "02edef928ec3951112452119f9a63d9479741ea0fc497682bd13064cfc5d1cc4e3",
2005 firstPrivKey: "PMcqFx52ipYy9gZynEi5LYVD3XUC8YbQr2Neg6e3LFnh4yTBQ9yJ",
2006 };
2007 testNetwork(done, params);
2008 });
2009 it('Allows selection of BitcoinGreen', function(done) {
2010 var params = {
2011 selectText: "BITG - Bitcoin Green",
2012 phrase: "abandon abandon ability",
2013 firstAddress: "GeNGm9SkEfwbsws3UrrUSE2sJeyWYjzraY",
2014 firstPubKey: "02a8e34c2599a14ca861285b734750432a7ce10caf7f1ff5a366a94264c636a12b",
2015 firstPrivKey: "7uf6WeVgBqKR1WyUcaz1TLSKabyov9SfQDghyvfaCy6VZPwLNeku",
2016 };
2017 testNetwork(done, params);
2018 });
2019 it('Allows selection of ANON', function(done) {
2020 var params = {
2021 selectText: "ANON - ANON",
2022 phrase: "abandon abandon ability",
2023 firstAddress: "AnU6pijpEeUZFWSTyM2qTqZQn996Zq1Xard",
2024 firstPubKey: "032742ff4eaf9188d84d38dfb4a2fdbb541bfd3ca9ee533a7d1092940a1ea60bb4",
2025 firstPrivKey: "L2w3aoZExc9eHh1KMnDzrzaSVmfgQMvBxxFbtcegKNvrHVa4r81m",
2026 };
2027 testNetwork(done, params);
2028 });
2029 it('Allows selection of ProjectCoin', function(done) {
2030 var params = {
2031 selectText: "PRJ - ProjectCoin",
2032 phrase: "abandon abandon ability",
2033 firstAddress: "PXZG97saRseSCftfe1mcFmfAA7pf6qBbaz",
2034 firstPubKey: "025f84297a93a33bccb735c931140ddb4279fe9d55a571ee7731259e3e19d0c7fe",
2035 firstPrivKey: "JRR5uB6daEtSCLNnv7hKSgZ5KmFdHMUcpTzJGtEAi9sWSiQd4hVQ",
2036 };
2037 testNetwork(done, params);
2038 });
2039 it('Allows selection of Phore', function(done) {
2040 var params = {
2041 selectText: "PHR - Phore",
2042 phrase: "abandon abandon ability",
2043 firstAddress: "PJThxpoXAG6hqrmdeQQbVDX4TJtFTMMymC",
2044 firstPubKey: "022ef3c4cbc0481fd925ecac51f09f2976ea024b0863b543b1b481181e1ef34265",
2045 firstPrivKey: "YPzQxHMA2Pm5S2p8Xwhmhm2PnH6ooYHrWNXiAKCCA2CjMtHyNzuh",
2046 };
2047 testNetwork(done, params);
2048 });
2049 it('Allows selection of Safecoin', function(done) {
2050 var params = {
2051 selectText: "SAFE - Safecoin",
2052 phrase: "abandon abandon ability",
2053 firstAddress: "RtxHpnhJz6RY8k9owP3ua5QWraunmewB1G",
2054 firstPubKey: "0383956cd23c1124324c92ac69f4bcf71ad973892a83aceb4085041afb082f6db9",
2055 firstPrivKey: "Uznk2AHWqpSGRw8dmG3t3Q3rJJwyn3TcjzWh9EgDCQ9jU34DWF6m",
2056 };
2057 testNetwork(done, params);
2058 });
2059 it('Allows selection of Blocknode', function(done) {
2060 var params = {
2061 selectText: "BND - Blocknode",
2062 phrase: "abandon abandon ability",
2063 firstAddress: "BG8xZSAur2jYLG9VXt8dYfkKxxeR7w9bSe",
2064 firstPubKey: "03e91c00dcfca87c80f57691e34e0e4c55a18eb79048dbdd5f6d9c83daefea6459",
2065 firstPrivKey: "C6gySxND85cLnLgsjTfUxXmMzh8JrSR24vpQnUHqVMqGYy36k4ho",
2066 };
2067 testNetwork(done, params);
2068 });
2069 it('Allows selection of Blocknode Testnet', function(done) {
2070 var params = {
2071 selectText: "tBND - Blocknode Testnet",
2072 phrase: "abandon abandon ability",
2073 firstAddress: "bSptsFyDktFSKpWveRywJsDoJA2TC6qfHv",
2074 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2075 firstPrivKey: "MPuJVFnTAhFFvtLqgYL32FBF1g7jPraowuN5tV9EF2AtkYXCfkE3",
2076 };
2077 testNetwork(done, params);
2078 });
2079 it('Allows selection of LitecoinZ', function(done) {
2080 var params = {
2081 selectText: "LTZ - LitecoinZ",
2082 phrase: "abandon abandon ability",
2083 firstAddress: "L1VTXju7hLgKV4T7fGXS9sKsnm2gmtRCmyw",
2084 firstPubKey: "03ea84a1cc8b43ea8330bc2f363e706a9ff2d48858185c42c296d06ddcb94bc827",
2085 firstPrivKey: "L1PktmLfTgVRQZsqs2ZoFBBqnVXi5hVAimJt8tmfT2ye95WH9zEd",
2086 };
2087 testNetwork(done, params);
2088 });
2089 it('Allows selection of BlockStamp', function(done) {
2090 var params = {
2091 selectText: "BST - BlockStamp",
2092 phrase: "abandon abandon ability",
2093 firstAddress: "15gypKtim4cVTj137ApfryG17RkvSbPazZ",
2094 firstPubKey: "0277bc537f8354004f8a77e07fb78b38f291df7bc07819c2d7eab049b8d10b3f7f",
2095 firstPrivKey: "L1NmycTQz17fXBMzK25aBTnN7v5U6rz3AURjL72xyKg21zmAmgt7",
2096 };
2097 testNetwork(done, params);
2098 });
2099 it('Allows selection of DEXON', function(done) {
2100 var params = {
2101 selectText: "DXN - DEXON",
2102 phrase: "abandon abandon ability",
2103 firstAddress: "0x136a58788033E028CCd740FbDec6734358DB56Ec",
2104 firstPubKey: "0x028d7fa8c3417904cec37946db8d12bba51d85dde25156651f216260e0ff641cf4",
2105 firstPrivKey: "0x8d7d8479dac38e786d4e493159dd655e116871d17ed803af6bb70207c60298ff",
2106 };
2107 testNetwork(done, params);
2108 });
2109 it('Allows selection of Ellaism', function(done) {
2110 var params = {
2111 selectText: "ELLA - Ellaism",
2112 phrase: "abandon abandon ability",
2113 firstAddress: "0xa8B0BeA09eeBc41062308546a01d6E544277e2Ca",
2114 firstPubKey: "0x03698fee21c52ad4b4772df3da92ddf0278da529da231c2ebfb167c9e3cc88f29f",
2115 firstPrivKey: "0xe10bc99fcea6f5bca20c1b6e5386a18991b8d16d658b36881b7aca792e06bac2",
2116 };
2117 testNetwork(done, params);
2118 });
2119 it('Allows selection of Ethersocial Network', function(done) {
2120 var params = {
2121 selectText: "ESN - Ethersocial Network",
2122 phrase: "abandon abandon ability",
2123 firstAddress: "0x6EE99Be2A0C7F887a71e21C8608ACF0aa0D2b767",
2124 firstPubKey: "0x028df59c64daa4f1036fe0dc832c4e36d9df0692a7ed9a062d48a4662a01d2c7b3",
2125 firstPrivKey: "0x44e0316578fd8168022039d5dfd5838e70826686a4b05dec9c88100c30049fce",
2126 };
2127 testNetwork(done, params);
2128 });
2129 it('Allows selection of Stellar', function(done) {
2130 var params = {
2131 selectText: "XLM - Stellar",
2132 phrase: "abandon abandon ability",
2133 firstAddress: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2134 firstPubKey: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2135 firstPrivKey: "SA35HYGAHWYYLCW2P5EDHGWAYQW2C5F25KH4KFWEXLG5I4CPKPZTLRM5",
2136 };
2137 testNetwork(done, params);
2138 });
2139 it('Allows selection of Wagerr', function(done) {
2140 var params = {
2141 selectText: "WGR - Wagerr",
2142 phrase: "abandon abandon ability",
2143 firstAddress: "WYiVgQU39VcQxcnacoCiaZHZZLjDCJoS95",
2144 firstPubKey: "0343cfa1ed85e02fdc782c3c8b0b5febe7653c30a0c4319bef2e7d462e67245e46",
2145 firstPrivKey: "WagfoYsRKgtBwBMgwYWuboY2DpGjJBpFcneqzSegZg4ppvYLWcry",
2146 };
2147 testNetwork(done, params);
2148 });
2149 it('Allows selection of Groestlcoin', function(done) {
2150 var params = {
2151 selectText: "GRS - Groestlcoin",
2152 phrase: "abandon abandon ability",
2153 firstAddress: "FZycsFvZ1eH1hbtyjBpAgJSukVw1bN6PBN",
2154 firstPubKey: "03c1d0c7b272a762b4b697bdb1b3b36e26add3215e69f7251db16c5a51c84b7b4c",
2155 firstPrivKey: "KzQVqEsQrKjb4K6bViRqqQJc9nXrvEAxDy2AiPf6tfEkRW7rgNfg",
2156 };
2157 testNetwork(done, params);
2158 });
2159 it('Allows selection of Groestlcoin Testnet', function(done) {
2160 var params = {
2161 selectText: "GRS - Groestlcoin Testnet",
2162 phrase: "abandon abandon ability",
2163 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiygRPne9",
2164 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2165 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJpRHpNq",
2166 };
2167 testNetwork(done, params);
2168 });
2169 it('Allows selection of Elastos', function(done) {
2170 var params = {
2171 selectText: "ELA - Elastos",
2172 phrase: "abandon abandon ability",
2173 firstAddress: "EMccDcsn3SwPDcfeQMf3w7utqi8ioWYtkg",
2174 firstPubKey: "02c936d5025b06acc283bf9562700279fd1ea3ce7ee204afca0c07be77bc3b4822",
2175 firstPrivKey: "608f7e64b46a1df51ba6b5b38b0599196afd1f36572b1ec696d7aae65d05045d",
2176 };
2177 testNetwork(done, params);
2178 });
2179 it('Allows selection of Energyweb', function(done) {
2180 var params = {
2181 selectText: "EWT - EnergyWeb",
2182 phrase: "abandon abandon ability",
2183 firstAddress: "0x22171474844Fc7E8E99A3A69CCf1eDb5574FdD4c",
2184 firstPubKey: "0x03eee63d4d201168802b43f392e61f148a478935055cd990549452c741f4c34b84",
2185 firstPrivKey: "0x325aa9e82d03b3773859d84bece81a598df8478d361cfbc59efc27385e0e3611",
2186 };
2187 testNetwork(done, params);
2188 });
2189 it('Allows selection of Thought', function(done) {
2190 var params = {
2191 selectText: "THT - Thought",
2192 phrase: "abandon abandon ability",
2193 firstAddress: "4B1Bh9GibDarFQrhtYU8krpc7WSjgGfYvo",
2194 firstPubKey: "0390e4598e7924f3b0369020394b133545db6bd37fa3aa4648aafbce46330c28cc",
2195 firstPrivKey: "KCwL3y6VVrgzJFqtCkh2RV9M1zruX9NymKsWheb7by1dWLd2QkFx",
2196 };
2197 testNetwork(done, params);
2198 });
2199 it('Allows selection of EtherCore', function(done) {
2200 var params = {
2201 selectText: "ERE - EtherCore",
2202 phrase: "abandon abandon ability",
2203 firstAddress: "0x119e6EAC3Ce1b473D62d9fD847fb0ea222eF1D9e",
2204 firstPubKey: "0x02cfeb9a4d8003b5c919c1eb67c91e06b3c08e602a336f74017fc7c756a2550ca9",
2205 firstPrivKey: "0x6bb6e036aaf39326d3c74345ec34ef0c73b1608acb409306c9ba73d22de6abf0",
2206 };
2207 testNetwork(done, params);
2208 });
2209 it('Allows selection of RBTC - RSK', function(done) {
2210 var params = {
2211 selectText: "RBTC - RSK",
2212 phrase: "abandon abandon ability",
2213 firstAddress: "RGtz5TDdtviAZ9haz1YAUNQzcGVFm5bQrP",
2214 firstPubKey: "0219d9b5087ab68edc8a714969d8cb70e7159417b47a05932b227e6f417c7962b9",
2215 firstPrivKey: "UsiDPMcpYqCwtzGXo4wiPZp7cwBaKdmbmseioTc1rFQsg21adFc8",
2216 };
2217 testNetwork(done, params);
2218 });
2219 it('Allows selection of tRBTC - RSK Testnet', function(done) {
2220 var params = {
2221 selectText: "tRBTC - RSK Testnet",
2222 phrase: "abandon abandon ability",
2223 firstAddress: "RHkrWgnSdJHxQAqEsMErhUUa4icXY6xUUC",
2224 firstPubKey: "03f77eb7bd83e92ef47be1abddae7f71fb0bc8a7a1ee4b193662a86ed2705ffc5b",
2225 firstPrivKey: "UpqfuSEDKoacrPh4wMV4sJZqCB6DJfYe81oWBr4eb7y9FWQWoo2A",
2226 };
2227 testNetwork(done, params);
2228 });
2229
2230 // BIP39 seed is set from phrase
2231 it('Sets the bip39 seed from the prhase', function(done) {
2232 driver.findElement(By.css('.phrase'))
2233 .sendKeys('abandon abandon ability');
2234 driver.sleep(generateDelay).then(function() {
2235 driver.findElement(By.css('.seed'))
2236 .getAttribute("value")
2237 .then(function(seed) {
2238 expect(seed).toBe("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3");
2239 done();
2240 })
2241 });
2242 });
2243
2244 // BIP32 root key is set from phrase
2245 it('Sets the bip39 root key from the prhase', function(done) {
2246 driver.findElement(By.css('.phrase'))
2247 .sendKeys('abandon abandon ability');
2248 driver.sleep(generateDelay).then(function() {
2249 driver.findElement(By.css('.root-key'))
2250 .getAttribute("value")
2251 .then(function(seed) {
2252 expect(seed).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
2253 done();
2254 })
2255 });
2256 });
2257
2258 // Tabs show correct addresses when changed
2259 it('Shows the correct address when tab is changed', function(done) {
2260 driver.findElement(By.css('.phrase'))
2261 .sendKeys('abandon abandon ability');
2262 driver.sleep(generateDelay).then(function() {
2263 driver.findElement(By.css('#bip32-tab a'))
2264 .click();
2265 driver.sleep(generateDelay).then(function() {
2266 getFirstAddress(function(address) {
2267 expect(address).toBe("17uQ7s2izWPwBmEVFikTmZUjbBKWYdJchz");
2268 done();
2269 });
2270 });
2271 });
2272 });
2273
2274 // BIP44 derivation path is shown
2275 it('Shows the derivation path for bip44 tab', function(done) {
2276 driver.findElement(By.css('.phrase'))
2277 .sendKeys('abandon abandon ability');
2278 driver.sleep(generateDelay).then(function() {
2279 driver.findElement(By.css('#bip44 .path'))
2280 .getAttribute("value")
2281 .then(function(path) {
2282 expect(path).toBe("m/44'/0'/0'/0");
2283 done();
2284 })
2285 });
2286 });
2287
2288 // BIP44 extended private key is shown
2289 it('Shows the extended private key for bip44 tab', function(done) {
2290 driver.findElement(By.css('.phrase'))
2291 .sendKeys('abandon abandon ability');
2292 driver.sleep(generateDelay).then(function() {
2293 driver.findElement(By.css('.extended-priv-key'))
2294 .getAttribute("value")
2295 .then(function(path) {
2296 expect(path).toBe("xprvA2DxxvPZcyRvYgZMGS53nadR32mVDeCyqQYyFhrCVbJNjPoxMeVf7QT5g7mQASbTf9Kp4cryvcXnu2qurjWKcrdsr91jXymdCDNxKgLFKJG");
2297 done();
2298 })
2299 });
2300 });
2301
2302 // BIP44 extended public key is shown
2303 it('Shows the extended public key for bip44 tab', function(done) {
2304 driver.findElement(By.css('.phrase'))
2305 .sendKeys('abandon abandon ability');
2306 driver.sleep(generateDelay).then(function() {
2307 driver.findElement(By.css('.extended-pub-key'))
2308 .getAttribute("value")
2309 .then(function(path) {
2310 expect(path).toBe("xpub6FDKNRvTTLzDmAdpNTc49ia9b4byd6vqCdUa46Fp3vqMcC96uBoufCmZXQLiN5AK3iSCJMhf9gT2sxkpyaPepRuA7W3MujV5tGmF5VfbueM");
2311 done();
2312 })
2313 });
2314 });
2315
2316 // BIP44 account field changes address list
2317 it('Changes the address list if bip44 account is changed', function(done) {
2318 driver.findElement(By.css('#bip44 .account'))
2319 .sendKeys('1');
2320 driver.findElement(By.css('.phrase'))
2321 .sendKeys('abandon abandon ability');
2322 driver.sleep(generateDelay).then(function() {
2323 getFirstAddress(function(address) {
2324 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H");
2325 done();
2326 });
2327 });
2328 });
2329
2330 // BIP44 change field changes address list
2331 it('Changes the address list if bip44 change is changed', function(done) {
2332 driver.findElement(By.css('#bip44 .change'))
2333 .sendKeys('1');
2334 driver.findElement(By.css('.phrase'))
2335 .sendKeys('abandon abandon ability');
2336 driver.sleep(generateDelay).then(function() {
2337 getFirstAddress(function(address) {
2338 expect(address).toBe("1KAGfWgqfVbSSXY56fNQ7YnhyKuoskHtYo");
2339 done();
2340 });
2341 });
2342 });
2343
2344 // BIP32 derivation path can be set
2345 it('Can use a custom bip32 derivation path', function(done) {
2346 driver.findElement(By.css('#bip32-tab a'))
2347 .click();
2348 driver.findElement(By.css('#bip32 .path'))
2349 .clear();
2350 driver.findElement(By.css('#bip32 .path'))
2351 .sendKeys('m/1');
2352 driver.findElement(By.css('.phrase'))
2353 .sendKeys('abandon abandon ability');
2354 driver.sleep(generateDelay).then(function() {
2355 getFirstAddress(function(address) {
2356 expect(address).toBe("16pYQQdLD1hH4hwTGLXBaZ9Teboi1AGL8L");
2357 done();
2358 });
2359 });
2360 });
2361
2362 // BIP32 can use hardened derivation paths
2363 it('Can use a hardened derivation paths', function(done) {
2364 driver.findElement(By.css('#bip32-tab a'))
2365 .click();
2366 driver.findElement(By.css('#bip32 .path'))
2367 .clear();
2368 driver.findElement(By.css('#bip32 .path'))
2369 .sendKeys("m/0'");
2370 driver.findElement(By.css('.phrase'))
2371 .sendKeys('abandon abandon ability');
2372 driver.sleep(generateDelay).then(function() {
2373 getFirstAddress(function(address) {
2374 expect(address).toBe("14aXZeprXAE3UUKQc4ihvwBvww2LuEoHo4");
2375 done();
2376 });
2377 });
2378 });
2379
2380 // BIP32 extended private key is shown
2381 it('Shows the BIP32 extended private key', function(done) {
2382 driver.findElement(By.css('#bip32-tab a'))
2383 .click();
2384 driver.findElement(By.css('.phrase'))
2385 .sendKeys('abandon abandon ability');
2386 driver.sleep(generateDelay).then(function() {
2387 driver.findElement(By.css('.extended-priv-key'))
2388 .getAttribute("value")
2389 .then(function(privKey) {
2390 expect(privKey).toBe("xprv9va99uTVE5aLiutUVLTyfxfe8v8aaXjSQ1XxZbK6SezYVuikA9MnjQVTA8rQHpNA5LKvyQBpLiHbBQiiccKiBDs7eRmBogsvq3THFeLHYbe");
2391 done();
2392 });
2393 });
2394 });
2395
2396 // BIP32 extended public key is shown
2397 it('Shows the BIP32 extended public key', function(done) {
2398 driver.findElement(By.css('#bip32-tab a'))
2399 .click();
2400 driver.findElement(By.css('.phrase'))
2401 .sendKeys('abandon abandon ability');
2402 driver.sleep(generateDelay).then(function() {
2403 driver.findElement(By.css('.extended-pub-key'))
2404 .getAttribute("value")
2405 .then(function(pubKey) {
2406 expect(pubKey).toBe("xpub69ZVZQzP4T8dwPxwbMzz36cNgwy4yzTHmETZMyihzzXXNi3thgg3HCow1RtY252wdw5rS8369xKnraN5Q93y3FkFfJp2XEHWUrkyXsjS93P");
2407 done();
2408 });
2409 });
2410 });
2411
2412 // Derivation path is shown in table
2413 it('Shows the derivation path in the table', function(done) {
2414 driver.findElement(By.css('.phrase'))
2415 .sendKeys('abandon abandon ability');
2416 driver.sleep(generateDelay).then(function() {
2417 getFirstPath(function(path) {
2418 expect(path).toBe("m/44'/0'/0'/0/0");
2419 done();
2420 });
2421 });
2422 });
2423
2424 // Derivation path for address can be hardened
2425 it('Can derive hardened addresses', function(done) {
2426 driver.findElement(By.css('#bip32-tab a'))
2427 .click();
2428 driver.executeScript(function() {
2429 $(".hardened-addresses").prop("checked", true);
2430 });
2431 driver.findElement(By.css('.phrase'))
2432 .sendKeys('abandon abandon ability');
2433 driver.sleep(generateDelay).then(function() {
2434 getFirstAddress(function(address) {
2435 expect(address).toBe("18exLzUv7kfpiXRzmCjFDoC9qwNLFyvwyd");
2436 done();
2437 });
2438 });
2439 });
2440
2441 // Derivation path visibility can be toggled
2442 it('Can toggle visibility of the derivation path column', function(done) {
2443 driver.findElement(By.css('.phrase'))
2444 .sendKeys('abandon abandon ability');
2445 driver.sleep(generateDelay).then(function() {
2446 driver.findElement(By.css('.index-toggle'))
2447 .click();
2448 testColumnValuesAreInvisible(done, "index");
2449 });
2450 });
2451
2452 // Address is shown
2453 it('Shows the address in the table', function(done) {
2454 driver.findElement(By.css('.phrase'))
2455 .sendKeys('abandon abandon ability');
2456 driver.sleep(generateDelay).then(function() {
2457 getFirstAddress(function(address) {
2458 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
2459 done();
2460 });
2461 });
2462 });
2463
2464 // Addresses are shown in order of derivation path
2465 it('Shows the address in order of derivation path', function(done) {
2466 driver.findElement(By.css('.phrase'))
2467 .sendKeys('abandon abandon ability');
2468 driver.sleep(generateDelay).then(function() {
2469 testRowsAreInCorrectOrder(done);
2470 });
2471 });
2472
2473 // Address visibility can be toggled
2474 it('Can toggle visibility of the address column', function(done) {
2475 driver.findElement(By.css('.phrase'))
2476 .sendKeys('abandon abandon ability');
2477 driver.sleep(generateDelay).then(function() {
2478 driver.findElement(By.css('.address-toggle'))
2479 .click();
2480 testColumnValuesAreInvisible(done, "address");
2481 });
2482 });
2483
2484 // Public key is shown in table
2485 it('Shows the public key in the table', function(done) {
2486 driver.findElement(By.css('.phrase'))
2487 .sendKeys('abandon abandon ability');
2488 driver.sleep(generateDelay).then(function() {
2489 driver.findElements(By.css('.pubkey'))
2490 .then(function(els) {
2491 els[0].getText()
2492 .then(function(pubkey) {
2493 expect(pubkey).toBe("033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3");
2494 done();
2495 });
2496 });
2497 });
2498 });
2499
2500 // Public key visibility can be toggled
2501 it('Can toggle visibility of the public key column', function(done) {
2502 driver.findElement(By.css('.phrase'))
2503 .sendKeys('abandon abandon ability');
2504 driver.sleep(generateDelay).then(function() {
2505 driver.findElement(By.css('.public-key-toggle'))
2506 .click();
2507 testColumnValuesAreInvisible(done, "pubkey");
2508 });
2509 });
2510
2511 // Private key is shown in table
2512 it('Shows the private key in the table', function(done) {
2513 driver.findElement(By.css('.phrase'))
2514 .sendKeys('abandon abandon ability');
2515 driver.sleep(generateDelay).then(function() {
2516 driver.findElements(By.css('.privkey'))
2517 .then(function(els) {
2518 els[0].getText()
2519 .then(function(pubkey) {
2520 expect(pubkey).toBe("L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE");
2521 done();
2522 });
2523 });
2524 });
2525 });
2526
2527 // Private key visibility can be toggled
2528 it('Can toggle visibility of the private key column', function(done) {
2529 driver.findElement(By.css('.phrase'))
2530 .sendKeys('abandon abandon ability');
2531 driver.sleep(generateDelay).then(function() {
2532 driver.findElement(By.css('.private-key-toggle'))
2533 .click();
2534 testColumnValuesAreInvisible(done, "privkey");
2535 });
2536 });
2537
2538 // More addresses can be generated
2539 it('Can generate more rows in the table', function(done) {
2540 driver.findElement(By.css('.phrase'))
2541 .sendKeys('abandon abandon ability');
2542 driver.sleep(generateDelay).then(function() {
2543 driver.findElement(By.css('.more'))
2544 .click();
2545 driver.sleep(generateDelay).then(function() {
2546 driver.findElements(By.css('.address'))
2547 .then(function(els) {
2548 expect(els.length).toBe(40);
2549 done();
2550 });
2551 });
2552 });
2553 });
2554
2555 // A custom number of additional addresses can be generated
2556 it('Can generate more rows in the table', function(done) {
2557 driver.findElement(By.css('.phrase'))
2558 .sendKeys('abandon abandon ability');
2559 driver.sleep(generateDelay).then(function() {
2560 driver.findElement(By.css('.rows-to-add'))
2561 .clear();
2562 driver.findElement(By.css('.rows-to-add'))
2563 .sendKeys('1');
2564 driver.findElement(By.css('.more'))
2565 .click();
2566 driver.sleep(generateDelay).then(function() {
2567 driver.findElements(By.css('.address'))
2568 .then(function(els) {
2569 expect(els.length).toBe(21);
2570 done();
2571 });
2572 });
2573 });
2574 });
2575
2576 // Additional addresses are shown in order of derivation path
2577 it('Shows additional addresses in order of derivation path', function(done) {
2578 driver.findElement(By.css('.phrase'))
2579 .sendKeys('abandon abandon ability');
2580 driver.sleep(generateDelay).then(function() {
2581 driver.findElement(By.css('.more'))
2582 .click();
2583 driver.sleep(generateDelay).then(function() {
2584 testRowsAreInCorrectOrder(done);
2585 });
2586 });
2587 });
2588
2589 // BIP32 root key can be set by the user
2590 it('Allows the user to set the BIP32 root key', function(done) {
2591 driver.findElement(By.css('.root-key'))
2592 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2593 driver.sleep(generateDelay).then(function() {
2594 getFirstAddress(function(address) {
2595 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
2596 done();
2597 });
2598 });
2599 });
2600
2601 // Setting BIP32 root key clears the existing phrase, passphrase and seed
2602 it('Confirms the existing phrase should be cleared', function(done) {
2603 driver.findElement(By.css('.phrase'))
2604 .sendKeys('A non-blank but invalid value');
2605 driver.findElement(By.css('.root-key'))
2606 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2607 driver.switchTo().alert().accept();
2608 driver.findElement(By.css('.phrase'))
2609 .getAttribute("value").then(function(value) {
2610 expect(value).toBe("");
2611 done();
2612 });
2613 });
2614
2615 // Clearing of phrase, passphrase and seed can be cancelled by user
2616 it('Allows the clearing of the phrase to be cancelled', function(done) {
2617 driver.findElement(By.css('.phrase'))
2618 .sendKeys('abandon abandon ability');
2619 driver.sleep(generateDelay).then(function() {
2620 driver.findElement(By.css('.root-key'))
2621 .clear();
2622 driver.findElement(By.css('.root-key'))
2623 .sendKeys('x');
2624 driver.switchTo().alert().dismiss();
2625 driver.findElement(By.css('.phrase'))
2626 .getAttribute("value").then(function(value) {
2627 expect(value).toBe("abandon abandon ability");
2628 done();
2629 });
2630 });
2631 });
2632
2633 // Custom BIP32 root key is used when changing the derivation path
2634 it('Can set derivation path for root key instead of phrase', function(done) {
2635 driver.findElement(By.css('#bip44 .account'))
2636 .sendKeys('1');
2637 driver.findElement(By.css('.root-key'))
2638 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2639 driver.sleep(generateDelay).then(function() {
2640 getFirstAddress(function(address) {
2641 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H");
2642 done();
2643 });
2644 });
2645 });
2646
2647 // Incorrect mnemonic shows error
2648 it('Shows an error for incorrect mnemonic', function(done) {
2649 driver.findElement(By.css('.phrase'))
2650 .sendKeys('abandon abandon abandon');
2651 driver.sleep(feedbackDelay).then(function() {
2652 driver.findElement(By.css('.feedback'))
2653 .getText()
2654 .then(function(feedback) {
2655 expect(feedback).toBe("Invalid mnemonic");
2656 done();
2657 });
2658 });
2659 });
2660
2661 // Incorrect word shows suggested replacement
2662 it('Shows word suggestion for incorrect word', function(done) {
2663 driver.findElement(By.css('.phrase'))
2664 .sendKeys('abandon abandon abiliti');
2665 driver.sleep(feedbackDelay).then(function() {
2666 driver.findElement(By.css('.feedback'))
2667 .getText()
2668 .then(function(feedback) {
2669 var msg = "abiliti not in wordlist, did you mean ability?";
2670 expect(feedback).toBe(msg);
2671 done();
2672 });
2673 });
2674 });
2675
2676 // Github pull request 48
2677 // First four letters of word shows that word, not closest
2678 // since first four letters gives unique word in BIP39 wordlist
2679 // eg ille should show illegal, not idle
2680 it('Shows word suggestion based on first four chars', function(done) {
2681 driver.findElement(By.css('.phrase'))
2682 .sendKeys('ille');
2683 driver.sleep(feedbackDelay).then(function() {
2684 driver.findElement(By.css('.feedback'))
2685 .getText()
2686 .then(function(feedback) {
2687 var msg = "ille not in wordlist, did you mean illegal?";
2688 expect(feedback).toBe(msg);
2689 done();
2690 });
2691 });
2692 });
2693
2694 // Incorrect BIP32 root key shows error
2695 it('Shows error for incorrect root key', function(done) {
2696 driver.findElement(By.css('.root-key'))
2697 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpj');
2698 driver.sleep(feedbackDelay).then(function() {
2699 driver.findElement(By.css('.feedback'))
2700 .getText()
2701 .then(function(feedback) {
2702 var msg = "Invalid root key";
2703 expect(feedback).toBe(msg);
2704 done();
2705 });
2706 });
2707 });
2708
2709 // Derivation path not starting with m shows error
2710 it('Shows error for derivation path not starting with m', function(done) {
2711 driver.findElement(By.css('#bip32-tab a'))
2712 .click();
2713 driver.findElement(By.css('#bip32 .path'))
2714 .clear();
2715 driver.findElement(By.css('#bip32 .path'))
2716 .sendKeys('n/0');
2717 driver.findElement(By.css('.phrase'))
2718 .sendKeys('abandon abandon ability');
2719 driver.sleep(feedbackDelay).then(function() {
2720 driver.findElement(By.css('.feedback'))
2721 .getText()
2722 .then(function(feedback) {
2723 var msg = "First character must be 'm'";
2724 expect(feedback).toBe(msg);
2725 done();
2726 });
2727 });
2728 });
2729
2730 // Derivation path containing invalid characters shows useful error
2731 it('Shows error for derivation path not starting with m', function(done) {
2732 driver.findElement(By.css('#bip32-tab a'))
2733 .click();
2734 driver.findElement(By.css('#bip32 .path'))
2735 .clear();
2736 driver.findElement(By.css('#bip32 .path'))
2737 .sendKeys('m/1/0wrong1/1');
2738 driver.findElement(By.css('.phrase'))
2739 .sendKeys('abandon abandon ability');
2740 driver.sleep(feedbackDelay).then(function() {
2741 driver.findElement(By.css('.feedback'))
2742 .getText()
2743 .then(function(feedback) {
2744 var msg = "Invalid characters 0wrong1 found at depth 2";
2745 expect(feedback).toBe(msg);
2746 done();
2747 });
2748 });
2749 });
2750
2751 // Github Issue 11: Default word length is 15
2752 // https://github.com/iancoleman/bip39/issues/11
2753 it('Sets the default word length to 15', function(done) {
2754 driver.findElement(By.css('.strength'))
2755 .getAttribute("value")
2756 .then(function(strength) {
2757 expect(strength).toBe("15");
2758 done();
2759 });
2760 });
2761
2762 // Github Issue 12: Generate more rows with private keys hidden
2763 // https://github.com/iancoleman/bip39/issues/12
2764 it('Sets the correct hidden column state on new rows', function(done) {
2765 driver.findElement(By.css('.phrase'))
2766 .sendKeys("abandon abandon ability");
2767 driver.sleep(generateDelay).then(function() {
2768 driver.findElement(By.css('.private-key-toggle'))
2769 .click();
2770 driver.findElement(By.css('.more'))
2771 .click();
2772 driver.sleep(generateDelay).then(function() {
2773 driver.findElements(By.css('.privkey'))
2774 .then(function(els) {
2775 expect(els.length).toBe(40);
2776 });
2777 testColumnValuesAreInvisible(done, "privkey");
2778 });
2779 });
2780 });
2781
2782 // Github Issue 19: Mnemonic is not sensitive to whitespace
2783 // https://github.com/iancoleman/bip39/issues/19
2784 it('Ignores excess whitespace in the mnemonic', function(done) {
2785 var doublespace = " ";
2786 var mnemonic = "urge cat" + doublespace + "bid";
2787 driver.findElement(By.css('.phrase'))
2788 .sendKeys(mnemonic);
2789 driver.sleep(generateDelay).then(function() {
2790 driver.findElement(By.css('.root-key'))
2791 .getAttribute("value")
2792 .then(function(seed) {
2793 expect(seed).toBe("xprv9s21ZrQH143K3isaZsWbKVoTtbvd34Y1ZGRugGdMeBGbM3AgBVzTH159mj1cbbtYSJtQr65w6L5xy5L9SFC7c9VJZWHxgAzpj4mun5LhrbC");
2794 done();
2795 });
2796 });
2797 });
2798
2799 // Github Issue 23: Part 1: Use correct derivation path when changing tabs
2800 // https://github.com/iancoleman/bip39/issues/23
2801 // This test was failing for default timeout of 5000ms so changed it to +10s
2802 it('Uses the correct derivation path when changing tabs', function(done) {
2803 // 1) and 2) set the phrase
2804 driver.findElement(By.css('.phrase'))
2805 .sendKeys("abandon abandon ability");
2806 driver.sleep(generateDelay).then(function() {
2807 // 3) select bip32 tab
2808 driver.findElement(By.css('#bip32-tab a'))
2809 .click();
2810 driver.sleep(generateDelay).then(function() {
2811 // 4) switch from bitcoin to litecoin
2812 selectNetwork("LTC - Litecoin");
2813 driver.sleep(generateDelay).then(function() {
2814 // 5) Check address is displayed correctly
2815 getFirstAddress(function(address) {
2816 expect(address).toBe("LS8MP5LZ5AdzSZveRrjm3aYVoPgnfFh5T5");
2817 // 5) Check derivation path is displayed correctly
2818 getFirstPath(function(path) {
2819 expect(path).toBe("m/0/0");
2820 done();
2821 });
2822 });
2823 });
2824 });
2825 });
2826 }, generateDelay + 10000);
2827
2828 // Github Issue 23 Part 2: Coin selection in derivation path
2829 // https://github.com/iancoleman/bip39/issues/23#issuecomment-238011920
2830 it('Uses the correct derivation path when changing coins', function(done) {
2831 // set the phrase
2832 driver.findElement(By.css('.phrase'))
2833 .sendKeys("abandon abandon ability");
2834 driver.sleep(generateDelay).then(function() {
2835 // switch from bitcoin to clam
2836 selectNetwork("CLAM - Clams");
2837 driver.sleep(generateDelay).then(function() {
2838 // check derivation path is displayed correctly
2839 getFirstPath(function(path) {
2840 expect(path).toBe("m/44'/23'/0'/0/0");
2841 done();
2842 });
2843 });
2844 });
2845 });
2846
2847 // Github Issue 26: When using a Root key derrived altcoins are incorrect
2848 // https://github.com/iancoleman/bip39/issues/26
2849 it('Uses the correct derivation for altcoins with root keys', function(done) {
2850 // 1) 2) and 3) set the root key
2851 driver.findElement(By.css('.root-key'))
2852 .sendKeys("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
2853 driver.sleep(generateDelay).then(function() {
2854 // 4) switch from bitcoin to viacoin
2855 selectNetwork("VIA - Viacoin");
2856 driver.sleep(generateDelay).then(function() {
2857 // 5) ensure the derived address is correct
2858 getFirstAddress(function(address) {
2859 expect(address).toBe("Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT");
2860 done();
2861 });
2862 });
2863 });
2864 });
2865
2866 // Selecting a language with no existing phrase should generate a phrase in
2867 // that language.
2868 it('Generate a random phrase when language is selected and no current phrase', function(done) {
2869 driver.findElement(By.css("a[href='#japanese']"))
2870 .click();
2871 driver.sleep(generateDelay).then(function() {
2872 driver.findElement(By.css(".phrase"))
2873 .getAttribute("value").then(function(phrase) {
2874 expect(phrase.search(/[a-z]/)).toBe(-1);
2875 expect(phrase.length).toBeGreaterThan(0);
2876 done();
2877 });
2878 });
2879 });
2880
2881 // Selecting a language with existing phrase should update the phrase to use
2882 // that language.
2883 it('Updates existing phrases when the language is changed', function(done) {
2884 driver.findElement(By.css(".phrase"))
2885 .sendKeys("abandon abandon ability");
2886 driver.sleep(generateDelay).then(function() {
2887 driver.findElement(By.css("a[href='#italian']"))
2888 .click();
2889 driver.sleep(generateDelay).then(function() {
2890 driver.findElement(By.css(".phrase"))
2891 .getAttribute("value").then(function(phrase) {
2892 // Check only the language changes, not the phrase
2893 expect(phrase).toBe("abaco abaco abbaglio");
2894 getFirstAddress(function(address) {
2895 // Check the address is correct
2896 expect(address).toBe("1Dz5TgDhdki9spa6xbPFbBqv5sjMrx3xgV");
2897 done();
2898 });
2899 });
2900 });
2901 });
2902 });
2903
2904 // Suggested replacement for erroneous word in non-English language
2905 it('Shows word suggestion for incorrect word in non-English language', function(done) {
2906 driver.findElement(By.css('.phrase'))
2907 .sendKeys('abaco abaco zbbaglio');
2908 driver.sleep(feedbackDelay).then(function() {
2909 driver.findElement(By.css('.feedback'))
2910 .getText()
2911 .then(function(feedback) {
2912 var msg = "zbbaglio not in wordlist, did you mean abbaglio?";
2913 expect(feedback).toBe(msg);
2914 done();
2915 });
2916 });
2917 });
2918
2919 // Japanese word does not break across lines.
2920 // Point 2 from
2921 // https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md#japanese
2922 it('Does not break Japanese words across lines', function(done) {
2923 driver.findElement(By.css('.phrase'))
2924 .getCssValue("word-break")
2925 .then(function(value) {
2926 expect(value).toBe("keep-all");
2927 done();
2928 });
2929 });
2930
2931 // Language can be specified at page load using hash value in url
2932 it('Can set the language from the url hash', function(done) {
2933 driver.get(url + "#japanese").then(function() {
2934 driver.findElement(By.css('.generate')).click();
2935 driver.sleep(generateDelay).then(function() {
2936 driver.findElement(By.css(".phrase"))
2937 .getAttribute("value").then(function(phrase) {
2938 expect(phrase.search(/[a-z]/)).toBe(-1);
2939 expect(phrase.length).toBeGreaterThan(0);
2940 done();
2941 });
2942 });
2943 });
2944 });
2945
2946 // Entropy can be entered by the user
2947 it('Allows entropy to be entered', function(done) {
2948 driver.findElement(By.css('.use-entropy'))
2949 .click();
2950 driver.findElement(By.css('.entropy'))
2951 .sendKeys('00000000 00000000 00000000 00000000');
2952 driver.sleep(generateDelay).then(function() {
2953 driver.findElement(By.css(".phrase"))
2954 .getAttribute("value").then(function(phrase) {
2955 expect(phrase).toBe("abandon abandon ability");
2956 getFirstAddress(function(address) {
2957 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
2958 done();
2959 })
2960 });
2961 });
2962 });
2963
2964 // A warning about entropy is shown to the user, with additional information
2965 it('Shows a warning about using entropy', function(done) {
2966 driver.findElement(By.css('.use-entropy'))
2967 .click();
2968 driver.findElement(By.css('.entropy-container'))
2969 .getText()
2970 .then(function(containerText) {
2971 var warning = "mnemonic may be insecure";
2972 expect(containerText).toContain(warning);
2973 driver.findElement(By.css('#entropy-notes'))
2974 .findElement(By.xpath("parent::*"))
2975 .getText()
2976 .then(function(notesText) {
2977 var detail = "flipping a fair coin, rolling a fair dice, noise measurements etc";
2978 expect(notesText).toContain(detail);
2979 done();
2980 });
2981 });
2982 });
2983
2984 // The types of entropy available are described to the user
2985 it('Shows the types of entropy available', function(done) {
2986 driver.findElement(By.css('.entropy'))
2987 .getAttribute("placeholder")
2988 .then(function(placeholderText) {
2989 var options = [
2990 "binary",
2991 "base 6",
2992 "dice",
2993 "base 10",
2994 "hexadecimal",
2995 "cards",
2996 ];
2997 for (var i=0; i<options.length; i++) {
2998 var option = options[i];
2999 expect(placeholderText).toContain(option);
3000 }
3001 done();
3002 });
3003 });
3004
3005 // The actual entropy used is shown to the user
3006 it('Shows the actual entropy used', function(done) {
3007 driver.findElement(By.css('.use-entropy'))
3008 .click();
3009 driver.findElement(By.css('.entropy'))
3010 .sendKeys('Not A Very Good Entropy Source At All');
3011 driver.sleep(generateDelay).then(function() {
3012 driver.findElement(By.css('.entropy-container'))
3013 .getText()
3014 .then(function(text) {
3015 expect(text).toMatch(/Filtered Entropy\s+AedEceAA/);
3016 done();
3017 });
3018 });
3019 });
3020
3021 // Binary entropy can be entered
3022 it('Allows binary entropy to be entered', function(done) {
3023 testEntropyType(done, "01", "binary");
3024 });
3025
3026 // Base 6 entropy can be entered
3027 it('Allows base 6 entropy to be entered', function(done) {
3028 testEntropyType(done, "012345", "base 6");
3029 });
3030
3031 // Base 6 dice entropy can be entered
3032 it('Allows base 6 dice entropy to be entered', function(done) {
3033 testEntropyType(done, "123456", "base 6 (dice)");
3034 });
3035
3036 // Base 10 entropy can be entered
3037 it('Allows base 10 entropy to be entered', function(done) {
3038 testEntropyType(done, "789", "base 10");
3039 });
3040
3041 // Hexadecimal entropy can be entered
3042 it('Allows hexadecimal entropy to be entered', function(done) {
3043 testEntropyType(done, "abcdef", "hexadecimal");
3044 });
3045
3046 // Dice entropy value is shown as the converted base 6 value
3047 // ie 123456 is converted to 123450
3048 it('Shows dice entropy as base 6', function(done) {
3049 driver.findElement(By.css('.use-entropy'))
3050 .click();
3051 driver.findElement(By.css('.entropy'))
3052 .sendKeys("123456");
3053 driver.sleep(generateDelay).then(function() {
3054 driver.findElement(By.css('.entropy-container'))
3055 .getText()
3056 .then(function(text) {
3057 expect(text).toMatch(/Filtered Entropy\s+123450/);
3058 done();
3059 });
3060 });
3061 });
3062
3063 // The number of bits of entropy accumulated is shown
3064 it("Shows the number of bits of entropy for 20 bits of binary", function(done) {
3065 testEntropyBits(done, "0000 0000 0000 0000 0000", "20");
3066 });
3067 it("Shows the number of bits of entropy for 1 bit of binary", function(done) {
3068 testEntropyBits(done, "0", "1");
3069 });
3070 it("Shows the number of bits of entropy for 4 bits of binary", function(done) {
3071 testEntropyBits(done, "0000", "4");
3072 });
3073 it("Shows the number of bits of entropy for 1 character of base 6 (dice)", function(done) {
3074 // 6 in card is 0 in base 6, 0 in base 6 is 2.6 bits (rounded down to 2 bits)
3075 testEntropyBits(done, "6", "2");
3076 });
3077 it("Shows the number of bits of entropy for 1 character of base 10 with 3 bits", function(done) {
3078 // 7 in base 10 is 111 in base 2, no leading zeros
3079 testEntropyBits(done, "7", "3");
3080 });
3081 it("Shows the number of bits of entropy for 1 character of base 10 with 4 bis", function(done) {
3082 testEntropyBits(done, "8", "4");
3083 });
3084 it("Shows the number of bits of entropy for 1 character of hex", function(done) {
3085 testEntropyBits(done, "F", "4");
3086 });
3087 it("Shows the number of bits of entropy for 2 characters of base 10", function(done) {
3088 testEntropyBits(done, "29", "6");
3089 });
3090 it("Shows the number of bits of entropy for 2 characters of hex", function(done) {
3091 testEntropyBits(done, "0A", "8");
3092 });
3093 it("Shows the number of bits of entropy for 2 characters of hex with 3 leading zeros", function(done) {
3094 // hex is always multiple of 4 bits of entropy
3095 testEntropyBits(done, "1A", "8");
3096 });
3097 it("Shows the number of bits of entropy for 2 characters of hex with 2 leading zeros", function(done) {
3098 testEntropyBits(done, "2A", "8");
3099 });
3100 it("Shows the number of bits of entropy for 2 characters of hex with 1 leading zero", function(done) {
3101 testEntropyBits(done, "4A", "8");
3102 });
3103 it("Shows the number of bits of entropy for 2 characters of hex with no leading zeros", function(done) {
3104 testEntropyBits(done, "8A", "8");
3105 });
3106 it("Shows the number of bits of entropy for 2 characters of hex starting with F", function(done) {
3107 testEntropyBits(done, "FA", "8");
3108 });
3109 it("Shows the number of bits of entropy for 4 characters of hex with leading zeros", function(done) {
3110 testEntropyBits(done, "000A", "16");
3111 });
3112 it("Shows the number of bits of entropy for 4 characters of base 6", function(done) {
3113 testEntropyBits(done, "5555", "11");
3114 });
3115 it("Shows the number of bits of entropy for 4 characters of base 6 dice", function(done) {
3116 // uses dice, so entropy is actually 0000 in base 6, which is 4 lots of
3117 // 2.58 bits, which is 10.32 bits (rounded down to 10 bits)
3118 testEntropyBits(done, "6666", "10");
3119 });
3120 it("Shows the number of bits of entropy for 4 charactes of base 10", function(done) {
3121 // Uses base 10, which is 4 lots of 3.32 bits, which is 13.3 bits (rounded
3122 // down to 13)
3123 testEntropyBits(done, "2227", "13");
3124 });
3125 it("Shows the number of bits of entropy for 4 characters of hex with 2 leading zeros", function(done) {
3126 testEntropyBits(done, "222F", "16");
3127 });
3128 it("Shows the number of bits of entropy for 4 characters of hex starting with F", function(done) {
3129 testEntropyBits(done, "FFFF", "16");
3130 });
3131 it("Shows the number of bits of entropy for 10 characters of base 10", function(done) {
3132 // 10 events at 3.32 bits per event
3133 testEntropyBits(done, "0000101017", "33");
3134 });
3135 it("Shows the number of bits of entropy for a full deck of cards", function(done) {
3136 // cards are not replaced, so a full deck is not 52^52 entropy which is 296
3137 // bits, it's 52!, which is 225 bits
3138 testEntropyBits(done, "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", "225");
3139 });
3140
3141 it("Shows details about the entered entropy", function(done) {
3142 testEntropyFeedback(done,
3143 {
3144 entropy: "A",
3145 filtered: "A",
3146 type: "hexadecimal",
3147 events: "1",
3148 bits: "4",
3149 words: 0,
3150 strength: "less than a second",
3151 }
3152 );
3153 });
3154 it("Shows details about the entered entropy", function(done) {
3155 testEntropyFeedback(done,
3156 {
3157 entropy: "AAAAAAAA",
3158 filtered: "AAAAAAAA",
3159 type: "hexadecimal",
3160 events: "8",
3161 bits: "32",
3162 words: 3,
3163 strength: "less than a second - Repeats like \"aaa\" are easy to guess",
3164 }
3165 );
3166 });
3167 it("Shows details about the entered entropy", function(done) {
3168 testEntropyFeedback(done,
3169 {
3170 entropy: "AAAAAAAA B",
3171 filtered: "AAAAAAAAB",
3172 type: "hexadecimal",
3173 events: "9",
3174 bits: "36",
3175 words: 3,
3176 strength: "less than a second - Repeats like \"aaa\" are easy to guess",
3177 }
3178 );
3179 });
3180 it("Shows details about the entered entropy", function(done) {
3181 testEntropyFeedback(done,
3182 {
3183 entropy: "AAAAAAAA BBBBBBBB",
3184 filtered: "AAAAAAAABBBBBBBB",
3185 type: "hexadecimal",
3186 events: "16",
3187 bits: "64",
3188 words: 6,
3189 strength: "less than a second - Repeats like \"aaa\" are easy to guess",
3190 }
3191 );
3192 });
3193 it("Shows details about the entered entropy", function(done) {
3194 testEntropyFeedback(done,
3195 {
3196 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC",
3197 filtered: "AAAAAAAABBBBBBBBCCCCCCCC",
3198 type: "hexadecimal",
3199 events: "24",
3200 bits: "96",
3201 words: 9,
3202 strength: "less than a second",
3203 }
3204 );
3205 });
3206 it("Shows details about the entered entropy", function(done) {
3207 testEntropyFeedback(done,
3208 {
3209 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD",
3210 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD",
3211 type: "hexadecimal",
3212 events: "32",
3213 bits: "128",
3214 words: 12,
3215 strength: "2 minutes",
3216 }
3217 );
3218 });
3219 it("Shows details about the entered entropy", function(done) {
3220 testEntropyFeedback(done,
3221 {
3222 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA",
3223 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDA",
3224 type: "hexadecimal",
3225 events: "32",
3226 bits: "128",
3227 words: 12,
3228 strength: "2 days",
3229 }
3230 );
3231 });
3232 it("Shows details about the entered entropy", function(done) {
3233 testEntropyFeedback(done,
3234 {
3235 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE",
3236 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEE",
3237 type: "hexadecimal",
3238 events: "40",
3239 bits: "160",
3240 words: 15,
3241 strength: "3 years",
3242 }
3243 );
3244 });
3245 it("Shows details about the entered entropy", function(done) {
3246 testEntropyFeedback(done,
3247 {
3248 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF",
3249 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEEFFFFFFFF",
3250 type: "hexadecimal",
3251 events: "48",
3252 bits: "192",
3253 words: 18,
3254 strength: "centuries",
3255 }
3256 );
3257 });
3258 it("Shows details about the entered entropy", function(done) {
3259 testEntropyFeedback(done,
3260 {
3261 entropy: "7d",
3262 type: "card",
3263 events: "1",
3264 bits: "4",
3265 words: 0,
3266 strength: "less than a second",
3267 }
3268 );
3269 });
3270 it("Shows details about the entered entropy", function(done) {
3271 testEntropyFeedback(done,
3272 {
3273 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
3274 type: "card (full deck)",
3275 events: "52",
3276 bits: "225",
3277 words: 21,
3278 strength: "centuries",
3279 }
3280 );
3281 });
3282 it("Shows details about the entered entropy", function(done) {
3283 testEntropyFeedback(done,
3284 {
3285 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d",
3286 type: "card (full deck, 1 duplicate: 3d)",
3287 events: "53",
3288 bits: "254",
3289 words: 21,
3290 strength: "centuries",
3291 }
3292 );
3293 });
3294 it("Shows details about the entered entropy", function(done) {
3295 testEntropyFeedback(done,
3296 {
3297 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d",
3298 type: "card (2 duplicates: 3d 4d, 1 missing: KS)",
3299 events: "53",
3300 bits: "254",
3301 words: 21,
3302 strength: "centuries",
3303 }
3304 );
3305 });
3306 it("Shows details about the entered entropy", function(done) {
3307 testEntropyFeedback(done,
3308 {
3309 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d",
3310 type: "card (4 duplicates: 3d 4d 5d..., 1 missing: KS)",
3311 events: "55",
3312 bits: "264",
3313 words: 24,
3314 strength: "centuries",
3315 }
3316 );
3317 });
3318 it("Shows details about the entered entropy", function(done) {
3319 testEntropyFeedback(done,
3320 // Next test was throwing uncaught error in zxcvbn
3321 // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2
3322 {
3323 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsksac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
3324 type: "card (full deck, 52 duplicates: ac 2c 3c...)",
3325 events: "104",
3326 bits: "499",
3327 words: 45,
3328 strength: "centuries",
3329 }
3330 );
3331 });
3332 it("Shows details about the entered entropy", function(done) {
3333 testEntropyFeedback(done,
3334 // Case insensitivity to duplicate cards
3335 {
3336 entropy: "asAS",
3337 type: "card (1 duplicate: AS)",
3338 events: "2",
3339 bits: "9",
3340 words: 0,
3341 strength: "less than a second",
3342 }
3343 );
3344 });
3345 it("Shows details about the entered entropy", function(done) {
3346 testEntropyFeedback(done,
3347 {
3348 entropy: "ASas",
3349 type: "card (1 duplicate: as)",
3350 events: "2",
3351 bits: "9",
3352 words: 0,
3353 strength: "less than a second",
3354 }
3355 );
3356 });
3357 it("Shows details about the entered entropy", function(done) {
3358 testEntropyFeedback(done,
3359 // Missing cards are detected
3360 {
3361 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
3362 type: "card (1 missing: 9C)",
3363 events: "51",
3364 bits: "221",
3365 words: 18,
3366 strength: "centuries",
3367 }
3368 );
3369 });
3370 it("Shows details about the entered entropy", function(done) {
3371 testEntropyFeedback(done,
3372 {
3373 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
3374 type: "card (2 missing: 9C 5D)",
3375 events: "50",
3376 bits: "216",
3377 words: 18,
3378 strength: "centuries",
3379 }
3380 );
3381 });
3382 it("Shows details about the entered entropy", function(done) {
3383 testEntropyFeedback(done,
3384 {
3385 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
3386 type: "card (4 missing: 9C 5D QD...)",
3387 events: "48",
3388 bits: "208",
3389 words: 18,
3390 strength: "centuries",
3391 }
3392 );
3393 });
3394 it("Shows details about the entered entropy", function(done) {
3395 testEntropyFeedback(done,
3396 // More than six missing cards does not show message
3397 {
3398 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d 8d9d jd kdah2h3h 5h6h7h8h9hthjhqhkh 2s3s4s5s6s7s8s9stsjsqsks",
3399 type: "card",
3400 events: "45",
3401 bits: "195",
3402 words: 18,
3403 strength: "centuries",
3404 }
3405 );
3406 });
3407 it("Shows details about the entered entropy", function(done) {
3408 testEntropyFeedback(done,
3409 // Multiple decks of cards increases bits per event
3410 {
3411 entropy: "3d",
3412 events: "1",
3413 bits: "4",
3414 bitsPerEvent: "4.34",
3415 }
3416 );
3417 });
3418 it("Shows details about the entered entropy", function(done) {
3419 testEntropyFeedback(done,
3420 {
3421 entropy: "3d3d",
3422 events: "2",
3423 bits: "9",
3424 bitsPerEvent: "4.80",
3425 }
3426 );
3427 });
3428 it("Shows details about the entered entropy", function(done) {
3429 testEntropyFeedback(done,
3430 {
3431 entropy: "3d3d3d",
3432 events: "3",
3433 bits: "15",
3434 bitsPerEvent: "5.01",
3435 }
3436 );
3437 });
3438 it("Shows details about the entered entropy", function(done) {
3439 testEntropyFeedback(done,
3440 {
3441 entropy: "3d3d3d3d",
3442 events: "4",
3443 bits: "20",
3444 bitsPerEvent: "5.14",
3445 }
3446 );
3447 });
3448 it("Shows details about the entered entropy", function(done) {
3449 testEntropyFeedback(done,
3450 {
3451 entropy: "3d3d3d3d3d",
3452 events: "5",
3453 bits: "26",
3454 bitsPerEvent: "5.22",
3455 }
3456 );
3457 });
3458 it("Shows details about the entered entropy", function(done) {
3459 testEntropyFeedback(done,
3460 {
3461 entropy: "3d3d3d3d3d3d",
3462 events: "6",
3463 bits: "31",
3464 bitsPerEvent: "5.28",
3465 }
3466 );
3467 });
3468 it("Shows details about the entered entropy", function(done) {
3469 testEntropyFeedback(done,
3470 {
3471 entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d",
3472 events: "33",
3473 bits: "184",
3474 bitsPerEvent: "5.59",
3475 strength: 'less than a second - Repeats like "abcabcabc" are only slightly harder to guess than "abc"',
3476 }
3477 );
3478 });
3479
3480 // Entropy is truncated from the left
3481 it('Truncates entropy from the left', function(done) {
3482 // Truncate from left means 0000 is removed from the start
3483 // which gives mnemonic 'avocado zoo zone'
3484 // not 1111 removed from the end
3485 // which gives the mnemonic 'abstract zoo zoo'
3486 var entropy = "00000000 00000000 00000000 00000000";
3487 entropy += "11111111 11111111 11111111 1111"; // Missing last byte
3488 driver.findElement(By.css('.use-entropy'))
3489 .click();
3490 driver.findElement(By.css('.entropy'))
3491 .sendKeys(entropy);
3492 driver.sleep(generateDelay).then(function() {
3493 driver.findElement(By.css(".phrase"))
3494 .getAttribute("value").then(function(phrase) {
3495 expect(phrase).toBe("avocado zoo zone");
3496 done();
3497 });
3498 });
3499 });
3500
3501 // Very large entropy results in very long mnemonics
3502 it('Converts very long entropy to very long mnemonics', function(done) {
3503 var entropy = "";
3504 for (var i=0; i<33; i++) {
3505 entropy += "AAAAAAAA"; // 3 words * 33 iterations = 99 words
3506 }
3507 driver.findElement(By.css('.use-entropy'))
3508 .click();
3509 driver.findElement(By.css('.entropy'))
3510 .sendKeys(entropy);
3511 driver.sleep(generateDelay).then(function() {
3512 driver.findElement(By.css(".phrase"))
3513 .getAttribute("value").then(function(phrase) {
3514 var wordCount = phrase.split(/\s+/g).length;
3515 expect(wordCount).toBe(99);
3516 done();
3517 });
3518 });
3519 });
3520
3521 // Is compatible with bip32jp entropy
3522 // https://bip32jp.github.io/english/index.html
3523 // NOTES:
3524 // Is incompatible with:
3525 // base 20
3526 it('Is compatible with bip32jp.github.io', function(done) {
3527 var entropy = "543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543";
3528 var expectedPhrase = "train then jungle barely whip fiber purpose puppy eagle cloud clump hospital robot brave balcony utility detect estate old green desk skill multiply virus";
3529 driver.findElement(By.css('.use-entropy'))
3530 .click();
3531 driver.findElement(By.css('.entropy'))
3532 .sendKeys(entropy);
3533 driver.sleep(generateDelay).then(function() {
3534 driver.findElement(By.css(".phrase"))
3535 .getAttribute("value").then(function(phrase) {
3536 expect(phrase).toBe(expectedPhrase);
3537 done();
3538 });
3539 });
3540 });
3541
3542 // Blank entropy does not generate mnemonic or addresses
3543 it('Does not generate mnemonic for blank entropy', function(done) {
3544 driver.findElement(By.css('.use-entropy'))
3545 .click();
3546 driver.findElement(By.css('.entropy'))
3547 .clear();
3548 // check there is no mnemonic
3549 driver.sleep(generateDelay).then(function() {
3550 driver.findElement(By.css(".phrase"))
3551 .getAttribute("value").then(function(phrase) {
3552 expect(phrase).toBe("");
3553 // check there is no mnemonic
3554 driver.findElements(By.css(".address"))
3555 .then(function(addresses) {
3556 expect(addresses.length).toBe(0);
3557 // Check the feedback says 'blank entropy'
3558 driver.findElement(By.css(".feedback"))
3559 .getText()
3560 .then(function(feedbackText) {
3561 expect(feedbackText).toBe("Blank entropy");
3562 done();
3563 });
3564 })
3565 });
3566 });
3567 });
3568
3569 // Mnemonic length can be selected even for weak entropy
3570 it('Allows selection of mnemonic length even for weak entropy', function(done) {
3571 driver.findElement(By.css('.use-entropy'))
3572 .click();
3573 driver.executeScript(function() {
3574 $(".mnemonic-length").val("18").trigger("change");
3575 });
3576 driver.findElement(By.css('.entropy'))
3577 .sendKeys("012345");
3578 driver.sleep(generateDelay).then(function() {
3579 driver.findElement(By.css(".phrase"))
3580 .getAttribute("value").then(function(phrase) {
3581 var wordCount = phrase.split(/\s+/g).length;
3582 expect(wordCount).toBe(18);
3583 done();
3584 });
3585 });
3586 });
3587
3588 // Github issue 33
3589 // https://github.com/iancoleman/bip39/issues/33
3590 // Final cards should contribute entropy
3591 it('Uses as much entropy as possible for the mnemonic', function(done) {
3592 driver.findElement(By.css('.use-entropy'))
3593 .click();
3594 driver.findElement(By.css('.entropy'))
3595 .sendKeys("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");
3596 driver.sleep(generateDelay).then(function() {
3597 // Get mnemonic
3598 driver.findElement(By.css(".phrase"))
3599 .getAttribute("value").then(function(originalPhrase) {
3600 // Set the last 12 cards to be AS
3601 driver.findElement(By.css('.entropy'))
3602 .clear();
3603 driver.findElement(By.css('.entropy'))
3604 .sendKeys("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");
3605 driver.sleep(generateDelay).then(function() {
3606 // Get new mnemonic
3607 driver.findElement(By.css(".phrase"))
3608 .getAttribute("value").then(function(newPhrase) {
3609 expect(originalPhrase).not.toEqual(newPhrase);
3610 done();
3611 });
3612 });
3613 });
3614 });
3615 });
3616
3617 // Github issue 35
3618 // https://github.com/iancoleman/bip39/issues/35
3619 // QR Code support
3620 // TODO this doesn't work in selenium with firefox
3621 // see https://stackoverflow.com/q/40360223
3622 it('Shows a qr code on hover for the phrase', function(done) {
3623 if (browser == "firefox") {
3624 pending("Selenium + Firefox bug for mouseMove, see https://stackoverflow.com/q/40360223");
3625 }
3626 // generate a random mnemonic
3627 var generateEl = driver.findElement(By.css('.generate'));
3628 generateEl.click();
3629 // toggle qr to show (hidden by default)
3630 var phraseEl = driver.findElement(By.css(".phrase"));
3631 phraseEl.click();
3632 var rootKeyEl = driver.findElement(By.css(".root-key"));
3633 driver.sleep(generateDelay).then(function() {
3634 // hover over the root key
3635 driver.actions().mouseMove(rootKeyEl).perform().then(function() {
3636 // check the qr code shows
3637 driver.executeScript(function() {
3638 return $(".qr-container").find("canvas").length > 0;
3639 })
3640 .then(function(qrShowing) {
3641 expect(qrShowing).toBe(true);
3642 // hover away from the phrase
3643 driver.actions().mouseMove(generateEl).perform().then(function() {;
3644 // check the qr code hides
3645 driver.executeScript(function() {
3646 return $(".qr-container").find("canvas").length == 0;
3647 })
3648 .then(function(qrHidden) {
3649 expect(qrHidden).toBe(true);
3650 done();
3651 });
3652 });
3653 });
3654 });
3655 });
3656 });
3657
3658 // BIP44 account extendend private key is shown
3659 // github issue 37 - compatibility with electrum
3660 it('Shows the bip44 account extended private key', function(done) {
3661 driver.findElement(By.css(".phrase"))
3662 .sendKeys("abandon abandon ability");
3663 driver.sleep(generateDelay).then(function() {
3664 driver.findElement(By.css("#bip44 .account-xprv"))
3665 .getAttribute("value")
3666 .then(function(xprv) {
3667 expect(xprv).toBe("xprv9yzrnt4zWVJUr1k2VxSPy9ettKz5PpeDMgaVG7UKedhqnw1tDkxP2UyYNhuNSumk2sLE5ctwKZs9vwjsq3e1vo9egCK6CzP87H2cVYXpfwQ");
3668 done();
3669 });
3670 });
3671 });
3672
3673 // BIP44 account extendend public key is shown
3674 // github issue 37 - compatibility with electrum
3675 it('Shows the bip44 account extended public key', function(done) {
3676 driver.findElement(By.css(".phrase"))
3677 .sendKeys("abandon abandon ability");
3678 driver.sleep(generateDelay).then(function() {
3679 driver.findElement(By.css("#bip44 .account-xpub"))
3680 .getAttribute("value")
3681 .then(function(xprv) {
3682 expect(xprv).toBe("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3683 done();
3684 });
3685 });
3686 });
3687
3688 // github issue 40
3689 // BIP32 root key can be set as an xpub
3690 it('Generates addresses from xpub as bip32 root key', function(done) {
3691 driver.findElement(By.css('#bip32-tab a'))
3692 .click();
3693 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3694 driver.findElement(By.css("#root-key"))
3695 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3696 driver.sleep(generateDelay).then(function() {
3697 // check the addresses are generated
3698 getFirstAddress(function(address) {
3699 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
3700 // check the xprv key is not set
3701 driver.findElement(By.css(".extended-priv-key"))
3702 .getAttribute("value")
3703 .then(function(xprv) {
3704 expect(xprv).toBe("NA");
3705 // check the private key is not set
3706 driver.findElements(By.css(".privkey"))
3707 .then(function(els) {
3708 els[0]
3709 .getText()
3710 .then(function(privkey) {
3711 expect(xprv).toBe("NA");
3712 done();
3713 });
3714 });
3715 });
3716 });
3717 });
3718 });
3719
3720 // github issue 40
3721 // xpub for bip32 root key will not work with hardened derivation paths
3722 it('Shows error for hardened derivation paths with xpub root key', function(done) {
3723 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3724 driver.findElement(By.css("#root-key"))
3725 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3726 driver.sleep(feedbackDelay).then(function() {
3727 // Check feedback is correct
3728 driver.findElement(By.css('.feedback'))
3729 .getText()
3730 .then(function(feedback) {
3731 var msg = "Hardened derivation path is invalid with xpub key";
3732 expect(feedback).toBe(msg);
3733 // Check no addresses are shown
3734 driver.findElements(By.css('.addresses tr'))
3735 .then(function(rows) {
3736 expect(rows.length).toBe(0);
3737 done();
3738 });
3739 });
3740 });
3741 });
3742
3743 // github issue 39
3744 // no root key shows feedback
3745 it('Shows feedback for no root key', function(done) {
3746 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3747 driver.findElement(By.css('#bip32-tab a'))
3748 .click();
3749 driver.sleep(feedbackDelay).then(function() {
3750 // Check feedback is correct
3751 driver.findElement(By.css('.feedback'))
3752 .getText()
3753 .then(function(feedback) {
3754 expect(feedback).toBe("Invalid root key");
3755 done();
3756 });
3757 });
3758 });
3759
3760 // Github issue 44
3761 // display error switching tabs while addresses are generating
3762 it('Can change details while old addresses are still being generated', function(done) {
3763 // Set to generate 199 more addresses.
3764 // This will take a long time allowing a new set of addresses to be
3765 // generated midway through this lot.
3766 // The newly generated addresses should not include any from the old set.
3767 // Any more than 199 will show an alert which needs to be accepted.
3768 driver.findElement(By.css('.rows-to-add'))
3769 .clear();
3770 driver.findElement(By.css('.rows-to-add'))
3771 .sendKeys('199');
3772 // set the prhase
3773 driver.findElement(By.css('.phrase'))
3774 .sendKeys("abandon abandon ability");
3775 driver.sleep(generateDelay).then(function() {
3776 // change tabs which should cancel the previous generating
3777 driver.findElement(By.css('.rows-to-add'))
3778 .clear();
3779 driver.findElement(By.css('.rows-to-add'))
3780 .sendKeys('20');
3781 driver.findElement(By.css('#bip32-tab a'))
3782 .click()
3783 driver.sleep(generateDelay).then(function() {
3784 driver.findElements(By.css('.index'))
3785 .then(function(els) {
3786 // check the derivation paths have the right quantity
3787 expect(els.length).toBe(20);
3788 // check the derivation paths are in order
3789 testRowsAreInCorrectOrder(done);
3790 });
3791 });
3792 });
3793 }, generateDelay + 10000);
3794
3795 // Github issue 49
3796 // padding for binary should give length with multiple of 256
3797 // hashed entropy 1111 is length 252, so requires 4 leading zeros
3798 // prior to issue 49 it would only generate 2 leading zeros, ie missing 2
3799 it('Pads hashed entropy with leading zeros', function(done) {
3800 driver.findElement(By.css('.use-entropy'))
3801 .click();
3802 driver.executeScript(function() {
3803 $(".mnemonic-length").val("15").trigger("change");
3804 });
3805 driver.findElement(By.css('.entropy'))
3806 .sendKeys("1111");
3807 driver.sleep(generateDelay).then(function() {
3808 driver.findElement(By.css('.phrase'))
3809 .getAttribute("value")
3810 .then(function(phrase) {
3811 expect(phrase).toBe("avocado valid quantum cross link predict excuse edit street able flame large galaxy ginger nuclear");
3812 done();
3813 });
3814 });
3815 });
3816
3817 // Github pull request 55
3818 // https://github.com/iancoleman/bip39/pull/55
3819 // Client select
3820 it('Can set the derivation path on bip32 tab for bitcoincore', function(done) {
3821 testClientSelect(done, {
3822 selectValue: "0",
3823 bip32path: "m/0'/0'",
3824 useHardenedAddresses: "true",
3825 });
3826 });
3827 it('Can set the derivation path on bip32 tab for multibit', function(done) {
3828 testClientSelect(done, {
3829 selectValue: "2",
3830 bip32path: "m/0'/0",
3831 useHardenedAddresses: null,
3832 });
3833 });
3834 it('Can set the derivation path on bip32 tab for coinomi/ledger', function(done) {
3835 testClientSelect(done, {
3836 selectValue: "3",
3837 bip32path: "m/44'/0'/0'",
3838 useHardenedAddresses: null,
3839 });
3840 });
3841
3842 // github issue 58
3843 // https://github.com/iancoleman/bip39/issues/58
3844 // bip32 derivation is correct, does not drop leading zeros
3845 // see also
3846 // https://medium.com/@alexberegszaszi/why-do-my-bip32-wallets-disagree-6f3254cc5846
3847 it('Retains leading zeros for bip32 derivation', function(done) {
3848 driver.findElement(By.css(".phrase"))
3849 .sendKeys("fruit wave dwarf banana earth journey tattoo true farm silk olive fence");
3850 driver.findElement(By.css(".passphrase"))
3851 .sendKeys("banana");
3852 driver.sleep(generateDelay).then(function() {
3853 getFirstAddress(function(address) {
3854 // Note that bitcore generates an incorrect address
3855 // 13EuKhffWkBE2KUwcbkbELZb1MpzbimJ3Y
3856 // see the medium.com link above for more details
3857 expect(address).toBe("17rxURoF96VhmkcEGCj5LNQkmN9HVhWb7F");
3858 done();
3859 });
3860 });
3861 });
3862
3863 // github issue 60
3864 // Japanese mnemonics generate incorrect bip32 seed
3865 // BIP39 seed is set from phrase
3866 it('Generates correct seed for Japanese mnemonics', function(done) {
3867 driver.findElement(By.css(".phrase"))
3868 .sendKeys("あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あおぞら");
3869 driver.findElement(By.css(".passphrase"))
3870 .sendKeys("メートルガバヴァぱばぐゞちぢ十人十色");
3871 driver.sleep(generateDelay).then(function() {
3872 driver.findElement(By.css(".seed"))
3873 .getAttribute("value")
3874 .then(function(seed) {
3875 expect(seed).toBe("a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55");
3876 done();
3877 });
3878 });
3879 });
3880
3881 // BIP49 official test vectors
3882 // https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#test-vectors
3883 it('Generates BIP49 addresses matching the official test vectors', function(done) {
3884 driver.findElement(By.css('#bip49-tab a'))
3885 .click();
3886 selectNetwork("BTC - Bitcoin Testnet");
3887 driver.findElement(By.css(".phrase"))
3888 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
3889 driver.sleep(generateDelay).then(function() {
3890 getFirstAddress(function(address) {
3891 expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
3892 done();
3893 });
3894 });
3895 });
3896
3897 // BIP49 derivation path is shown
3898 it('Shows the bip49 derivation path', function(done) {
3899 driver.findElement(By.css('#bip49-tab a'))
3900 .click();
3901 driver.findElement(By.css(".phrase"))
3902 .sendKeys("abandon abandon ability");
3903 driver.sleep(generateDelay).then(function() {
3904 driver.findElement(By.css('#bip49 .path'))
3905 .getAttribute("value")
3906 .then(function(path) {
3907 expect(path).toBe("m/49'/0'/0'/0");
3908 done();
3909 });
3910 });
3911 });
3912
3913 // BIP49 extended private key is shown
3914 it('Shows the bip49 extended private key', function(done) {
3915 driver.findElement(By.css('#bip49-tab a'))
3916 .click();
3917 driver.findElement(By.css(".phrase"))
3918 .sendKeys("abandon abandon ability");
3919 driver.sleep(generateDelay).then(function() {
3920 driver.findElement(By.css('.extended-priv-key'))
3921 .getAttribute("value")
3922 .then(function(xprv) {
3923 expect(xprv).toBe("yprvALYB4DYRG6CzzVgzQZwwqjAA2wjBGC3iEd7KYYScpoDdmf75qMRWZWxoFcRXBJjgEXdFqJ9vDRGRLJQsrL22Su5jMbNFeM9vetaGVqy9Qy2");
3924 done();
3925 });
3926 });
3927 });
3928
3929 // BIP49 extended public key is shown
3930 it('Shows the bip49 extended public key', function(done) {
3931 driver.findElement(By.css('#bip49-tab a'))
3932 .click();
3933 driver.findElement(By.css(".phrase"))
3934 .sendKeys("abandon abandon ability");
3935 driver.sleep(generateDelay).then(function() {
3936 driver.findElement(By.css('.extended-pub-key'))
3937 .getAttribute("value")
3938 .then(function(xprv) {
3939 expect(xprv).toBe("ypub6ZXXTj5K6TmJCymTWbUxCs6tayZffemZbr2vLvrEP8kceTSENtjm7KHH6thvAKxVar9fGe8rgsPEX369zURLZ68b4f7Vexz7RuXsjQ69YDt");
3940 done();
3941 });
3942 });
3943 });
3944
3945 // BIP49 account field changes address list
3946 it('Can set the bip49 account field', function(done) {
3947 driver.findElement(By.css('#bip49-tab a'))
3948 .click();
3949 driver.findElement(By.css('#bip49 .account'))
3950 .clear();
3951 driver.findElement(By.css('#bip49 .account'))
3952 .sendKeys("1");
3953 driver.findElement(By.css(".phrase"))
3954 .sendKeys("abandon abandon ability");
3955 driver.sleep(generateDelay).then(function() {
3956 getFirstAddress(function(address) {
3957 expect(address).toBe("381wg1GGN4rP88rNC9v7QWsiww63yLVPsn");
3958 done();
3959 });
3960 });
3961 });
3962
3963 // BIP49 change field changes address list
3964 it('Can set the bip49 change field', function(done) {
3965 driver.findElement(By.css('#bip49-tab a'))
3966 .click();
3967 driver.findElement(By.css('#bip49 .change'))
3968 .clear();
3969 driver.findElement(By.css('#bip49 .change'))
3970 .sendKeys("1");
3971 driver.findElement(By.css(".phrase"))
3972 .sendKeys("abandon abandon ability");
3973 driver.sleep(generateDelay).then(function() {
3974 getFirstAddress(function(address) {
3975 expect(address).toBe("3PEM7MiKed5konBoN66PQhK8r3hjGhy9dT");
3976 done();
3977 });
3978 });
3979 });
3980
3981 // BIP49 account extendend private key is shown
3982 it('Shows the bip49 account extended private key', function(done) {
3983 driver.findElement(By.css('#bip49-tab a'))
3984 .click();
3985 driver.findElement(By.css(".phrase"))
3986 .sendKeys("abandon abandon ability");
3987 driver.sleep(generateDelay).then(function() {
3988 driver.findElement(By.css('#bip49 .account-xprv'))
3989 .getAttribute("value")
3990 .then(function(xprv) {
3991 expect(xprv).toBe("yprvAHtB1M5Wp675aLzFy9TJYK2mSsLkg6mcBRh5DZTR7L4EnYSmYPaL63KFA4ycg1PngW5LfkmejxzosCs17TKZMpRFKc3z5SJar6QAKaFcaZL");
3992 done();
3993 });
3994 });
3995 });
3996
3997 // BIP49 account extendend public key is shown
3998 it('Shows the bip49 account extended public key', function(done) {
3999 driver.findElement(By.css('#bip49-tab a'))
4000 .click();
4001 driver.findElement(By.css(".phrase"))
4002 .sendKeys("abandon abandon ability");
4003 driver.sleep(generateDelay).then(function() {
4004 driver.findElement(By.css('#bip49 .account-xpub'))
4005 .getAttribute("value")
4006 .then(function(xprv) {
4007 expect(xprv).toBe("ypub6WsXQrcQeTfNnq4j5AzJuSyVzuBF5ZVTYecg1ws2ffbDfLmv5vtadqdj1NgR6C6gufMpMfJpHxvb6JEQKvETVNWCRanNedfJtnTchZiJtsL");
4008 done();
4009 });
4010 });
4011 });
4012
4013 // Test selecting coin where bip49 is unavailable (eg CLAM)
4014 it('Shows an error on bip49 tab for coins without bip49', function(done) {
4015 driver.findElement(By.css('#bip49-tab a'))
4016 .click();
4017 driver.findElement(By.css(".phrase"))
4018 .sendKeys("abandon abandon ability");
4019 driver.sleep(generateDelay).then(function() {
4020 selectNetwork("CLAM - Clams");
4021 // bip49 available is hidden
4022 driver.findElement(By.css('#bip49 .available'))
4023 .getAttribute("class")
4024 .then(function(classes) {
4025 expect(classes).toContain("hidden");
4026 // bip49 unavailable is shown
4027 driver.findElement(By.css('#bip49 .unavailable'))
4028 .getAttribute("class")
4029 .then(function(classes) {
4030 expect(classes).not.toContain("hidden");
4031 // check there are no addresses shown
4032 driver.findElements(By.css('.addresses tr'))
4033 .then(function(rows) {
4034 expect(rows.length).toBe(0);
4035 // check the derived private key is blank
4036 driver.findElement(By.css('.extended-priv-key'))
4037 .getAttribute("value")
4038 .then(function(xprv) {
4039 expect(xprv).toBe('');
4040 // check the derived public key is blank
4041 driver.findElement(By.css('.extended-pub-key'))
4042 .getAttribute("value")
4043 .then(function(xpub) {
4044 expect(xpub).toBe('');
4045 done();
4046 });
4047 });
4048 })
4049 });
4050 });
4051 });
4052 });
4053
4054 // github issue 43
4055 // Cleared mnemonic and root key still allows addresses to be generated
4056 // https://github.com/iancoleman/bip39/issues/43
4057 it('Clears old root keys from memory when mnemonic is cleared', function(done) {
4058 // set the phrase
4059 driver.findElement(By.css(".phrase"))
4060 .sendKeys("abandon abandon ability");
4061 driver.sleep(generateDelay).then(function() {
4062 // clear the mnemonic and root key
4063 // using selenium .clear() doesn't seem to trigger the 'input' event
4064 // so clear it using keys instead
4065 driver.findElement(By.css('.phrase'))
4066 .sendKeys(Key.CONTROL,"a");
4067 driver.findElement(By.css('.phrase'))
4068 .sendKeys(Key.DELETE);
4069 driver.findElement(By.css('.root-key'))
4070 .sendKeys(Key.CONTROL,"a");
4071 driver.findElement(By.css('.root-key'))
4072 .sendKeys(Key.DELETE);
4073 driver.sleep(generateDelay).then(function() {
4074 // try to generate more addresses
4075 driver.findElement(By.css('.more'))
4076 .click();
4077 driver.sleep(generateDelay).then(function() {
4078 driver.findElements(By.css(".addresses tr"))
4079 .then(function(els) {
4080 // check there are no addresses shown
4081 expect(els.length).toBe(0);
4082 done();
4083 });
4084 });
4085 });
4086 });
4087 });
4088
4089 // Github issue 95
4090 // error trying to generate addresses from xpub with hardened derivation
4091 it('Shows error for hardened addresses with xpub root key', function(done) {
4092 driver.findElement(By.css('#bip32-tab a'))
4093 .click()
4094 driver.executeScript(function() {
4095 $(".hardened-addresses").prop("checked", true);
4096 });
4097 // set xpub for account 0 of bip44 for 'abandon abandon ability'
4098 driver.findElement(By.css("#root-key"))
4099 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
4100 driver.sleep(feedbackDelay).then(function() {
4101 // Check feedback is correct
4102 driver.findElement(By.css('.feedback'))
4103 .getText()
4104 .then(function(feedback) {
4105 var msg = "Hardened derivation path is invalid with xpub key";
4106 expect(feedback).toBe(msg);
4107 done();
4108 });
4109 });
4110 });
4111
4112 // Litecoin uses ltub by default, and can optionally be set to xprv
4113 // github issue 96
4114 // https://github.com/iancoleman/bip39/issues/96
4115 // Issue with extended keys on Litecoin
4116 it('Uses ltub by default for litecoin, but can be set to xprv', function(done) {
4117 driver.findElement(By.css('.phrase'))
4118 .sendKeys("abandon abandon ability");
4119 selectNetwork("LTC - Litecoin");
4120 driver.sleep(generateDelay).then(function() {
4121 // check the extended key is generated correctly
4122 driver.findElement(By.css('.root-key'))
4123 .getAttribute("value")
4124 .then(function(rootKey) {
4125 expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
4126 // set litecoin to use ltub
4127 driver.executeScript(function() {
4128 $(".litecoin-use-ltub").prop("checked", false);
4129 $(".litecoin-use-ltub").trigger("change");
4130 });
4131 driver.sleep(generateDelay).then(function() {
4132 driver.findElement(By.css('.root-key'))
4133 .getAttribute("value")
4134 .then(function(rootKey) {
4135 expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
4136 done();
4137 });
4138 })
4139 });
4140 });
4141 });
4142
4143 // github issue 99
4144 // https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
4145 // "warn me emphatically when they have detected invalid input" to the entropy field
4146 // A warning is shown when entropy is filtered and discarded
4147 it('Warns when entropy is filtered and discarded', function(done) {
4148 driver.findElement(By.css('.use-entropy'))
4149 .click();
4150 // set entropy to have no filtered content
4151 driver.findElement(By.css('.entropy'))
4152 .sendKeys("00000000 00000000 00000000 00000000");
4153 driver.sleep(generateDelay).then(function() {
4154 // check the filter warning does not show
4155 driver.findElement(By.css('.entropy-container .filter-warning'))
4156 .getAttribute("class")
4157 .then(function(classes) {
4158 expect(classes).toContain("hidden");
4159 // set entropy to have some filtered content
4160 driver.findElement(By.css('.entropy'))
4161 .sendKeys("10000000 zxcvbn 00000000 00000000 00000000");
4162 driver.sleep(entropyFeedbackDelay).then(function() {
4163 // check the filter warning shows
4164 driver.findElement(By.css('.entropy-container .filter-warning'))
4165 .getAttribute("class")
4166 .then(function(classes) {
4167 expect(classes).not.toContain("hidden");
4168 done();
4169 });
4170 });
4171 });
4172 });
4173 });
4174
4175 // Bitcoin Cash address can be set to use cashaddr format
4176 it('Can use cashaddr format for bitcoin cash addresses', function(done) {
4177 driver.executeScript(function() {
4178 $(".use-bch-cashaddr-addresses").prop("checked", true);
4179 });
4180 driver.findElement(By.css('.phrase'))
4181 .sendKeys("abandon abandon ability");
4182 selectNetwork("BCH - Bitcoin Cash");
4183 driver.sleep(generateDelay).then(function() {
4184 getFirstAddress(function(address) {
4185 expect(address).toBe("bitcoincash:qzlquk7w4hkudxypl4fgv8x279r754dkvur7jpcsps");
4186 done();
4187 });
4188 });
4189 });
4190
4191 // Bitcoin Cash address can be set to use bitpay format
4192 it('Can use bitpay format for bitcoin cash addresses', function(done) {
4193 driver.executeScript(function() {
4194 $(".use-bch-bitpay-addresses").prop("checked", true);
4195 });
4196 driver.findElement(By.css('.phrase'))
4197 .sendKeys("abandon abandon ability");
4198 selectNetwork("BCH - Bitcoin Cash");
4199 driver.sleep(generateDelay).then(function() {
4200 getFirstAddress(function(address) {
4201 expect(address).toBe("CZnpA9HPmvhuhLLPWJP8rNDpLUYXy1LXFk");
4202 done();
4203 });
4204 });
4205 });
4206
4207 // Bitcoin Cash address can be set to use legacy format
4208 it('Can use legacy format for bitcoin cash addresses', function(done) {
4209 driver.executeScript(function() {
4210 $(".use-bch-legacy-addresses").prop("checked", true);
4211 });
4212 driver.findElement(By.css('.phrase'))
4213 .sendKeys("abandon abandon ability");
4214 selectNetwork("BCH - Bitcoin Cash");
4215 driver.sleep(generateDelay).then(function() {
4216 getFirstAddress(function(address) {
4217 expect(address).toBe("1JKvb6wKtsjNoCRxpZ4DGrbniML7z5U16A");
4218 done();
4219 });
4220 });
4221 });
4222
4223 // End of tests ported from old suit, so no more comments above each test now
4224
4225 it('Can generate more addresses from a custom index', function(done) {
4226 var expectedIndexes = [
4227 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
4228 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
4229 ];
4230 driver.findElement(By.css('.phrase'))
4231 .sendKeys("abandon abandon ability");
4232 driver.sleep(generateDelay).then(function() {
4233 // Set start of next lot of rows to be from index 40
4234 // which means indexes 20-39 will not be in the table.
4235 driver.findElement(By.css('.more-rows-start-index'))
4236 .sendKeys("40");
4237 driver.findElement(By.css('.more'))
4238 .click();
4239 driver.sleep(generateDelay).then(function() {
4240 // Check actual indexes in the table match the expected pattern
4241 driver.findElements(By.css(".index"))
4242 .then(function(els) {
4243 expect(els.length).toBe(expectedIndexes.length);
4244 var testRowAtIndex = function(i) {
4245 if (i >= expectedIndexes.length) {
4246 done();
4247 }
4248 else {
4249 els[i].getText()
4250 .then(function(actualPath) {
4251 var noHardened = actualPath.replace(/'/g, "");
4252 var pathBits = noHardened.split("/")
4253 var lastBit = pathBits[pathBits.length-1];
4254 var actualIndex = parseInt(lastBit);
4255 var expectedIndex = expectedIndexes[i];
4256 expect(actualIndex).toBe(expectedIndex);
4257 testRowAtIndex(i+1);
4258 });
4259 }
4260 }
4261 testRowAtIndex(0);
4262 });
4263 });
4264 });
4265 });
4266
4267 it('Can generate BIP141 addresses with P2WPKH-in-P2SH semanitcs', function(done) {
4268 // Sourced from BIP49 official test specs
4269 driver.findElement(By.css('#bip141-tab a'))
4270 .click();
4271 driver.findElement(By.css('.bip141-path'))
4272 .clear();
4273 driver.findElement(By.css('.bip141-path'))
4274 .sendKeys("m/49'/1'/0'/0");
4275 selectNetwork("BTC - Bitcoin Testnet");
4276 driver.findElement(By.css(".phrase"))
4277 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
4278 driver.sleep(generateDelay).then(function() {
4279 getFirstAddress(function(address) {
4280 expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
4281 done();
4282 });
4283 });
4284 });
4285
4286 it('Can generate BIP141 addresses with P2WSH semanitcs', function(done) {
4287 driver.findElement(By.css('#bip141-tab a'))
4288 .click();
4289 // Choose P2WSH
4290 driver.executeScript(function() {
4291 $(".bip141-semantics option[selected]").removeAttr("selected");
4292 $(".bip141-semantics option").filter(function(i,e) {
4293 return $(e).html() == "P2WSH (1-of-1 multisig)";
4294 }).prop("selected", true);
4295 $(".bip141-semantics").trigger("change");
4296 });
4297 driver.findElement(By.css(".phrase"))
4298 .sendKeys("abandon abandon ability");
4299 driver.sleep(generateDelay).then(function() {
4300 driver.findElement(By.css("#root-key"))
4301 .getAttribute("value")
4302 .then(function(rootKey) {
4303 expect(rootKey).toBe("ZprvAhadJRUYsNge9uHspaggavxU1BUQ8QwfT4Z9UGq5sKF2mSt1mVy8EckLAaoBdmLHyP5eYDJ3LxtmzMNnLg2MRFe7QN2ueF4NCH4s5PrCDR6");
4304 getFirstAddress(function(address) {
4305 expect(address).toBe("bc1q2qhee847pv438tgg8hc7mjy38n8dklleshettn344l0tgs0kj5hskz9p9r");
4306 done();
4307 });
4308 })
4309 });
4310 });
4311
4312 it('Can generate BIP141 addresses with P2WSH-in-P2SH semanitcs', function(done) {
4313 driver.findElement(By.css('#bip141-tab a'))
4314 .click();
4315 // Choose P2WSH-in-P2SH
4316 driver.executeScript(function() {
4317 $(".bip141-semantics option[selected]").removeAttr("selected");
4318 $(".bip141-semantics option").filter(function(i,e) {
4319 return $(e).html() == "P2WSH nested in P2SH (1-of-1 multisig)";
4320 }).prop("selected", true);
4321 $(".bip141-semantics").trigger("change");
4322 });
4323 driver.findElement(By.css(".phrase"))
4324 .sendKeys("abandon abandon ability");
4325 driver.sleep(generateDelay).then(function() {
4326 driver.findElement(By.css("#root-key"))
4327 .getAttribute("value")
4328 .then(function(rootKey) {
4329 expect(rootKey).toBe("YprvANkMzkodih9AJc6kzDu4NqrxqDKxBnxAXx2vgswCVJs9iM4nWqoZcZ6C9NqbdrgNZjxqnjhUtJYE74mDcycLd1xWY2LV4LEsvZ1DgqxuAKe");
4330 getFirstAddress(function(address) {
4331 expect(address).toBe("343DLC4vGDyHBbBr9myL8zzZA1MdN9TM1G");
4332 done();
4333 });
4334 })
4335 });
4336 });
4337
4338 it('Uses Vprv for bitcoin testnet p2wsh', function(done) {
4339 selectNetwork("BTC - Bitcoin Testnet");
4340 driver.findElement(By.css('#bip141-tab a'))
4341 .click()
4342 // Choose P2WSH
4343 driver.executeScript(function() {
4344 $(".bip141-semantics option[selected]").removeAttr("selected");
4345 $(".bip141-semantics option").filter(function(i,e) {
4346 return $(e).html() == "P2WSH (1-of-1 multisig)";
4347 }).prop("selected", true);
4348 $(".bip141-semantics").trigger("change");
4349 });
4350 driver.findElement(By.css('.phrase'))
4351 .sendKeys('abandon abandon ability');
4352 driver.sleep(generateDelay).then(function() {
4353 driver.findElement(By.css('.root-key'))
4354 .getAttribute("value")
4355 .then(function(path) {
4356 expect(path).toBe("Vprv16YtLrHXxePM5ja5hXQbiJs5JKDAc4WcaXo5rZcrVMU6bMhUg1oY7fpPku3i819gvMcHvq1h8aELDsyfCEs19vj1Q3iDHRrESWyJConkoT1");
4357 done();
4358 })
4359 });
4360 });
4361
4362 it('Uses Uprv for bitcoin testnet p2wsh-in-p2sh', function(done) {
4363 selectNetwork("BTC - Bitcoin Testnet");
4364 driver.findElement(By.css('#bip141-tab a'))
4365 .click()
4366 // Choose P2WSH-in-P2SH
4367 driver.executeScript(function() {
4368 $(".bip141-semantics option[selected]").removeAttr("selected");
4369 $(".bip141-semantics option").filter(function(i,e) {
4370 return $(e).html() == "P2WSH nested in P2SH (1-of-1 multisig)";
4371 }).prop("selected", true);
4372 $(".bip141-semantics").trigger("change");
4373 });
4374 driver.findElement(By.css('.phrase'))
4375 .sendKeys('abandon abandon ability');
4376 driver.sleep(generateDelay).then(function() {
4377 driver.findElement(By.css('.root-key'))
4378 .getAttribute("value")
4379 .then(function(path) {
4380 expect(path).toBe("Uprv95RJn67y7xyEuRLHenkZYVUx9LkARJzAsVx3ZJMeyHMdVwosWD9K8JTe4Z1FeE4gwBVcnqKF3f82ZvJxkBxHS5E74fYnigxvqeke8ZV3Fp2");
4381 done();
4382 })
4383 });
4384 });
4385
4386 it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
4387 // This result tested against bitcoinjs-lib test spec for segwit address
4388 // using the first private key of this mnemonic and default path m/0
4389 // https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50
4390 // so whilst not directly comparable, substituting the private key produces
4391 // identical results between this tool and the bitcoinjs-lib test.
4392 // Private key generated is:
4393 // L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP
4394 driver.findElement(By.css('#bip141-tab a'))
4395 .click();
4396 // Choose P2WPKH
4397 driver.executeScript(function() {
4398 $(".bip141-semantics option[selected]").removeAttr("selected");
4399 $(".bip141-semantics option").filter(function(i,e) {
4400 return $(e).html() == "P2WPKH";
4401 }).prop("selected", true);
4402 $(".bip141-semantics").trigger("change");
4403 });
4404 driver.findElement(By.css(".phrase"))
4405 .sendKeys("abandon abandon ability");
4406 driver.sleep(generateDelay).then(function() {
4407 getFirstAddress(function(address) {
4408 expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9");
4409 done();
4410 });
4411 });
4412 });
4413
4414 it('Shows the entropy used by the PRNG when clicking generate', function(done) {
4415 driver.findElement(By.css('.generate')).click();
4416 driver.sleep(generateDelay).then(function() {
4417 driver.findElement(By.css('.entropy'))
4418 .getAttribute("value")
4419 .then(function(entropy) {
4420 expect(entropy).not.toBe("");
4421 done();
4422 });
4423 });
4424 });
4425
4426 it('Shows the index of each word in the mnemonic', function(done) {
4427 driver.findElement(By.css('.phrase'))
4428 .sendKeys("abandon abandon ability");
4429 driver.sleep(generateDelay).then(function() {
4430 driver.findElement(By.css('.use-entropy'))
4431 .click();
4432 driver.findElement(By.css('.word-indexes'))
4433 .getText()
4434 .then(function(indexes) {
4435 expect(indexes).toBe("0, 0, 1");
4436 done();
4437 });
4438 });
4439 });
4440
4441 it('Shows the derivation path for bip84 tab', function(done) {
4442 driver.findElement(By.css('#bip84-tab a'))
4443 .click()
4444 driver.findElement(By.css('.phrase'))
4445 .sendKeys('abandon abandon ability');
4446 driver.sleep(generateDelay).then(function() {
4447 driver.findElement(By.css('#bip84 .path'))
4448 .getAttribute("value")
4449 .then(function(path) {
4450 expect(path).toBe("m/84'/0'/0'/0");
4451 done();
4452 })
4453 });
4454 });
4455
4456 it('Shows the extended private key for bip84 tab', function(done) {
4457 driver.findElement(By.css('#bip84-tab a'))
4458 .click()
4459 driver.findElement(By.css('.phrase'))
4460 .sendKeys('abandon abandon ability');
4461 driver.sleep(generateDelay).then(function() {
4462 driver.findElement(By.css('.extended-priv-key'))
4463 .getAttribute("value")
4464 .then(function(path) {
4465 expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
4466 done();
4467 })
4468 });
4469 });
4470
4471 it('Shows the extended public key for bip84 tab', function(done) {
4472 driver.findElement(By.css('#bip84-tab a'))
4473 .click()
4474 driver.findElement(By.css('.phrase'))
4475 .sendKeys('abandon abandon ability');
4476 driver.sleep(generateDelay).then(function() {
4477 driver.findElement(By.css('.extended-pub-key'))
4478 .getAttribute("value")
4479 .then(function(path) {
4480 expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
4481 done();
4482 })
4483 });
4484 });
4485
4486 it('Changes the address list if bip84 account is changed', function(done) {
4487 driver.findElement(By.css('#bip84-tab a'))
4488 .click()
4489 driver.findElement(By.css('#bip84 .account'))
4490 .sendKeys('1');
4491 driver.findElement(By.css('.phrase'))
4492 .sendKeys('abandon abandon ability');
4493 driver.sleep(generateDelay).then(function() {
4494 getFirstAddress(function(address) {
4495 expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
4496 done();
4497 });
4498 });
4499 });
4500
4501 it('Changes the address list if bip84 change is changed', function(done) {
4502 driver.findElement(By.css('#bip84-tab a'))
4503 .click()
4504 driver.findElement(By.css('#bip84 .change'))
4505 .sendKeys('1');
4506 driver.findElement(By.css('.phrase'))
4507 .sendKeys('abandon abandon ability');
4508 driver.sleep(generateDelay).then(function() {
4509 getFirstAddress(function(address) {
4510 expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
4511 done();
4512 });
4513 });
4514 });
4515
4516 it('Passes the official BIP84 test spec for rootpriv', function(done) {
4517 driver.findElement(By.css('#bip84-tab a'))
4518 .click()
4519 driver.findElement(By.css('.phrase'))
4520 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4521 driver.sleep(generateDelay).then(function() {
4522 driver.findElement(By.css(".root-key"))
4523 .getAttribute("value")
4524 .then(function(rootKey) {
4525 expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
4526 done();
4527 })
4528 });
4529 });
4530
4531 it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
4532 driver.findElement(By.css('#bip84-tab a'))
4533 .click()
4534 driver.findElement(By.css('.phrase'))
4535 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4536 driver.sleep(generateDelay).then(function() {
4537 driver.findElement(By.css("#bip84 .account-xprv"))
4538 .getAttribute("value")
4539 .then(function(rootKey) {
4540 expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
4541 done();
4542 })
4543 });
4544 });
4545
4546 it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
4547 driver.findElement(By.css('#bip84-tab a'))
4548 .click()
4549 driver.findElement(By.css('.phrase'))
4550 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4551 driver.sleep(generateDelay).then(function() {
4552 driver.findElement(By.css("#bip84 .account-xpub"))
4553 .getAttribute("value")
4554 .then(function(rootKey) {
4555 expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
4556 done();
4557 })
4558 });
4559 });
4560
4561 it('Passes the official BIP84 test spec for account 0 first address', function(done) {
4562 driver.findElement(By.css('#bip84-tab a'))
4563 .click()
4564 driver.findElement(By.css('.phrase'))
4565 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4566 driver.sleep(generateDelay).then(function() {
4567 getFirstAddress(function(address) {
4568 expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
4569 done();
4570 });
4571 });
4572 });
4573
4574 it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
4575 driver.findElement(By.css('#bip84-tab a'))
4576 .click()
4577 driver.findElement(By.css('.phrase'))
4578 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4579 driver.findElement(By.css('#bip84 .change'))
4580 .sendKeys('1');
4581 driver.sleep(generateDelay).then(function() {
4582 getFirstAddress(function(address) {
4583 expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
4584 done();
4585 });
4586 });
4587 });
4588
4589 it('Can display the table as csv', function(done) {
4590 var headings = "path,address,public key,private key";
4591 var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE";
4592 var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab";
4593 driver.findElement(By.css('.phrase'))
4594 .sendKeys('abandon abandon ability');
4595 driver.sleep(generateDelay).then(function() {
4596 driver.findElement(By.css('.csv'))
4597 .getAttribute("value")
4598 .then(function(csv) {
4599 expect(csv).toContain(headings);
4600 expect(csv).toContain(row1);
4601 expect(csv).toContain(row20);
4602 done();
4603 });
4604 });
4605 });
4606
4607 it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
4608 // see https://github.com/iancoleman/bip39/issues/155
4609 selectNetwork("ETH - Ethereum");
4610 driver.findElement(By.css('#bip32-tab a'))
4611 .click()
4612 driver.findElement(By.css('#bip32-path'))
4613 .clear();
4614 driver.findElement(By.css('#bip32-path'))
4615 .sendKeys("m/44'/60'/0'");
4616 driver.findElement(By.css('.phrase'))
4617 .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');
4618 driver.sleep(generateDelay).then(function() {
4619 getFirstAddress(function(address) {
4620 expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
4621 done();
4622 });
4623 });
4624 });
4625
4626 it('Can encrypt private keys using BIP38', function(done) {
4627 // see https://github.com/iancoleman/bip39/issues/140
4628 driver.executeScript(function() {
4629 $(".use-bip38").prop("checked", true);
4630 });
4631 driver.findElement(By.css('.bip38-password'))
4632 .sendKeys('bip38password');
4633 driver.findElement(By.css('.rows-to-add'))
4634 .clear();
4635 driver.findElement(By.css('.rows-to-add'))
4636 .sendKeys('1');
4637 driver.findElement(By.css('.phrase'))
4638 .sendKeys('abandon abandon ability');
4639 driver.sleep(bip38delay).then(function() {
4640 // address
4641 getFirstRowValue(function(address) {
4642 expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB");
4643 // pubkey
4644 getFirstRowValue(function(pubkey) {
4645 expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1");
4646 // privkey
4647 getFirstRowValue(function(privkey) {
4648 expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM");
4649 done();
4650 }, ".privkey");
4651 }, ".pubkey");
4652 }, ".address");
4653 });
4654 }, bip38delay + 5000);
4655
4656 it('Shows the checksum for the entropy', function(done) {
4657 driver.findElement(By.css('.use-entropy'))
4658 .click();
4659 driver.findElement(By.css('.entropy'))
4660 .sendKeys("00000000000000000000000000000000");
4661 driver.sleep(generateDelay).then(function() {
4662 driver.findElement(By.css('.checksum'))
4663 .getText()
4664 .then(function(text) {
4665 expect(text).toBe("1");
4666 done();
4667 });
4668 });
4669 });
4670
4671 it('Shows the checksum for the entropy with the correct groupings', function(done) {
4672 driver.findElement(By.css('.use-entropy'))
4673 .click();
4674 // create a checksum of 20 bits, which spans multiple words
4675 driver.findElement(By.css('.entropy'))
4676 .sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
4677 driver.sleep(generateDelay).then(function() {
4678 driver.findElement(By.css('.checksum'))
4679 .getText()
4680 .then(function(text) {
4681 // first group is 9 bits, second group is 11
4682 expect(text).toBe("011010111 01110000110");
4683 done();
4684 });
4685 });
4686 });
4687
4688 it('Uses vprv for bitcoin testnet p2wpkh', function(done) {
4689 selectNetwork("BTC - Bitcoin Testnet");
4690 driver.findElement(By.css('#bip84-tab a'))
4691 .click()
4692 driver.findElement(By.css('.phrase'))
4693 .sendKeys('abandon abandon ability');
4694 driver.sleep(generateDelay).then(function() {
4695 driver.findElement(By.css('.root-key'))
4696 .getAttribute("value")
4697 .then(function(path) {
4698 expect(path).toBe("vprv9DMUxX4ShgxML9N2YV5CvWEebWrM9aJ5ULpbRRyzyWu6vs4BzTvbfFFrH41N5hVi7MYSfiugd765L3JmAfDM5po36Y8ouCKRDeYQwByCmS7");
4699 done();
4700 })
4701 });
4702 });
4703
4704 it('Shows a warning if generating weak mnemonics', function(done) {
4705 driver.executeScript(function() {
4706 $(".strength option[selected]").removeAttr("selected");
4707 $(".strength option[value=6]").prop("selected", true);
4708 $(".strength").trigger("change");
4709 });
4710 driver.findElement(By.css(".generate-container .warning"))
4711 .getAttribute("class")
4712 .then(function(classes) {
4713 expect(classes).not.toContain("hidden");
4714 done();
4715 });
4716 });
4717
4718 it('Does not show a warning if generating strong mnemonics', function(done) {
4719 driver.executeScript(function() {
4720 $(".strength option[selected]").removeAttr("selected");
4721 $(".strength option[value=12]").prop("selected", true);
4722 });
4723 driver.findElement(By.css(".generate-container .warning"))
4724 .getAttribute("class")
4725 .then(function(classes) {
4726 expect(classes).toContain("hidden");
4727 done();
4728 });
4729 });
4730
4731 it('Shows a warning if overriding weak entropy with longer mnemonics', function(done) {
4732 driver.findElement(By.css('.use-entropy'))
4733 .click();
4734 driver.findElement(By.css('.entropy'))
4735 .sendKeys("0123456789abcdef"); // 6 words
4736 driver.executeScript(function() {
4737 $(".mnemonic-length").val("12").trigger("change");
4738 });
4739 driver.findElement(By.css(".weak-entropy-override-warning"))
4740 .getAttribute("class")
4741 .then(function(classes) {
4742 expect(classes).not.toContain("hidden");
4743 done();
4744 });
4745 });
4746
4747 it('Does not show a warning if entropy is stronger than mnemonic length', function(done) {
4748 driver.findElement(By.css('.use-entropy'))
4749 .click();
4750 driver.findElement(By.css('.entropy'))
4751 .sendKeys("0123456789abcdef0123456789abcdef0123456789abcdef"); // 18 words
4752 driver.executeScript(function() {
4753 $(".mnemonic-length").val("12").trigger("change");
4754 });
4755 driver.findElement(By.css(".weak-entropy-override-warning"))
4756 .getAttribute("class")
4757 .then(function(classes) {
4758 expect(classes).toContain("hidden");
4759 done();
4760 });
4761 });
4762
4763 it('Shows litecoin BIP49 addresses', function(done) {
4764 driver.findElement(By.css('.phrase'))
4765 .sendKeys('abandon abandon ability');
4766 selectNetwork("LTC - Litecoin");
4767 driver.findElement(By.css('#bip49-tab a'))
4768 .click()
4769 // bip49 addresses are shown
4770 driver.sleep(generateDelay).then(function() {
4771 driver.findElement(By.css('#bip49 .available'))
4772 .getAttribute("class")
4773 .then(function(classes) {
4774 expect(classes).not.toContain("hidden");
4775 // check first address
4776 getFirstAddress(function(address) {
4777 expect(address).toBe("MFwLPhsXoBuSLL8cLmW9uK6tChkzduV8qN");
4778 done();
4779 });
4780 });
4781 });
4782 });
4783
4784 it('Shows Groestlcoin BIP49 addresses', function(done) {
4785 driver.findElement(By.css('.phrase'))
4786 .sendKeys('abandon abandon ability');
4787 selectNetwork("GRS - Groestlcoin");
4788 driver.findElement(By.css('#bip49-tab a'))
4789 .click()
4790 // bip49 addresses are shown
4791 driver.sleep(generateDelay).then(function() {
4792 driver.findElement(By.css('#bip49 .available'))
4793 .getAttribute("class")
4794 .then(function(classes) {
4795 expect(classes).not.toContain("hidden");
4796 // check first address
4797 getFirstAddress(function(address) {
4798 expect(address).toBe("3HXSCZwCypLyixMsF4Z1sN49noJtrm8gnX");
4799 done();
4800 });
4801 });
4802 });
4803 });
4804
4805 it('Can use root keys to generate segwit table rows', function(done) {
4806 // segwit uses ypub / zpub instead of xpub but the root key should still
4807 // be valid regardless of the encoding used to import that key.
4808 // Maybe this breaks the reason for the different extended key prefixes, but
4809 // since the parsed root key is used behind the scenes anyhow this should be
4810 // allowed.
4811 driver.findElement(By.css('#root-key'))
4812 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
4813 driver.findElement(By.css('#bip49-tab a'))
4814 .click()
4815 // bip49 addresses are shown
4816 driver.sleep(generateDelay).then(function() {
4817 getFirstAddress(function(address) {
4818 expect(address).toBe("3QG2Y9AA4xZ846gKHZqNf7mvVKbLqMKxr2");
4819 done();
4820 });
4821 });
4822 });
4823
4824 // Pull Request 271
4825 // Allow converting mnemonic back to raw entropy value
4826 it('Converts mnemonics into raw entropy', function(done) {
4827 driver.findElement(By.css('.phrase'))
4828 .sendKeys('abandon abandon about');
4829 driver.sleep(generateDelay).then(function() {
4830 driver.findElement(By.css('.use-entropy'))
4831 .click();
4832 driver.findElement(By.css('.entropy'))
4833 .getAttribute("value")
4834 .then(function(entropy) {
4835 expect(entropy).toBe("00000001");
4836 driver.findElement(By.css('.phrase'))
4837 .getAttribute("value")
4838 .then(function(phrase) {
4839 expect(phrase).toBe("abandon abandon about");
4840 done();
4841 });
4842 });
4843 });
4844 });
4845
4846 // Pull Request 279
4847 // Added Split Phrase Card Output
4848 it('Shows split prase cards', function(done) {
4849 var originalPhrase = "ugly charge strong giant once anchor capable october thumb inject dwarf legal alley mixture shoot";
4850 var originalWords = originalPhrase.split(' ');
4851 driver.findElement(By.css('.phrase'))
4852 .sendKeys(originalPhrase);
4853 driver.sleep(generateDelay).then(function() {
4854 driver.findElement(By.css('.phraseSplit'))
4855 .getAttribute("value")
4856 .then(function(cardsStr) {
4857 var cards = cardsStr.split("\n");
4858 expect(cards.length).toBe(3);
4859 // test all 2-of-3 combos can be used to form full phrase
4860 var combos = [[0,1],[0,2],[1,2]];
4861 for (var i=0; i<combos.length; i++) {
4862 var combo = combos[i];
4863 var a = combo[0];
4864 var b = combo[1];
4865 var phrase = cards[a] + " " + cards[b];
4866 // check all original words are present
4867 for (var j=0; j<originalWords.length; j++) {
4868 var originalWord = originalWords[j];
4869 expect(phrase).toContain(originalWord);
4870 }
4871 }
4872 done();
4873 });
4874 });
4875 });
4876
4877 // It allows manually specifying the entropy type
4878 it('Allows entropy type to be manually selected', function(done) {
4879 driver.findElement(By.css('.use-entropy'))
4880 .click();
4881 // use decimal entropy
4882 driver.findElement(By.css('.entropy'))
4883 .sendKeys("91");
4884 // manually change to binary entropy
4885 driver.executeScript(function() {
4886 $(".entropy-container input[value='binary']").click();
4887 });
4888 driver.sleep(entropyFeedbackDelay).then(function() {
4889 driver.findElement(By.css('.entropy-container'))
4890 .getText()
4891 .then(function(text) {
4892 // overide 91 to be just 1
4893 var key = "Filtered Entropy";
4894 var value = "1";
4895 var reText = key + "\\s+" + value;
4896 var re = new RegExp(reText);
4897 expect(text).toMatch(re);
4898 // overide automatic decimal to binary
4899 var key = "Entropy Type";
4900 var value = "binary";
4901 var reText = key + "\\s+" + value;
4902 var re = new RegExp(reText);
4903 expect(text).toMatch(re);
4904 // overide 2 events to 1
4905 var key = "Event Count";
4906 var value = 1;
4907 var reText = key + "\\s+" + value;
4908 var re = new RegExp(reText);
4909 expect(text).toMatch(re);
4910 // overide log2(10)*2 bits to 1 bit
4911 var key = "Total Bits";
4912 var value = 1;
4913 var reText = key + "\\s+" + value;
4914 var re = new RegExp(reText);
4915 expect(text).toMatch(re);
4916 done();
4917 });
4918 });
4919 });
4920
4921 // https://github.com/iancoleman/bip39/issues/388
4922 // Make field for bip39 seed editable
4923 it('Generates addresses when seed is set', function(done) {
4924 driver.findElement(By.css('.seed'))
4925 .sendKeys("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3");
4926 driver.sleep(generateDelay).then(function() {
4927 getFirstAddress(function(address) {
4928 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
4929 done();
4930 });
4931 });
4932 });
4933
4934 // https://github.com/iancoleman/bip39/issues/169
4935 it('Generates ethereum addresses from a public key', function(done) {
4936 var pubkey = "xpub68UK3hrMEp2jLPxPASgXSiqiUsQsUWZHCeuu6NqcJLt259LMeWzwDyufXLN1QmjLeLRY5he4QfArDDLbsXiw3xN3kFcYtyDy74BY73RPhhW";
4937 driver.findElement(By.css('.root-key'))
4938 .sendKeys(pubkey);
4939 driver.findElement(By.css('#bip32-tab a'))
4940 .click()
4941 selectNetwork('ETH - Ethereum');
4942 driver.sleep(generateDelay).then(function() {
4943 getFirstAddress(function(address) {
4944 expect(address).toBe("0x1Bd54748903438C7E386b4a3fCbe16237A316a98");
4945 done();
4946 });
4947 });
4948 });
4949
4950 });