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