2 // cd /path/to/repo/tests
3 // jasmine spec/tests.js
9 // see https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode#Automated_testing_with_headless_mode
11 // USER SPECIFIED OPTIONS
12 var browser
= process
.env
.BROWSER
; //"firefox"; // or "chrome"
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");
21 console
.log("Using browser: " + browser
);
26 var webdriver
= require('selenium-webdriver');
27 var By
= webdriver
.By
;
28 var Key
= webdriver
.Key
;
29 var until
= webdriver
.until
;
33 var generateDelay
= 1500;
34 var feedbackDelay
= 500;
35 var entropyFeedbackDelay
= 500;
36 var bip38delay
= 15000;
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";
51 // Variables dependent on specific browser selection
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
))
64 else if (browser
== "chrome") {
65 var chrome
= require('selenium-webdriver/chrome');
66 newDriver = function() {
67 return new webdriver
.Builder()
69 .setChromeOptions(new chrome
.Options().addArguments("headless"))
76 function testNetwork(done
, params
) {
77 var phrase
= params
.phrase
|| 'abandon abandon ability';
78 driver
.findElement(By
.css('.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
);
88 if ("firstPubKey" in params
) {
89 expect(pubkey
).toBe(params
.firstPubKey
);
91 if ("firstPrivKey" in params
) {
92 expect(privkey
).toBe(params
.firstPrivKey
);
101 function getFirstRowValue(handler
, selector
) {
102 driver
.findElements(By
.css(selector
))
103 .then(function(els
) {
109 function getFirstAddress(handler
) {
110 getFirstRowValue(handler
, ".address");
113 function getFirstPublicKey(handler
) {
114 getFirstRowValue(handler
, ".pubkey");
117 function getFirstPrivateKey(handler
) {
118 getFirstRowValue(handler
, ".privkey");
121 function getFirstPath(handler
) {
122 getFirstRowValue(handler
, ".index");
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");
137 function testRowsAreInCorrectOrder(done
) {
138 driver
.findElements(By
.css('.index'))
139 .then(function(els
) {
140 var testRowAtIndex = function(i
) {
141 if (i
>= els
.length
) {
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);
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");
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
'))
177 driver.findElement(By.css('.entropy
'))
178 .sendKeys(entropyText);
179 driver.sleep(generateDelay).then(function() {
180 driver.findElement(By.css('.entropy
-container
'))
182 .then(function(text) {
183 var re = new RegExp("Entropy Type\\s+" + entropyType);
184 expect(text).toMatch(re);
190 function testEntropyBits(done, entropyText, entropyBits) {
191 driver.findElement(By.css('.use-entropy
'))
193 driver.findElement(By.css('.entropy
'))
194 .sendKeys(entropyText);
195 driver.sleep(generateDelay).then(function() {
196 driver.findElement(By.css('.entropy
-container
'))
198 .then(function(text) {
199 var re = new RegExp("Total Bits\\s+" + entropyBits);
200 expect(text).toMatch(re);
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, "\\$&");
212 driver.findElement(By.css('.use-entropy
'))
214 driver.findElement(By.css('.entropy
'))
215 .sendKeys(entropyDetail.entropy);
216 driver.sleep(entropyFeedbackDelay).then(function() {
217 driver.findElement(By.css('.entropy
-container
'))
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);
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);
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);
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);
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);
258 if ("words" in entropyDetail) {
259 var actualWords = phrase.split(/\s+/)
260 .filter(function(w) { return w.length > 0 })
262 expect(actualWords).toBe(entropyDetail.words);
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);
277 function testClientSelect(done, params) {
278 // set mnemonic and select bip32 tab
279 driver.findElement(By.css('#bip32
-tab a
'))
281 driver.findElement(By.css('.phrase
'))
282 .sendKeys("abandon abandon ability");
283 driver.sleep(generateDelay).then(function() {
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");
315 describe('BIP39 Tool Tests
', function() {
317 beforeEach(function(done) {
318 driver = newDriver();
319 driver.get(url).then(done);
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);
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('');
339 it('Should have text on the page
', function(done) {
340 driver.findElement(By.css('body
'))
342 .then(function(text) {
343 var textToFind = "You can enter an existing BIP39 mnemonic";
344 expect(text).toContain(textToFind);
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);
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);
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);
383 // Mnemonic length can be customized
384 it('Should allow custom length mnemonics
', function(done) {
386 driver.executeScript(function() {
387 $(".strength option[selected]").removeAttr("selected");
388 $(".strength option[value=6]").prop("selected", true);
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);
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");
416 // Network can be set to networks other than bitcoin
417 it('Allows selection
of bitcoin testnet
', function(done) {
419 selectText: "BTC - Bitcoin Testnet",
420 phrase: "abandon abandon ability",
421 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
422 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
423 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
425 testNetwork(done, params);
427 it('Allows selection
of bitcoin regtest
', function(done) {
429 selectText: "BTC - Bitcoin RegTest",
430 phrase: "abandon abandon ability",
431 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
432 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
433 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
435 testNetwork(done, params);
437 it('Allows selection
of litecoin
', function(done) {
439 selectText: "LTC - Litecoin",
440 phrase: "abandon abandon ability",
441 firstAddress: "LQ4XU8RX2ULPmPq9FcUHdVmPVchP9nwXdn",
442 firstPubKey: "028e27f074a8f4b85c07f944330bd59ec1b2dd7f88bb28182720cab6d2a5a5ff30",
443 firstPrivKey: "T9ShR6Z2vyEMHVgpeoif857LdMUZDKvzux3QMvD4EjpPYUV5TuEx",
445 testNetwork(done, params);
447 it('Allows selection
of litecoin testnet
', function(done) {
449 selectText: "LTCt - Litecoin Testnet",
450 phrase: "abandon abandon ability",
451 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiyg2nJKi",
452 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
453 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
455 testNetwork(done, params);
457 it('Allows selection
of ripple
', function(done) {
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",
465 testNetwork(done, params);
467 it('Allows selection
of jingtum
', function(done) {
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",
475 testNetwork(done, params);
477 it('Allows selection
of casinocoin
', function(done) {
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",
485 testNetwork(done, params);
487 it('Allows selection
of dogecoin
', function(done) {
489 selectText: "DOGE - Dogecoin",
490 phrase: "abandon abandon ability",
491 firstAddress: "DPQH2AtuzkVSG6ovjKk4jbUmZ6iXLpgbJA",
492 firstPubKey: "02d3d540cc62d5102887d26f2b129947f2bd2306dd9b76242c61ca65e5ca408899",
493 firstPrivKey: "QNv5TAoR6EodkN86FXaLDosy4Rau4sJ46JxE9NtUYtmKPLTuRmpc",
495 testNetwork(done, params);
497 it('Allows selection
of dogecoin testnet
', function(done) {
499 selectText: "DOGEt - Dogecoin Testnet",
500 phrase: "abandon abandon ability",
501 firstAddress: "niHnSJKHdwDyDxRMLBJrtNqpvHEsAFWe6B",
502 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
503 firstPrivKey: "cnCsx3G1NgXZGhijCRNupM1tts1aDNnQsr9e5jB5JnYv2yEDTwT5",
505 testNetwork(done, params);
507 it('Allows selection
of denarius
', function(done) {
509 selectText: "DNR - Denarius",
510 phrase: "abandon abandon ability",
511 firstAddress: "DFdFMVUMzU9xX88EywXvAGwjiwpxyh9vKb",
512 firstPubKey: "0285cda45afbf0b8897a5cedf97cbb1e2b63b0ac28cd1e919ea60fb748bc61e8d5",
513 firstPrivKey: "QX3Dy3b7C3vNWYDBPk8Hewp3ii2NukAopsHFCCsLZ6Ss77vzdoMj",
515 testNetwork(done, params);
517 it('Allows selection
of shadowcash
', function(done) {
519 selectText: "SDC - ShadowCash",
520 phrase: "abandon abandon ability",
521 firstAddress: "SiSZtfYAXEFvMm3XM8hmtkGDyViRwErtCG",
522 firstPubKey: "024d48659b83ff20fc250e7f111742e652aa71b73f3ff8d41b5f3ea99cb8ef9e3c",
523 firstPrivKey: "VJzJ98j5pdjzpY9DVRvU2RiRcvQ4t2oYYd9w9WUdiUJjvPs9X83v",
525 testNetwork(done, params);
527 it('Allows selection
of shadowcash testnet
', function(done) {
529 selectText: "SDC - ShadowCash Testnet",
530 phrase: "abandon abandon ability",
531 firstAddress: "tM2EDpVKaTiEg2NZg3yKg8eqjLr55BErHe",
532 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
533 firstPrivKey: "erKhxJJbpqMUuwuUwUuQxnLiNwphuEabA2sTv62QBV6syc1coTeS",
535 testNetwork(done, params);
537 it('Allows selection
of viacoin
', function(done) {
539 selectText: "VIA - Viacoin",
540 phrase: "abandon abandon ability",
541 firstAddress: "Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT",
542 firstPubKey: "0223abcae630e23afd7ce0dc399906ca00f984b3be475fbf3f3995e708b0b75392",
543 firstPrivKey: "WX5sbp26uyFDa4Bt5DgPqvQuRjrwc95DYzG7ZHXsdtooFAUhd3xV",
545 testNetwork(done, params);
547 it('Allows selection
of viacoin testnet
', function(done) {
549 selectText: "VIA - Viacoin Testnet",
550 phrase: "abandon abandon ability",
551 firstAddress: "tM2EDpVKaTiEg2NZg3yKg8eqjLr55BErHe",
552 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
553 firstPrivKey: "erKhxJJbpqMUuwuUwUuQxnLiNwphuEabA2sTv62QBV6syc1coTeS",
555 testNetwork(done, params);
557 it('Allows selection
of jumbucks
', function(done) {
559 selectText: "JBS - Jumbucks",
560 phrase: "abandon abandon ability",
561 firstAddress: "JLEXccwDXADK4RxBPkRez7mqsHVoJBEUew",
562 firstPubKey: "02e9e84c68e2247d87c863f5697676af9c0f2dacc3fe774a24188f37311b679059",
563 firstPrivKey: "SPcmbuyWp5ukQLbnDyaVr8WuPfmLUEVZN9e2r7X96i31twrn8BBQ",
565 testNetwork(done, params);
567 it('Allows selection
of clam
', function(done) {
569 selectText: "CLAM - Clams",
570 phrase: "abandon abandon ability",
571 firstAddress: "xCp4sakjVx4pUAZ6cBCtuin8Ddb6U1sk9y",
572 firstPubKey: "03f6189ef4ae7f15ead1a579201c63845cf3efc4745d6abf58aa5584163b2dd070",
573 firstPrivKey: "LoqdpeyYzFoGqQag6Ya4BkMT9KQJK1ygQFbKj3x2meaWe6Xzen15",
575 testNetwork(done, params);
577 it('Allows selection
of crown
', function(done) {
579 selectText: "CRW - Crown (Legacy)",
580 phrase: "abandon abandon ability",
581 firstAddress: "18pWSwSUAQdiwMHUfFZB1fM2xue9X1FqE5",
582 firstPubKey: "034246d561c53eb1a2afbd9df6403d6fd8a70b36016e0307eae28095a465eaa602",
583 firstPrivKey: "L2oSEFimb9QJB38eGD1xL8zKZAa1cTYGFGXMi4yJBqKmYvpjcuJs",
585 testNetwork(done, params);
587 it('Allows selection
of crown
', function(done) {
589 selectText: "CRW - Crown",
590 phrase: "abandon abandon ability",
591 firstAddress: "CRWKnVmVhvH1KWTYe6sq8xV4dFGcFpBEEkPQ",
592 firstPubKey: "034246d561c53eb1a2afbd9df6403d6fd8a70b36016e0307eae28095a465eaa602",
593 firstPrivKey: "L2oSEFimb9QJB38eGD1xL8zKZAa1cTYGFGXMi4yJBqKmYvpjcuJs",
595 testNetwork(done, params);
597 it('Allows selection
of dash
', function(done) {
599 selectText: "DASH - Dash",
600 phrase: "abandon abandon ability",
601 firstAddress: "XdbhtMuGsPSkE6bPdNTHoFSszQKmK4S5LT",
602 firstPubKey: "0270009f37337f15603103ce90111f32f44ddd87525017a93ec6170abb784be2ff",
603 firstPrivKey: "XGqEiiVo1w6Us3YN8KRthyLxdnBH1W6JpLkcxoX2w2zQMYFDKSua",
605 testNetwork(done, params);
607 it('Allows selection
of dash testnet
', function(done) {
609 selectText: "DASH - Dash Testnet",
610 phrase: "abandon abandon ability",
611 firstAddress: "yaR52EN4oojdJfBgzWJTymC4uuCLPT29Gw",
612 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
613 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
615 testNetwork(done, params);
617 it('Allows selection
of game
', function(done) {
619 selectText: "GAME - GameCredits",
620 phrase: "abandon abandon ability",
621 firstAddress: "GSMY9bAp36cMR4zyT4uGVS7GFjpdXbao5Q",
622 firstPubKey: "03d173ea00b6688f7d7c2afdcbc720b227aa8b9b87e5f7145139acaa9f0a0dc447",
623 firstPrivKey: "Raixm9wAKFjw9rnPKcXkymQ5iEdMZBRdrvjm8zLpqacS7LUeXBwZ",
625 testNetwork(done, params);
627 it('Allows selection
of komodo
', function(done) {
629 selectText: "KMD - Komodo",
630 phrase: "abandon abandon ability",
631 firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
632 firstPubKey: "03bd652582a446ce9a697e74da9429eabe6e70bbe3d300b9ef227df7430e83b6fc",
633 firstPrivKey: "UxHzU8KCfSDrQgreujv1vGrqpbvx5jrjSz7bNWjWoT7D3V4uWo4i",
635 testNetwork(done, params);
637 it('Allows selection
of namecoin
', function(done) {
639 selectText: "NMC - Namecoin",
640 phrase: "abandon abandon ability",
641 firstAddress: "Mw2vK2Bvex1yYtYF6sfbEg2YGoUc98YUD2",
642 firstPubKey: "0398066486fe87cbcb9da8e29d180b44937b6c43ad1ec4d3bddd77b7905765937e",
643 firstPrivKey: "L4A8sSkrGndiXyZdj6Fnju8Wu76s96cdHHmPxV3C5M2R2w4GVNco",
645 testNetwork(done, params);
647 it('Allows selection
of onixcoin
', function(done) {
649 selectText: "ONX - Onixcoin",
650 phrase: "abandon abandon ability",
651 firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
652 firstPubKey: "035349f2912e3290898d6e00807704254f256127e59a2930367c403b3b9ae5afbd",
653 firstPrivKey: "X8hzuyWvi2F6UQQ5MNiQo2taYwKwZvJRurTBV6smahx2ikLksLPm",
655 testNetwork(done, params);
657 it('Allows selection
of lkrcoin
', function(done) {
659 selectText: "LKR - Lkrcoin",
660 phrase: "abandon abandon ability",
661 firstAddress: "LfbT296e7AEEnn4bYDbL535Nd8P9g98CdJ",
662 firstPubKey: "03328d3800456372224ec54b033ace88bfd4c19a684204147404063839a02ab7e8",
663 firstPrivKey: "TANp1xRA3qCdRfZc8THM8HMKZivevNz8BEXmA8YxemqXj1YzHmDS",
665 testNetwork(done, params);
667 it('Allows selection
of bolivarcoin
', function(done) {
669 selectText: "BOLI - Bolivarcoin",
670 phrase: "abandon abandon ability",
671 firstAddress: "bbKzCAUR7hZ3nqfffy7VgrSz8LmAP3S5mK",
672 firstPubKey: "0328a72574c709cc183ffccb8f17c0383caf937ce67e7c3411cdf8ca2e5fc2bf8f",
673 firstPrivKey: "YYwA99QgwZu9zNJBxYbG43GzeE8kEREb7S1dpnFcBJG1W5sR1W9T",
675 testNetwork(done, params);
677 it('Allows selection
of peercoin
', function(done) {
679 selectText: "PPC - Peercoin",
680 phrase: "abandon abandon ability",
681 firstAddress: "PVAiioTaK2eDHSEo3tppT9AVdBYqxRTBAm",
682 firstPubKey: "02035b1d7f7683a03be1a6009c4572b24a3ba114afb8caff278881af77c4cba362",
683 firstPrivKey: "UCcQgeBjh7GpqukSRcXrx54Q41BJYkWY6PSdm6CtCUFYD5bS9qZS",
685 testNetwork(done, params);
687 it('Allows selection
of ethereum
', function(done) {
689 selectText: "ETH - Ethereum",
690 phrase: "abandon abandon ability",
691 firstAddress: "0xe5815d5902Ad612d49283DEdEc02100Bd44C2772",
692 firstPubKey: "0x03e723e5b3aa7d72213f01139aa4783e1b34f74e1a04534e3fd8e29bfe2768af8a",
693 firstPrivKey: "0x8f253078b73d7498302bb78c171b23ce7a8fb511987d2b2702b731638a4a15e7",
695 testNetwork(done, params);
697 it('Allows selection
of slimcoin
', function(done) {
699 selectText: "SLM - Slimcoin",
700 phrase: "abandon abandon ability",
701 firstAddress: "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww",
702 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
703 firstPrivKey: "BTPTMvgoTgsAxpoQE4VCJAq5TYMnLbX5mDodFSaF7ceq6suK13pk",
705 testNetwork(done, params);
707 it('Allows selection
of slimcoin testnet
', function(done) {
709 selectText: "SLM - Slimcoin Testnet",
710 phrase: "abandon abandon ability",
711 firstAddress: "n3nMgWufTek5QQAr6uwMhg5xbzj8xqc4Dq",
712 firstPubKey: "024557a9693da0354c5f77e57a0b2aac9c20b15cc322bec85faa2ec45438415c90",
713 firstPrivKey: "DvJeEkHzJzysYFtUdgETgWHprG63ATFWRtG2R9xfBJ6bZ2fHcJSU",
715 testNetwork(done, params);
717 it('Allows selection
of bitcoin cash
', function(done) {
719 selectText: "BCH - Bitcoin Cash",
720 phrase: "abandon abandon ability",
721 firstAddress: "bitcoincash:qzlquk7w4hkudxypl4fgv8x279r754dkvur7jpcsps",
722 firstPubKey: "02b1cbe8aba996d77d4c33fa2e3bf1f6ae80576aa587aa74d87092b1dbdf2aa067",
723 firstPrivKey: "KxbCheZjSzF48zyka4QK1ToSYmz3REZiePU6FPc99qqFs8WuHyVY",
725 testNetwork(done, params);
728 it('Allows selection
of simpleledger(SLP
)', function(done) {
730 selectText: "SLP - Simple Ledger Protocol",
731 phrase: "abandon abandon ability",
732 firstAddress: "simpleledger:qrtffz6ajfsn74gpur7y3epjquz42pvww5acewqmre",
733 firstPubKey: "03c8310ef78a379ce91ed3d7998e1f356dbcb089869f9c9d8f8571b0d8414acbdc",
734 firstPrivKey: "L2q3Bvqe6kBRSqUaJpew7pLacnWjsJdUk7hwV1bTdDu665gXHDj6",
736 testNetwork(done, params);
739 it('Allows selection
of myriadcoin
', function(done) {
741 selectText: "XMY - Myriadcoin",
742 phrase: "abandon abandon ability",
743 firstAddress: "MJEswvRR46wh9BoiVj9DzKYMBkCramhoBV",
744 firstPubKey: "037ad798b3173b0af46acddd1501ed53ce654840f29e4710c3081134b1193f811b",
745 firstPrivKey: "TMMUiQ3yqes7wjWvCro1Ghbu7eFXm8wQgX89v4Wgxm5qFZJAVEVD",
747 testNetwork(done, params);
749 it('Allows selection
of pivx
', function(done) {
751 selectText: "PIVX - PIVX",
752 phrase: "abandon abandon ability",
753 firstAddress: "DBxgT7faCuno7jmtKuu6KWCiwqsVPqh1tS",
754 firstPubKey: "022583478df6a5ac35380e7cdcd9f7ab0d43f5eb82452d4aa1f74f04c810fcde8c",
755 firstPrivKey: "YVdYDdkuTbra4EVRLWoBUCCm9WMLuXZy3ZpK6iDBCi13ttreZ4cD",
757 testNetwork(done, params);
759 it('Allows selection
of pivx testnet
', function(done) {
761 selectText: "PIVX - PIVX Testnet",
762 phrase: "abandon abandon ability",
763 firstAddress: "yB5U384n6dGkVE3by5y9VdvHHPwPg68fQj",
764 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
765 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
767 testNetwork(done, params);
769 it('Allows selection
of maza
', function(done) {
771 selectText: "MAZA - Maza",
772 phrase: "abandon abandon ability",
773 firstAddress: "MGW4Bmi2NEm4PxSjgeFwhP9vg18JHoRnfw",
774 firstPubKey: "022b9d4376588a736d43301a659ef288302472aeff6344f5d8a5bfe376733e0da8",
775 firstPrivKey: "aH9R7KaHm6D3p44zDM2Vf6vY9x7bHVdaZGkBb2rHeXAZzEKnQ66G",
777 testNetwork(done, params);
779 it('Allows selection
of FIX
', function(done) {
781 selectText: "FIX - FIX",
782 phrase: "abandon abandon ability",
783 firstAddress: "FS5MEU8fs5dUvsaSCSusV8RQtC8j2h3JEh",
784 firstPubKey: "026003e9a2bc6b9bd18bd7f8826cebbfd4d0554995141920eda2cb723ae53337ee",
785 firstPrivKey: "9uFsoZFuCUCMRF93aNKsLvYTX8jwYoKPbgENtdYURH1GCJvDNkps",
787 testNetwork(done, params);
789 it('Allows selection
of FIX testnet
', function(done) {
791 selectText: "FIX - FIX Testnet",
792 phrase: "abandon abandon ability",
793 firstAddress: "XpnU1HHdNG5YxvG9Rez4wjmidchxqnZaNa",
794 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
795 firstPrivKey: "cBtMfPpQg4s1Ndfez7oLdedwu8CxshhWE5f7qunhLsY4ueNvKKyM",
797 testNetwork(done, params);
799 it('Allows selection
of fujicoin
', function(done) {
801 selectText: "FJC - Fujicoin",
802 phrase: "abandon abandon ability",
803 firstAddress: "FgiaLpG7C99DyR4WnPxXedRVHXSfKzUDhF",
804 firstPubKey: "022b41c7ecbae94c0c926dda9304ccf6e6b22f6f6879e2fc52823b154d118a290e",
805 firstPrivKey: "RMFbyVXUF5Ndji4H75jXrnXi9KH6QFKgA6zDfuisa57BrHCN8MSG",
807 testNetwork(done, params);
809 it('Allows selection
of nubits
', function(done) {
811 selectText: "USNBT - NuBits",
812 phrase: "abandon abandon ability",
813 firstAddress: "BLxkabXuZSJSdesLD7KxZdqovd4YwyBTU6",
814 firstPubKey: "03a37da71e839af0e3fc7cef0f3a82fbff64e372eb7fd067dc452d13b7b269e858",
815 firstPrivKey: "PJ9vZVjQWXNQDbfZbmFiDTcUGpJHiWc923LcX7oKSYHuLRvWhdJ3",
817 testNetwork(done, params);
819 it('Allows selection
of bitcoin gold
', function(done) {
821 selectText: "BTG - Bitcoin Gold",
822 phrase: "abandon abandon ability",
823 firstAddress: "GdDqug4WUsn5syNbSTHatNn4XnuwZtzedx",
824 firstPubKey: "02e48e4053db573bb74fb67a47c91443ec7c0ed5f3f25aa8a408bad798f0230086",
825 firstPrivKey: "KwxCxhXq72JzuDNEj2VzzjKr1XU4tvpuksdEKBhngFuSEK8XWCBa",
827 testNetwork(done, params);
829 it('Allows selection
of monacoin
', function(done) {
831 selectText: "MONA - Monacoin",
832 phrase: "abandon abandon ability",
833 firstAddress: "MKMiMr7MyjDKjJbCBzgF6u4ByqTS4NkRB1",
834 firstPubKey: "020b104320aaeb1ec921874e96cafd5add3c0de8d785cd01dc93e5f2b31fa352f4",
835 firstPrivKey: "T45jYrkbSutUvNF1cytpmbvyLR7qWWEXg5r7udj4mqrauzEsxHAG",
837 testNetwork(done, params);
839 it('Allows selection
of AXE
', function(done) {
841 selectText: "AXE - Axe",
842 phrase: "abandon abandon ability",
843 firstAddress: "PScwtLUyPiGrqtKXrHF37DGETLXLZdw4up",
844 firstPubKey: "0288ea360af543ff72c79560f9f0ed8ed5386681fc3cc5edc84921c1118d989bce",
845 firstPrivKey: "XJKs1GN3sABamT6daKdRSjBgE2XPrnwBurWyBSVJht6zv5kS2dZd",
847 testNetwork(done, params);
849 it('Allows selection
of BlackCoin
', function(done) {
851 selectText: "BLK - BlackCoin",
852 phrase: "abandon abandon ability",
853 firstAddress: "B5MznAKwj7uQ42vDz3w4onhBXPcqhTwJ9z",
854 firstPubKey: "03f500b73bad9955fbe26a27bbeefa4ec00119532449eeccfb1f021cafa638d046",
855 firstPrivKey: "Piyy1AGXZ9wRJdiUMPm97WAmN1DHvSxtjCpkYrtX2qyvc4huUxe9",
857 testNetwork(done, params);
859 it('Allows selection
of Neblio
', function(done) {
861 selectText: "NEBL - Neblio",
862 phrase: "abandon abandon ability",
863 firstAddress: "NefkeEEvhusbHMmTRrxx7H9wFnUXd8qQsE",
864 firstPubKey: "0274d827c4aef5b009e0c5ddd3c852a9a0bd91cb37cfb72a5f07d570e4ce7e1569",
865 firstPrivKey: "TpEwnrinfiH7AMDJLvFzNoW1duU2rg7hox6tgF4wMmcnQSmNmQZM",
867 testNetwork(done, params);
869 it('Allows selection
of Beetlecoin
', function(done) {
871 selectText: "BEET - Beetlecoin",
872 phrase: "abandon abandon ability",
873 firstAddress: "BVmtbEsGrjpknprmpHFq26z4kYHJUFHE71",
874 firstPubKey: "03e8e78daa2d96e390b55426d6b4cad887bdc028a394847308ad4910d00875b04c",
875 firstPrivKey: "Pkb5yU9mK1CzSQuYKm6CYmaJxDEiycipm426F3EhYtHPJdBJxViG",
877 testNetwork(done, params);
879 it('Allows selection
of Adcoin
', function(done) {
881 selectText: "ACC - Adcoin",
882 phrase: "abandon abandon ability",
883 firstAddress: "AcEDM6V5sF4kFHC76MJjjfProtS5Sw2qcd",
884 firstPubKey: "026625ec7d1b747bd361a57c593fd8384fcdc65696aed5b72f64e73dbf2b24e854",
885 firstPrivKey: "T4B9YVUonpM7tQQEkqv4QjMxWJqxyqcJt78H7XqsRXRvuvd2XGog",
887 testNetwork(done, params);
889 it('Allows selection
of Asiacoin
', function(done) {
891 selectText: "AC - Asiacoin",
892 phrase: "abandon abandon ability",
893 firstAddress: "ALupuEEz7kJjQTAvmtcBMBVuEjPa7GqZzE",
894 firstPubKey: "0338b40a58e69c087f5092223555c1ce48988e5b2b6bb15f42d881109aa1499d39",
895 firstPrivKey: "PNRyYtznRQBbD3GNCt86uHdWEHyeFr7ZszqckXCt7ZXEcRF29Z4X",
897 testNetwork(done, params);
899 it('Allows selection
of Aryacoin
', function(done) {
901 selectText: "ARYA - Aryacoin",
902 phrase: "abandon abandon ability",
903 firstAddress: "Abr6gX25KaU9BpwD34UfsL3A4n89NvYYSf",
904 firstPubKey: "03973c0669f332a69e8f0661ffddc7fd86dd7fdb768a40608fcbf0efceebf900e0",
905 firstPrivKey: "PNukdY6bBGJhFDnJGeRFrJ5ptj3WD1xZHbPv8ubjMknFz2L6sZFi",
907 testNetwork(done, params);
909 it('Allows selection
of Auroracoin
', function(done) {
911 selectText: "AUR - Auroracoin",
912 phrase: "abandon abandon ability",
913 firstAddress: "ANuraS6F4Jpi413FEnavjYkKYJJRHkgYCm",
914 firstPubKey: "03f843b9258aa001f24ebe3a77b6746a20ffda9f60934da8ed44f83d081977fe4b",
915 firstPrivKey: "PQyDA9ewjeMNvNy6ZaUEWVwTNHFPp2J3F131msPx4XFNgMuKMaXF",
917 testNetwork(done, params);
919 it('Allows selection
of Bata
', function(done) {
921 selectText: "BTA - Bata",
922 phrase: "abandon abandon ability",
923 firstAddress: "BGxBdNeYPtF3GCuTtZBPQdFxCkdBYSF3fj",
924 firstPubKey: "033f35cba191c80f5246113ef33cd8a1e2449d304ad25afbd25e86aff333f07472",
925 firstPrivKey: "RKbjo1gnyFsuEimVGGybBfbvcp6fCCY35D9SY38xLAwrSrQ3B5v9",
927 testNetwork(done, params);
929 it('Allows selection
of Belacoin
', function(done) {
931 selectText: "BELA - Belacoin",
932 phrase: "abandon abandon ability",
933 firstAddress: "BEeetqpNffdzeknSpNmQp5KAFh2KK1Qx7S",
934 firstPubKey: "039d895165f9c8218c12499820b783d920b632b49b0ca70b9352171b2f4273bf0b",
935 firstPrivKey: "PeicG333UdMZ1t5PoHCt2Yepc7X15wHPawvsusWWspKCw99Dfqmx",
937 testNetwork(done, params);
939 it('Allows selection
of Bitcoin Atom
', function(done) {
941 selectText: "BCA - Bitcoin Atom",
942 phrase: "abandon abandon ability",
943 firstAddress: "AMy6qMbJeC4zsGRL6iWszmeCdQH65fgfih",
944 firstPubKey: "02efe1e4f85342c8c57c4d6e6f48758f7be4e059d61586f769e33dd5bf0aa78a04",
945 firstPrivKey: "Ky4hiMBLXZEj3TFknsuvceh16ttBfw9U7ReMgGWBtoYg1LPuxxUq",
947 testNetwork(done, params);
949 it('Allows selection
of Bitcoinplus
', function(done) {
951 selectText: "XBC - Bitcoinplus",
952 phrase: "abandon abandon ability",
953 firstAddress: "B7FSynZoDbEwTCSgsXq9nJ5ue8owYLVL8r",
954 firstPubKey: "03ca81fbc766f6a38c7d122facd68c87ceeb57a0ee7d58927132a77704dfe88f92",
955 firstPrivKey: "Pjjssfh7oJnFZfcxxooUvUqqxtb35oiurrDm3rEHCGpyCW1tPEG2",
957 testNetwork(done, params);
959 it('Allows selection
of Bitcoin Private
', function(done) {
961 selectText: "BTCP - Bitcoin Private",
962 phrase: "abandon abandon ability",
963 firstAddress: "b1M3PbiXXyN6Hdivdw5rJv5VKpLjPzhm4jM",
964 firstPubKey: "03b4dae910c8563ae77e4c665022f8afbf8bcc659ce3bc790a74956e5ebba932af",
965 firstPrivKey: "L5U3Rfy7otN5JQP9iveYkT1pB9va71uebx7VE8reBbiAofKCiCxk",
967 testNetwork(done, params);
969 it('Allows selection
of Bitcoin SV
', function(done) {
971 selectText: "BSV - BitcoinSV",
972 phrase: "abandon abandon ability",
973 firstAddress: "1N4mgtE5yxifch9jWs7Sds6oVqxdy2t576",
974 firstPubKey: "0280bbf3fd6f1c7ab4b04cca0ab6e23487fafa9c5edea3d1882d8e967111ee8b38",
975 firstPrivKey: "L3oBCYKNpT6uc5qeYGN9NFNyvQsTUGBV7v2cqeB76GfWzuGJDYeY",
977 testNetwork(done, params);
979 it('Allows selection
of Bitcoinz
', function(done) {
981 selectText: "BTCZ - Bitcoinz",
982 phrase: "abandon abandon ability",
983 firstAddress: "t1X2YQoxs8cYRo2oaBYgVEwW5QNjCC59NYc",
984 firstPubKey: "033eb18e80984fa3fbaeee1096977d6b169399123641dc97ceba00910c8ad211d4",
985 firstPrivKey: "L1qcDeAXPxMSgnXvquJo5Dd4myFxxxrWNgi99Ns26GPNyRW7eVuZ",
987 testNetwork(done, params);
989 it('Allows selection
of BitCloud
', function(done) {
991 selectText: "BTDX - BitCloud",
992 phrase: "abandon abandon ability",
993 firstAddress: "BHbWitXCNgTf1BhsRDNMP186EeibuzmrBi",
994 firstPubKey: "032ca47d6a35bd01ba3832791bcb0ee5676b1a63a491b42c39a4b214d78bf64fd3",
995 firstPrivKey: "PgTZBt9exdzZSWfhdwXKVmz5WBFjAJFjNLa9552FCx1X6mnztNSL",
997 testNetwork(done, params);
999 it('Allows selection
of Bitcore
', function(done) {
1001 selectText: "BTX - Bitcore",
1002 phrase: "abandon abandon ability",
1003 firstAddress: "2Rgp5Znhpy34TK4QmPkfCiYs9r4KovfTH9",
1004 firstPubKey: "02caa73ee839b074c8d353f6869222bafd8ce5ad3bcb1c0bd404d108390b2a6438",
1005 firstPrivKey: "L4286qDXUJfVq4ebbHHUVDoFpEudJj81FUWkjwNeQ132gFCDGUBj",
1007 testNetwork(done, params);
1009 it('Allows selection
of Bitsend
', function(done) {
1011 selectText: "BSD - Bitsend",
1012 phrase: "abandon abandon ability",
1013 firstAddress: "iBPk7LYjDun3EPk7CRR8UUmnPoceVc1bp2",
1014 firstPubKey: "03e6b12ed885225302fc126980e42abfee1c3350b77b61b01abcf200b5e9a9fee5",
1015 firstPrivKey: "XCTxjfV68KfXKySGJyZTYvYMBDFKSPJu41W3SN1bRpJch5R498mC",
1017 testNetwork(done, params);
1019 it('Allows selection
of Britcoin
', function(done) {
1021 selectText: "BRIT - Britcoin",
1022 phrase: "abandon abandon ability",
1023 firstAddress: "B6Aue4J2XLs1f1dtD4H1SHYFfh4XrmEbrw",
1024 firstPubKey: "035dee3aad6f635aeffe61a28e82a58271b984d20cc3766f63d9acb29ecee91d3f",
1025 firstPrivKey: "PdyPdAngoD42Pe5qCd2en6nS1j4rqVyH6cFGkCDEu2nEMt8DHsoz",
1027 testNetwork(done, params);
1029 it('Allows selection
of Canadaecoin
', function(done) {
1031 selectText: "CDN - Canadaecoin",
1032 phrase: "abandon abandon ability",
1033 firstAddress: "CanAyCfd5Rj2CQVfaoAmvDUZunPM5W1AEQ",
1034 firstPubKey: "03124e22733a75beba1e4f2635d08e034772bf6cbe8102404226a9402e135ff7f6",
1035 firstPrivKey: "QCEMYNRcKqGgYXhxDNZfrF9m8sqd28NujXpjDNuN7r525rrXPnLm",
1037 testNetwork(done, params);
1039 it('Allows selection
of Cannacoin
', function(done) {
1041 selectText: "CCN - Cannacoin",
1042 phrase: "abandon abandon ability",
1043 firstAddress: "CYjW8xWB43g6krLJTmmrPk1PonoQX7h9Qd",
1044 firstPubKey: "03bd05a584f418aa8d65a05c7bcc301eb552f67aa380f15e4b29c0b8eec698b443",
1045 firstPrivKey: "QAM1aUWMGEDdcDsgaPQKXcMe8Z3vEfDaPSds3wTFz8USQ3yht7Kk",
1047 testNetwork(done, params);
1049 it('Allows selection
of Clubcoin
', function(done) {
1051 selectText: "CLUB - Clubcoin",
1052 phrase: "abandon abandon ability",
1053 firstAddress: "CHMDEXN4sihpSVX4GyAa2hZ62shnby7uyN",
1054 firstPubKey: "0356187f1336ac2e340145478f02024ce1c318e3648cbba38262afbde7f2dc0055",
1055 firstPrivKey: "PeJx6v8h1N6GvTj7VkK7vWqjdWJb4QXzfrDgJjFao8bkpRrDiymm",
1057 testNetwork(done, params);
1059 it('Allows selection
of Compcoin
', function(done) {
1061 selectText: "CMP - Compcoin",
1062 phrase: "abandon abandon ability",
1063 firstAddress: "CLshtw3zhxkseBJS46UF12v3AFy9Dx7JVv",
1064 firstPubKey: "027d1b4f1798882b8978eb3ab0e8b503aa1fb4cf058e0086cf25326fb6a8751aae",
1065 firstPrivKey: "QDq6KKEdmrzHbZHmgzsGcweUFwYA7mVvvfeAKsPSxfxHNv73ETr7",
1067 testNetwork(done, params);
1069 it('Allows selection
of CPUchain
', function(done) {
1071 selectText: "CPU - CPUchain",
1072 phrase: "abandon abandon ability",
1073 firstAddress: "CWSpLpW7jS4mBHJnkz3mmL5s3yQMg93zK8",
1074 firstPubKey: "0390845eef5c5993069211f94d9f3990c27c380700bb92ae629d2a5afae1c08806",
1075 firstPrivKey: "L378gxzvUEX9JUFnfXBik2H4gV7XM4dzXWKM9rvR8UZr2rBphL1t",
1077 testNetwork(done, params);
1079 it('Allows selection
of Crave
', function(done) {
1081 selectText: "CRAVE - Crave",
1082 phrase: "abandon abandon ability",
1083 firstAddress: "VCYJeti6uKMNBFKCL7eP96UwuFWYHM7c85",
1084 firstPubKey: "02c8938f30cc46013706586753d6dca3e4ac6b7d6924dfc35d444c3605f35da4c7",
1085 firstPrivKey: "PjRdEuhRZ6rufXAdU6amoaPDRZamWmxN46qbmSPyqUKsJzChCjZT",
1087 testNetwork(done, params);
1089 it('Allows selection
of Defcoin
', function(done) {
1091 selectText: "DFC - Defcoin",
1092 phrase: "abandon abandon ability",
1093 firstAddress: "D8swcgyaaFUrXZU3ATwbgy16buCpWqbG1M",
1094 firstPubKey: "02d02cc83ddfaa5aed4fb9b611b504cccbfa8397485411f16816fc28dccb51e609",
1095 firstPrivKey: "QSRhMr1B4tt7DEcgxji6NrEfS51wQ6GypfMkqgNDHuWVKo2RzTac",
1097 testNetwork(done, params);
1099 it('Allows selection
of Diamond
', function(done) {
1101 selectText: "DMD - Diamond",
1102 phrase: "abandon abandon ability",
1103 firstAddress: "dJnrVbLL9UPjdaVRz2C8VpqHZknqAqjLek",
1104 firstPubKey: "03750645ffc120a0ffda07f01b0cc0d321bccf02eaedc98907672d78f2b2ef20d6",
1105 firstPrivKey: "ZKnjDNkhgCwRs8KV5Mf33k1USiiiP8AuXKM2xR4zhd3PAhtVmkEg",
1107 testNetwork(done, params);
1109 it('Allows selection
of Digibyte
', function(done) {
1111 selectText: "DGB - Digibyte",
1112 phrase: "abandon abandon ability",
1113 firstAddress: "D85Rp9jwLtMdmP6wGjTiqHBdVQLST3YCEq",
1114 firstPubKey: "02f86cc0afd113956e995fb9cbe33b68e59e9175c0c89419efc4031f2e3c128288",
1115 firstPrivKey: "L1w9pD4XodykLEJxiK1R9SVELpftD9x1QtGjHEb1nWviAvYVZbwv",
1117 testNetwork(done, params);
1119 it('Allows selection
of Digitalcoin
', function(done) {
1121 selectText: "DGC - Digitalcoin",
1122 phrase: "abandon abandon ability",
1123 firstAddress: "DKw4UGKEAZWweDNEbBFNQx4EM8x1mpUdia",
1124 firstPubKey: "02148710e3f09fa9e108bd90a3d53e0eeea9b6ee929c4668a7d64732e3fc839ff7",
1125 firstPrivKey: "QVBstKEkSbT4M9aDbBTkqJkpLCaGjL5zYSiiufHwMxGCn2dunbYL",
1127 testNetwork(done, params);
1129 it('Allows selection
of Ecoin
', function(done) {
1131 selectText: "ECN - Ecoin",
1132 phrase: "abandon abandon ability",
1133 firstAddress: "e6WFPLG5gcXyF7cESFteH1hE2XSmowW5yB",
1134 firstPubKey: "03a74536710cba6aa02b543f1ac4a76d241b47a96e38cfd002eb975cdef4b9ec19",
1135 firstPrivKey: "ZZPUTdAqpJ3s6S6xe2RpZD3jyEqwGk5MRkJHSpar1rESp4BFEqLV",
1137 testNetwork(done, params);
1139 it('Allows selection
of Edrcoin
', function(done) {
1141 selectText: "EDRC - Edrcoin",
1142 phrase: "abandon abandon ability",
1143 firstAddress: "eh1nUJsvgKPFv6ebMBfcwJ299GMCpjeZUG",
1144 firstPubKey: "02b541bdd9ff6ffc03ec4749dbe1a8a4ac8b02dc528758acac43eb1f38b5f48f27",
1145 firstPrivKey: "ZjZir6LUrg6A8WqcCeCeM249TGCxJcgGkEL6VefJJV1mGsGb7MEb",
1147 testNetwork(done, params);
1149 it('Allows selection
of Egulden
', function(done) {
1151 selectText: "EFL - Egulden",
1152 phrase: "abandon abandon ability",
1153 firstAddress: "Lg66yt55R7edRM58cDhKzXik2kFme3viX7",
1154 firstPubKey: "02d8d54be535836e70b9feed7a2502c026d714894342746f15d21c6bc80e1f97e4",
1155 firstPrivKey: "T7NPtpaVXs7SBfsCzp3ooadkctNqcZW6HpNHeT3U8EAXc6NtDJ4c",
1157 testNetwork(done, params);
1159 it('Allows selection
of Einsteinium
', function(done) {
1161 selectText: "EMC2 - Einsteinium",
1162 phrase: "abandon abandon ability",
1163 firstAddress: "EVAABm9hXKHk2MpVMbwNakRubFnNha5m8m",
1164 firstPubKey: "02826e69c802fbf71ca8e7daf9fdac2e371b86847b5397422997785cefb973269b",
1165 firstPrivKey: "QwySA5DiFKbvMcm7H3xXfsDUdq1Q5RPYjBAcLjZKkESxmJMXBvL2",
1167 testNetwork(done, params);
1169 it('Allows selection
of EOSIO
', function(done) {
1171 selectText: "EOS - EOSIO",
1172 phrase: "abandon abandon ability",
1173 firstPubKey: "EOS692VJTBK3Rmw93onNnpnZ8ZtmE9PdxjDStArvbyzoe11QUTNoy",
1174 firstPrivKey: "5Jef4qXr3nF8cjudHNQBaComNB653dnQX4pWec32xXRVThBLiCM",
1176 testNetwork(done, params);
1178 it('Allows selection
of Europecoin
', function(done) {
1180 selectText: "ERC - Europecoin",
1181 phrase: "abandon abandon ability",
1182 firstAddress: "ESA2YwPYntAoaPrE8Fm5qkKRtkcwLcwD6R",
1183 firstPubKey: "038f16d567cdefac2813b64d465f5cd8d6d59df9dfe4d16302a19b5e0b7179d685",
1184 firstPrivKey: "RzXndDAzJ4Wft6HXkpopV7vRnRBeVw2o6dKp44FYQgriYWngseBu",
1186 testNetwork(done, params);
1188 it('Allows selection
of Exclusivecoin
', function(done) {
1190 selectText: "EXCL - Exclusivecoin",
1191 phrase: "abandon abandon ability",
1192 firstAddress: "EbUa6m8UZW6nTxsYZD2FsDjkadKbp5M6JT",
1193 firstPubKey: "0291a6b82197e13aa2fd65bd1f2a6e905a9a2baaa36dfb5da10690022f7f9e998d",
1194 firstPrivKey: "Qu6pr1srXmEFzWSa4Ry1sjV6qDj4TEf4q2CxHBSRByiSBLsm967z",
1196 testNetwork(done, params);
1198 it('Allows selection
of Feathercoin
', function(done) {
1200 selectText: "FTC - Feathercoin",
1201 phrase: "abandon abandon ability",
1202 firstAddress: "6gDdjAMoSgQaW8UhqK3oboHs6ftGAroKkM",
1203 firstPubKey: "02e9f5c37fba2b6457f3c59de5bf5be2efe524751a682a47765825cb9d82d339f3",
1204 firstPrivKey: "N5487NUGCd1JnWzZzhjX1uu6SNGnpQKjeWuK6Y1NzNHjGaLysCdi",
1206 testNetwork(done, params);
1208 it('Allows selection
of FIO
', function(done) {
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",
1215 testNetwork(done, params);
1217 it('Allows selection
of Firstcoin
', function(done) {
1219 selectText: "FRST - Firstcoin",
1220 phrase: "abandon abandon ability",
1221 firstAddress: "FJN9GzfMm7Q8R4DJwK1H9F6A1GTghvFiMJ",
1222 firstPubKey: "029300108c006d1dc75847fece915138747b7bc17b515eae7458da98d2f14d7178",
1223 firstPrivKey: "RDxAN3n3k2dEZ4Ln3bbozzZ3Jgg7CQdgzYDCURmPghKQdzctX7ck",
1225 testNetwork(done, params);
1227 it('Allows selection
of Flashcoin
', function(done) {
1229 selectText: "FLASH - Flashcoin",
1230 phrase: "abandon abandon ability",
1231 firstAddress: "UWfpf5LfMmLxZYooEb2EyvWhZ8NG7EZDRt",
1232 firstPubKey: "032d55eae8073e75f02e9674b0ac3f69190ad359ad37ee4c4c11d12bcfee13d439",
1233 firstPrivKey: "W6pedhBW35Twq8ZmgTQi7sHx6wczQanSk2FUpcFWtgEW29jowsvi",
1235 testNetwork(done, params);
1237 it('Allows selection
of GCRCoin
', function(done) {
1239 selectText: "GCR - GCRCoin",
1240 phrase: "abandon abandon ability",
1241 firstAddress: "GJjF5cLwyXLacpuvXAVksxGxKvHDjx58d6",
1242 firstPubKey: "0356187f1336ac2e340145478f02024ce1c318e3648cbba38262afbde7f2dc0055",
1243 firstPrivKey: "Pntag5VbBX1Qtyjt3pi1igwDswWEtpoiqHqosBbgHcMU6m2e7t9J",
1245 testNetwork(done, params);
1247 it('Allows selection
of Gobyte
', function(done) {
1249 selectText: "GBX - Gobyte",
1250 phrase: "abandon abandon ability",
1251 firstAddress: "GS813Ys2brkmvSUw1rUqGPm2HqQVDHJRyA",
1252 firstPubKey: "036f84f44e4c8bffe039c2d9da087b006ebbfcdcf24b32a6434b2fad708ef00ae0",
1253 firstPrivKey: "WLiSrhfqRwgNmw7rhGHFoXLEuNGXxQYuKb9PK84AZmTfiHN9dz22",
1255 testNetwork(done, params);
1257 it('Allows selection
of Gridcoin
', function(done) {
1259 selectText: "GRC - Gridcoin",
1260 phrase: "abandon abandon ability",
1261 firstAddress: "SGrWbBPvobgqKRF8td1Kdc9vbRY7MJ78Y9",
1262 firstPubKey: "0377436f8c4c4d96d5ddfe6875abeb589deec595331b9a915b7e8d81a4134926ce",
1263 firstPrivKey: "V7h5EhRuWGM8uqAouxHr9uNt8ZLCQ7kmpA27tvKDbUE3zBarH81n",
1265 testNetwork(done, params);
1267 it('Allows selection
of Gulden
', function(done) {
1269 selectText: "NLG - Gulden",
1270 phrase: "abandon abandon ability",
1271 firstAddress: "GcDP7cNEc33MPPdTFNJ8pZc6VMZJ2CbKxY",
1272 firstPubKey: "03ff51002146450eb68f294dbe34f3e208f8694b51079f81e3f7dbd403cc10df41",
1273 firstPrivKey: "Fc6gU4tscBk3pybMWU1ajS1tLvNerXC24hQJ1F944QqdgSSrr3XW",
1275 testNetwork(done, params);
1277 it('Allows selection
of Helleniccoin
', function(done) {
1279 selectText: "HNC - Helleniccoin",
1280 phrase: "abandon abandon ability",
1281 firstAddress: "LbHEKe5H72zp9G1fuWNiiNePTUfJb88915",
1282 firstPubKey: "02e602000d65b969ac27172297ee907684bfc606f457ef0bad62c229edb17d5cb2",
1283 firstPrivKey: "T6JEq9jKLvztjhg4tJMezy1L4NjnMfLDZJe1egVzPBU3Q5XPBFrz",
1285 testNetwork(done, params);
1287 it('Allows selection
of Hempcoin
', function(done) {
1289 selectText: "THC - Hempcoin",
1290 phrase: "abandon abandon ability",
1291 firstAddress: "H8sdWbZyJV4gyXyHtLXDaNnAuUDhK5mfTV",
1292 firstPubKey: "02e40aaa6bf20e32d9f5976f57e9bf7a8f75db36b96a9033c20b681c9d9454b617",
1293 firstPrivKey: "Ry5Dg2yR32uhbrPLdNmsK1TRbZ1bHLvFp7kcPgeMzVPN6ycu9Jj5",
1295 testNetwork(done, params);
1297 it('Allows selection
of Insane
', function(done) {
1299 selectText: "INSN - Insane",
1300 phrase: "abandon abandon ability",
1301 firstAddress: "iMPqEJMiXWuxC9U2NVinCCMr4t72h58EWx",
1302 firstPubKey: "036ec4cf4b92300f12ff824b1eca775b27b1a728f6b57c6354ce791fd8ea0f3497",
1303 firstPrivKey: "9HA4X5kXWKxLjybjko8Z5wDo19UUJKroRrZ1BuKCtsfcfNB48K61",
1305 testNetwork(done, params);
1307 it('Allows selection
of Iop
', function(done) {
1309 selectText: "IOP - Iop",
1310 phrase: "abandon abandon ability",
1311 firstAddress: "pGKQmcaPf95Ur5o6oHK4qdiZ52p1yaTvq1",
1312 firstPubKey: "02bbaa07f154d04b04dec0978a1655952e1a09a3c0e7798085902273965d93c2f6",
1313 firstPrivKey: "8MDnKDhVSp84AqzYN5g18MhMvHk3UMYnP51EVjidSas1pT62Sdpc",
1315 testNetwork(done, params);
1317 it('Allows selection
of Ixcoin
', function(done) {
1319 selectText: "IXC - Ixcoin",
1320 phrase: "abandon abandon ability",
1321 firstAddress: "xgE9bTZ6YypT3E6ByzkTt31Hq68E9BqywH",
1322 firstPubKey: "0257766cea209cf52ba08776b6dfa263a4759e1e148f25d0cab3a91a60b6a52062",
1323 firstPrivKey: "KxdDep6zGCWoRt6arat5DVR5s6a8vmZtuekwHafEwRc7VGxfeD4Y",
1325 testNetwork(done, params);
1327 it('Allows selection
of Kobocoin
', function(done) {
1329 selectText: "KOBO - Kobocoin",
1330 phrase: "abandon abandon ability",
1331 firstAddress: "FTVoNJETXDAM8x7MnmdE8RwWndSr9PQWhy",
1332 firstPubKey: "0225753a5e232b384dce73b58d25fb90172faaf4c83a8850189abd8cae86495601",
1333 firstPrivKey: "R7u1uvHmVGkGqjURaNoppFjPNBzPYt37QwttrJc6F2K1WRm1zKoQ",
1335 testNetwork(done, params);
1337 it('Allows selection
of Landcoin
', function(done) {
1339 selectText: "LDCN - Landcoin",
1340 phrase: "abandon abandon ability",
1341 firstAddress: "LLvLwNjG1aJcn1RS4W4GJUbv8fNaRATG7c",
1342 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1343 firstPrivKey: "T8rHy2tA1yykFgCpr6KrgcrhqbevpxG923qSZbJHALYGwy3M3qAw",
1345 testNetwork(done, params);
1347 it('Allows selection
of Library Credits
', function(done) {
1349 selectText: "LBC - Library Credits",
1350 phrase: "abandon abandon ability",
1351 firstAddress: "bQJEQrHDJyHdqycB32uysh1SWn8Ln8LMdg",
1352 firstPubKey: "02abd5018c033f59f49f28ee76d93c41323890928e25c171ccc7c61ed753cde8ad",
1353 firstPrivKey: "5CWjkFs7be8vPa3CZEodPDsMDSbvyT9gAC1n1w83znRz4poNK5nZ",
1355 testNetwork(done, params);
1357 it('Allows selection
of Linx
', function(done) {
1359 selectText: "LINX - Linx",
1360 phrase: "abandon abandon ability",
1361 firstAddress: "XGWQ3cb3LGUB3VnHmj6xYSMgnokNbf6dyk",
1362 firstPubKey: "0232edeec8e3e021b53982a01943dea4398e9cc4b177c5483cf0e7774be41ea094",
1363 firstPrivKey: "X8YJFxPPmwyCBQ7Rp5bqn3V8U9rsaba5Tftsh3j8qZX9hjTTURgL",
1365 testNetwork(done, params);
1367 it('Allows selection
of Litecoincash
', function(done) {
1369 selectText: "LCC - Litecoincash",
1370 phrase: "abandon abandon ability",
1371 firstAddress: "Ce5n7fjUuQPLutJ4W5nCCfQLKdKLE1mv9A",
1372 firstPubKey: "033af2daadddcc976ea61023783b350f9b1ac45a056dba2d3b8c6ceec9d5817a8d",
1373 firstPrivKey: "T6qztYVwa6onx5HjCB3XZcCtegpUjVKtocRCQ8daWj2b8tbrDZqp",
1375 testNetwork(done, params);
1377 it('Allows selection
of Lynx
', function(done) {
1379 selectText: "LYNX - Lynx",
1380 phrase: "abandon abandon ability",
1381 firstAddress: "KUeY3ZdZkg96p4W98pj1JjygCFU1XqWdw3",
1382 firstPubKey: "0340435307cc0831d85adb70ceb518297cdebee8f25574d8eca0ff94e35fa759da",
1383 firstPrivKey: "SdwVFsLjH2wbWziEZTLPQ2iCBrt9vXHWr7X333RbFZG7hZg88u5V",
1385 testNetwork(done, params);
1387 it('Allows selection
of Megacoin
', function(done) {
1389 selectText: "MEC - Megacoin",
1390 phrase: "abandon abandon ability",
1391 firstAddress: "MDfAj9CzkC1HpcUiVGnHp8yKTa7WXgu8AY",
1392 firstPubKey: "02e560b00165c939ba08f5096201794a32e6de66216cdc5763472abf09a5e62380",
1393 firstPrivKey: "TSw7if5qV6HzW2hKhPjVvQBVUXt5aD17mM34PkueLrHQiXwMwcp4",
1395 testNetwork(done, params);
1397 it('Allows selection
of Minexcoin
', function(done) {
1399 selectText: "MNX - Minexcoin",
1400 phrase: "abandon abandon ability",
1401 firstAddress: "XC1VnyJVfiMDwWgFtAHDp41cgY3AHk3dJT",
1402 firstPubKey: "0232a31bee17b806941c419cea385d427f0d6c6fbd564fb2f366faa008aa15822c",
1403 firstPrivKey: "KzouDFGCydewfP2pGdGv62vwP7KBtaaSgBW28B94YuksV5y8jGyE",
1405 testNetwork(done, params);
1407 it('Allows selection
of Navcoin
', function(done) {
1409 selectText: "NAV - Navcoin",
1410 phrase: "abandon abandon ability",
1411 firstAddress: "NTQVTPK3NWSQLKoffkiQw99T8PifkF1Y2U",
1412 firstPubKey: "0345105cc449c627cfee118bcd7804465669e6b32e751a61e39737f5693f56d5f4",
1413 firstPrivKey: "PKXWZeQCqutM4vawyuNAHuAAkfEuWLVhwtszCRuWTecyJ92EMEE2",
1415 testNetwork(done, params);
1417 it('Allows selection
of Nebulas
', function(done) {
1419 selectText: "NAS - Nebulas",
1420 phrase: "abandon abandon ability",
1421 firstAddress: "n1PbK61DGBfDoDusLw621G6sVSMfLLHdfnm",
1422 firstPubKey: "3a3ffb88114f54ed7525c987a3124dc5eefc221806bc049e1e08371cca5fbebea38c2ce791ee32912c1f7799fad99db91f6a3724def5e715b4ff64bc06fe4537",
1423 firstPrivKey: "78d2df373c54efe1bfda371ee7532892ea8ec046f45e5c7e2dfa8371ad190f8b",
1425 testNetwork(done, params);
1427 it('Allows selection
of Neoscoin
', function(done) {
1429 selectText: "NEOS - Neoscoin",
1430 phrase: "abandon abandon ability",
1431 firstAddress: "NgATz6QbQNXvayHQ4CpZayugb9HeaPDdby",
1432 firstPubKey: "021bf6bd94ac773ed78b6e682bf6509a08944b67925a3ea9ec94f500479f637f63",
1433 firstPrivKey: "TBebkUs87R1WLhMPHMzCYF2FmiHzuVcCrhgf2rRwsSpi35SGZPMc",
1435 testNetwork(done, params);
1437 it('Allows selection
of Nix
', function(done) {
1439 selectText: "NIX - NIX Platform",
1440 phrase: "abandon abandon ability",
1441 firstAddress: "GgcNW2SQQXB4LWHRQTHKkQF3GzXNSLqS8u",
1442 firstPubKey: "02438f5277bc74be69e99eee406cda968705a8ab26b9aecfaa1bbc9d3700fa2eae",
1443 firstPrivKey: "L44wVS6tPZhVGfnJhXTfEyBZwLggW61GKKRVDaEKSaWAt2HkALyT",
1445 testNetwork(done, params);
1447 it('Allows selection
of Neurocoin
', function(done) {
1449 selectText: "NRO - Neurocoin",
1450 phrase: "abandon abandon ability",
1451 firstAddress: "NVdYErQ3mFpDuF5DquW9WMiT7sLc8ufFTn",
1452 firstPubKey: "03a3690f587d97dee95393d6dfe9daa81d60354657f84a75fb6733335a1c0588db",
1453 firstPrivKey: "Tn3LK6WyQRczahRsf3cZCpS12VxvbdhM6zSARDvGxhNoxCCN7oKv",
1455 testNetwork(done, params);
1457 it('Allows selection
of Newyorkc
', function(done) {
1459 selectText: "NYC - Newyorkc",
1460 phrase: "abandon abandon ability",
1461 firstAddress: "RSVMfyH1fKfy3puADJEhut2vfkRyon6imm",
1462 firstPubKey: "02c1f71b4e74098cf6dc66c5c0e386c695002093e986698e53f50162493b2deec8",
1463 firstPrivKey: "UqWMjJsXSsC4X7vgCTxLwxV21yA8vDosyGW2rBTYnn7MfFUbKZFy",
1465 testNetwork(done, params);
1467 it('Allows selection
of Novacoin
', function(done) {
1469 selectText: "NVC - Novacoin",
1470 phrase: "abandon abandon ability",
1471 firstAddress: "4JRvUmxcKCJmaMXZyvRoSS1cmG2XvnZfHN",
1472 firstPubKey: "0252531247a5e26a866909467ce552a3433b00f86319446aa3584723ad637be28a",
1473 firstPrivKey: "MD2NsZQtBdXGvox6VzpZfnhHyDJ2NHzzdSE6jUeUjQuaBRQ3LXUg",
1475 testNetwork(done, params);
1477 it('Allows selection
of Nushares
', function(done) {
1479 selectText: "NSR - Nushares",
1480 phrase: "abandon abandon ability",
1481 firstAddress: "SecjXzU3c7EecdT7EbC4vvmbdtBBokWh6J",
1482 firstPubKey: "02e0e94d07415703fd89b8a72f22fc28e7b916c0649bea2c53e6600377a4d125b5",
1483 firstPrivKey: "P5SXdUhciyemKJojb5tBFPKjVyX4Ymf1wdKDPmYHRigxPAnDNudM",
1485 testNetwork(done, params);
1487 it('Allows selection
of Okcash
', function(done) {
1489 selectText: "OK - Okcash",
1490 phrase: "abandon abandon ability",
1491 firstAddress: "PV4Qp1TUYuGv4TqVtLZtqvrsWWRycfx1Yi",
1492 firstPubKey: "02ab6d1d1b2c6f19f9c13cf0cd48e352e04245026d25de014cde0493c773f27789",
1493 firstPrivKey: "WuuneUUV8naqRRs1mSAdSVfZ9g6VXLWRV7NVEYdugts8vT2iNXR",
1495 testNetwork(done, params);
1497 it('Allows selection
of Omnicore
', function(done) {
1499 selectText: "OMNI - Omnicore",
1500 phrase: "abandon abandon ability",
1501 firstAddress: "1Q1t3gonjCT3rW38TsTsCvgSc3hh7zBGbi",
1502 firstPubKey: "02a8cadac7ee1d034f968c1441481fc2c941c8f529a17b6810e917f9ccc893fa3a",
1503 firstPrivKey: "KyvFh1tWTBsLWxJTVjpTpfjJ7eha81iks7NiD6FvrC23o24oAhcs",
1505 testNetwork(done, params);
1507 it('Allows selection
of DeepOnion
', function(done) {
1509 selectText: "ONION - DeepOnion",
1510 phrase: "abandon abandon ability",
1511 firstAddress: "DYREY7XCFXVqJ3x5UuN43k2JwD2s1kif48",
1512 firstPubKey: "030ed256ea98edd15006a57fd4d3c60b2b811ecd74107c3fa1ac36558107c139b3",
1513 firstPrivKey: "QZZHsJF9C9okF5JV2qx4H1NgCCQqeio6k8cryKyrpU3TPnDhSzwV",
1515 testNetwork(done, params);
1517 it('Allows selection
of Pesobit
', function(done) {
1519 selectText: "PSB - Pesobit",
1520 phrase: "abandon abandon ability",
1521 firstAddress: "PDePsF7ALyXP7JaywokdYiRTDtKa14MAr1",
1522 firstPubKey: "023dd8af1b0196275ee2fb450279656ab16f86221d47f62094c78088200d67e90f",
1523 firstPrivKey: "U9eg6xGhoA9H4aHmQtXPP1uR3dR3EjbdmTr3ejVK5jdhWFoJotSj",
1525 testNetwork(done, params);
1527 it('Allows selection
of Pinkcoin
', function(done) {
1529 selectText: "PINK - Pinkcoin",
1530 phrase: "abandon abandon ability",
1531 firstAddress: "2TgjYQffjbzUHJghNaVbdsjHbRwruC3yzC",
1532 firstPubKey: "02fcc7a9d26b78c1ef3149dc3fcb9fbd68293fe5627a9099a01e5acf5f848d029d",
1533 firstPrivKey: "LX84Cjro1aRwwqTDu2jqNTPvproSm7VJCyMFLCeEKa4LTFGzXgks",
1535 testNetwork(done, params);
1537 it('Allows selection
of POSWcoin
', function(done) {
1539 selectText: "POSW - POSWcoin",
1540 phrase: "abandon abandon ability",
1541 firstAddress: "PNxewmZoPnGBvoEbH6hgQZCK1igDiBCdgC",
1542 firstPubKey: "0358e511140f2f2bc96debf22639b36cc9b12addc386ac7a1de7dca05896ec0162",
1543 firstPrivKey: "UCs7SQEhD8r3GwXL99M8sBuxcqB9uke6kRSh7qQfbH9VdS6g919B",
1545 testNetwork(done, params);
1547 it('Allows selection
of Potcoin
', function(done) {
1549 selectText: "POT - Potcoin",
1550 phrase: "abandon abandon ability",
1551 firstAddress: "PEo7Vg2ctXgpP4vuLPeY9aGJtZotyrmiHc",
1552 firstPubKey: "02b86d3f153eac657f140a8ce9ae530504eea3c9894e594b9c9ddf0cfe393dc8ab",
1553 firstPrivKey: "U89dfzjfUtTSEKaRzr3FPw7ark3bjZAzTVw5kedjBcFj1UAdBcdE",
1555 testNetwork(done, params);
1557 it('Allows selection
of Putincoin
', function(done) {
1559 selectText: "PUT - Putincoin",
1560 phrase: "abandon abandon ability",
1561 firstAddress: "PViWnfr2uFtovd6e7joM49C94CsGSnqJis",
1562 firstPubKey: "0387bbd868cb20682619733e63205c66d460014714db26593d55c916c34f7e7970",
1563 firstPrivKey: "UBB9nGXWEMjhmvWqta83YkSYLLc1vjkqsnP289jbwMPG72LpAiUg",
1565 testNetwork(done, params);
1567 it('Allows selection
of Rapids
', function(done) {
1569 selectText: "RPD - Rapids",
1570 phrase: "abandon abandon ability",
1571 firstAddress: "Ri8XxUdZaXS5LqxmFJcFEjFinkaMbmhSUp",
1572 firstPubKey: "03cf69b270c1d03bbedb39f21d70a0a2aa0192b7dfb26bff4bf9a4ed8315d90f4e",
1573 firstPrivKey: "7sgLTht7XHwAkEgEpm7FJE6Tkv7GqCXxSSKPsr4hWYDNePUhBx6t",
1575 testNetwork(done, params);
1577 it('Allows selection
of Ravencoin
', function(done) {
1579 selectText: "RVN - Ravencoin",
1580 phrase: "abandon abandon ability",
1581 firstAddress: "RBuDoVNnzvFsEcX8XKPm8ic4mgiCzjUCNk",
1582 firstPubKey: "02135446ddfa13617ada02187702b51c3ae17a671773aa7ab7100a3cb89b7c9eb1",
1583 firstPrivKey: "KwRpyD9EmoyjQQRKtFVYL1WkS9Ywue8zSpebRPtXViiGR8kWUEJV",
1585 testNetwork(done, params);
1587 it('Allows selection
of Reddcoin
', function(done) {
1589 selectText: "RDD - Reddcoin",
1590 phrase: "abandon abandon ability",
1591 firstAddress: "RtgRvXMBng1y51ftteveFqwNfyRG18HpxQ",
1592 firstPubKey: "026565dd8a2e6f75e6391fbe16e6fb7dfab8b9cba85ea56b63f015d98c13d8f46d",
1593 firstPrivKey: "V1cNKW3ZYbRXosccyG9d3t4g7nGCBGyQJi7zLe6WZ3tExXMUqqK1",
1595 testNetwork(done, params);
1597 it('Allows selection
of RevolutionVR
', function(done) {
1599 selectText: "RVR - RevolutionVR",
1600 phrase: "abandon abandon ability",
1601 firstAddress: "VXeeoP2jkzZnMFxtc66ZBZK1NHN5QJnnjL",
1602 firstPubKey: "03c107f37ffb305d70a690ecd89254a67099d8855a4162762c62e3ad72e78c50e4",
1603 firstPrivKey: "WQdDNS6ZPZcFfBn7AwFMu1GHkm5jScBwpVDqNjmC16PEU7yG97vP",
1605 testNetwork(done, params);
1607 it('Allows selection
of Rubycoin
', function(done) {
1609 selectText: "RBY - Rubycoin",
1610 phrase: "abandon abandon ability",
1611 firstAddress: "RV76JDtjTs11JdMDRToYn6CHecMRPLnKS6",
1612 firstPubKey: "037828022748cf1f2107e9d99f7a19b8b44ebb24b332c51c0ca1cecec301cf1797",
1613 firstPrivKey: "UwQPqs31g9AKQzLjHNqgXN66tout2i6F7VSiCsSsR3LVHq7aToVL",
1615 testNetwork(done, params);
1617 it('Allows selection
of Salus
', function(done) {
1619 selectText: "SLS - Salus",
1620 phrase: "abandon abandon ability",
1621 firstAddress: "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww",
1622 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1623 firstPrivKey: "VMYkYTHeeHiosSQM9EFFdEH1a7fiMEL3TgBPxQVhXWqxAvyQ3uJL",
1625 testNetwork(done, params);
1627 it('Allows selection
of Smileycoin
', function(done) {
1629 selectText: "SMLY - Smileycoin",
1630 phrase: "abandon abandon ability",
1631 firstAddress: "BEZVnEBCAyFByrgKpwAgYgtvP4rKAd9Sj2",
1632 firstPubKey: "02145f25ab87def3ce6decffc6bf740037dc467a32ff8e62f147c70f5092074f2b",
1633 firstPrivKey: "pC32pZDfv3L3vegrv8gptiyc3SkJEZ6BigioGjLmD3wFw2h1qcz",
1635 testNetwork(done, params);
1637 it('Allows selection
of Solarcoin
', function(done) {
1639 selectText: "SLR - Solarcoin",
1640 phrase: "abandon abandon ability",
1641 firstAddress: "8LZ13HbnjtaMJWSvvVFNTLf71zFfDrhwLu",
1642 firstPubKey: "0305dbadd4fd239ecfca9239c9405e3b12178d46bdaf7520d511339a05367a3c88",
1643 firstPrivKey: "NeNfMe2zy5R6eUVJ3pZ4hs17s4xtm7xHjLJoe1hgCwVoYsfHx5Jy",
1645 testNetwork(done, params);
1647 it('Allows selection
of stash
', function(done) {
1649 selectText: "STASH - Stash",
1650 phrase: "abandon abandon ability",
1651 firstAddress: "XxwAsWB7REDKmAvHA85SbEZQQtpxeUDxS3",
1652 firstPubKey: "030caa120ce0fbd2c2d08a24c15086bafcf55d3862f423b0e55fd376474a0e7160",
1653 firstPrivKey: "XF3r4xQozRKvRUNgQG1bx8MGCuSLzV82XrNfB52Utpaixm8tWmWz",
1655 testNetwork(done, params);
1657 it('Allows selection
of stash testnet
', function(done) {
1659 selectText: "STASH - Stash Testnet",
1660 phrase: "abandon abandon ability",
1661 firstAddress: "yWQCTSkUst7ddYuebKsqa1kSoXEjpCkGKR",
1662 firstPubKey: "02a709b853a4ac1739c036c3d2bcf03b3e8c54b64927c57a07ac05c8e903545dd0",
1663 firstPrivKey: "cNrt5ghh7pPGQZVZkL5FJFNsWQQTKQPtLJz2JT7KnsfpzeAPYSp3",
1665 testNetwork(done, params);
1667 it('Allows selection
of Stratis
', function(done) {
1669 selectText: "STRAT - Stratis",
1670 phrase: "abandon abandon ability",
1671 firstAddress: "ScfJnq3QDhKgDMEds6sqUE1ot6ShfhmXXq",
1672 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1673 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1675 testNetwork(done, params);
1677 it('Allows selection
of Stratis Test
', function(done) {
1679 selectText: "TSTRAT - Stratis Testnet",
1680 phrase: "abandon abandon ability",
1681 firstAddress: "TRLWm3dye4FRrDWouwYUSUZP96xb76mBE3",
1682 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1683 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1685 testNetwork(done, params);
1687 it('Allows selection
of Sugarchain
', function(done) {
1689 selectText: "SUGAR - Sugarchain",
1690 phrase: "abandon abandon ability",
1691 firstAddress: "SYnd31fYr39VgKju87Vz1sYBmEeHg5cudk",
1692 firstPubKey: "035bc9fa22eff2246ec07bb09c9e32f5f9fee517b4f49a8f117508f8fb41905b25",
1693 firstPrivKey: "L2G3axGdZv5EV8osAsBPMese74i4dTHaGvxDh7DsRF5Ky6hKkPDY",
1695 testNetwork(done, params);
1697 it('Allows selection
of Sugarchain Testnet
', function(done) {
1699 selectText: "TUGAR - Sugarchain Testnet",
1700 phrase: "abandon abandon ability",
1701 firstAddress: "TkoRzLZQyaY88dAACNVwUFMYekR7pv6CbY",
1702 firstPubKey: "035bc9fa22eff2246ec07bb09c9e32f5f9fee517b4f49a8f117508f8fb41905b25",
1703 firstPrivKey: "cSd33sGUzymVeaH8ZGzWiyNhjJ1UHuPGLy6goXgNvMjLDqioARWW",
1705 testNetwork(done, params);
1707 it('Allows selection
of Syscoin
', function(done) {
1709 selectText: "SYS - Syscoin",
1710 phrase: "abandon abandon ability",
1711 firstAddress: "SZwJi42Pst3VAMomyK5DG4157WM5ofRmSj",
1712 firstPubKey: "02219514722373a337c6425ca5ccc423e160f0abf66b57a71fba4db7aca6957f6a",
1713 firstPrivKey: "L36rm7aHFTz571YY87nA3ZLace8NcqPYZsyuyREuT4wXFtTBqLrc",
1715 testNetwork(done, params);
1717 it('Allows selection
of Toa
', function(done) {
1719 selectText: "TOA - Toa",
1720 phrase: "abandon abandon ability",
1721 firstAddress: "TSe1QAnUwQzUfbBusDzRJ9URttrRGKoNKF",
1722 firstPubKey: "0332facd2ea64c2f1e6152961340b7e51ca77f1bffa0f950442b4ef5021f7ee86c",
1723 firstPrivKey: "VdSdDaM1Kjw1SzzW7KCzFEFi7Zf5egUHVofSiLkrSh7K6bbYZhnb",
1725 testNetwork(done, params);
1727 it('Allows selection
of TWINS
', function(done) {
1729 selectText: "TWINS - TWINS",
1730 phrase: "abandon abandon ability",
1731 firstAddress: "WPpJnfLLubNmF7HLNxg8d8zH5haxn4wri8",
1732 firstPubKey: "02a4b9bda2a7a2e4540d54c4afb3a3007f6f22f8cd2df67d5c69388fd8ddc16a07",
1733 firstPrivKey: "Au5fg7nYMXHmNT9BSfQVNxaUduP9cgJASeNDMrP9qfoWi2ZTmR48",
1735 testNetwork(done, params);
1737 it('Allows selection
of TWINS testnet
', function(done) {
1739 selectText: "TWINS - TWINS Testnet",
1740 phrase: "abandon abandon ability",
1741 firstAddress: "XpnU1HHdNG5YxvG9Rez4wjmidchxqnZaNa",
1742 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
1743 firstPrivKey: "cBtMfPpQg4s1Ndfez7oLdedwu8CxshhWE5f7qunhLsY4ueNvKKyM",
1745 testNetwork(done, params);
1747 it('Allows selection
of Ultimatesecurecash
', function(done) {
1749 selectText: "USC - Ultimatesecurecash",
1750 phrase: "abandon abandon ability",
1751 firstAddress: "UPyLAZU2Che5fiy7Ed8xVJFmXAUhitA4ug",
1752 firstPubKey: "03a529111ee6d54965962b289f7537db1edb57863e2e10dd96939f8d3501ecebd4",
1753 firstPrivKey: "VG1ZbBExPyeeT72EL1jQU8SvXkpK6heTept76wLiGCuMgRHqrz9L",
1755 testNetwork(done, params);
1757 it('Allows selection
of Unobtanium
', function(done) {
1759 selectText: "UNO - Unobtanium",
1760 phrase: "abandon abandon ability",
1761 firstAddress: "uUBMPVMXrR6qhqornJqKTWgr8L69vihSL9",
1762 firstPubKey: "026dd108ff43d425ad923f2107f5fc166cbb90dd0bd04b157c1ebdc9c04a423e0f",
1763 firstPrivKey: "aAf6LmMJpWQMZbHVSHtkKDCNViknGD4TQ3y1rwvJe2L55dwpbqBV",
1765 testNetwork(done, params);
1767 it('Allows selection
of Vcash
', function(done) {
1769 selectText: "XVC - Vcash",
1770 phrase: "abandon abandon ability",
1771 firstAddress: "VuL53MSY6KjvAjKSeRkh3NDnKykacDVeps",
1772 firstPubKey: "03ab245795cf39c4084684d039a01c387472c3626d93d24289d229c27ce9eeeace",
1773 firstPrivKey: "WVC2yAf2rFHzjbKKJeZWNFjMqQ9ATRg3xdtG2FfVDQATpNj5fHy9",
1775 testNetwork(done, params);
1777 it('Allows selection
of Verge
', function(done) {
1779 selectText: "XVG - Verge",
1780 phrase: "abandon abandon ability",
1781 firstAddress: "DCrVuGkMjLJpTGgwAgv9AcMdeb1nkWbjZA",
1782 firstPubKey: "03cd21de72f291cd5a3632a23a710616416743f60b4667a0f8d3fc03c7fd6e0c77",
1783 firstPrivKey: "QRpRGbTRC7P12PyhiFqyZpVwK5XCGe5Lmr9hbV7ujcjg9cjUGqF7",
1785 testNetwork(done, params);
1787 it('Allows selection
of Vertcoin
', function(done) {
1789 selectText: "VTC - Vertcoin",
1790 phrase: "abandon abandon ability",
1791 firstAddress: "Vf6koGuiWdXQfx8tNqxoNeEDxh4xh5cxsG",
1792 firstPubKey: "02f15155bc5445fc764db199da5e7ac92112ab9f2a5e408904f145ea29d169010a",
1793 firstPrivKey: "Kxu4LwEJZooaVWGT9ZLzJBuaUFr1hLjuottjT7eTNNWJKk7Hur1u",
1795 testNetwork(done, params);
1797 it('Allows selection
of Vivo
', function(done) {
1799 selectText: "VIVO - Vivo",
1800 phrase: "abandon abandon ability",
1801 firstAddress: "VFmBwuXXGhJe7MarQG2GfzHMFebRHgfSpB",
1802 firstPubKey: "02d24546a74522e0dc8bbfde66e65201ae81b0f6e2b60239c8baf09c1a53b73f8c",
1803 firstPrivKey: "WLSLMqZjuwzibyhPfaYvxG4z1tRnmVX4yYFtbQmHhU4eKt12Nuqq",
1805 testNetwork(done, params);
1807 it('Allows selection
of Vpncoin
', function(done) {
1809 selectText: "VASH - Vpncoin",
1810 phrase: "abandon abandon ability",
1811 firstAddress: "VoEmH1qXC4TsSgBAStR21QYetwnFqbqCx9",
1812 firstPubKey: "039e579dd18157ef1dff74d46f0bdb95f729d3985f0d4f9167fed4095b1aba846c",
1813 firstPrivKey: "WTbS2wjqeTzs8nk1E1N8RxpPUow8wNkgCjfDCuvDLRHaWFuNhxMz",
1815 testNetwork(done, params);
1817 it('Allows selection
of VeChain
', function(done) {
1819 selectText: "VET - VeChain",
1820 phrase: "abandon abandon ability",
1821 firstAddress: "0xdba55B1B6070f3a733D5eDFf35F0da4A00E455F2",
1822 firstPubKey: "0x0386911777255ed1d57906dcc85ca7fd4ba9eb4c8160ced97817933919d1ffe7ad",
1823 firstPrivKey: "0x3ec2b392952fe8a82a319c8ca9a4bb9c1db7beb09c64799da7693615ba1a787e",
1825 testNetwork(done, params);
1827 it('Allows selection
of Whitecoin
', function(done) {
1829 selectText: "XWC - Whitecoin",
1830 phrase: "abandon abandon ability",
1831 firstAddress: "WcSwCAUqrSgeSYbsaS3SSWWhsx8KRYTFDR",
1832 firstPubKey: "03d3f4fa758f6260bfb39664d248a32258b53a90a71224db056ee79abaa3e9f208",
1833 firstPrivKey: "WrGUVSubUyDx5wzjfwi3EhhUwf5anHFW7Dv9kAaTu39CtDDBJWM9",
1835 testNetwork(done, params);
1837 it('Allows selection
of Wincoin
', function(done) {
1839 selectText: "WC - Wincoin",
1840 phrase: "abandon abandon ability",
1841 firstAddress: "WaDVCESMGgyKgNESdn3u43NnwmGSkZED3Z",
1842 firstPubKey: "02d10b29f6d88dd86f733b2140ba2207a9dfb5d014bb287541c66a41e467e231a7",
1843 firstPrivKey: "WmLWUvbz8UF1s7PrHyeQBMLbt4LpmQrwbzatvusvx6SRoNASbWtW",
1845 testNetwork(done, params);
1847 it('Allows selection
of Zcoin
', function(done) {
1849 selectText: "XZC - Zcoin",
1850 phrase: "abandon abandon ability",
1851 firstAddress: "a6VcMdP4XgAA9Tr7xNszmPG5FZpfRf17Cq",
1852 firstPubKey: "0236f2348c32dc62d69488b01988ed1154df261723ec60461cb6e62189984c62db",
1853 firstPrivKey: "Y8k3XQRQrJoABEao4Sw45s744g6xth7yviNqFcN7zqPqKUJrrKTQ",
1855 testNetwork(done, params);
1857 it('Allows selection
of Zcash
', function(done) {
1859 selectText: "ZEC - Zcash",
1860 phrase: "abandon abandon ability",
1861 firstAddress: "t1Sz8AneMcVuzUg3tPJ8et5AS5LFJ7K2EF9",
1862 firstPubKey: "035864cede8db462f7ccfda96bd7358156e198a894032cfc87505d82abb6d48b48",
1863 firstPrivKey: "L1eU2kCeBQBZTQKKt7uYu4pb6Z1ZMy1Km1VMznUvGyH64GTxMqfL",
1865 testNetwork(done, params);
1867 it('Allows selection
of Zclassic
', function(done) {
1869 selectText: "ZCL - Zclassic",
1870 phrase: "abandon abandon ability",
1871 firstAddress: "t1TBMxTvVJRybUbMLGWq8H4A8F4VUL7czEc",
1872 firstPubKey: "02fbdf32c4d9e692d4a94aa09f830a2a3b7b73f5c4f313b8234fc39a8b151c9ab7",
1873 firstPrivKey: "L5N7BBrrAweLcbAQGVDLZAaX9DnfAiD2VCZBBU1U3HBftFsRfHm7",
1875 testNetwork(done, params);
1877 it('Allows selection
of Horizen
', function(done) {
1879 selectText: "ZEN - Horizen",
1880 phrase: "abandon abandon ability",
1881 firstAddress: "znWh9XASyW2dZq5tck84wFjiwuqVysi7q3p",
1882 firstPubKey: "0326a78c08ef8a2b6c0d0d3959ffeddaad64fc921b0e714baeafff4785db31ff7a",
1883 firstPrivKey: "L25L6Ctvb4fr6fTaVVECE2CVoeGuttfUJqk1HQxfuejgb5QZHu8y",
1885 testNetwork(done, params);
1887 it('Allows selection
of Energi
', function(done) {
1889 selectText: "NRG - Energi",
1890 phrase: "abandon abandon ability",
1891 firstAddress: "EejRy4t4nidzhGGzkJUgFP3z4HYBjhTsRt",
1892 firstPubKey: "03a4aa1d4d5bdce7c18df69b123ef292e7e9b6069948b14bf3ee089188076e7c80",
1893 firstPrivKey: "GkMWjZtHh9RXFeNL2m5GKPp3wdNmiaSqqUWVLunR766TjbigK4FC",
1895 testNetwork(done, params);
1897 it('Allows selection
of Ethereum Classic
', function(done) {
1899 selectText: "ETC - Ethereum Classic",
1900 phrase: "abandon abandon ability",
1901 firstAddress: "0x3c05e5556693808367afB62eF3b63e35d6eD249A",
1902 firstPubKey: "0x02afa443029a20b62fe90c3eaa772d440d8e2ddc1ad247c3473b3ff34dc0583f3f",
1903 firstPrivKey: "0x5253e43358ddb97c8c710a2f51fcbdf7c07aad193ddd29c8b57dbab50d6141f2",
1905 testNetwork(done, params);
1907 it('Allows selection
of Pirl
', function(done) {
1909 selectText: "PIRL - Pirl",
1910 phrase: "abandon abandon ability",
1911 firstAddress: "0xe77FC0723dA122B5025CA79193c28563eB47e776",
1912 firstPubKey: "0x039b4d13ecf9ef299546ba0d486969e0b659baa0cb71278501a46dce4381f612de",
1913 firstPrivKey: "0xe76ed1cffd0572b31be2ada6848d46e267b8b2242b30f1a92142f64ee4772460",
1915 testNetwork(done, params);
1917 it('Allows selection
of MIX
', function(done) {
1919 selectText: "MIX - MIX",
1920 phrase: "abandon abandon ability",
1921 firstAddress: "0x98BC5e63aeb6A4e82d72850d20710F07E29A29F1",
1922 firstPubKey: "0x02686ad3d73950627c46b73cd0c0d3b17e0bdcb89c094ce68b2f4219c09016c547",
1923 firstPrivKey: "0x70deca38fff7d8a2490491deb1bb7fbc979d6a0b97000b9f1eddefdd214eb7da",
1925 testNetwork(done, params);
1927 it('Allows selection
of Monkey Project
', function(done) {
1929 selectText: "MONK - Monkey Project",
1930 phrase: "abandon abandon ability",
1931 firstAddress: "MnLrcnnUzKnf7TzufjRe5DLZqQJz18oYyu",
1932 firstPubKey: "03a3f72bd9023fa12b22e5255d74e80420a968b577efbc52cea283da0f6690d4fc",
1933 firstPrivKey: "9B4CknHTfmvPS3oEG6AjJUMz1SZtJKN6rmEoaFoZNCJd1EU1xVdS",
1935 testNetwork(done, params);
1938 it('Allows selection
of MOAC
', function(done) {
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",
1946 testNetwork(done, params);
1948 it('Allows selection
of Musicoin
', function(done) {
1950 selectText: "MUSIC - Musicoin",
1951 phrase: "abandon abandon ability",
1952 firstAddress: "0xDc060e4A0b0313ea83Cf6B3A39B9db2D29004897",
1953 firstPubKey: "0x02a17278d54548e7cf0c1e6120646174f42e380ae5a0080f1a0d09f118305d6f9f",
1954 firstPrivKey: "0xaea8683b8bfd56b6fc68c19b88eee4ccd2f00430bc466741d0297aa65c7b56a5",
1956 testNetwork(done, params);
1958 it('Allows selection
of Poa
', function(done) {
1960 selectText: "POA - Poa",
1961 phrase: "abandon abandon ability",
1962 firstAddress: "0x53aF28d754e106210C3d0467Dd581eaf7e3C5e60",
1963 firstPubKey: "0x02cda40cf7f21f370afe0206cbf219f963369d7c7229dc7ba64137358489d96567",
1964 firstPrivKey: "0xed0a44cff8e44fa978f339af3308ee439c30f4170671ad0e1ccd7e4bfff70ed9",
1966 testNetwork(done, params);
1968 it('Allows selection
of Expanse
', function(done) {
1970 selectText: "EXP - Expanse",
1971 phrase: "abandon abandon ability",
1972 firstAddress: "0xf57FeAbf26582b6E3E666559d3B1Cc6fB2b2c5F6",
1973 firstPubKey: "0x0232fa15f0971f93c182afea54cb28a3180f5a4c31759235ca6ceca47a5a777335",
1974 firstPrivKey: "0x9f96418f9ec3672b52c2a6421272650b2d5992d524a48905a4ff0ed9ce347c9b",
1976 testNetwork(done, params);
1978 it('Allows selection
of Callisto
', function(done) {
1980 selectText: "CLO - Callisto",
1981 phrase: "abandon abandon ability",
1982 firstAddress: "0x4f9364F7420B317266C51Dc8eB979717D4dE3f4E",
1983 firstPubKey: "0x0313d9db8d77249c768630a5a8315e08e3a3284d7e18774476d15e073931ddc15e",
1984 firstPrivKey: "0x02bbf00719f3730baf989f7392b8d55548dd349abd744c68242c69bd016ce28d",
1986 testNetwork(done, params);
1988 it('Allows selection
of HUSH
', function(done) {
1990 selectText: "HUSH - Hush (Legacy)",
1991 phrase: "abandon abandon ability",
1992 firstAddress: "t1g6rLXUnJaiJuu4q4zmJjoa9Gk4fwKpiuA",
1993 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
1994 firstPrivKey: "Kx99fhLCDHPsBsZAJDH7v8vgGDch4rNr9VjhAUMfVevJWnoGr8WD",
1996 testNetwork(done, params);
1998 it('Allows selection
of HUSH3
', function(done) {
2000 selectText: "HUSH - Hush3",
2001 phrase: "abandon abandon ability",
2002 firstAddress: "RXWSQhwvw5jHPGP8bjwJhWoRnMLBnuPDKD",
2003 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
2004 firstPrivKey: "UpvyyNxAiWN7evMFUkxhgabuCHfq9xeTv17Wjj9LxN91QegKs6RR",
2006 testNetwork(done, params);
2008 it('Allows selection
of ExchangeCoin
', function(done) {
2010 selectText: "EXCC - ExchangeCoin",
2011 phrase: "abandon abandon ability",
2012 firstAddress: "22txYKpFN5fwGwdSs2UBf7ywewbLM92YqK7E",
2013 firstPubKey: "033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3",
2014 firstPrivKey: "L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE",
2016 testNetwork(done, params);
2018 it('Allows selection
of Artax
', function(done) {
2020 selectText: "XAX - Artax",
2021 phrase: "abandon abandon ability",
2022 firstAddress: "AYxaQPY7XLidG31V7F3yNzwxPYpYzRqG4q",
2023 firstPubKey: "02edef928ec3951112452119f9a63d9479741ea0fc497682bd13064cfc5d1cc4e3",
2024 firstPrivKey: "PMcqFx52ipYy9gZynEi5LYVD3XUC8YbQr2Neg6e3LFnh4yTBQ9yJ",
2026 testNetwork(done, params);
2028 it('Allows selection
of BitcoinGreen
', function(done) {
2030 selectText: "BITG - Bitcoin Green",
2031 phrase: "abandon abandon ability",
2032 firstAddress: "GeNGm9SkEfwbsws3UrrUSE2sJeyWYjzraY",
2033 firstPubKey: "02a8e34c2599a14ca861285b734750432a7ce10caf7f1ff5a366a94264c636a12b",
2034 firstPrivKey: "7uf6WeVgBqKR1WyUcaz1TLSKabyov9SfQDghyvfaCy6VZPwLNeku",
2036 testNetwork(done, params);
2038 it('Allows selection
of ANON
', function(done) {
2040 selectText: "ANON - ANON",
2041 phrase: "abandon abandon ability",
2042 firstAddress: "AnU6pijpEeUZFWSTyM2qTqZQn996Zq1Xard",
2043 firstPubKey: "032742ff4eaf9188d84d38dfb4a2fdbb541bfd3ca9ee533a7d1092940a1ea60bb4",
2044 firstPrivKey: "L2w3aoZExc9eHh1KMnDzrzaSVmfgQMvBxxFbtcegKNvrHVa4r81m",
2046 testNetwork(done, params);
2048 it('Allows selection
of ProjectCoin
', function(done) {
2050 selectText: "PRJ - ProjectCoin",
2051 phrase: "abandon abandon ability",
2052 firstAddress: "PXZG97saRseSCftfe1mcFmfAA7pf6qBbaz",
2053 firstPubKey: "025f84297a93a33bccb735c931140ddb4279fe9d55a571ee7731259e3e19d0c7fe",
2054 firstPrivKey: "JRR5uB6daEtSCLNnv7hKSgZ5KmFdHMUcpTzJGtEAi9sWSiQd4hVQ",
2056 testNetwork(done, params);
2058 it('Allows selection
of Phore
', function(done) {
2060 selectText: "PHR - Phore",
2061 phrase: "abandon abandon ability",
2062 firstAddress: "PJThxpoXAG6hqrmdeQQbVDX4TJtFTMMymC",
2063 firstPubKey: "022ef3c4cbc0481fd925ecac51f09f2976ea024b0863b543b1b481181e1ef34265",
2064 firstPrivKey: "YPzQxHMA2Pm5S2p8Xwhmhm2PnH6ooYHrWNXiAKCCA2CjMtHyNzuh",
2066 testNetwork(done, params);
2068 it('Allows selection
of Safecoin
', function(done) {
2070 selectText: "SAFE - Safecoin",
2071 phrase: "abandon abandon ability",
2072 firstAddress: "RtxHpnhJz6RY8k9owP3ua5QWraunmewB1G",
2073 firstPubKey: "0383956cd23c1124324c92ac69f4bcf71ad973892a83aceb4085041afb082f6db9",
2074 firstPrivKey: "Uznk2AHWqpSGRw8dmG3t3Q3rJJwyn3TcjzWh9EgDCQ9jU34DWF6m",
2076 testNetwork(done, params);
2078 it('Allows selection
of Blocknode
', function(done) {
2080 selectText: "BND - Blocknode",
2081 phrase: "abandon abandon ability",
2082 firstAddress: "BG8xZSAur2jYLG9VXt8dYfkKxxeR7w9bSe",
2083 firstPubKey: "03e91c00dcfca87c80f57691e34e0e4c55a18eb79048dbdd5f6d9c83daefea6459",
2084 firstPrivKey: "C6gySxND85cLnLgsjTfUxXmMzh8JrSR24vpQnUHqVMqGYy36k4ho",
2086 testNetwork(done, params);
2088 it('Allows selection
of Blocknode Testnet
', function(done) {
2090 selectText: "tBND - Blocknode Testnet",
2091 phrase: "abandon abandon ability",
2092 firstAddress: "bSptsFyDktFSKpWveRywJsDoJA2TC6qfHv",
2093 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2094 firstPrivKey: "MPuJVFnTAhFFvtLqgYL32FBF1g7jPraowuN5tV9EF2AtkYXCfkE3",
2096 testNetwork(done, params);
2098 it('Allows selection
of LitecoinZ
', function(done) {
2100 selectText: "LTZ - LitecoinZ",
2101 phrase: "abandon abandon ability",
2102 firstAddress: "L1VTXju7hLgKV4T7fGXS9sKsnm2gmtRCmyw",
2103 firstPubKey: "03ea84a1cc8b43ea8330bc2f363e706a9ff2d48858185c42c296d06ddcb94bc827",
2104 firstPrivKey: "L1PktmLfTgVRQZsqs2ZoFBBqnVXi5hVAimJt8tmfT2ye95WH9zEd",
2106 testNetwork(done, params);
2108 it('Allows selection
of BlockStamp
', function(done) {
2110 selectText: "BST - BlockStamp",
2111 phrase: "abandon abandon ability",
2112 firstAddress: "15gypKtim4cVTj137ApfryG17RkvSbPazZ",
2113 firstPubKey: "0277bc537f8354004f8a77e07fb78b38f291df7bc07819c2d7eab049b8d10b3f7f",
2114 firstPrivKey: "L1NmycTQz17fXBMzK25aBTnN7v5U6rz3AURjL72xyKg21zmAmgt7",
2116 testNetwork(done, params);
2118 it('Allows selection
of DEXON
', function(done) {
2120 selectText: "DXN - DEXON",
2121 phrase: "abandon abandon ability",
2122 firstAddress: "0x136a58788033E028CCd740FbDec6734358DB56Ec",
2123 firstPubKey: "0x028d7fa8c3417904cec37946db8d12bba51d85dde25156651f216260e0ff641cf4",
2124 firstPrivKey: "0x8d7d8479dac38e786d4e493159dd655e116871d17ed803af6bb70207c60298ff",
2126 testNetwork(done, params);
2128 it('Allows selection
of Ellaism
', function(done) {
2130 selectText: "ELLA - Ellaism",
2131 phrase: "abandon abandon ability",
2132 firstAddress: "0xa8B0BeA09eeBc41062308546a01d6E544277e2Ca",
2133 firstPubKey: "0x03698fee21c52ad4b4772df3da92ddf0278da529da231c2ebfb167c9e3cc88f29f",
2134 firstPrivKey: "0xe10bc99fcea6f5bca20c1b6e5386a18991b8d16d658b36881b7aca792e06bac2",
2136 testNetwork(done, params);
2138 it('Allows selection
of Ethersocial Network
', function(done) {
2140 selectText: "ESN - Ethersocial Network",
2141 phrase: "abandon abandon ability",
2142 firstAddress: "0x6EE99Be2A0C7F887a71e21C8608ACF0aa0D2b767",
2143 firstPubKey: "0x028df59c64daa4f1036fe0dc832c4e36d9df0692a7ed9a062d48a4662a01d2c7b3",
2144 firstPrivKey: "0x44e0316578fd8168022039d5dfd5838e70826686a4b05dec9c88100c30049fce",
2146 testNetwork(done, params);
2148 it('Allows selection
of Stellar
', function(done) {
2150 selectText: "XLM - Stellar",
2151 phrase: "abandon abandon ability",
2152 firstAddress: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2153 firstPubKey: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2154 firstPrivKey: "SA35HYGAHWYYLCW2P5EDHGWAYQW2C5F25KH4KFWEXLG5I4CPKPZTLRM5",
2156 testNetwork(done, params);
2158 it('Allows selection
of Wagerr
', function(done) {
2160 selectText: "WGR - Wagerr",
2161 phrase: "abandon abandon ability",
2162 firstAddress: "WYiVgQU39VcQxcnacoCiaZHZZLjDCJoS95",
2163 firstPubKey: "0343cfa1ed85e02fdc782c3c8b0b5febe7653c30a0c4319bef2e7d462e67245e46",
2164 firstPrivKey: "WagfoYsRKgtBwBMgwYWuboY2DpGjJBpFcneqzSegZg4ppvYLWcry",
2166 testNetwork(done, params);
2168 it('Allows selection
of Groestlcoin
', function(done) {
2170 selectText: "GRS - Groestlcoin",
2171 phrase: "abandon abandon ability",
2172 firstAddress: "FZycsFvZ1eH1hbtyjBpAgJSukVw1bN6PBN",
2173 firstPubKey: "03c1d0c7b272a762b4b697bdb1b3b36e26add3215e69f7251db16c5a51c84b7b4c",
2174 firstPrivKey: "KzQVqEsQrKjb4K6bViRqqQJc9nXrvEAxDy2AiPf6tfEkRW7rgNfg",
2176 testNetwork(done, params);
2178 it('Allows selection
of Groestlcoin Testnet
', function(done) {
2180 selectText: "GRS - Groestlcoin Testnet",
2181 phrase: "abandon abandon ability",
2182 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiygRPne9",
2183 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2184 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJpRHpNq",
2186 testNetwork(done, params);
2188 it('Allows selection
of Elastos
', function(done) {
2190 selectText: "ELA - Elastos",
2191 phrase: "abandon abandon ability",
2192 firstAddress: "EMccDcsn3SwPDcfeQMf3w7utqi8ioWYtkg",
2193 firstPubKey: "02c936d5025b06acc283bf9562700279fd1ea3ce7ee204afca0c07be77bc3b4822",
2194 firstPrivKey: "608f7e64b46a1df51ba6b5b38b0599196afd1f36572b1ec696d7aae65d05045d",
2196 testNetwork(done, params);
2198 it('Allows selection
of Energyweb
', function(done) {
2200 selectText: "EWT - EnergyWeb",
2201 phrase: "abandon abandon ability",
2202 firstAddress: "0x22171474844Fc7E8E99A3A69CCf1eDb5574FdD4c",
2203 firstPubKey: "0x03eee63d4d201168802b43f392e61f148a478935055cd990549452c741f4c34b84",
2204 firstPrivKey: "0x325aa9e82d03b3773859d84bece81a598df8478d361cfbc59efc27385e0e3611",
2206 testNetwork(done, params);
2208 it('Allows selection
of Thought
', function(done) {
2210 selectText: "THT - Thought",
2211 phrase: "abandon abandon ability",
2212 firstAddress: "4B1Bh9GibDarFQrhtYU8krpc7WSjgGfYvo",
2213 firstPubKey: "0390e4598e7924f3b0369020394b133545db6bd37fa3aa4648aafbce46330c28cc",
2214 firstPrivKey: "KCwL3y6VVrgzJFqtCkh2RV9M1zruX9NymKsWheb7by1dWLd2QkFx",
2216 testNetwork(done, params);
2218 it('Allows selection
of EtherCore
', function(done) {
2220 selectText: "ERE - EtherCore",
2221 phrase: "abandon abandon ability",
2222 firstAddress: "0x119e6EAC3Ce1b473D62d9fD847fb0ea222eF1D9e",
2223 firstPubKey: "0x02cfeb9a4d8003b5c919c1eb67c91e06b3c08e602a336f74017fc7c756a2550ca9",
2224 firstPrivKey: "0x6bb6e036aaf39326d3c74345ec34ef0c73b1608acb409306c9ba73d22de6abf0",
2226 testNetwork(done, params);
2228 it('Allows selection
of RBTC
- RSK
', function(done) {
2230 selectText: "R-BTC - RSK",
2231 phrase: "abandon abandon ability",
2232 firstAddress: "0x37CA764c4b2fe819108448b80d2F35921b035931",
2233 firstPubKey: "0x0219d9b5087ab68edc8a714969d8cb70e7159417b47a05932b227e6f417c7962b9",
2234 firstPrivKey: "0x6e6f48cc422825f7fd68f2200d3dde757849f15342f252eeb0bc4ebc46089fe1",
2236 testNetwork(done, params);
2238 it('Allows selection
of tRBTC
- RSK Testnet
', function(done) {
2240 selectText: "tR-BTC - RSK Testnet",
2241 phrase: "abandon abandon ability",
2242 firstAddress: "0x176484B5a155Fe802aCB26055eb1c193D5A576d5",
2243 firstPubKey: "0x03f77eb7bd83e92ef47be1abddae7f71fb0bc8a7a1ee4b193662a86ed2705ffc5b",
2244 firstPrivKey: "0x18c2400d2f818d28b80d0e31235873bfeef644fc45fd702f54ae0d422cff6ab3",
2246 testNetwork(done, params);
2248 it('Allows selection
of Argoneum
', function(done) {
2250 selectText: "AGM - Argoneum",
2251 phrase: "abandon abandon ability",
2252 firstAddress: "MWgLPvJkaJwH6hrXFs1MimAC4FwC1kYRhe",
2253 firstPubKey: "0348e5252045fee1d3b1e5bce25dbc16284d5b6c3bfff9c305d4ffa6078c16f3f8",
2254 firstPrivKey: "VJXpuMEFnK8USLyo5tgF7M4cBXU44U8MUor1KRTQ6t9DVno9AAgg",
2256 testNetwork(done, params);
2258 it('Allows selection
of CranePay
', function(done) {
2260 selectText: "CRP - CranePay",
2261 phrase: "abandon abandon ability",
2262 firstAddress: "CcUHPqgmef1BmgWFa9g3YNc8scgVXVh8ip",
2263 firstPubKey: "0392af9ea9dc78170c6f68c50bac926f960e50769295f539ac6382a3af2b928740",
2264 firstPrivKey: "KHTCAvKHKg1WdLoDSg3VjjyZK5Wk1ihzJENpp2YMb1RmAxrCZrXX",
2266 testNetwork(done, params);
2268 it('Allows selection
of Scribe
', function(done) {
2270 selectText: "SCRIBE - Scribe",
2271 phrase: "abandon abandon ability",
2272 firstAddress: "RYAnPeBLD8veZ9Tw8xugeTC2f9PeZonLHM",
2273 firstPubKey: "02c912bc4759c8a209475502fb5352ff5be8a8f13eb72f1732ee25125cd53edc1e",
2274 firstPrivKey: "HLZWvNCEUv4ghygjH9A2EYCa9HNRcxe5CS42kzUTmoxJYp3z96QE",
2276 testNetwork(done, params);
2278 it('Allows selection
of Binance Smart Chain
', function(done) {
2280 selectText: "BSC - Binance Smart Chain",
2281 phrase: "abandon abandon ability",
2282 firstAddress: "0xe5815d5902Ad612d49283DEdEc02100Bd44C2772",
2283 firstPubKey: "0x03e723e5b3aa7d72213f01139aa4783e1b34f74e1a04534e3fd8e29bfe2768af8a",
2284 firstPrivKey: "0x8f253078b73d7498302bb78c171b23ce7a8fb511987d2b2702b731638a4a15e7",
2286 testNetwork(done, params);
2289 // BIP39 seed is set from phrase
2290 it('Sets the bip39 seed
from the prhase
', function(done) {
2291 driver.findElement(By.css('.phrase
'))
2292 .sendKeys('abandon abandon ability
');
2293 driver.sleep(generateDelay).then(function() {
2294 driver.findElement(By.css('.seed
'))
2295 .getAttribute("value")
2296 .then(function(seed) {
2297 expect(seed).toBe("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3");
2303 // BIP32 root key is set from phrase
2304 it('Sets the bip39 root key
from the prhase
', function(done) {
2305 driver.findElement(By.css('.phrase
'))
2306 .sendKeys('abandon abandon ability
');
2307 driver.sleep(generateDelay).then(function() {
2308 driver.findElement(By.css('.root
-key
'))
2309 .getAttribute("value")
2310 .then(function(seed) {
2311 expect(seed).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
2317 // Tabs show correct addresses when changed
2318 it('Shows the correct address when tab is changed
', function(done) {
2319 driver.findElement(By.css('.phrase
'))
2320 .sendKeys('abandon abandon ability
');
2321 driver.sleep(generateDelay).then(function() {
2322 driver.findElement(By.css('#bip32
-tab a
'))
2324 driver.sleep(generateDelay).then(function() {
2325 getFirstAddress(function(address) {
2326 expect(address).toBe("17uQ7s2izWPwBmEVFikTmZUjbBKWYdJchz");
2333 // BIP44 derivation path is shown
2334 it('Shows the derivation path
for bip44 tab
', function(done) {
2335 driver.findElement(By.css('.phrase
'))
2336 .sendKeys('abandon abandon ability
');
2337 driver.sleep(generateDelay).then(function() {
2338 driver.findElement(By.css('#bip44
.path
'))
2339 .getAttribute("value")
2340 .then(function(path) {
2341 expect(path).toBe("m/44'/0'/0'/0");
2347 // BIP44 extended private key is shown
2348 it('Shows the extended private key for bip44 tab', function(done) {
2349 driver.findElement(By.css('.phrase'))
2350 .sendKeys('abandon abandon ability');
2351 driver.sleep(generateDelay).then(function() {
2352 driver.findElement(By.css('.extended-priv-key'))
2353 .getAttribute("value
")
2354 .then(function(path) {
2355 expect(path).toBe("xprvA2DxxvPZcyRvYgZMGS53nadR32mVDeCyqQYyFhrCVbJNjPoxMeVf7QT5g7mQASbTf9Kp4cryvcXnu2qurjWKcrdsr91jXymdCDNxKgLFKJG
");
2361 // BIP44 extended public key is shown
2362 it('Shows the extended public key for bip44 tab', function(done) {
2363 driver.findElement(By.css('.phrase'))
2364 .sendKeys('abandon abandon ability');
2365 driver.sleep(generateDelay).then(function() {
2366 driver.findElement(By.css('.extended-pub-key'))
2367 .getAttribute("value
")
2368 .then(function(path) {
2369 expect(path).toBe("xpub6FDKNRvTTLzDmAdpNTc49ia9b4byd6vqCdUa46Fp3vqMcC96uBoufCmZXQLiN5AK3iSCJMhf9gT2sxkpyaPepRuA7W3MujV5tGmF5VfbueM
");
2375 // BIP44 account field changes address list
2376 it('Changes the address list if bip44 account is changed', function(done) {
2377 driver.findElement(By.css('#bip44 .account'))
2379 driver.findElement(By.css('.phrase'))
2380 .sendKeys('abandon abandon ability');
2381 driver.sleep(generateDelay).then(function() {
2382 getFirstAddress(function(address) {
2383 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H
");
2389 // BIP44 change field changes address list
2390 it('Changes the address list if bip44 change is changed', function(done) {
2391 driver.findElement(By.css('#bip44 .change'))
2393 driver.findElement(By.css('.phrase'))
2394 .sendKeys('abandon abandon ability');
2395 driver.sleep(generateDelay).then(function() {
2396 getFirstAddress(function(address) {
2397 expect(address).toBe("1KAGfWgqfVbSSXY56fNQ7YnhyKuoskHtYo
");
2403 // BIP32 derivation path can be set
2404 it('Can use a custom bip32 derivation path', function(done) {
2405 driver.findElement(By.css('#bip32-tab a'))
2407 driver.findElement(By.css('#bip32 .path'))
2409 driver.findElement(By.css('#bip32 .path'))
2411 driver.findElement(By.css('.phrase'))
2412 .sendKeys('abandon abandon ability');
2413 driver.sleep(generateDelay).then(function() {
2414 getFirstAddress(function(address) {
2415 expect(address).toBe("16pYQQdLD1hH4hwTGLXBaZ9Teboi1AGL8L
");
2421 // BIP32 can use hardened derivation paths
2422 it('Can use a hardened derivation paths', function(done) {
2423 driver.findElement(By.css('#bip32-tab a'))
2425 driver.findElement(By.css('#bip32 .path'))
2427 driver.findElement(By.css('#bip32 .path'))
2429 driver.findElement(By.css('.phrase
'))
2430 .sendKeys('abandon abandon ability
');
2431 driver.sleep(generateDelay).then(function() {
2432 getFirstAddress(function(address) {
2433 expect(address).toBe("14aXZeprXAE3UUKQc4ihvwBvww2LuEoHo4");
2439 // BIP32 extended private key is shown
2440 it('Shows the BIP32 extended
private key
', function(done) {
2441 driver.findElement(By.css('#bip32
-tab a
'))
2443 driver.findElement(By.css('.phrase
'))
2444 .sendKeys('abandon abandon ability
');
2445 driver.sleep(generateDelay).then(function() {
2446 driver.findElement(By.css('.extended
-priv
-key
'))
2447 .getAttribute("value")
2448 .then(function(privKey) {
2449 expect(privKey).toBe("xprv9va99uTVE5aLiutUVLTyfxfe8v8aaXjSQ1XxZbK6SezYVuikA9MnjQVTA8rQHpNA5LKvyQBpLiHbBQiiccKiBDs7eRmBogsvq3THFeLHYbe");
2455 // BIP32 extended public key is shown
2456 it('Shows the BIP32 extended
public key
', function(done) {
2457 driver.findElement(By.css('#bip32
-tab a
'))
2459 driver.findElement(By.css('.phrase
'))
2460 .sendKeys('abandon abandon ability
');
2461 driver.sleep(generateDelay).then(function() {
2462 driver.findElement(By.css('.extended
-pub
-key
'))
2463 .getAttribute("value")
2464 .then(function(pubKey) {
2465 expect(pubKey).toBe("xpub69ZVZQzP4T8dwPxwbMzz36cNgwy4yzTHmETZMyihzzXXNi3thgg3HCow1RtY252wdw5rS8369xKnraN5Q93y3FkFfJp2XEHWUrkyXsjS93P");
2471 // Derivation path is shown in table
2472 it('Shows the derivation path
in the table
', function(done) {
2473 driver.findElement(By.css('.phrase
'))
2474 .sendKeys('abandon abandon ability
');
2475 driver.sleep(generateDelay).then(function() {
2476 getFirstPath(function(path) {
2477 expect(path).toBe("m/44'/0'/0'/0/0");
2483 // Derivation path for address can be hardened
2484 it('Can derive hardened addresses', function(done) {
2485 driver.findElement(By.css('#bip32-tab a'))
2487 driver.executeScript(function() {
2488 $(".hardened
-addresses
").prop("checked
", true);
2490 driver.findElement(By.css('.phrase'))
2491 .sendKeys('abandon abandon ability');
2492 driver.sleep(generateDelay).then(function() {
2493 getFirstAddress(function(address) {
2494 expect(address).toBe("18exLzUv7kfpiXRzmCjFDoC9qwNLFyvwyd
");
2500 // Derivation path visibility can be toggled
2501 it('Can toggle visibility of the derivation path column', function(done) {
2502 driver.findElement(By.css('.phrase'))
2503 .sendKeys('abandon abandon ability');
2504 driver.sleep(generateDelay).then(function() {
2505 driver.findElement(By.css('.index-toggle'))
2507 testColumnValuesAreInvisible(done, "index
");
2512 it('Shows the address in the table', function(done) {
2513 driver.findElement(By.css('.phrase'))
2514 .sendKeys('abandon abandon ability');
2515 driver.sleep(generateDelay).then(function() {
2516 getFirstAddress(function(address) {
2517 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
2523 // Addresses are shown in order of derivation path
2524 it('Shows the address in order of derivation path', function(done) {
2525 driver.findElement(By.css('.phrase'))
2526 .sendKeys('abandon abandon ability');
2527 driver.sleep(generateDelay).then(function() {
2528 testRowsAreInCorrectOrder(done);
2532 // Address visibility can be toggled
2533 it('Can toggle visibility of the address column', function(done) {
2534 driver.findElement(By.css('.phrase'))
2535 .sendKeys('abandon abandon ability');
2536 driver.sleep(generateDelay).then(function() {
2537 driver.findElement(By.css('.address-toggle'))
2539 testColumnValuesAreInvisible(done, "address
");
2543 // Public key is shown in table
2544 it('Shows the public key in the table', function(done) {
2545 driver.findElement(By.css('.phrase'))
2546 .sendKeys('abandon abandon ability');
2547 driver.sleep(generateDelay).then(function() {
2548 driver.findElements(By.css('.pubkey'))
2549 .then(function(els) {
2551 .then(function(pubkey) {
2552 expect(pubkey).toBe("033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3
");
2559 // Public key visibility can be toggled
2560 it('Can toggle visibility of the public key column', function(done) {
2561 driver.findElement(By.css('.phrase'))
2562 .sendKeys('abandon abandon ability');
2563 driver.sleep(generateDelay).then(function() {
2564 driver.findElement(By.css('.public-key-toggle'))
2566 testColumnValuesAreInvisible(done, "pubkey
");
2570 // Private key is shown in table
2571 it('Shows the private key in the table', function(done) {
2572 driver.findElement(By.css('.phrase'))
2573 .sendKeys('abandon abandon ability');
2574 driver.sleep(generateDelay).then(function() {
2575 driver.findElements(By.css('.privkey'))
2576 .then(function(els) {
2578 .then(function(pubkey) {
2579 expect(pubkey).toBe("L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE
");
2586 // Private key visibility can be toggled
2587 it('Can toggle visibility of the private key column', function(done) {
2588 driver.findElement(By.css('.phrase'))
2589 .sendKeys('abandon abandon ability');
2590 driver.sleep(generateDelay).then(function() {
2591 driver.findElement(By.css('.private-key-toggle'))
2593 testColumnValuesAreInvisible(done, "privkey
");
2597 // More addresses can be generated
2598 it('Can generate more rows in the table', function(done) {
2599 driver.findElement(By.css('.phrase'))
2600 .sendKeys('abandon abandon ability');
2601 driver.sleep(generateDelay).then(function() {
2602 driver.findElement(By.css('.more'))
2604 driver.sleep(generateDelay).then(function() {
2605 driver.findElements(By.css('.address'))
2606 .then(function(els) {
2607 expect(els.length).toBe(40);
2614 // A custom number of additional addresses can be generated
2615 it('Can generate more rows in the table', function(done) {
2616 driver.findElement(By.css('.phrase'))
2617 .sendKeys('abandon abandon ability');
2618 driver.sleep(generateDelay).then(function() {
2619 driver.findElement(By.css('.rows-to-add'))
2621 driver.findElement(By.css('.rows-to-add'))
2623 driver.findElement(By.css('.more'))
2625 driver.sleep(generateDelay).then(function() {
2626 driver.findElements(By.css('.address'))
2627 .then(function(els) {
2628 expect(els.length).toBe(21);
2635 // Additional addresses are shown in order of derivation path
2636 it('Shows additional addresses in order of derivation path', function(done) {
2637 driver.findElement(By.css('.phrase'))
2638 .sendKeys('abandon abandon ability');
2639 driver.sleep(generateDelay).then(function() {
2640 driver.findElement(By.css('.more'))
2642 driver.sleep(generateDelay).then(function() {
2643 testRowsAreInCorrectOrder(done);
2648 // BIP32 root key can be set by the user
2649 it('Allows the user to set the BIP32 root key', function(done) {
2650 driver.findElement(By.css('.root-key'))
2651 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2652 driver.sleep(generateDelay).then(function() {
2653 getFirstAddress(function(address) {
2654 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
2660 // Setting BIP32 root key clears the existing phrase, passphrase and seed
2661 it('Confirms the existing phrase should be cleared', function(done) {
2662 driver.findElement(By.css('.phrase'))
2663 .sendKeys('A non-blank but invalid value');
2664 driver.findElement(By.css('.root-key'))
2665 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2666 driver.switchTo().alert().accept();
2667 driver.findElement(By.css('.phrase'))
2668 .getAttribute("value
").then(function(value) {
2669 expect(value).toBe("");
2674 // Clearing of phrase, passphrase and seed can be cancelled by user
2675 it('Allows the clearing of the phrase to be cancelled', function(done) {
2676 driver.findElement(By.css('.phrase'))
2677 .sendKeys('abandon abandon ability');
2678 driver.sleep(generateDelay).then(function() {
2679 driver.findElement(By.css('.root-key'))
2681 driver.findElement(By.css('.root-key'))
2683 driver.switchTo().alert().dismiss();
2684 driver.findElement(By.css('.phrase'))
2685 .getAttribute("value
").then(function(value) {
2686 expect(value).toBe("abandon abandon ability
");
2692 // Custom BIP32 root key is used when changing the derivation path
2693 it('Can set derivation path for root key instead of phrase', function(done) {
2694 driver.findElement(By.css('#bip44 .account'))
2696 driver.findElement(By.css('.root-key'))
2697 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2698 driver.sleep(generateDelay).then(function() {
2699 getFirstAddress(function(address) {
2700 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H
");
2706 // Incorrect mnemonic shows error
2707 it('Shows an error for incorrect mnemonic', function(done) {
2708 driver.findElement(By.css('.phrase'))
2709 .sendKeys('abandon abandon abandon');
2710 driver.sleep(feedbackDelay).then(function() {
2711 driver.findElement(By.css('.feedback'))
2713 .then(function(feedback) {
2714 expect(feedback).toBe("Invalid mnemonic
");
2720 // Incorrect word shows suggested replacement
2721 it('Shows word suggestion for incorrect word', function(done) {
2722 driver.findElement(By.css('.phrase'))
2723 .sendKeys('abandon abandon abiliti');
2724 driver.sleep(feedbackDelay).then(function() {
2725 driver.findElement(By.css('.feedback'))
2727 .then(function(feedback) {
2728 var msg = "abiliti not
in wordlist
, did you mean ability
?";
2729 expect(feedback).toBe(msg);
2735 // Github pull request 48
2736 // First four letters of word shows that word, not closest
2737 // since first four letters gives unique word in BIP39 wordlist
2738 // eg ille should show illegal, not idle
2739 it('Shows word suggestion based on first four chars', function(done) {
2740 driver.findElement(By.css('.phrase'))
2742 driver.sleep(feedbackDelay).then(function() {
2743 driver.findElement(By.css('.feedback'))
2745 .then(function(feedback) {
2746 var msg = "ille not
in wordlist
, did you mean illegal
?";
2747 expect(feedback).toBe(msg);
2753 // Incorrect BIP32 root key shows error
2754 it('Shows error for incorrect root key', function(done) {
2755 driver.findElement(By.css('.root-key'))
2756 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpj');
2757 driver.sleep(feedbackDelay).then(function() {
2758 driver.findElement(By.css('.feedback'))
2760 .then(function(feedback) {
2761 var msg = "Invalid root key
";
2762 expect(feedback).toBe(msg);
2768 // Derivation path not starting with m shows error
2769 it('Shows error for derivation path not starting with m', function(done) {
2770 driver.findElement(By.css('#bip32-tab a'))
2772 driver.findElement(By.css('#bip32 .path'))
2774 driver.findElement(By.css('#bip32 .path'))
2776 driver.findElement(By.css('.phrase'))
2777 .sendKeys('abandon abandon ability');
2778 driver.sleep(feedbackDelay).then(function() {
2779 driver.findElement(By.css('.feedback'))
2781 .then(function(feedback) {
2782 var msg = "First character must be
'm'";
2783 expect(feedback).toBe(msg);
2789 // Derivation path containing invalid characters shows useful error
2790 it('Shows error for derivation path not starting with m', function(done) {
2791 driver.findElement(By.css('#bip32-tab a'))
2793 driver.findElement(By.css('#bip32 .path'))
2795 driver.findElement(By.css('#bip32 .path'))
2796 .sendKeys('m/1/0wrong1/1');
2797 driver.findElement(By.css('.phrase'))
2798 .sendKeys('abandon abandon ability');
2799 driver.sleep(feedbackDelay).then(function() {
2800 driver.findElement(By.css('.feedback'))
2802 .then(function(feedback) {
2803 var msg = "Invalid characters
0wrong1 found at depth
2";
2804 expect(feedback).toBe(msg);
2810 // Github Issue 11: Default word length is 15
2811 // https://github.com/iancoleman/bip39/issues/11
2812 it('Sets the default word length to 15', function(done) {
2813 driver.findElement(By.css('.strength'))
2814 .getAttribute("value
")
2815 .then(function(strength) {
2816 expect(strength).toBe("15");
2821 // Github Issue 12: Generate more rows with private keys hidden
2822 // https://github.com/iancoleman/bip39/issues/12
2823 it('Sets the correct hidden column state on new rows', function(done) {
2824 driver.findElement(By.css('.phrase'))
2825 .sendKeys("abandon abandon ability
");
2826 driver.sleep(generateDelay).then(function() {
2827 driver.findElement(By.css('.private-key-toggle'))
2829 driver.findElement(By.css('.more'))
2831 driver.sleep(generateDelay).then(function() {
2832 driver.findElements(By.css('.privkey'))
2833 .then(function(els) {
2834 expect(els.length).toBe(40);
2836 testColumnValuesAreInvisible(done, "privkey
");
2841 // Github Issue 19: Mnemonic is not sensitive to whitespace
2842 // https://github.com/iancoleman/bip39/issues/19
2843 it('Ignores excess whitespace in the mnemonic', function(done) {
2844 var doublespace = " ";
2845 var mnemonic = "urge cat
" + doublespace + "bid
";
2846 driver.findElement(By.css('.phrase'))
2847 .sendKeys(mnemonic);
2848 driver.sleep(generateDelay).then(function() {
2849 driver.findElement(By.css('.root-key'))
2850 .getAttribute("value
")
2851 .then(function(seed) {
2852 expect(seed).toBe("xprv9s21ZrQH143K3isaZsWbKVoTtbvd34Y1ZGRugGdMeBGbM3AgBVzTH159mj1cbbtYSJtQr65w6L5xy5L9SFC7c9VJZWHxgAzpj4mun5LhrbC
");
2858 // Github Issue 23: Part 1: Use correct derivation path when changing tabs
2859 // https://github.com/iancoleman/bip39/issues/23
2860 // This test was failing for default timeout of 5000ms so changed it to +10s
2861 it('Uses the correct derivation path when changing tabs', function(done) {
2862 // 1) and 2) set the phrase
2863 driver.findElement(By.css('.phrase'))
2864 .sendKeys("abandon abandon ability
");
2865 driver.sleep(generateDelay).then(function() {
2866 // 3) select bip32 tab
2867 driver.findElement(By.css('#bip32-tab a'))
2869 driver.sleep(generateDelay).then(function() {
2870 // 4) switch from bitcoin to litecoin
2871 selectNetwork("LTC
- Litecoin
");
2872 driver.sleep(generateDelay).then(function() {
2873 // 5) Check address is displayed correctly
2874 getFirstAddress(function(address) {
2875 expect(address).toBe("LS8MP5LZ5AdzSZveRrjm3aYVoPgnfFh5T5
");
2876 // 5) Check derivation path is displayed correctly
2877 getFirstPath(function(path) {
2878 expect(path).toBe("m
/0/0");
2885 }, generateDelay + 10000);
2887 // Github Issue 23 Part 2: Coin selection in derivation path
2888 // https://github.com/iancoleman/bip39/issues/23#issuecomment-238011920
2889 it('Uses the correct derivation path when changing coins', function(done) {
2891 driver.findElement(By.css('.phrase'))
2892 .sendKeys("abandon abandon ability
");
2893 driver.sleep(generateDelay).then(function() {
2894 // switch from bitcoin to clam
2895 selectNetwork("CLAM
- Clams
");
2896 driver.sleep(generateDelay).then(function() {
2897 // check derivation path is displayed correctly
2898 getFirstPath(function(path) {
2899 expect(path).toBe("m
/44'/23'/0'/0/0");
2906 // Github Issue 26: When using a Root key derrived altcoins are incorrect
2907 // https://github.com/iancoleman/bip39/issues/26
2908 it('Uses the correct derivation for altcoins with root keys', function(done) {
2909 // 1) 2) and 3) set the root key
2910 driver.findElement(By.css('.root-key'))
2911 .sendKeys("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi
");
2912 driver.sleep(generateDelay).then(function() {
2913 // 4) switch from bitcoin to viacoin
2914 selectNetwork("VIA
- Viacoin
");
2915 driver.sleep(generateDelay).then(function() {
2916 // 5) ensure the derived address is correct
2917 getFirstAddress(function(address) {
2918 expect(address).toBe("Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT
");
2925 // Selecting a language with no existing phrase should generate a phrase in
2927 it('Generate a random phrase when language is selected and no current phrase', function(done) {
2928 driver.findElement(By.css("a
[href
='#japanese']"))
2930 driver.sleep(generateDelay).then(function() {
2931 driver.findElement(By.css(".phrase
"))
2932 .getAttribute("value
").then(function(phrase) {
2933 expect(phrase.search(/[a-z]/)).toBe(-1);
2934 expect(phrase.length).toBeGreaterThan(0);
2940 // Selecting a language with existing phrase should update the phrase to use
2942 it('Updates existing phrases when the language is changed', function(done) {
2943 driver.findElement(By.css(".phrase
"))
2944 .sendKeys("abandon abandon ability
");
2945 driver.sleep(generateDelay).then(function() {
2946 driver.findElement(By.css("a
[href
='#italian']"))
2948 driver.sleep(generateDelay).then(function() {
2949 driver.findElement(By.css(".phrase
"))
2950 .getAttribute("value
").then(function(phrase) {
2951 // Check only the language changes, not the phrase
2952 expect(phrase).toBe("abaco abaco abbaglio
");
2953 getFirstAddress(function(address) {
2954 // Check the address is correct
2955 expect(address).toBe("1Dz5TgDhdki9spa6xbPFbBqv5sjMrx3xgV
");
2963 // Suggested replacement for erroneous word in non-English language
2964 it('Shows word suggestion for incorrect word in non-English language', function(done) {
2965 driver.findElement(By.css('.phrase'))
2966 .sendKeys('abaco abaco zbbaglio');
2967 driver.sleep(feedbackDelay).then(function() {
2968 driver.findElement(By.css('.feedback'))
2970 .then(function(feedback) {
2971 var msg = "zbbaglio not
in wordlist
, did you mean abbaglio
?";
2972 expect(feedback).toBe(msg);
2978 // Japanese word does not break across lines.
2980 // https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md#japanese
2981 it('Does not break Japanese words across lines', function(done) {
2982 driver.findElement(By.css('.phrase'))
2983 .getCssValue("word
-break")
2984 .then(function(value) {
2985 expect(value).toBe("keep
-all
");
2990 // Language can be specified at page load using hash value in url
2991 it('Can set the language from the url hash', function(done) {
2992 driver.get(url + "#japanese
").then(function() {
2993 driver.findElement(By.css('.generate')).click();
2994 driver.sleep(generateDelay).then(function() {
2995 driver.findElement(By.css(".phrase
"))
2996 .getAttribute("value
").then(function(phrase) {
2997 expect(phrase.search(/[a-z]/)).toBe(-1);
2998 expect(phrase.length).toBeGreaterThan(0);
3005 // Entropy can be entered by the user
3006 it('Allows entropy to be entered', function(done) {
3007 driver.findElement(By.css('.use-entropy'))
3009 driver.findElement(By.css('.entropy'))
3010 .sendKeys('00000000 00000000 00000000 00000000');
3011 driver.sleep(generateDelay).then(function() {
3012 driver.findElement(By.css(".phrase
"))
3013 .getAttribute("value
").then(function(phrase) {
3014 expect(phrase).toBe("abandon abandon ability
");
3015 getFirstAddress(function(address) {
3016 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
3023 // A warning about entropy is shown to the user, with additional information
3024 it('Shows a warning about using entropy', function(done) {
3025 driver.findElement(By.css('.use-entropy'))
3027 driver.findElement(By.css('.entropy-container'))
3029 .then(function(containerText) {
3030 var warning = "mnemonic may be insecure
";
3031 expect(containerText).toContain(warning);
3032 driver.findElement(By.css('#entropy-notes'))
3033 .findElement(By.xpath("parent::*"))
3035 .then(function(notesText) {
3036 var detail = "flipping a fair coin
, rolling a fair dice
, noise measurements etc
";
3037 expect(notesText).toContain(detail);
3043 // The types of entropy available are described to the user
3044 it('Shows the types of entropy available', function(done) {
3045 driver.findElement(By.css('.entropy'))
3046 .getAttribute("placeholder
")
3047 .then(function(placeholderText) {
3056 for (var i=0; i<options.length; i++) {
3057 var option = options[i];
3058 expect(placeholderText).toContain(option);
3064 // The actual entropy used is shown to the user
3065 it('Shows the actual entropy used', function(done) {
3066 driver.findElement(By.css('.use-entropy'))
3068 driver.findElement(By.css('.entropy'))
3069 .sendKeys('Not A Very Good Entropy Source At All');
3070 driver.sleep(generateDelay).then(function() {
3071 driver.findElement(By.css('.entropy-container'))
3073 .then(function(text) {
3074 expect(text).toMatch(/Filtered Entropy\s+AedEceAA/);
3080 // Binary entropy can be entered
3081 it('Allows binary entropy to be entered', function(done) {
3082 testEntropyType(done, "01", "binary
");
3085 // Base 6 entropy can be entered
3086 it('Allows base 6 entropy to be entered', function(done) {
3087 testEntropyType(done, "012345", "base
6");
3090 // Base 6 dice entropy can be entered
3091 it('Allows base 6 dice entropy to be entered', function(done) {
3092 testEntropyType(done, "123456", "base
6 (dice
)");
3095 // Base 10 entropy can be entered
3096 it('Allows base 10 entropy to be entered', function(done) {
3097 testEntropyType(done, "789", "base
10");
3100 // Hexadecimal entropy can be entered
3101 it('Allows hexadecimal entropy to be entered', function(done) {
3102 testEntropyType(done, "abcdef
", "hexadecimal
");
3105 // Dice entropy value is shown as the converted base 6 value
3106 // ie 123456 is converted to 123450
3107 it('Shows dice entropy as base 6', function(done) {
3108 driver.findElement(By.css('.use-entropy'))
3110 driver.findElement(By.css('.entropy'))
3111 .sendKeys("123456");
3112 driver.sleep(generateDelay).then(function() {
3113 driver.findElement(By.css('.entropy-container'))
3115 .then(function(text) {
3116 expect(text).toMatch(/Filtered Entropy\s+123450/);
3122 // The number of bits of entropy accumulated is shown
3123 it("Shows the number
of bits
of entropy
for 20 bits
of binary
", function(done) {
3124 testEntropyBits(done, "0000 0000 0000 0000 0000", "20");
3126 it("Shows the number
of bits
of entropy
for 1 bit
of binary
", function(done) {
3127 testEntropyBits(done, "0", "1");
3129 it("Shows the number
of bits
of entropy
for 4 bits
of binary
", function(done) {
3130 testEntropyBits(done, "0000", "4");
3132 it("Shows the number
of bits
of entropy
for 1 character
of base
6 (dice
)", function(done) {
3133 // 6 in card is 0 in base 6, 0 in base 6 is 2.6 bits (rounded down to 2 bits)
3134 testEntropyBits(done, "6", "2");
3136 it("Shows the number
of bits
of entropy
for 1 character
of base
10 with 3 bits
", function(done) {
3137 // 7 in base 10 is 111 in base 2, no leading zeros
3138 testEntropyBits(done, "7", "3");
3140 it("Shows the number
of bits
of entropy
for 1 character
of base
10 with 4 bis
", function(done) {
3141 testEntropyBits(done, "8", "4");
3143 it("Shows the number
of bits
of entropy
for 1 character
of hex
", function(done) {
3144 testEntropyBits(done, "F
", "4");
3146 it("Shows the number
of bits
of entropy
for 2 characters
of base
10", function(done) {
3147 testEntropyBits(done, "29", "6");
3149 it("Shows the number
of bits
of entropy
for 2 characters
of hex
", function(done) {
3150 testEntropyBits(done, "0A
", "8");
3152 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 3 leading zeros
", function(done) {
3153 // hex is always multiple of 4 bits of entropy
3154 testEntropyBits(done, "1A
", "8");
3156 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 2 leading zeros
", function(done) {
3157 testEntropyBits(done, "2A
", "8");
3159 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 1 leading zero
", function(done) {
3160 testEntropyBits(done, "4A
", "8");
3162 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with no leading zeros
", function(done) {
3163 testEntropyBits(done, "8A
", "8");
3165 it("Shows the number
of bits
of entropy
for 2 characters
of hex starting
with F
", function(done) {
3166 testEntropyBits(done, "FA
", "8");
3168 it("Shows the number
of bits
of entropy
for 4 characters
of hex
with leading zeros
", function(done) {
3169 testEntropyBits(done, "000A
", "16");
3171 it("Shows the number
of bits
of entropy
for 4 characters
of base
6", function(done) {
3172 testEntropyBits(done, "5555", "11");
3174 it("Shows the number
of bits
of entropy
for 4 characters
of base
6 dice
", function(done) {
3175 // uses dice, so entropy is actually 0000 in base 6, which is 4 lots of
3176 // 2.58 bits, which is 10.32 bits (rounded down to 10 bits)
3177 testEntropyBits(done, "6666", "10");
3179 it("Shows the number
of bits
of entropy
for 4 charactes
of base
10", function(done) {
3180 // Uses base 10, which is 4 lots of 3.32 bits, which is 13.3 bits (rounded
3182 testEntropyBits(done, "2227", "13");
3184 it("Shows the number
of bits
of entropy
for 4 characters
of hex
with 2 leading zeros
", function(done) {
3185 testEntropyBits(done, "222F
", "16");
3187 it("Shows the number
of bits
of entropy
for 4 characters
of hex starting
with F
", function(done) {
3188 testEntropyBits(done, "FFFF
", "16");
3190 it("Shows the number
of bits
of entropy
for 10 characters
of base
10", function(done) {
3191 // 10 events at 3.32 bits per event
3192 testEntropyBits(done, "0000101017", "33");
3194 it("Shows the number
of bits
of entropy
for a full deck
of cards
", function(done) {
3195 // cards are not replaced, so a full deck is not 52^52 entropy which is 296
3196 // bits, it's 52!, which is 225 bits
3197 testEntropyBits(done, "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
", "225");
3200 it("Shows details about the entered entropy
", function(done) {
3201 testEntropyFeedback(done,
3205 type: "hexadecimal
",
3209 strength: "less than a second
",
3213 it("Shows details about the entered entropy
", function(done) {
3214 testEntropyFeedback(done,
3216 entropy: "AAAAAAAA
",
3217 filtered: "AAAAAAAA
",
3218 type: "hexadecimal
",
3222 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3226 it("Shows details about the entered entropy
", function(done) {
3227 testEntropyFeedback(done,
3229 entropy: "AAAAAAAA B
",
3230 filtered: "AAAAAAAAB
",
3231 type: "hexadecimal
",
3235 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3239 it("Shows details about the entered entropy
", function(done) {
3240 testEntropyFeedback(done,
3242 entropy: "AAAAAAAA BBBBBBBB
",
3243 filtered: "AAAAAAAABBBBBBBB
",
3244 type: "hexadecimal
",
3248 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3252 it("Shows details about the entered entropy
", function(done) {
3253 testEntropyFeedback(done,
3255 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC
",
3256 filtered: "AAAAAAAABBBBBBBBCCCCCCCC
",
3257 type: "hexadecimal
",
3261 strength: "less than a second
",
3265 it("Shows details about the entered entropy
", function(done) {
3266 testEntropyFeedback(done,
3268 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
",
3269 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD
",
3270 type: "hexadecimal
",
3274 strength: "2 minutes
",
3278 it("Shows details about the entered entropy
", function(done) {
3279 testEntropyFeedback(done,
3281 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA
",
3282 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDA
",
3283 type: "hexadecimal
",
3291 it("Shows details about the entered entropy
", function(done) {
3292 testEntropyFeedback(done,
3294 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE
",
3295 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEE
",
3296 type: "hexadecimal
",
3300 strength: "3 years
",
3304 it("Shows details about the entered entropy
", function(done) {
3305 testEntropyFeedback(done,
3307 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF
",
3308 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEEFFFFFFFF
",
3309 type: "hexadecimal
",
3313 strength: "centuries
",
3317 it("Shows details about the entered entropy
", function(done) {
3318 testEntropyFeedback(done,
3325 strength: "less than a second
",
3329 it("Shows details about the entered entropy
", function(done) {
3330 testEntropyFeedback(done,
3332 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3333 type: "card (full deck
)",
3337 strength: "centuries
",
3341 it("Shows details about the entered entropy
", function(done) {
3342 testEntropyFeedback(done,
3344 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d
",
3345 type: "card (full deck
, 1 duplicate: 3d
)",
3349 strength: "centuries
",
3353 it("Shows details about the entered entropy
", function(done) {
3354 testEntropyFeedback(done,
3356 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d
",
3357 type: "card (2 duplicates: 3d
4d
, 1 missing: KS
)",
3361 strength: "centuries
",
3365 it("Shows details about the entered entropy
", function(done) {
3366 testEntropyFeedback(done,
3368 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d
",
3369 type: "card (4 duplicates: 3d
4d
5d
..., 1 missing: KS
)",
3373 strength: "centuries
",
3377 it("Shows details about the entered entropy
", function(done) {
3378 testEntropyFeedback(done,
3379 // Next test was throwing uncaught error in zxcvbn
3380 // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2
3382 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsksac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3383 type: "card (full deck
, 52 duplicates: ac
2c
3c
...)",
3387 strength: "centuries
",
3391 it("Shows details about the entered entropy
", function(done) {
3392 testEntropyFeedback(done,
3393 // Case insensitivity to duplicate cards
3396 type: "card (1 duplicate: AS
)",
3400 strength: "less than a second
",
3404 it("Shows details about the entered entropy
", function(done) {
3405 testEntropyFeedback(done,
3408 type: "card (1 duplicate: as
)",
3412 strength: "less than a second
",
3416 it("Shows details about the entered entropy
", function(done) {
3417 testEntropyFeedback(done,
3418 // Missing cards are detected
3420 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3421 type: "card (1 missing: 9C
)",
3425 strength: "centuries
",
3429 it("Shows details about the entered entropy
", function(done) {
3430 testEntropyFeedback(done,
3432 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3433 type: "card (2 missing: 9C
5D
)",
3437 strength: "centuries
",
3441 it("Shows details about the entered entropy
", function(done) {
3442 testEntropyFeedback(done,
3444 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d7d8d9dtdjd kdah2h3h
5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3445 type: "card (4 missing: 9C
5D QD
...)",
3449 strength: "centuries
",
3453 it("Shows details about the entered entropy
", function(done) {
3454 testEntropyFeedback(done,
3455 // More than six missing cards does not show message
3457 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d
8d9d jd kdah2h3h
5h6h7h8h9hthjhqhkh
2s3s4s5s6s7s8s9stsjsqsks
",
3462 strength: "centuries
",
3466 it("Shows details about the entered entropy
", function(done) {
3467 testEntropyFeedback(done,
3468 // Multiple decks of cards increases bits per event
3473 bitsPerEvent: "4.34",
3477 it("Shows details about the entered entropy
", function(done) {
3478 testEntropyFeedback(done,
3483 bitsPerEvent: "4.80",
3487 it("Shows details about the entered entropy
", function(done) {
3488 testEntropyFeedback(done,
3493 bitsPerEvent: "5.01",
3497 it("Shows details about the entered entropy
", function(done) {
3498 testEntropyFeedback(done,
3500 entropy: "3d3d3d3d
",
3503 bitsPerEvent: "5.14",
3507 it("Shows details about the entered entropy
", function(done) {
3508 testEntropyFeedback(done,
3510 entropy: "3d3d3d3d3d
",
3513 bitsPerEvent: "5.22",
3517 it("Shows details about the entered entropy
", function(done) {
3518 testEntropyFeedback(done,
3520 entropy: "3d3d3d3d3d3d
",
3523 bitsPerEvent: "5.28",
3527 it("Shows details about the entered entropy
", function(done) {
3528 testEntropyFeedback(done,
3530 entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d
",
3533 bitsPerEvent: "5.59",
3534 strength: 'less than a second - Repeats like "abcabcabc
" are only slightly harder to guess than "abc
"',
3539 // Entropy is truncated from the left
3540 it('Truncates entropy from the left', function(done) {
3541 // Truncate from left means 0000 is removed from the start
3542 // which gives mnemonic 'avocado zoo zone'
3543 // not 1111 removed from the end
3544 // which gives the mnemonic 'abstract zoo zoo'
3545 var entropy = "00000000 00000000 00000000 00000000";
3546 entropy += "11111111 11111111 11111111 1111"; // Missing last byte
3547 driver.findElement(By.css('.use-entropy'))
3549 driver.findElement(By.css('.entropy'))
3551 driver.sleep(generateDelay).then(function() {
3552 driver.findElement(By.css(".phrase
"))
3553 .getAttribute("value
").then(function(phrase) {
3554 expect(phrase).toBe("avocado zoo zone
");
3560 // Very large entropy results in very long mnemonics
3561 it('Converts very long entropy to very long mnemonics', function(done) {
3563 for (var i=0; i<33; i++) {
3564 entropy += "AAAAAAAA
"; // 3 words * 33 iterations = 99 words
3566 driver.findElement(By.css('.use-entropy'))
3568 driver.findElement(By.css('.entropy'))
3570 driver.sleep(generateDelay).then(function() {
3571 driver.findElement(By.css(".phrase
"))
3572 .getAttribute("value
").then(function(phrase) {
3573 var wordCount = phrase.split(/\s+/g).length;
3574 expect(wordCount).toBe(99);
3580 // Is compatible with bip32jp entropy
3581 // https://bip32jp.github.io/english/index.html
3583 // Is incompatible with:
3585 it('Is compatible with bip32jp.github.io', function(done) {
3586 var entropy = "543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543";
3587 var expectedPhrase = "train then jungle barely whip fiber purpose puppy eagle cloud clump hospital robot brave balcony utility detect estate old green desk skill multiply virus
";
3588 driver.findElement(By.css('.use-entropy'))
3590 driver.findElement(By.css('.entropy'))
3592 driver.sleep(generateDelay).then(function() {
3593 driver.findElement(By.css(".phrase
"))
3594 .getAttribute("value
").then(function(phrase) {
3595 expect(phrase).toBe(expectedPhrase);
3601 // Blank entropy does not generate mnemonic or addresses
3602 it('Does not generate mnemonic for blank entropy', function(done) {
3603 driver.findElement(By.css('.use-entropy'))
3605 driver.findElement(By.css('.entropy'))
3607 // check there is no mnemonic
3608 driver.sleep(generateDelay).then(function() {
3609 driver.findElement(By.css(".phrase
"))
3610 .getAttribute("value
").then(function(phrase) {
3611 expect(phrase).toBe("");
3612 // check there is no mnemonic
3613 driver.findElements(By.css(".address
"))
3614 .then(function(addresses) {
3615 expect(addresses.length).toBe(0);
3616 // Check the feedback says 'blank entropy'
3617 driver.findElement(By.css(".feedback
"))
3619 .then(function(feedbackText) {
3620 expect(feedbackText).toBe("Blank entropy
");
3628 // Mnemonic length can be selected even for weak entropy
3629 it('Allows selection of mnemonic length even for weak entropy', function(done) {
3630 driver.findElement(By.css('.use-entropy'))
3632 driver.executeScript(function() {
3633 $(".mnemonic
-length
").val("18").trigger("change
");
3635 driver.findElement(By.css('.entropy'))
3636 .sendKeys("012345");
3637 driver.sleep(generateDelay).then(function() {
3638 driver.findElement(By.css(".phrase
"))
3639 .getAttribute("value
").then(function(phrase) {
3640 var wordCount = phrase.split(/\s+/g).length;
3641 expect(wordCount).toBe(18);
3648 // https://github.com/iancoleman/bip39/issues/33
3649 // Final cards should contribute entropy
3650 it('Uses as much entropy as possible for the mnemonic', function(done) {
3651 driver.findElement(By.css('.use-entropy'))
3653 driver.findElement(By.css('.entropy'))
3654 .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
");
3655 driver.sleep(generateDelay).then(function() {
3657 driver.findElement(By.css(".phrase
"))
3658 .getAttribute("value
").then(function(originalPhrase) {
3659 // Set the last 12 cards to be AS
3660 driver.findElement(By.css('.entropy'))
3662 driver.findElement(By.css('.entropy'))
3663 .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
");
3664 driver.sleep(generateDelay).then(function() {
3666 driver.findElement(By.css(".phrase
"))
3667 .getAttribute("value
").then(function(newPhrase) {
3668 expect(originalPhrase).not.toEqual(newPhrase);
3677 // https://github.com/iancoleman/bip39/issues/35
3679 // TODO this doesn't work in selenium with firefox
3680 // see https://stackoverflow.com/q/40360223
3681 it('Shows a qr code on hover for the phrase', function(done) {
3682 if (browser == "firefox
") {
3683 pending("Selenium
+ Firefox bug
for mouseMove
, see
https://stackoverflow.com/q/40360223");
3685 // generate a random mnemonic
3686 var generateEl
= driver
.findElement(By
.css('.generate'));
3688 // toggle qr to show (hidden by default)
3689 var phraseEl
= driver
.findElement(By
.css(".phrase"));
3691 var rootKeyEl
= driver
.findElement(By
.css(".root-key"));
3692 driver
.sleep(generateDelay
).then(function() {
3693 // hover over the root key
3694 driver
.actions().mouseMove(rootKeyEl
).perform().then(function() {
3695 // check the qr code shows
3696 driver
.executeScript(function() {
3697 return $(".qr-container").find("canvas").length
> 0;
3699 .then(function(qrShowing
) {
3700 expect(qrShowing
).toBe(true);
3701 // hover away from the phrase
3702 driver
.actions().mouseMove(generateEl
).perform().then(function() {;
3703 // check the qr code hides
3704 driver
.executeScript(function() {
3705 return $(".qr-container").find("canvas").length
== 0;
3707 .then(function(qrHidden
) {
3708 expect(qrHidden
).toBe(true);
3717 // BIP44 account extendend private key is shown
3718 // github issue 37 - compatibility with electrum
3719 it('Shows the bip44 account extended private key', function(done
) {
3720 driver
.findElement(By
.css(".phrase"))
3721 .sendKeys("abandon abandon ability");
3722 driver
.sleep(generateDelay
).then(function() {
3723 driver
.findElement(By
.css("#bip44 .account-xprv"))
3724 .getAttribute("value")
3725 .then(function(xprv
) {
3726 expect(xprv
).toBe("xprv9yzrnt4zWVJUr1k2VxSPy9ettKz5PpeDMgaVG7UKedhqnw1tDkxP2UyYNhuNSumk2sLE5ctwKZs9vwjsq3e1vo9egCK6CzP87H2cVYXpfwQ");
3732 // BIP44 account extendend public key is shown
3733 // github issue 37 - compatibility with electrum
3734 it('Shows the bip44 account extended public key', function(done
) {
3735 driver
.findElement(By
.css(".phrase"))
3736 .sendKeys("abandon abandon ability");
3737 driver
.sleep(generateDelay
).then(function() {
3738 driver
.findElement(By
.css("#bip44 .account-xpub"))
3739 .getAttribute("value")
3740 .then(function(xprv
) {
3741 expect(xprv
).toBe("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3748 // BIP32 root key can be set as an xpub
3749 it('Generates addresses from xpub as bip32 root key', function(done
) {
3750 driver
.findElement(By
.css('#bip32-tab a'))
3752 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3753 driver
.findElement(By
.css("#root-key"))
3754 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3755 driver
.sleep(generateDelay
).then(function() {
3756 // check the addresses are generated
3757 getFirstAddress(function(address
) {
3758 expect(address
).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
3759 // check the xprv key is not set
3760 driver
.findElement(By
.css(".extended-priv-key"))
3761 .getAttribute("value")
3762 .then(function(xprv
) {
3763 expect(xprv
).toBe("NA");
3764 // check the private key is not set
3765 driver
.findElements(By
.css(".privkey"))
3766 .then(function(els
) {
3769 .then(function(privkey
) {
3770 expect(xprv
).toBe("NA");
3780 // xpub for bip32 root key will not work with hardened derivation paths
3781 it('Shows error for hardened derivation paths with xpub root key', function(done
) {
3782 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3783 driver
.findElement(By
.css("#root-key"))
3784 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3785 driver
.sleep(feedbackDelay
).then(function() {
3786 // Check feedback is correct
3787 driver
.findElement(By
.css('.feedback'))
3789 .then(function(feedback
) {
3790 var msg
= "Hardened derivation path is invalid with xpub key";
3791 expect(feedback
).toBe(msg
);
3792 // Check no addresses are shown
3793 driver
.findElements(By
.css('.addresses tr'))
3794 .then(function(rows
) {
3795 expect(rows
.length
).toBe(0);
3803 // no root key shows feedback
3804 it('Shows feedback for no root key', function(done
) {
3805 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3806 driver
.findElement(By
.css('#bip32-tab a'))
3808 driver
.sleep(feedbackDelay
).then(function() {
3809 // Check feedback is correct
3810 driver
.findElement(By
.css('.feedback'))
3812 .then(function(feedback
) {
3813 expect(feedback
).toBe("Invalid root key");
3820 // display error switching tabs while addresses are generating
3821 it('Can change details while old addresses are still being generated', function(done
) {
3822 // Set to generate 199 more addresses.
3823 // This will take a long time allowing a new set of addresses to be
3824 // generated midway through this lot.
3825 // The newly generated addresses should not include any from the old set.
3826 // Any more than 199 will show an alert which needs to be accepted.
3827 driver
.findElement(By
.css('.rows-to-add'))
3829 driver
.findElement(By
.css('.rows-to-add'))
3832 driver
.findElement(By
.css('.phrase'))
3833 .sendKeys("abandon abandon ability");
3834 driver
.sleep(generateDelay
).then(function() {
3835 // change tabs which should cancel the previous generating
3836 driver
.findElement(By
.css('.rows-to-add'))
3838 driver
.findElement(By
.css('.rows-to-add'))
3840 driver
.findElement(By
.css('#bip32-tab a'))
3842 driver
.sleep(generateDelay
).then(function() {
3843 driver
.findElements(By
.css('.index'))
3844 .then(function(els
) {
3845 // check the derivation paths have the right quantity
3846 expect(els
.length
).toBe(20);
3847 // check the derivation paths are in order
3848 testRowsAreInCorrectOrder(done
);
3852 }, generateDelay
+ 10000);
3855 // padding for binary should give length with multiple of 256
3856 // hashed entropy 1111 is length 252, so requires 4 leading zeros
3857 // prior to issue 49 it would only generate 2 leading zeros, ie missing 2
3858 it('Pads hashed entropy with leading zeros', function(done
) {
3859 driver
.findElement(By
.css('.use-entropy'))
3861 driver
.executeScript(function() {
3862 $(".mnemonic-length").val("15").trigger("change");
3864 driver
.findElement(By
.css('.entropy'))
3866 driver
.sleep(generateDelay
).then(function() {
3867 driver
.findElement(By
.css('.phrase'))
3868 .getAttribute("value")
3869 .then(function(phrase
) {
3870 expect(phrase
).toBe("avocado valid quantum cross link predict excuse edit street able flame large galaxy ginger nuclear");
3876 // Github pull request 55
3877 // https://github.com/iancoleman/bip39/pull/55
3879 it('Can set the derivation path on bip32 tab for bitcoincore', function(done
) {
3880 testClientSelect(done
, {
3882 bip32path: "m/0'/0'",
3883 useHardenedAddresses: "true",
3886 it('Can set the derivation path on bip32 tab for multibit', function(done
) {
3887 testClientSelect(done
, {
3889 bip32path: "m/0'/0",
3890 useHardenedAddresses: null,
3893 it('Can set the derivation path on bip32 tab for coinomi/ledger', function(done
) {
3894 testClientSelect(done
, {
3896 bip32path: "m/44'/0'/0'",
3897 useHardenedAddresses: null,
3902 // https://github.com/iancoleman/bip39/issues/58
3903 // bip32 derivation is correct, does not drop leading zeros
3905 // https://medium.com/@alexberegszaszi/why-do-my-bip32-wallets-disagree-6f3254cc5846
3906 it('Retains leading zeros for bip32 derivation', function(done
) {
3907 driver
.findElement(By
.css(".phrase"))
3908 .sendKeys("fruit wave dwarf banana earth journey tattoo true farm silk olive fence");
3909 driver
.findElement(By
.css(".passphrase"))
3910 .sendKeys("banana");
3911 driver
.sleep(generateDelay
).then(function() {
3912 getFirstAddress(function(address
) {
3913 // Note that bitcore generates an incorrect address
3914 // 13EuKhffWkBE2KUwcbkbELZb1MpzbimJ3Y
3915 // see the medium.com link above for more details
3916 expect(address
).toBe("17rxURoF96VhmkcEGCj5LNQkmN9HVhWb7F");
3923 // Japanese mnemonics generate incorrect bip32 seed
3924 // BIP39 seed is set from phrase
3925 it('Generates correct seed for Japanese mnemonics', function(done
) {
3926 driver
.findElement(By
.css(".phrase"))
3927 .sendKeys("あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あおぞら");
3928 driver
.findElement(By
.css(".passphrase"))
3929 .sendKeys("メートルガバヴァぱばぐゞちぢ十人十色");
3930 driver
.sleep(generateDelay
).then(function() {
3931 driver
.findElement(By
.css(".seed"))
3932 .getAttribute("value")
3933 .then(function(seed
) {
3934 expect(seed
).toBe("a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55");
3940 // BIP49 official test vectors
3941 // https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#test-vectors
3942 it('Generates BIP49 addresses matching the official test vectors', function(done
) {
3943 driver
.findElement(By
.css('#bip49-tab a'))
3945 selectNetwork("BTC - Bitcoin Testnet");
3946 driver
.findElement(By
.css(".phrase"))
3947 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
3948 driver
.sleep(generateDelay
).then(function() {
3949 getFirstAddress(function(address
) {
3950 expect(address
).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
3956 // BIP49 derivation path is shown
3957 it('Shows the bip49 derivation path', function(done
) {
3958 driver
.findElement(By
.css('#bip49-tab a'))
3960 driver
.findElement(By
.css(".phrase"))
3961 .sendKeys("abandon abandon ability");
3962 driver
.sleep(generateDelay
).then(function() {
3963 driver
.findElement(By
.css('#bip49 .path'))
3964 .getAttribute("value")
3965 .then(function(path
) {
3966 expect(path
).toBe("m/49'/0'/0'/0");
3972 // BIP49 extended private key is shown
3973 it('Shows the bip49 extended private key', function(done
) {
3974 driver
.findElement(By
.css('#bip49-tab a'))
3976 driver
.findElement(By
.css(".phrase"))
3977 .sendKeys("abandon abandon ability");
3978 driver
.sleep(generateDelay
).then(function() {
3979 driver
.findElement(By
.css('.extended-priv-key'))
3980 .getAttribute("value")
3981 .then(function(xprv
) {
3982 expect(xprv
).toBe("yprvALYB4DYRG6CzzVgzQZwwqjAA2wjBGC3iEd7KYYScpoDdmf75qMRWZWxoFcRXBJjgEXdFqJ9vDRGRLJQsrL22Su5jMbNFeM9vetaGVqy9Qy2");
3988 // BIP49 extended public key is shown
3989 it('Shows the bip49 extended public key', function(done
) {
3990 driver
.findElement(By
.css('#bip49-tab a'))
3992 driver
.findElement(By
.css(".phrase"))
3993 .sendKeys("abandon abandon ability");
3994 driver
.sleep(generateDelay
).then(function() {
3995 driver
.findElement(By
.css('.extended-pub-key'))
3996 .getAttribute("value")
3997 .then(function(xprv
) {
3998 expect(xprv
).toBe("ypub6ZXXTj5K6TmJCymTWbUxCs6tayZffemZbr2vLvrEP8kceTSENtjm7KHH6thvAKxVar9fGe8rgsPEX369zURLZ68b4f7Vexz7RuXsjQ69YDt");
4004 // BIP49 account field changes address list
4005 it('Can set the bip49 account field', function(done
) {
4006 driver
.findElement(By
.css('#bip49-tab a'))
4008 driver
.findElement(By
.css('#bip49 .account'))
4010 driver
.findElement(By
.css('#bip49 .account'))
4012 driver
.findElement(By
.css(".phrase"))
4013 .sendKeys("abandon abandon ability");
4014 driver
.sleep(generateDelay
).then(function() {
4015 getFirstAddress(function(address
) {
4016 expect(address
).toBe("381wg1GGN4rP88rNC9v7QWsiww63yLVPsn");
4022 // BIP49 change field changes address list
4023 it('Can set the bip49 change field', function(done
) {
4024 driver
.findElement(By
.css('#bip49-tab a'))
4026 driver
.findElement(By
.css('#bip49 .change'))
4028 driver
.findElement(By
.css('#bip49 .change'))
4030 driver
.findElement(By
.css(".phrase"))
4031 .sendKeys("abandon abandon ability");
4032 driver
.sleep(generateDelay
).then(function() {
4033 getFirstAddress(function(address
) {
4034 expect(address
).toBe("3PEM7MiKed5konBoN66PQhK8r3hjGhy9dT");
4040 // BIP49 account extendend private key is shown
4041 it('Shows the bip49 account extended private key', function(done
) {
4042 driver
.findElement(By
.css('#bip49-tab a'))
4044 driver
.findElement(By
.css(".phrase"))
4045 .sendKeys("abandon abandon ability");
4046 driver
.sleep(generateDelay
).then(function() {
4047 driver
.findElement(By
.css('#bip49 .account-xprv'))
4048 .getAttribute("value")
4049 .then(function(xprv
) {
4050 expect(xprv
).toBe("yprvAHtB1M5Wp675aLzFy9TJYK2mSsLkg6mcBRh5DZTR7L4EnYSmYPaL63KFA4ycg1PngW5LfkmejxzosCs17TKZMpRFKc3z5SJar6QAKaFcaZL");
4056 // BIP49 account extendend public key is shown
4057 it('Shows the bip49 account extended public key', function(done
) {
4058 driver
.findElement(By
.css('#bip49-tab a'))
4060 driver
.findElement(By
.css(".phrase"))
4061 .sendKeys("abandon abandon ability");
4062 driver
.sleep(generateDelay
).then(function() {
4063 driver
.findElement(By
.css('#bip49 .account-xpub'))
4064 .getAttribute("value")
4065 .then(function(xprv
) {
4066 expect(xprv
).toBe("ypub6WsXQrcQeTfNnq4j5AzJuSyVzuBF5ZVTYecg1ws2ffbDfLmv5vtadqdj1NgR6C6gufMpMfJpHxvb6JEQKvETVNWCRanNedfJtnTchZiJtsL");
4072 // Test selecting coin where bip49 is unavailable (eg CLAM)
4073 it('Shows an error on bip49 tab for coins without bip49', function(done
) {
4074 driver
.findElement(By
.css('#bip49-tab a'))
4076 driver
.findElement(By
.css(".phrase"))
4077 .sendKeys("abandon abandon ability");
4078 driver
.sleep(generateDelay
).then(function() {
4079 selectNetwork("CLAM - Clams");
4080 // bip49 available is hidden
4081 driver
.findElement(By
.css('#bip49 .available'))
4082 .getAttribute("class")
4083 .then(function(classes
) {
4084 expect(classes
).toContain("hidden");
4085 // bip49 unavailable is shown
4086 driver
.findElement(By
.css('#bip49 .unavailable'))
4087 .getAttribute("class")
4088 .then(function(classes
) {
4089 expect(classes
).not
.toContain("hidden");
4090 // check there are no addresses shown
4091 driver
.findElements(By
.css('.addresses tr'))
4092 .then(function(rows
) {
4093 expect(rows
.length
).toBe(0);
4094 // check the derived private key is blank
4095 driver
.findElement(By
.css('.extended-priv-key'))
4096 .getAttribute("value")
4097 .then(function(xprv
) {
4098 expect(xprv
).toBe('');
4099 // check the derived public key is blank
4100 driver
.findElement(By
.css('.extended-pub-key'))
4101 .getAttribute("value")
4102 .then(function(xpub
) {
4103 expect(xpub
).toBe('');
4114 // Cleared mnemonic and root key still allows addresses to be generated
4115 // https://github.com/iancoleman/bip39/issues/43
4116 it('Clears old root keys from memory when mnemonic is cleared', function(done
) {
4118 driver
.findElement(By
.css(".phrase"))
4119 .sendKeys("abandon abandon ability");
4120 driver
.sleep(generateDelay
).then(function() {
4121 // clear the mnemonic and root key
4122 // using selenium .clear() doesn't seem to trigger the 'input' event
4123 // so clear it using keys instead
4124 driver
.findElement(By
.css('.phrase'))
4125 .sendKeys(Key
.CONTROL
,"a");
4126 driver
.findElement(By
.css('.phrase'))
4127 .sendKeys(Key
.DELETE
);
4128 driver
.findElement(By
.css('.root-key'))
4129 .sendKeys(Key
.CONTROL
,"a");
4130 driver
.findElement(By
.css('.root-key'))
4131 .sendKeys(Key
.DELETE
);
4132 driver
.sleep(generateDelay
).then(function() {
4133 // try to generate more addresses
4134 driver
.findElement(By
.css('.more'))
4136 driver
.sleep(generateDelay
).then(function() {
4137 driver
.findElements(By
.css(".addresses tr"))
4138 .then(function(els
) {
4139 // check there are no addresses shown
4140 expect(els
.length
).toBe(0);
4149 // error trying to generate addresses from xpub with hardened derivation
4150 it('Shows error for hardened addresses with xpub root key', function(done
) {
4151 driver
.findElement(By
.css('#bip32-tab a'))
4153 driver
.executeScript(function() {
4154 $(".hardened-addresses").prop("checked", true);
4156 // set xpub for account 0 of bip44 for 'abandon abandon ability'
4157 driver
.findElement(By
.css("#root-key"))
4158 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
4159 driver
.sleep(feedbackDelay
).then(function() {
4160 // Check feedback is correct
4161 driver
.findElement(By
.css('.feedback'))
4163 .then(function(feedback
) {
4164 var msg
= "Hardened derivation path is invalid with xpub key";
4165 expect(feedback
).toBe(msg
);
4171 // Litecoin uses ltub by default, and can optionally be set to xprv
4173 // https://github.com/iancoleman/bip39/issues/96
4174 // Issue with extended keys on Litecoin
4175 it('Uses ltub by default for litecoin, but can be set to xprv', function(done
) {
4176 driver
.findElement(By
.css('.phrase'))
4177 .sendKeys("abandon abandon ability");
4178 selectNetwork("LTC - Litecoin");
4179 driver
.sleep(generateDelay
).then(function() {
4180 // check the extended key is generated correctly
4181 driver
.findElement(By
.css('.root-key'))
4182 .getAttribute("value")
4183 .then(function(rootKey
) {
4184 expect(rootKey
).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
4185 // set litecoin to use ltub
4186 driver
.executeScript(function() {
4187 $(".litecoin-use-ltub").prop("checked", false);
4188 $(".litecoin-use-ltub").trigger("change");
4190 driver
.sleep(generateDelay
).then(function() {
4191 driver
.findElement(By
.css('.root-key'))
4192 .getAttribute("value")
4193 .then(function(rootKey
) {
4194 expect(rootKey
).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
4203 // https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
4204 // "warn me emphatically when they have detected invalid input" to the entropy field
4205 // A warning is shown when entropy is filtered and discarded
4206 it('Warns when entropy is filtered and discarded', function(done
) {
4207 driver
.findElement(By
.css('.use-entropy'))
4209 // set entropy to have no filtered content
4210 driver
.findElement(By
.css('.entropy'))
4211 .sendKeys("00000000 00000000 00000000 00000000");
4212 driver
.sleep(generateDelay
).then(function() {
4213 // check the filter warning does not show
4214 driver
.findElement(By
.css('.entropy-container .filter-warning'))
4215 .getAttribute("class")
4216 .then(function(classes
) {
4217 expect(classes
).toContain("hidden");
4218 // set entropy to have some filtered content
4219 driver
.findElement(By
.css('.entropy'))
4220 .sendKeys("10000000 zxcvbn 00000000 00000000 00000000");
4221 driver
.sleep(entropyFeedbackDelay
).then(function() {
4222 // check the filter warning shows
4223 driver
.findElement(By
.css('.entropy-container .filter-warning'))
4224 .getAttribute("class")
4225 .then(function(classes
) {
4226 expect(classes
).not
.toContain("hidden");
4234 // Bitcoin Cash address can be set to use cashaddr format
4235 it('Can use cashaddr format for bitcoin cash addresses', function(done
) {
4236 driver
.executeScript(function() {
4237 $(".use-bch-cashaddr-addresses").prop("checked", true);
4239 driver
.findElement(By
.css('.phrase'))
4240 .sendKeys("abandon abandon ability");
4241 selectNetwork("BCH - Bitcoin Cash");
4242 driver
.sleep(generateDelay
).then(function() {
4243 getFirstAddress(function(address
) {
4244 expect(address
).toBe("bitcoincash:qzlquk7w4hkudxypl4fgv8x279r754dkvur7jpcsps");
4250 // Bitcoin Cash address can be set to use bitpay format
4251 it('Can use bitpay format for bitcoin cash addresses', function(done
) {
4252 driver
.executeScript(function() {
4253 $(".use-bch-bitpay-addresses").prop("checked", true);
4255 driver
.findElement(By
.css('.phrase'))
4256 .sendKeys("abandon abandon ability");
4257 selectNetwork("BCH - Bitcoin Cash");
4258 driver
.sleep(generateDelay
).then(function() {
4259 getFirstAddress(function(address
) {
4260 expect(address
).toBe("CZnpA9HPmvhuhLLPWJP8rNDpLUYXy1LXFk");
4266 // Bitcoin Cash address can be set to use legacy format
4267 it('Can use legacy format for bitcoin cash addresses', function(done
) {
4268 driver
.executeScript(function() {
4269 $(".use-bch-legacy-addresses").prop("checked", true);
4271 driver
.findElement(By
.css('.phrase'))
4272 .sendKeys("abandon abandon ability");
4273 selectNetwork("BCH - Bitcoin Cash");
4274 driver
.sleep(generateDelay
).then(function() {
4275 getFirstAddress(function(address
) {
4276 expect(address
).toBe("1JKvb6wKtsjNoCRxpZ4DGrbniML7z5U16A");
4282 // End of tests ported from old suit, so no more comments above each test now
4284 it('Can generate more addresses from a custom index', function(done
) {
4285 var expectedIndexes
= [
4286 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
4287 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
4289 driver
.findElement(By
.css('.phrase'))
4290 .sendKeys("abandon abandon ability");
4291 driver
.sleep(generateDelay
).then(function() {
4292 // Set start of next lot of rows to be from index 40
4293 // which means indexes 20-39 will not be in the table.
4294 driver
.findElement(By
.css('.more-rows-start-index'))
4296 driver
.findElement(By
.css('.more'))
4298 driver
.sleep(generateDelay
).then(function() {
4299 // Check actual indexes in the table match the expected pattern
4300 driver
.findElements(By
.css(".index"))
4301 .then(function(els
) {
4302 expect(els
.length
).toBe(expectedIndexes
.length
);
4303 var testRowAtIndex = function(i
) {
4304 if (i
>= expectedIndexes
.length
) {
4309 .then(function(actualPath
) {
4310 var noHardened
= actualPath
.replace(/'/g, "");
4311 var pathBits = noHardened.split("/")
4312 var lastBit = pathBits[pathBits.length-1];
4313 var actualIndex = parseInt(lastBit);
4314 var expectedIndex = expectedIndexes[i];
4315 expect(actualIndex).toBe(expectedIndex);
4316 testRowAtIndex(i+1);
4326 it('Can generate BIP141 addresses
with P2WPKH
-in-P2SH semanitcs
', function(done) {
4327 // Sourced from BIP49 official test specs
4328 driver.findElement(By.css('#bip141
-tab a
'))
4330 driver.findElement(By.css('.bip141
-path
'))
4332 driver.findElement(By.css('.bip141
-path
'))
4333 .sendKeys("m/49'/1'/0'/0");
4334 selectNetwork("BTC
- Bitcoin Testnet
");
4335 driver.findElement(By.css(".phrase
"))
4336 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
");
4337 driver.sleep(generateDelay).then(function() {
4338 getFirstAddress(function(address) {
4339 expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2
");
4345 it('Can generate BIP141 addresses with P2WSH semanitcs', function(done) {
4346 driver.findElement(By.css('#bip141-tab a'))
4349 driver.executeScript(function() {
4350 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4351 $(".bip141
-semantics option
").filter(function(i,e) {
4352 return $(e).html() == "P2WSH (1-of-1 multisig
)";
4353 }).prop("selected
", true);
4354 $(".bip141
-semantics
").trigger("change
");
4356 driver.findElement(By.css(".phrase
"))
4357 .sendKeys("abandon abandon ability
");
4358 driver.sleep(generateDelay).then(function() {
4359 driver.findElement(By.css("#root
-key
"))
4360 .getAttribute("value
")
4361 .then(function(rootKey) {
4362 expect(rootKey).toBe("ZprvAhadJRUYsNge9uHspaggavxU1BUQ8QwfT4Z9UGq5sKF2mSt1mVy8EckLAaoBdmLHyP5eYDJ3LxtmzMNnLg2MRFe7QN2ueF4NCH4s5PrCDR6
");
4363 getFirstAddress(function(address) {
4364 expect(address).toBe("bc1q2qhee847pv438tgg8hc7mjy38n8dklleshettn344l0tgs0kj5hskz9p9r
");
4371 it('Can generate BIP141 addresses with P2WSH-in-P2SH semanitcs', function(done) {
4372 driver.findElement(By.css('#bip141-tab a'))
4374 // Choose P2WSH-in-P2SH
4375 driver.executeScript(function() {
4376 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4377 $(".bip141
-semantics option
").filter(function(i,e) {
4378 return $(e).html() == "P2WSH nested
in P2SH (1-of-1 multisig
)";
4379 }).prop("selected
", true);
4380 $(".bip141
-semantics
").trigger("change
");
4382 driver.findElement(By.css(".phrase
"))
4383 .sendKeys("abandon abandon ability
");
4384 driver.sleep(generateDelay).then(function() {
4385 driver.findElement(By.css("#root
-key
"))
4386 .getAttribute("value
")
4387 .then(function(rootKey) {
4388 expect(rootKey).toBe("YprvANkMzkodih9AJc6kzDu4NqrxqDKxBnxAXx2vgswCVJs9iM4nWqoZcZ6C9NqbdrgNZjxqnjhUtJYE74mDcycLd1xWY2LV4LEsvZ1DgqxuAKe
");
4389 getFirstAddress(function(address) {
4390 expect(address).toBe("343DLC4vGDyHBbBr9myL8zzZA1MdN9TM1G
");
4397 it('Uses Vprv for bitcoin testnet p2wsh', function(done) {
4398 selectNetwork("BTC
- Bitcoin Testnet
");
4399 driver.findElement(By.css('#bip141-tab a'))
4402 driver.executeScript(function() {
4403 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4404 $(".bip141
-semantics option
").filter(function(i,e) {
4405 return $(e).html() == "P2WSH (1-of-1 multisig
)";
4406 }).prop("selected
", true);
4407 $(".bip141
-semantics
").trigger("change
");
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(path) {
4415 expect(path).toBe("Vprv16YtLrHXxePM5ja5hXQbiJs5JKDAc4WcaXo5rZcrVMU6bMhUg1oY7fpPku3i819gvMcHvq1h8aELDsyfCEs19vj1Q3iDHRrESWyJConkoT1
");
4421 it('Uses Uprv for bitcoin testnet p2wsh-in-p2sh', function(done) {
4422 selectNetwork("BTC
- Bitcoin Testnet
");
4423 driver.findElement(By.css('#bip141-tab a'))
4425 // Choose P2WSH-in-P2SH
4426 driver.executeScript(function() {
4427 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4428 $(".bip141
-semantics option
").filter(function(i,e) {
4429 return $(e).html() == "P2WSH nested
in P2SH (1-of-1 multisig
)";
4430 }).prop("selected
", true);
4431 $(".bip141
-semantics
").trigger("change
");
4433 driver.findElement(By.css('.phrase'))
4434 .sendKeys('abandon abandon ability');
4435 driver.sleep(generateDelay).then(function() {
4436 driver.findElement(By.css('.root-key'))
4437 .getAttribute("value
")
4438 .then(function(path) {
4439 expect(path).toBe("Uprv95RJn67y7xyEuRLHenkZYVUx9LkARJzAsVx3ZJMeyHMdVwosWD9K8JTe4Z1FeE4gwBVcnqKF3f82ZvJxkBxHS5E74fYnigxvqeke8ZV3Fp2
");
4445 it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
4446 // This result tested against bitcoinjs-lib test spec for segwit address
4447 // using the first private key of this mnemonic and default path m/0
4448 // https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50
4449 // so whilst not directly comparable, substituting the private key produces
4450 // identical results between this tool and the bitcoinjs-lib test.
4451 // Private key generated is:
4452 // L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP
4453 driver.findElement(By.css('#bip141-tab a'))
4456 driver.executeScript(function() {
4457 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4458 $(".bip141
-semantics option
").filter(function(i,e) {
4459 return $(e).html() == "P2WPKH
";
4460 }).prop("selected
", true);
4461 $(".bip141
-semantics
").trigger("change
");
4463 driver.findElement(By.css(".phrase
"))
4464 .sendKeys("abandon abandon ability
");
4465 driver.sleep(generateDelay).then(function() {
4466 getFirstAddress(function(address) {
4467 expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9
");
4473 it('Shows the entropy used by the PRNG when clicking generate', function(done) {
4474 driver.findElement(By.css('.generate')).click();
4475 driver.sleep(generateDelay).then(function() {
4476 driver.findElement(By.css('.entropy'))
4477 .getAttribute("value
")
4478 .then(function(entropy) {
4479 expect(entropy).not.toBe("");
4485 it('Shows the index of each word in the mnemonic', function(done) {
4486 driver.findElement(By.css('.phrase'))
4487 .sendKeys("abandon abandon ability
");
4488 driver.sleep(generateDelay).then(function() {
4489 driver.findElement(By.css('.use-entropy'))
4491 driver.findElement(By.css('.word-indexes'))
4493 .then(function(indexes) {
4494 expect(indexes).toBe("0, 0, 1");
4500 it('Shows the derivation path for bip84 tab', function(done) {
4501 driver.findElement(By.css('#bip84-tab a'))
4503 driver.findElement(By.css('.phrase'))
4504 .sendKeys('abandon abandon ability');
4505 driver.sleep(generateDelay).then(function() {
4506 driver.findElement(By.css('#bip84 .path'))
4507 .getAttribute("value
")
4508 .then(function(path) {
4509 expect(path).toBe("m
/84'/0'/0'/0");
4515 it('Shows the extended private key for bip84 tab', function(done) {
4516 driver.findElement(By.css('#bip84-tab a'))
4518 driver.findElement(By.css('.phrase'))
4519 .sendKeys('abandon abandon ability');
4520 driver.sleep(generateDelay).then(function() {
4521 driver.findElement(By.css('.extended-priv-key'))
4522 .getAttribute("value
")
4523 .then(function(path) {
4524 expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP
");
4530 it('Shows the extended public key for bip84 tab', function(done) {
4531 driver.findElement(By.css('#bip84-tab a'))
4533 driver.findElement(By.css('.phrase'))
4534 .sendKeys('abandon abandon ability');
4535 driver.sleep(generateDelay).then(function() {
4536 driver.findElement(By.css('.extended-pub-key'))
4537 .getAttribute("value
")
4538 .then(function(path) {
4539 expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx
");
4545 it('Changes the address list if bip84 account is changed', function(done) {
4546 driver.findElement(By.css('#bip84-tab a'))
4548 driver.findElement(By.css('#bip84 .account'))
4550 driver.findElement(By.css('.phrase'))
4551 .sendKeys('abandon abandon ability');
4552 driver.sleep(generateDelay).then(function() {
4553 getFirstAddress(function(address) {
4554 expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662
");
4560 it('Changes the address list if bip84 change is changed', function(done) {
4561 driver.findElement(By.css('#bip84-tab a'))
4563 driver.findElement(By.css('#bip84 .change'))
4565 driver.findElement(By.css('.phrase'))
4566 .sendKeys('abandon abandon ability');
4567 driver.sleep(generateDelay).then(function() {
4568 getFirstAddress(function(address) {
4569 expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2
");
4575 it('Passes the official BIP84 test spec for rootpriv', function(done) {
4576 driver.findElement(By.css('#bip84-tab a'))
4578 driver.findElement(By.css('.phrase'))
4579 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4580 driver.sleep(generateDelay).then(function() {
4581 driver.findElement(By.css(".root
-key
"))
4582 .getAttribute("value
")
4583 .then(function(rootKey) {
4584 expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5
");
4590 it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
4591 driver.findElement(By.css('#bip84-tab a'))
4593 driver.findElement(By.css('.phrase'))
4594 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4595 driver.sleep(generateDelay).then(function() {
4596 driver.findElement(By.css("#bip84
.account
-xprv
"))
4597 .getAttribute("value
")
4598 .then(function(rootKey) {
4599 expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE
");
4605 it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
4606 driver.findElement(By.css('#bip84-tab a'))
4608 driver.findElement(By.css('.phrase'))
4609 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4610 driver.sleep(generateDelay).then(function() {
4611 driver.findElement(By.css("#bip84
.account
-xpub
"))
4612 .getAttribute("value
")
4613 .then(function(rootKey) {
4614 expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs
");
4620 it('Passes the official BIP84 test spec for account 0 first address', function(done) {
4621 driver.findElement(By.css('#bip84-tab a'))
4623 driver.findElement(By.css('.phrase'))
4624 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4625 driver.sleep(generateDelay).then(function() {
4626 getFirstAddress(function(address) {
4627 expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu
");
4633 it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
4634 driver.findElement(By.css('#bip84-tab a'))
4636 driver.findElement(By.css('.phrase'))
4637 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4638 driver.findElement(By.css('#bip84 .change'))
4640 driver.sleep(generateDelay).then(function() {
4641 getFirstAddress(function(address) {
4642 expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el
");
4648 it('Can display the table as csv', function(done) {
4649 var headings = "path
,address
,public key
,private key
";
4650 var row1 = "m
/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3
,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE
";
4651 var row20 = "m
/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55
,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a
,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab
";
4652 driver.findElement(By.css('.phrase'))
4653 .sendKeys('abandon abandon ability');
4654 driver.sleep(generateDelay).then(function() {
4655 driver.findElement(By.css('.csv'))
4656 .getAttribute("value
")
4657 .then(function(csv) {
4658 expect(csv).toContain(headings);
4659 expect(csv).toContain(row1);
4660 expect(csv).toContain(row20);
4666 it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
4667 // see https://github.com/iancoleman/bip39/issues/155
4668 selectNetwork("ETH
- Ethereum
");
4669 driver.findElement(By.css('#bip32-tab a'))
4671 driver.findElement(By.css('#bip32-path'))
4673 driver.findElement(By.css('#bip32-path'))
4674 .sendKeys("m
/44'/60'/0'");
4675 driver.findElement(By.css('.phrase'))
4676 .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');
4677 driver.sleep(generateDelay).then(function() {
4678 getFirstAddress(function(address) {
4679 expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
4685 it('Can encrypt private keys using BIP38', function(done) {
4686 // see https://github.com/iancoleman/bip39/issues/140
4687 driver.executeScript(function() {
4688 $(".use-bip38
").prop("checked
", true);
4690 driver.findElement(By.css('.bip38-password'))
4691 .sendKeys('bip38password');
4692 driver.findElement(By.css('.rows-to-add'))
4694 driver.findElement(By.css('.rows-to-add'))
4696 driver.findElement(By.css('.phrase'))
4697 .sendKeys('abandon abandon ability');
4698 driver.sleep(bip38delay).then(function() {
4700 getFirstRowValue(function(address) {
4701 expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB
");
4703 getFirstRowValue(function(pubkey) {
4704 expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1
");
4706 getFirstRowValue(function(privkey) {
4707 expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM
");
4713 }, bip38delay + 5000);
4715 it('Shows the checksum for the entropy', function(done) {
4716 driver.findElement(By.css('.use-entropy'))
4718 driver.findElement(By.css('.entropy'))
4719 .sendKeys("00000000000000000000000000000000");
4720 driver.sleep(generateDelay).then(function() {
4721 driver.findElement(By.css('.checksum'))
4723 .then(function(text) {
4724 expect(text).toBe("1");
4730 it('Shows the checksum for the entropy with the correct groupings', function(done) {
4731 driver.findElement(By.css('.use-entropy'))
4733 // create a checksum of 20 bits, which spans multiple words
4734 driver.findElement(By.css('.entropy'))
4735 .sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
");
4736 driver.sleep(generateDelay).then(function() {
4737 driver.findElement(By.css('.checksum'))
4739 .then(function(text) {
4740 // first group is 9 bits, second group is 11
4741 expect(text).toBe("011010111 01110000110");
4747 it('Uses vprv for bitcoin testnet p2wpkh', function(done) {
4748 selectNetwork("BTC
- Bitcoin Testnet
");
4749 driver.findElement(By.css('#bip84-tab a'))
4751 driver.findElement(By.css('.phrase'))
4752 .sendKeys('abandon abandon ability');
4753 driver.sleep(generateDelay).then(function() {
4754 driver.findElement(By.css('.root-key'))
4755 .getAttribute("value
")
4756 .then(function(path) {
4757 expect(path).toBe("vprv9DMUxX4ShgxML9N2YV5CvWEebWrM9aJ5ULpbRRyzyWu6vs4BzTvbfFFrH41N5hVi7MYSfiugd765L3JmAfDM5po36Y8ouCKRDeYQwByCmS7
");
4763 it('Shows a warning if generating weak mnemonics', function(done) {
4764 driver.executeScript(function() {
4765 $(".strength option
[selected
]").removeAttr("selected
");
4766 $(".strength option
[value
=6]").prop("selected
", true);
4767 $(".strength
").trigger("change
");
4769 driver.findElement(By.css(".generate
-container
.warning
"))
4770 .getAttribute("class")
4771 .then(function(classes) {
4772 expect(classes).not.toContain("hidden
");
4777 it('Does not show a warning if generating strong mnemonics', function(done) {
4778 driver.executeScript(function() {
4779 $(".strength option
[selected
]").removeAttr("selected
");
4780 $(".strength option
[value
=12]").prop("selected
", true);
4782 driver.findElement(By.css(".generate
-container
.warning
"))
4783 .getAttribute("class")
4784 .then(function(classes) {
4785 expect(classes).toContain("hidden
");
4790 it('Shows a warning if overriding weak entropy with longer mnemonics', function(done) {
4791 driver.findElement(By.css('.use-entropy'))
4793 driver.findElement(By.css('.entropy'))
4794 .sendKeys("0123456789abcdef
"); // 6 words
4795 driver.executeScript(function() {
4796 $(".mnemonic
-length
").val("12").trigger("change
");
4798 driver.findElement(By.css(".weak
-entropy
-override
-warning
"))
4799 .getAttribute("class")
4800 .then(function(classes) {
4801 expect(classes).not.toContain("hidden
");
4806 it('Does not show a warning if entropy is stronger than mnemonic length', function(done) {
4807 driver.findElement(By.css('.use-entropy'))
4809 driver.findElement(By.css('.entropy'))
4810 .sendKeys("0123456789abcdef0123456789abcdef0123456789abcdef
"); // 18 words
4811 driver.executeScript(function() {
4812 $(".mnemonic
-length
").val("12").trigger("change
");
4814 driver.findElement(By.css(".weak
-entropy
-override
-warning
"))
4815 .getAttribute("class")
4816 .then(function(classes) {
4817 expect(classes).toContain("hidden
");
4822 it('Shows litecoin BIP49 addresses', function(done) {
4823 driver.findElement(By.css('.phrase'))
4824 .sendKeys('abandon abandon ability');
4825 selectNetwork("LTC
- Litecoin
");
4826 driver.findElement(By.css('#bip49-tab a'))
4828 // bip49 addresses are shown
4829 driver.sleep(generateDelay).then(function() {
4830 driver.findElement(By.css('#bip49 .available'))
4831 .getAttribute("class")
4832 .then(function(classes) {
4833 expect(classes).not.toContain("hidden
");
4834 // check first address
4835 getFirstAddress(function(address) {
4836 expect(address).toBe("MFwLPhsXoBuSLL8cLmW9uK6tChkzduV8qN
");
4843 it('Shows Groestlcoin BIP49 addresses', function(done) {
4844 driver.findElement(By.css('.phrase'))
4845 .sendKeys('abandon abandon ability');
4846 selectNetwork("GRS
- Groestlcoin
");
4847 driver.findElement(By.css('#bip49-tab a'))
4849 // bip49 addresses are shown
4850 driver.sleep(generateDelay).then(function() {
4851 driver.findElement(By.css('#bip49 .available'))
4852 .getAttribute("class")
4853 .then(function(classes) {
4854 expect(classes).not.toContain("hidden
");
4855 // check first address
4856 getFirstAddress(function(address) {
4857 expect(address).toBe("3HXSCZwCypLyixMsF4Z1sN49noJtrm8gnX
");
4864 it('Can use root keys to generate segwit table rows', function(done) {
4865 // segwit uses ypub / zpub instead of xpub but the root key should still
4866 // be valid regardless of the encoding used to import that key.
4867 // Maybe this breaks the reason for the different extended key prefixes, but
4868 // since the parsed root key is used behind the scenes anyhow this should be
4870 driver.findElement(By.css('#root-key'))
4871 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
4872 driver.findElement(By.css('#bip49-tab a'))
4874 // bip49 addresses are shown
4875 driver.sleep(generateDelay).then(function() {
4876 getFirstAddress(function(address) {
4877 expect(address).toBe("3QG2Y9AA4xZ846gKHZqNf7mvVKbLqMKxr2
");
4884 // Allow converting mnemonic back to raw entropy value
4885 it('Converts mnemonics into raw entropy', function(done) {
4886 driver.findElement(By.css('.phrase'))
4887 .sendKeys('abandon abandon about');
4888 driver.sleep(generateDelay).then(function() {
4889 driver.findElement(By.css('.use-entropy'))
4891 driver.findElement(By.css('.entropy'))
4892 .getAttribute("value
")
4893 .then(function(entropy) {
4894 expect(entropy).toBe("00000001");
4895 driver.findElement(By.css('.phrase'))
4896 .getAttribute("value
")
4897 .then(function(phrase) {
4898 expect(phrase).toBe("abandon abandon about
");
4906 // Added Split Phrase Card Output
4907 it('Shows split prase cards', function(done) {
4908 var originalPhrase = "ugly charge strong giant once anchor capable october thumb inject dwarf legal alley mixture shoot
";
4909 var originalWords = originalPhrase.split(' ');
4910 driver.findElement(By.css('.phrase'))
4911 .sendKeys(originalPhrase);
4912 driver.sleep(generateDelay).then(function() {
4913 driver.findElement(By.css('.phraseSplit'))
4914 .getAttribute("value
")
4915 .then(function(cardsStr) {
4916 var cards = cardsStr.split("\n");
4917 expect(cards.length).toBe(3);
4918 // test all 2-of-3 combos can be used to form full phrase
4919 var combos = [[0,1],[0,2],[1,2]];
4920 for (var i=0; i<combos.length; i++) {
4921 var combo = combos[i];
4924 var phrase = cards[a] + " " + cards[b];
4925 // check all original words are present
4926 for (var j=0; j<originalWords.length; j++) {
4927 var originalWord = originalWords[j];
4928 expect(phrase).toContain(originalWord);
4936 // It allows manually specifying the entropy type
4937 it('Allows entropy type to be manually selected', function(done) {
4938 driver.findElement(By.css('.use-entropy'))
4940 // use decimal entropy
4941 driver.findElement(By.css('.entropy'))
4943 // manually change to binary entropy
4944 driver.executeScript(function() {
4945 $(".entropy
-container input
[value
='binary']").click();
4947 driver.sleep(entropyFeedbackDelay).then(function() {
4948 driver.findElement(By.css('.entropy-container'))
4950 .then(function(text) {
4951 // overide 91 to be just 1
4952 var key = "Filtered Entropy
";
4954 var reText = key + "\\s
+" + value;
4955 var re = new RegExp(reText);
4956 expect(text).toMatch(re);
4957 // overide automatic decimal to binary
4958 var key = "Entropy Type
";
4959 var value = "binary
";
4960 var reText = key + "\\s
+" + value;
4961 var re = new RegExp(reText);
4962 expect(text).toMatch(re);
4963 // overide 2 events to 1
4964 var key = "Event Count
";
4966 var reText = key + "\\s
+" + value;
4967 var re = new RegExp(reText);
4968 expect(text).toMatch(re);
4969 // overide log2(10)*2 bits to 1 bit
4970 var key = "Total Bits
";
4972 var reText = key + "\\s
+" + value;
4973 var re = new RegExp(reText);
4974 expect(text).toMatch(re);
4980 // https://github.com/iancoleman/bip39/issues/388
4981 // Make field for bip39 seed editable
4982 it('Generates addresses when seed is set', function(done) {
4983 driver.findElement(By.css('.seed'))
4984 .sendKeys("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3
");
4985 driver.sleep(generateDelay).then(function() {
4986 getFirstAddress(function(address) {
4987 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
4993 // https://github.com/iancoleman/bip39/issues/169
4994 it('Generates ethereum addresses from a public key', function(done) {
4995 var pubkey = "xpub68UK3hrMEp2jLPxPASgXSiqiUsQsUWZHCeuu6NqcJLt259LMeWzwDyufXLN1QmjLeLRY5he4QfArDDLbsXiw3xN3kFcYtyDy74BY73RPhhW
";
4996 driver.findElement(By.css('.root-key'))
4998 driver.findElement(By.css('#bip32-tab a'))
5000 selectNetwork('ETH - Ethereum');
5001 driver.sleep(generateDelay).then(function() {
5002 getFirstAddress(function(address) {
5003 expect(address).toBe("0x1Bd54748903438C7E386b4a3fCbe16237A316a98");