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