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 Firstcoin
', function(done) {
1210 selectText: "FRST - Firstcoin",
1211 phrase: "abandon abandon ability",
1212 firstAddress: "FJN9GzfMm7Q8R4DJwK1H9F6A1GTghvFiMJ",
1213 firstPubKey: "029300108c006d1dc75847fece915138747b7bc17b515eae7458da98d2f14d7178",
1214 firstPrivKey: "RDxAN3n3k2dEZ4Ln3bbozzZ3Jgg7CQdgzYDCURmPghKQdzctX7ck",
1216 testNetwork(done, params);
1218 it('Allows selection
of Flashcoin
', function(done) {
1220 selectText: "FLASH - Flashcoin",
1221 phrase: "abandon abandon ability",
1222 firstAddress: "UWfpf5LfMmLxZYooEb2EyvWhZ8NG7EZDRt",
1223 firstPubKey: "032d55eae8073e75f02e9674b0ac3f69190ad359ad37ee4c4c11d12bcfee13d439",
1224 firstPrivKey: "W6pedhBW35Twq8ZmgTQi7sHx6wczQanSk2FUpcFWtgEW29jowsvi",
1226 testNetwork(done, params);
1228 it('Allows selection
of GCRCoin
', function(done) {
1230 selectText: "GCR - GCRCoin",
1231 phrase: "abandon abandon ability",
1232 firstAddress: "GJjF5cLwyXLacpuvXAVksxGxKvHDjx58d6",
1233 firstPubKey: "0356187f1336ac2e340145478f02024ce1c318e3648cbba38262afbde7f2dc0055",
1234 firstPrivKey: "Pntag5VbBX1Qtyjt3pi1igwDswWEtpoiqHqosBbgHcMU6m2e7t9J",
1236 testNetwork(done, params);
1238 it('Allows selection
of Gobyte
', function(done) {
1240 selectText: "GBX - Gobyte",
1241 phrase: "abandon abandon ability",
1242 firstAddress: "GS813Ys2brkmvSUw1rUqGPm2HqQVDHJRyA",
1243 firstPubKey: "036f84f44e4c8bffe039c2d9da087b006ebbfcdcf24b32a6434b2fad708ef00ae0",
1244 firstPrivKey: "WLiSrhfqRwgNmw7rhGHFoXLEuNGXxQYuKb9PK84AZmTfiHN9dz22",
1246 testNetwork(done, params);
1248 it('Allows selection
of Gridcoin
', function(done) {
1250 selectText: "GRC - Gridcoin",
1251 phrase: "abandon abandon ability",
1252 firstAddress: "SGrWbBPvobgqKRF8td1Kdc9vbRY7MJ78Y9",
1253 firstPubKey: "0377436f8c4c4d96d5ddfe6875abeb589deec595331b9a915b7e8d81a4134926ce",
1254 firstPrivKey: "V7h5EhRuWGM8uqAouxHr9uNt8ZLCQ7kmpA27tvKDbUE3zBarH81n",
1256 testNetwork(done, params);
1258 it('Allows selection
of Gulden
', function(done) {
1260 selectText: "NLG - Gulden",
1261 phrase: "abandon abandon ability",
1262 firstAddress: "GcDP7cNEc33MPPdTFNJ8pZc6VMZJ2CbKxY",
1263 firstPubKey: "03ff51002146450eb68f294dbe34f3e208f8694b51079f81e3f7dbd403cc10df41",
1264 firstPrivKey: "Fc6gU4tscBk3pybMWU1ajS1tLvNerXC24hQJ1F944QqdgSSrr3XW",
1266 testNetwork(done, params);
1268 it('Allows selection
of Helleniccoin
', function(done) {
1270 selectText: "HNC - Helleniccoin",
1271 phrase: "abandon abandon ability",
1272 firstAddress: "LbHEKe5H72zp9G1fuWNiiNePTUfJb88915",
1273 firstPubKey: "02e602000d65b969ac27172297ee907684bfc606f457ef0bad62c229edb17d5cb2",
1274 firstPrivKey: "T6JEq9jKLvztjhg4tJMezy1L4NjnMfLDZJe1egVzPBU3Q5XPBFrz",
1276 testNetwork(done, params);
1278 it('Allows selection
of Hempcoin
', function(done) {
1280 selectText: "THC - Hempcoin",
1281 phrase: "abandon abandon ability",
1282 firstAddress: "H8sdWbZyJV4gyXyHtLXDaNnAuUDhK5mfTV",
1283 firstPubKey: "02e40aaa6bf20e32d9f5976f57e9bf7a8f75db36b96a9033c20b681c9d9454b617",
1284 firstPrivKey: "Ry5Dg2yR32uhbrPLdNmsK1TRbZ1bHLvFp7kcPgeMzVPN6ycu9Jj5",
1286 testNetwork(done, params);
1288 it('Allows selection
of Insane
', function(done) {
1290 selectText: "INSN - Insane",
1291 phrase: "abandon abandon ability",
1292 firstAddress: "iMPqEJMiXWuxC9U2NVinCCMr4t72h58EWx",
1293 firstPubKey: "036ec4cf4b92300f12ff824b1eca775b27b1a728f6b57c6354ce791fd8ea0f3497",
1294 firstPrivKey: "9HA4X5kXWKxLjybjko8Z5wDo19UUJKroRrZ1BuKCtsfcfNB48K61",
1296 testNetwork(done, params);
1298 it('Allows selection
of Iop
', function(done) {
1300 selectText: "IOP - Iop",
1301 phrase: "abandon abandon ability",
1302 firstAddress: "pGKQmcaPf95Ur5o6oHK4qdiZ52p1yaTvq1",
1303 firstPubKey: "02bbaa07f154d04b04dec0978a1655952e1a09a3c0e7798085902273965d93c2f6",
1304 firstPrivKey: "8MDnKDhVSp84AqzYN5g18MhMvHk3UMYnP51EVjidSas1pT62Sdpc",
1306 testNetwork(done, params);
1308 it('Allows selection
of Ixcoin
', function(done) {
1310 selectText: "IXC - Ixcoin",
1311 phrase: "abandon abandon ability",
1312 firstAddress: "xgE9bTZ6YypT3E6ByzkTt31Hq68E9BqywH",
1313 firstPubKey: "0257766cea209cf52ba08776b6dfa263a4759e1e148f25d0cab3a91a60b6a52062",
1314 firstPrivKey: "KxdDep6zGCWoRt6arat5DVR5s6a8vmZtuekwHafEwRc7VGxfeD4Y",
1316 testNetwork(done, params);
1318 it('Allows selection
of Kobocoin
', function(done) {
1320 selectText: "KOBO - Kobocoin",
1321 phrase: "abandon abandon ability",
1322 firstAddress: "FTVoNJETXDAM8x7MnmdE8RwWndSr9PQWhy",
1323 firstPubKey: "0225753a5e232b384dce73b58d25fb90172faaf4c83a8850189abd8cae86495601",
1324 firstPrivKey: "R7u1uvHmVGkGqjURaNoppFjPNBzPYt37QwttrJc6F2K1WRm1zKoQ",
1326 testNetwork(done, params);
1328 it('Allows selection
of Landcoin
', function(done) {
1330 selectText: "LDCN - Landcoin",
1331 phrase: "abandon abandon ability",
1332 firstAddress: "LLvLwNjG1aJcn1RS4W4GJUbv8fNaRATG7c",
1333 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1334 firstPrivKey: "T8rHy2tA1yykFgCpr6KrgcrhqbevpxG923qSZbJHALYGwy3M3qAw",
1336 testNetwork(done, params);
1338 it('Allows selection
of Library Credits
', function(done) {
1340 selectText: "LBC - Library Credits",
1341 phrase: "abandon abandon ability",
1342 firstAddress: "bQJEQrHDJyHdqycB32uysh1SWn8Ln8LMdg",
1343 firstPubKey: "02abd5018c033f59f49f28ee76d93c41323890928e25c171ccc7c61ed753cde8ad",
1344 firstPrivKey: "5CWjkFs7be8vPa3CZEodPDsMDSbvyT9gAC1n1w83znRz4poNK5nZ",
1346 testNetwork(done, params);
1348 it('Allows selection
of Linx
', function(done) {
1350 selectText: "LINX - Linx",
1351 phrase: "abandon abandon ability",
1352 firstAddress: "XGWQ3cb3LGUB3VnHmj6xYSMgnokNbf6dyk",
1353 firstPubKey: "0232edeec8e3e021b53982a01943dea4398e9cc4b177c5483cf0e7774be41ea094",
1354 firstPrivKey: "X8YJFxPPmwyCBQ7Rp5bqn3V8U9rsaba5Tftsh3j8qZX9hjTTURgL",
1356 testNetwork(done, params);
1358 it('Allows selection
of Litecoincash
', function(done) {
1360 selectText: "LCC - Litecoincash",
1361 phrase: "abandon abandon ability",
1362 firstAddress: "Ce5n7fjUuQPLutJ4W5nCCfQLKdKLE1mv9A",
1363 firstPubKey: "033af2daadddcc976ea61023783b350f9b1ac45a056dba2d3b8c6ceec9d5817a8d",
1364 firstPrivKey: "T6qztYVwa6onx5HjCB3XZcCtegpUjVKtocRCQ8daWj2b8tbrDZqp",
1366 testNetwork(done, params);
1368 it('Allows selection
of Lynx
', function(done) {
1370 selectText: "LYNX - Lynx",
1371 phrase: "abandon abandon ability",
1372 firstAddress: "KUeY3ZdZkg96p4W98pj1JjygCFU1XqWdw3",
1373 firstPubKey: "0340435307cc0831d85adb70ceb518297cdebee8f25574d8eca0ff94e35fa759da",
1374 firstPrivKey: "SdwVFsLjH2wbWziEZTLPQ2iCBrt9vXHWr7X333RbFZG7hZg88u5V",
1376 testNetwork(done, params);
1378 it('Allows selection
of Megacoin
', function(done) {
1380 selectText: "MEC - Megacoin",
1381 phrase: "abandon abandon ability",
1382 firstAddress: "MDfAj9CzkC1HpcUiVGnHp8yKTa7WXgu8AY",
1383 firstPubKey: "02e560b00165c939ba08f5096201794a32e6de66216cdc5763472abf09a5e62380",
1384 firstPrivKey: "TSw7if5qV6HzW2hKhPjVvQBVUXt5aD17mM34PkueLrHQiXwMwcp4",
1386 testNetwork(done, params);
1388 it('Allows selection
of Minexcoin
', function(done) {
1390 selectText: "MNX - Minexcoin",
1391 phrase: "abandon abandon ability",
1392 firstAddress: "XC1VnyJVfiMDwWgFtAHDp41cgY3AHk3dJT",
1393 firstPubKey: "0232a31bee17b806941c419cea385d427f0d6c6fbd564fb2f366faa008aa15822c",
1394 firstPrivKey: "KzouDFGCydewfP2pGdGv62vwP7KBtaaSgBW28B94YuksV5y8jGyE",
1396 testNetwork(done, params);
1398 it('Allows selection
of Navcoin
', function(done) {
1400 selectText: "NAV - Navcoin",
1401 phrase: "abandon abandon ability",
1402 firstAddress: "NTQVTPK3NWSQLKoffkiQw99T8PifkF1Y2U",
1403 firstPubKey: "0345105cc449c627cfee118bcd7804465669e6b32e751a61e39737f5693f56d5f4",
1404 firstPrivKey: "PKXWZeQCqutM4vawyuNAHuAAkfEuWLVhwtszCRuWTecyJ92EMEE2",
1406 testNetwork(done, params);
1408 it('Allows selection
of Nebulas
', function(done) {
1410 selectText: "NAS - Nebulas",
1411 phrase: "abandon abandon ability",
1412 firstAddress: "n1PbK61DGBfDoDusLw621G6sVSMfLLHdfnm",
1413 firstPubKey: "3a3ffb88114f54ed7525c987a3124dc5eefc221806bc049e1e08371cca5fbebea38c2ce791ee32912c1f7799fad99db91f6a3724def5e715b4ff64bc06fe4537",
1414 firstPrivKey: "78d2df373c54efe1bfda371ee7532892ea8ec046f45e5c7e2dfa8371ad190f8b",
1416 testNetwork(done, params);
1418 it('Allows selection
of Neoscoin
', function(done) {
1420 selectText: "NEOS - Neoscoin",
1421 phrase: "abandon abandon ability",
1422 firstAddress: "NgATz6QbQNXvayHQ4CpZayugb9HeaPDdby",
1423 firstPubKey: "021bf6bd94ac773ed78b6e682bf6509a08944b67925a3ea9ec94f500479f637f63",
1424 firstPrivKey: "TBebkUs87R1WLhMPHMzCYF2FmiHzuVcCrhgf2rRwsSpi35SGZPMc",
1426 testNetwork(done, params);
1428 it('Allows selection
of Nix
', function(done) {
1430 selectText: "NIX - NIX Platform",
1431 phrase: "abandon abandon ability",
1432 firstAddress: "GgcNW2SQQXB4LWHRQTHKkQF3GzXNSLqS8u",
1433 firstPubKey: "02438f5277bc74be69e99eee406cda968705a8ab26b9aecfaa1bbc9d3700fa2eae",
1434 firstPrivKey: "L44wVS6tPZhVGfnJhXTfEyBZwLggW61GKKRVDaEKSaWAt2HkALyT",
1436 testNetwork(done, params);
1438 it('Allows selection
of Neurocoin
', function(done) {
1440 selectText: "NRO - Neurocoin",
1441 phrase: "abandon abandon ability",
1442 firstAddress: "NVdYErQ3mFpDuF5DquW9WMiT7sLc8ufFTn",
1443 firstPubKey: "03a3690f587d97dee95393d6dfe9daa81d60354657f84a75fb6733335a1c0588db",
1444 firstPrivKey: "Tn3LK6WyQRczahRsf3cZCpS12VxvbdhM6zSARDvGxhNoxCCN7oKv",
1446 testNetwork(done, params);
1448 it('Allows selection
of Newyorkc
', function(done) {
1450 selectText: "NYC - Newyorkc",
1451 phrase: "abandon abandon ability",
1452 firstAddress: "RSVMfyH1fKfy3puADJEhut2vfkRyon6imm",
1453 firstPubKey: "02c1f71b4e74098cf6dc66c5c0e386c695002093e986698e53f50162493b2deec8",
1454 firstPrivKey: "UqWMjJsXSsC4X7vgCTxLwxV21yA8vDosyGW2rBTYnn7MfFUbKZFy",
1456 testNetwork(done, params);
1458 it('Allows selection
of Novacoin
', function(done) {
1460 selectText: "NVC - Novacoin",
1461 phrase: "abandon abandon ability",
1462 firstAddress: "4JRvUmxcKCJmaMXZyvRoSS1cmG2XvnZfHN",
1463 firstPubKey: "0252531247a5e26a866909467ce552a3433b00f86319446aa3584723ad637be28a",
1464 firstPrivKey: "MD2NsZQtBdXGvox6VzpZfnhHyDJ2NHzzdSE6jUeUjQuaBRQ3LXUg",
1466 testNetwork(done, params);
1468 it('Allows selection
of Nushares
', function(done) {
1470 selectText: "NSR - Nushares",
1471 phrase: "abandon abandon ability",
1472 firstAddress: "SecjXzU3c7EecdT7EbC4vvmbdtBBokWh6J",
1473 firstPubKey: "02e0e94d07415703fd89b8a72f22fc28e7b916c0649bea2c53e6600377a4d125b5",
1474 firstPrivKey: "P5SXdUhciyemKJojb5tBFPKjVyX4Ymf1wdKDPmYHRigxPAnDNudM",
1476 testNetwork(done, params);
1478 it('Allows selection
of Okcash
', function(done) {
1480 selectText: "OK - Okcash",
1481 phrase: "abandon abandon ability",
1482 firstAddress: "PV4Qp1TUYuGv4TqVtLZtqvrsWWRycfx1Yi",
1483 firstPubKey: "02ab6d1d1b2c6f19f9c13cf0cd48e352e04245026d25de014cde0493c773f27789",
1484 firstPrivKey: "WuuneUUV8naqRRs1mSAdSVfZ9g6VXLWRV7NVEYdugts8vT2iNXR",
1486 testNetwork(done, params);
1488 it('Allows selection
of Omnicore
', function(done) {
1490 selectText: "OMNI - Omnicore",
1491 phrase: "abandon abandon ability",
1492 firstAddress: "1Q1t3gonjCT3rW38TsTsCvgSc3hh7zBGbi",
1493 firstPubKey: "02a8cadac7ee1d034f968c1441481fc2c941c8f529a17b6810e917f9ccc893fa3a",
1494 firstPrivKey: "KyvFh1tWTBsLWxJTVjpTpfjJ7eha81iks7NiD6FvrC23o24oAhcs",
1496 testNetwork(done, params);
1498 it('Allows selection
of DeepOnion
', function(done) {
1500 selectText: "ONION - DeepOnion",
1501 phrase: "abandon abandon ability",
1502 firstAddress: "DYREY7XCFXVqJ3x5UuN43k2JwD2s1kif48",
1503 firstPubKey: "030ed256ea98edd15006a57fd4d3c60b2b811ecd74107c3fa1ac36558107c139b3",
1504 firstPrivKey: "QZZHsJF9C9okF5JV2qx4H1NgCCQqeio6k8cryKyrpU3TPnDhSzwV",
1506 testNetwork(done, params);
1508 it('Allows selection
of Pesobit
', function(done) {
1510 selectText: "PSB - Pesobit",
1511 phrase: "abandon abandon ability",
1512 firstAddress: "PDePsF7ALyXP7JaywokdYiRTDtKa14MAr1",
1513 firstPubKey: "023dd8af1b0196275ee2fb450279656ab16f86221d47f62094c78088200d67e90f",
1514 firstPrivKey: "U9eg6xGhoA9H4aHmQtXPP1uR3dR3EjbdmTr3ejVK5jdhWFoJotSj",
1516 testNetwork(done, params);
1518 it('Allows selection
of Pinkcoin
', function(done) {
1520 selectText: "PINK - Pinkcoin",
1521 phrase: "abandon abandon ability",
1522 firstAddress: "2TgjYQffjbzUHJghNaVbdsjHbRwruC3yzC",
1523 firstPubKey: "02fcc7a9d26b78c1ef3149dc3fcb9fbd68293fe5627a9099a01e5acf5f848d029d",
1524 firstPrivKey: "LX84Cjro1aRwwqTDu2jqNTPvproSm7VJCyMFLCeEKa4LTFGzXgks",
1526 testNetwork(done, params);
1528 it('Allows selection
of POSWcoin
', function(done) {
1530 selectText: "POSW - POSWcoin",
1531 phrase: "abandon abandon ability",
1532 firstAddress: "PNxewmZoPnGBvoEbH6hgQZCK1igDiBCdgC",
1533 firstPubKey: "0358e511140f2f2bc96debf22639b36cc9b12addc386ac7a1de7dca05896ec0162",
1534 firstPrivKey: "UCs7SQEhD8r3GwXL99M8sBuxcqB9uke6kRSh7qQfbH9VdS6g919B",
1536 testNetwork(done, params);
1538 it('Allows selection
of Potcoin
', function(done) {
1540 selectText: "POT - Potcoin",
1541 phrase: "abandon abandon ability",
1542 firstAddress: "PEo7Vg2ctXgpP4vuLPeY9aGJtZotyrmiHc",
1543 firstPubKey: "02b86d3f153eac657f140a8ce9ae530504eea3c9894e594b9c9ddf0cfe393dc8ab",
1544 firstPrivKey: "U89dfzjfUtTSEKaRzr3FPw7ark3bjZAzTVw5kedjBcFj1UAdBcdE",
1546 testNetwork(done, params);
1548 it('Allows selection
of Putincoin
', function(done) {
1550 selectText: "PUT - Putincoin",
1551 phrase: "abandon abandon ability",
1552 firstAddress: "PViWnfr2uFtovd6e7joM49C94CsGSnqJis",
1553 firstPubKey: "0387bbd868cb20682619733e63205c66d460014714db26593d55c916c34f7e7970",
1554 firstPrivKey: "UBB9nGXWEMjhmvWqta83YkSYLLc1vjkqsnP289jbwMPG72LpAiUg",
1556 testNetwork(done, params);
1558 it('Allows selection
of Rapids
', function(done) {
1560 selectText: "RPD - Rapids",
1561 phrase: "abandon abandon ability",
1562 firstAddress: "Ri8XxUdZaXS5LqxmFJcFEjFinkaMbmhSUp",
1563 firstPubKey: "03cf69b270c1d03bbedb39f21d70a0a2aa0192b7dfb26bff4bf9a4ed8315d90f4e",
1564 firstPrivKey: "7sgLTht7XHwAkEgEpm7FJE6Tkv7GqCXxSSKPsr4hWYDNePUhBx6t",
1566 testNetwork(done, params);
1568 it('Allows selection
of Ravencoin
', function(done) {
1570 selectText: "RVN - Ravencoin",
1571 phrase: "abandon abandon ability",
1572 firstAddress: "RBuDoVNnzvFsEcX8XKPm8ic4mgiCzjUCNk",
1573 firstPubKey: "02135446ddfa13617ada02187702b51c3ae17a671773aa7ab7100a3cb89b7c9eb1",
1574 firstPrivKey: "KwRpyD9EmoyjQQRKtFVYL1WkS9Ywue8zSpebRPtXViiGR8kWUEJV",
1576 testNetwork(done, params);
1578 it('Allows selection
of Reddcoin
', function(done) {
1580 selectText: "RDD - Reddcoin",
1581 phrase: "abandon abandon ability",
1582 firstAddress: "RtgRvXMBng1y51ftteveFqwNfyRG18HpxQ",
1583 firstPubKey: "026565dd8a2e6f75e6391fbe16e6fb7dfab8b9cba85ea56b63f015d98c13d8f46d",
1584 firstPrivKey: "V1cNKW3ZYbRXosccyG9d3t4g7nGCBGyQJi7zLe6WZ3tExXMUqqK1",
1586 testNetwork(done, params);
1588 it('Allows selection
of RevolutionVR
', function(done) {
1590 selectText: "RVR - RevolutionVR",
1591 phrase: "abandon abandon ability",
1592 firstAddress: "VXeeoP2jkzZnMFxtc66ZBZK1NHN5QJnnjL",
1593 firstPubKey: "03c107f37ffb305d70a690ecd89254a67099d8855a4162762c62e3ad72e78c50e4",
1594 firstPrivKey: "WQdDNS6ZPZcFfBn7AwFMu1GHkm5jScBwpVDqNjmC16PEU7yG97vP",
1596 testNetwork(done, params);
1598 it('Allows selection
of Rubycoin
', function(done) {
1600 selectText: "RBY - Rubycoin",
1601 phrase: "abandon abandon ability",
1602 firstAddress: "RV76JDtjTs11JdMDRToYn6CHecMRPLnKS6",
1603 firstPubKey: "037828022748cf1f2107e9d99f7a19b8b44ebb24b332c51c0ca1cecec301cf1797",
1604 firstPrivKey: "UwQPqs31g9AKQzLjHNqgXN66tout2i6F7VSiCsSsR3LVHq7aToVL",
1606 testNetwork(done, params);
1608 it('Allows selection
of Salus
', function(done) {
1610 selectText: "SLS - Salus",
1611 phrase: "abandon abandon ability",
1612 firstAddress: "SNzPi1CafHFm3WWjRo43aMgiaEEj3ogjww",
1613 firstPubKey: "020c3ab49a6de010d23ddf14dec67666d7ad46dafbae9841db7723bbb0044067cc",
1614 firstPrivKey: "VMYkYTHeeHiosSQM9EFFdEH1a7fiMEL3TgBPxQVhXWqxAvyQ3uJL",
1616 testNetwork(done, params);
1618 it('Allows selection
of Smileycoin
', function(done) {
1620 selectText: "SMLY - Smileycoin",
1621 phrase: "abandon abandon ability",
1622 firstAddress: "BEZVnEBCAyFByrgKpwAgYgtvP4rKAd9Sj2",
1623 firstPubKey: "02145f25ab87def3ce6decffc6bf740037dc467a32ff8e62f147c70f5092074f2b",
1624 firstPrivKey: "pC32pZDfv3L3vegrv8gptiyc3SkJEZ6BigioGjLmD3wFw2h1qcz",
1626 testNetwork(done, params);
1628 it('Allows selection
of Solarcoin
', function(done) {
1630 selectText: "SLR - Solarcoin",
1631 phrase: "abandon abandon ability",
1632 firstAddress: "8LZ13HbnjtaMJWSvvVFNTLf71zFfDrhwLu",
1633 firstPubKey: "0305dbadd4fd239ecfca9239c9405e3b12178d46bdaf7520d511339a05367a3c88",
1634 firstPrivKey: "NeNfMe2zy5R6eUVJ3pZ4hs17s4xtm7xHjLJoe1hgCwVoYsfHx5Jy",
1636 testNetwork(done, params);
1638 it('Allows selection
of stash
', function(done) {
1640 selectText: "STASH - Stash",
1641 phrase: "abandon abandon ability",
1642 firstAddress: "XxwAsWB7REDKmAvHA85SbEZQQtpxeUDxS3",
1643 firstPubKey: "030caa120ce0fbd2c2d08a24c15086bafcf55d3862f423b0e55fd376474a0e7160",
1644 firstPrivKey: "XF3r4xQozRKvRUNgQG1bx8MGCuSLzV82XrNfB52Utpaixm8tWmWz",
1646 testNetwork(done, params);
1648 it('Allows selection
of stash testnet
', function(done) {
1650 selectText: "STASH - Stash Testnet",
1651 phrase: "abandon abandon ability",
1652 firstAddress: "yWQCTSkUst7ddYuebKsqa1kSoXEjpCkGKR",
1653 firstPubKey: "02a709b853a4ac1739c036c3d2bcf03b3e8c54b64927c57a07ac05c8e903545dd0",
1654 firstPrivKey: "cNrt5ghh7pPGQZVZkL5FJFNsWQQTKQPtLJz2JT7KnsfpzeAPYSp3",
1656 testNetwork(done, params);
1658 it('Allows selection
of Stratis
', function(done) {
1660 selectText: "STRAT - Stratis",
1661 phrase: "abandon abandon ability",
1662 firstAddress: "ScfJnq3QDhKgDMEds6sqUE1ot6ShfhmXXq",
1663 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1664 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1666 testNetwork(done, params);
1668 it('Allows selection
of Stratis Test
', function(done) {
1670 selectText: "TSTRAT - Stratis Testnet",
1671 phrase: "abandon abandon ability",
1672 firstAddress: "TRLWm3dye4FRrDWouwYUSUZP96xb76mBE3",
1673 firstPubKey: "0269cea528e4ed01b44729287c831fe1889b196fee6202956a7e5c9486c3bc5c00",
1674 firstPrivKey: "VLx3VXEsVzWVeZjHvrgCJ8N1H7JCEWTSHiEGsYUEZCedHR6yBqDU",
1676 testNetwork(done, params);
1678 it('Allows selection
of Sugarchain
', function(done) {
1680 selectText: "SUGAR - Sugarchain",
1681 phrase: "abandon abandon ability",
1682 firstAddress: "SYnd31fYr39VgKju87Vz1sYBmEeHg5cudk",
1683 firstPubKey: "035bc9fa22eff2246ec07bb09c9e32f5f9fee517b4f49a8f117508f8fb41905b25",
1684 firstPrivKey: "L2G3axGdZv5EV8osAsBPMese74i4dTHaGvxDh7DsRF5Ky6hKkPDY",
1686 testNetwork(done, params);
1688 it('Allows selection
of Sugarchain Testnet
', function(done) {
1690 selectText: "TUGAR - Sugarchain Testnet",
1691 phrase: "abandon abandon ability",
1692 firstAddress: "TkoRzLZQyaY88dAACNVwUFMYekR7pv6CbY",
1693 firstPubKey: "035bc9fa22eff2246ec07bb09c9e32f5f9fee517b4f49a8f117508f8fb41905b25",
1694 firstPrivKey: "cSd33sGUzymVeaH8ZGzWiyNhjJ1UHuPGLy6goXgNvMjLDqioARWW",
1696 testNetwork(done, params);
1698 it('Allows selection
of Syscoin
', function(done) {
1700 selectText: "SYS - Syscoin",
1701 phrase: "abandon abandon ability",
1702 firstAddress: "SZwJi42Pst3VAMomyK5DG4157WM5ofRmSj",
1703 firstPubKey: "02219514722373a337c6425ca5ccc423e160f0abf66b57a71fba4db7aca6957f6a",
1704 firstPrivKey: "L36rm7aHFTz571YY87nA3ZLace8NcqPYZsyuyREuT4wXFtTBqLrc",
1706 testNetwork(done, params);
1708 it('Allows selection
of Toa
', function(done) {
1710 selectText: "TOA - Toa",
1711 phrase: "abandon abandon ability",
1712 firstAddress: "TSe1QAnUwQzUfbBusDzRJ9URttrRGKoNKF",
1713 firstPubKey: "0332facd2ea64c2f1e6152961340b7e51ca77f1bffa0f950442b4ef5021f7ee86c",
1714 firstPrivKey: "VdSdDaM1Kjw1SzzW7KCzFEFi7Zf5egUHVofSiLkrSh7K6bbYZhnb",
1716 testNetwork(done, params);
1718 it('Allows selection
of TWINS
', function(done) {
1720 selectText: "TWINS - TWINS",
1721 phrase: "abandon abandon ability",
1722 firstAddress: "WPpJnfLLubNmF7HLNxg8d8zH5haxn4wri8",
1723 firstPubKey: "02a4b9bda2a7a2e4540d54c4afb3a3007f6f22f8cd2df67d5c69388fd8ddc16a07",
1724 firstPrivKey: "Au5fg7nYMXHmNT9BSfQVNxaUduP9cgJASeNDMrP9qfoWi2ZTmR48",
1726 testNetwork(done, params);
1728 it('Allows selection
of TWINS testnet
', function(done) {
1730 selectText: "TWINS - TWINS Testnet",
1731 phrase: "abandon abandon ability",
1732 firstAddress: "XpnU1HHdNG5YxvG9Rez4wjmidchxqnZaNa",
1733 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
1734 firstPrivKey: "cBtMfPpQg4s1Ndfez7oLdedwu8CxshhWE5f7qunhLsY4ueNvKKyM",
1736 testNetwork(done, params);
1738 it('Allows selection
of Ultimatesecurecash
', function(done) {
1740 selectText: "USC - Ultimatesecurecash",
1741 phrase: "abandon abandon ability",
1742 firstAddress: "UPyLAZU2Che5fiy7Ed8xVJFmXAUhitA4ug",
1743 firstPubKey: "03a529111ee6d54965962b289f7537db1edb57863e2e10dd96939f8d3501ecebd4",
1744 firstPrivKey: "VG1ZbBExPyeeT72EL1jQU8SvXkpK6heTept76wLiGCuMgRHqrz9L",
1746 testNetwork(done, params);
1748 it('Allows selection
of Unobtanium
', function(done) {
1750 selectText: "UNO - Unobtanium",
1751 phrase: "abandon abandon ability",
1752 firstAddress: "uUBMPVMXrR6qhqornJqKTWgr8L69vihSL9",
1753 firstPubKey: "026dd108ff43d425ad923f2107f5fc166cbb90dd0bd04b157c1ebdc9c04a423e0f",
1754 firstPrivKey: "aAf6LmMJpWQMZbHVSHtkKDCNViknGD4TQ3y1rwvJe2L55dwpbqBV",
1756 testNetwork(done, params);
1758 it('Allows selection
of Vcash
', function(done) {
1760 selectText: "XVC - Vcash",
1761 phrase: "abandon abandon ability",
1762 firstAddress: "VuL53MSY6KjvAjKSeRkh3NDnKykacDVeps",
1763 firstPubKey: "03ab245795cf39c4084684d039a01c387472c3626d93d24289d229c27ce9eeeace",
1764 firstPrivKey: "WVC2yAf2rFHzjbKKJeZWNFjMqQ9ATRg3xdtG2FfVDQATpNj5fHy9",
1766 testNetwork(done, params);
1768 it('Allows selection
of Verge
', function(done) {
1770 selectText: "XVG - Verge",
1771 phrase: "abandon abandon ability",
1772 firstAddress: "DCrVuGkMjLJpTGgwAgv9AcMdeb1nkWbjZA",
1773 firstPubKey: "03cd21de72f291cd5a3632a23a710616416743f60b4667a0f8d3fc03c7fd6e0c77",
1774 firstPrivKey: "QRpRGbTRC7P12PyhiFqyZpVwK5XCGe5Lmr9hbV7ujcjg9cjUGqF7",
1776 testNetwork(done, params);
1778 it('Allows selection
of Vertcoin
', function(done) {
1780 selectText: "VTC - Vertcoin",
1781 phrase: "abandon abandon ability",
1782 firstAddress: "Vf6koGuiWdXQfx8tNqxoNeEDxh4xh5cxsG",
1783 firstPubKey: "02f15155bc5445fc764db199da5e7ac92112ab9f2a5e408904f145ea29d169010a",
1784 firstPrivKey: "Kxu4LwEJZooaVWGT9ZLzJBuaUFr1hLjuottjT7eTNNWJKk7Hur1u",
1786 testNetwork(done, params);
1788 it('Allows selection
of Vivo
', function(done) {
1790 selectText: "VIVO - Vivo",
1791 phrase: "abandon abandon ability",
1792 firstAddress: "VFmBwuXXGhJe7MarQG2GfzHMFebRHgfSpB",
1793 firstPubKey: "02d24546a74522e0dc8bbfde66e65201ae81b0f6e2b60239c8baf09c1a53b73f8c",
1794 firstPrivKey: "WLSLMqZjuwzibyhPfaYvxG4z1tRnmVX4yYFtbQmHhU4eKt12Nuqq",
1796 testNetwork(done, params);
1798 it('Allows selection
of Vpncoin
', function(done) {
1800 selectText: "VASH - Vpncoin",
1801 phrase: "abandon abandon ability",
1802 firstAddress: "VoEmH1qXC4TsSgBAStR21QYetwnFqbqCx9",
1803 firstPubKey: "039e579dd18157ef1dff74d46f0bdb95f729d3985f0d4f9167fed4095b1aba846c",
1804 firstPrivKey: "WTbS2wjqeTzs8nk1E1N8RxpPUow8wNkgCjfDCuvDLRHaWFuNhxMz",
1806 testNetwork(done, params);
1808 it('Allows selection
of VeChain
', function(done) {
1810 selectText: "VET - VeChain",
1811 phrase: "abandon abandon ability",
1812 firstAddress: "0xdba55B1B6070f3a733D5eDFf35F0da4A00E455F2",
1813 firstPubKey: "0x0386911777255ed1d57906dcc85ca7fd4ba9eb4c8160ced97817933919d1ffe7ad",
1814 firstPrivKey: "0x3ec2b392952fe8a82a319c8ca9a4bb9c1db7beb09c64799da7693615ba1a787e",
1816 testNetwork(done, params);
1818 it('Allows selection
of Whitecoin
', function(done) {
1820 selectText: "XWC - Whitecoin",
1821 phrase: "abandon abandon ability",
1822 firstAddress: "WcSwCAUqrSgeSYbsaS3SSWWhsx8KRYTFDR",
1823 firstPubKey: "03d3f4fa758f6260bfb39664d248a32258b53a90a71224db056ee79abaa3e9f208",
1824 firstPrivKey: "WrGUVSubUyDx5wzjfwi3EhhUwf5anHFW7Dv9kAaTu39CtDDBJWM9",
1826 testNetwork(done, params);
1828 it('Allows selection
of Wincoin
', function(done) {
1830 selectText: "WC - Wincoin",
1831 phrase: "abandon abandon ability",
1832 firstAddress: "WaDVCESMGgyKgNESdn3u43NnwmGSkZED3Z",
1833 firstPubKey: "02d10b29f6d88dd86f733b2140ba2207a9dfb5d014bb287541c66a41e467e231a7",
1834 firstPrivKey: "WmLWUvbz8UF1s7PrHyeQBMLbt4LpmQrwbzatvusvx6SRoNASbWtW",
1836 testNetwork(done, params);
1838 it('Allows selection
of Zcoin
', function(done) {
1840 selectText: "XZC - Zcoin",
1841 phrase: "abandon abandon ability",
1842 firstAddress: "a6VcMdP4XgAA9Tr7xNszmPG5FZpfRf17Cq",
1843 firstPubKey: "0236f2348c32dc62d69488b01988ed1154df261723ec60461cb6e62189984c62db",
1844 firstPrivKey: "Y8k3XQRQrJoABEao4Sw45s744g6xth7yviNqFcN7zqPqKUJrrKTQ",
1846 testNetwork(done, params);
1848 it('Allows selection
of Zcash
', function(done) {
1850 selectText: "ZEC - Zcash",
1851 phrase: "abandon abandon ability",
1852 firstAddress: "t1Sz8AneMcVuzUg3tPJ8et5AS5LFJ7K2EF9",
1853 firstPubKey: "035864cede8db462f7ccfda96bd7358156e198a894032cfc87505d82abb6d48b48",
1854 firstPrivKey: "L1eU2kCeBQBZTQKKt7uYu4pb6Z1ZMy1Km1VMznUvGyH64GTxMqfL",
1856 testNetwork(done, params);
1858 it('Allows selection
of Zclassic
', function(done) {
1860 selectText: "ZCL - Zclassic",
1861 phrase: "abandon abandon ability",
1862 firstAddress: "t1TBMxTvVJRybUbMLGWq8H4A8F4VUL7czEc",
1863 firstPubKey: "02fbdf32c4d9e692d4a94aa09f830a2a3b7b73f5c4f313b8234fc39a8b151c9ab7",
1864 firstPrivKey: "L5N7BBrrAweLcbAQGVDLZAaX9DnfAiD2VCZBBU1U3HBftFsRfHm7",
1866 testNetwork(done, params);
1868 it('Allows selection
of Horizen
', function(done) {
1870 selectText: "ZEN - Horizen",
1871 phrase: "abandon abandon ability",
1872 firstAddress: "znWh9XASyW2dZq5tck84wFjiwuqVysi7q3p",
1873 firstPubKey: "0326a78c08ef8a2b6c0d0d3959ffeddaad64fc921b0e714baeafff4785db31ff7a",
1874 firstPrivKey: "L25L6Ctvb4fr6fTaVVECE2CVoeGuttfUJqk1HQxfuejgb5QZHu8y",
1876 testNetwork(done, params);
1878 it('Allows selection
of Energi
', function(done) {
1880 selectText: "NRG - Energi",
1881 phrase: "abandon abandon ability",
1882 firstAddress: "EejRy4t4nidzhGGzkJUgFP3z4HYBjhTsRt",
1883 firstPubKey: "03a4aa1d4d5bdce7c18df69b123ef292e7e9b6069948b14bf3ee089188076e7c80",
1884 firstPrivKey: "GkMWjZtHh9RXFeNL2m5GKPp3wdNmiaSqqUWVLunR766TjbigK4FC",
1886 testNetwork(done, params);
1888 it('Allows selection
of Ethereum Classic
', function(done) {
1890 selectText: "ETC - Ethereum Classic",
1891 phrase: "abandon abandon ability",
1892 firstAddress: "0x3c05e5556693808367afB62eF3b63e35d6eD249A",
1893 firstPubKey: "0x02afa443029a20b62fe90c3eaa772d440d8e2ddc1ad247c3473b3ff34dc0583f3f",
1894 firstPrivKey: "0x5253e43358ddb97c8c710a2f51fcbdf7c07aad193ddd29c8b57dbab50d6141f2",
1896 testNetwork(done, params);
1898 it('Allows selection
of Pirl
', function(done) {
1900 selectText: "PIRL - Pirl",
1901 phrase: "abandon abandon ability",
1902 firstAddress: "0xe77FC0723dA122B5025CA79193c28563eB47e776",
1903 firstPubKey: "0x039b4d13ecf9ef299546ba0d486969e0b659baa0cb71278501a46dce4381f612de",
1904 firstPrivKey: "0xe76ed1cffd0572b31be2ada6848d46e267b8b2242b30f1a92142f64ee4772460",
1906 testNetwork(done, params);
1908 it('Allows selection
of MIX
', function(done) {
1910 selectText: "MIX - MIX",
1911 phrase: "abandon abandon ability",
1912 firstAddress: "0x98BC5e63aeb6A4e82d72850d20710F07E29A29F1",
1913 firstPubKey: "0x02686ad3d73950627c46b73cd0c0d3b17e0bdcb89c094ce68b2f4219c09016c547",
1914 firstPrivKey: "0x70deca38fff7d8a2490491deb1bb7fbc979d6a0b97000b9f1eddefdd214eb7da",
1916 testNetwork(done, params);
1918 it('Allows selection
of Monkey Project
', function(done) {
1920 selectText: "MONK - Monkey Project",
1921 phrase: "abandon abandon ability",
1922 firstAddress: "MnLrcnnUzKnf7TzufjRe5DLZqQJz18oYyu",
1923 firstPubKey: "03a3f72bd9023fa12b22e5255d74e80420a968b577efbc52cea283da0f6690d4fc",
1924 firstPrivKey: "9B4CknHTfmvPS3oEG6AjJUMz1SZtJKN6rmEoaFoZNCJd1EU1xVdS",
1926 testNetwork(done, params);
1929 it('Allows selection
of MOAC
', function(done) {
1931 selectText: "MOAC - MOAC",
1932 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",
1933 firstAddress: "0xa1350EA5707247e0092Ab780A0CDbeA9c8C7Acb5",
1934 firstPubKey: "0x0376b024c6068c9fda7e91779e115dcd3a70584fd6984e6dd25da144c46ca259c6",
1935 firstPrivKey: "0x2515f9db03c1e56de393648eabf35d288f730aadce5d30865c52e72b28e303c9",
1937 testNetwork(done, params);
1939 it('Allows selection
of Musicoin
', function(done) {
1941 selectText: "MUSIC - Musicoin",
1942 phrase: "abandon abandon ability",
1943 firstAddress: "0xDc060e4A0b0313ea83Cf6B3A39B9db2D29004897",
1944 firstPubKey: "0x02a17278d54548e7cf0c1e6120646174f42e380ae5a0080f1a0d09f118305d6f9f",
1945 firstPrivKey: "0xaea8683b8bfd56b6fc68c19b88eee4ccd2f00430bc466741d0297aa65c7b56a5",
1947 testNetwork(done, params);
1949 it('Allows selection
of Poa
', function(done) {
1951 selectText: "POA - Poa",
1952 phrase: "abandon abandon ability",
1953 firstAddress: "0x53aF28d754e106210C3d0467Dd581eaf7e3C5e60",
1954 firstPubKey: "0x02cda40cf7f21f370afe0206cbf219f963369d7c7229dc7ba64137358489d96567",
1955 firstPrivKey: "0xed0a44cff8e44fa978f339af3308ee439c30f4170671ad0e1ccd7e4bfff70ed9",
1957 testNetwork(done, params);
1959 it('Allows selection
of Expanse
', function(done) {
1961 selectText: "EXP - Expanse",
1962 phrase: "abandon abandon ability",
1963 firstAddress: "0xf57FeAbf26582b6E3E666559d3B1Cc6fB2b2c5F6",
1964 firstPubKey: "0x0232fa15f0971f93c182afea54cb28a3180f5a4c31759235ca6ceca47a5a777335",
1965 firstPrivKey: "0x9f96418f9ec3672b52c2a6421272650b2d5992d524a48905a4ff0ed9ce347c9b",
1967 testNetwork(done, params);
1969 it('Allows selection
of Callisto
', function(done) {
1971 selectText: "CLO - Callisto",
1972 phrase: "abandon abandon ability",
1973 firstAddress: "0x4f9364F7420B317266C51Dc8eB979717D4dE3f4E",
1974 firstPubKey: "0x0313d9db8d77249c768630a5a8315e08e3a3284d7e18774476d15e073931ddc15e",
1975 firstPrivKey: "0x02bbf00719f3730baf989f7392b8d55548dd349abd744c68242c69bd016ce28d",
1977 testNetwork(done, params);
1979 it('Allows selection
of HUSH
', function(done) {
1981 selectText: "HUSH - Hush (Legacy)",
1982 phrase: "abandon abandon ability",
1983 firstAddress: "t1g6rLXUnJaiJuu4q4zmJjoa9Gk4fwKpiuA",
1984 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
1985 firstPrivKey: "Kx99fhLCDHPsBsZAJDH7v8vgGDch4rNr9VjhAUMfVevJWnoGr8WD",
1987 testNetwork(done, params);
1989 it('Allows selection
of HUSH3
', function(done) {
1991 selectText: "HUSH - Hush3",
1992 phrase: "abandon abandon ability",
1993 firstAddress: "RXWSQhwvw5jHPGP8bjwJhWoRnMLBnuPDKD",
1994 firstPubKey: "038702683b2d7bbb5c35e18e01cd18483cda8485fb919f34c0186ae31a05007755",
1995 firstPrivKey: "UpvyyNxAiWN7evMFUkxhgabuCHfq9xeTv17Wjj9LxN91QegKs6RR",
1997 testNetwork(done, params);
1999 it('Allows selection
of ExchangeCoin
', function(done) {
2001 selectText: "EXCC - ExchangeCoin",
2002 phrase: "abandon abandon ability",
2003 firstAddress: "22txYKpFN5fwGwdSs2UBf7ywewbLM92YqK7E",
2004 firstPubKey: "033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3",
2005 firstPrivKey: "L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE",
2007 testNetwork(done, params);
2009 it('Allows selection
of Artax
', function(done) {
2011 selectText: "XAX - Artax",
2012 phrase: "abandon abandon ability",
2013 firstAddress: "AYxaQPY7XLidG31V7F3yNzwxPYpYzRqG4q",
2014 firstPubKey: "02edef928ec3951112452119f9a63d9479741ea0fc497682bd13064cfc5d1cc4e3",
2015 firstPrivKey: "PMcqFx52ipYy9gZynEi5LYVD3XUC8YbQr2Neg6e3LFnh4yTBQ9yJ",
2017 testNetwork(done, params);
2019 it('Allows selection
of BitcoinGreen
', function(done) {
2021 selectText: "BITG - Bitcoin Green",
2022 phrase: "abandon abandon ability",
2023 firstAddress: "GeNGm9SkEfwbsws3UrrUSE2sJeyWYjzraY",
2024 firstPubKey: "02a8e34c2599a14ca861285b734750432a7ce10caf7f1ff5a366a94264c636a12b",
2025 firstPrivKey: "7uf6WeVgBqKR1WyUcaz1TLSKabyov9SfQDghyvfaCy6VZPwLNeku",
2027 testNetwork(done, params);
2029 it('Allows selection
of ANON
', function(done) {
2031 selectText: "ANON - ANON",
2032 phrase: "abandon abandon ability",
2033 firstAddress: "AnU6pijpEeUZFWSTyM2qTqZQn996Zq1Xard",
2034 firstPubKey: "032742ff4eaf9188d84d38dfb4a2fdbb541bfd3ca9ee533a7d1092940a1ea60bb4",
2035 firstPrivKey: "L2w3aoZExc9eHh1KMnDzrzaSVmfgQMvBxxFbtcegKNvrHVa4r81m",
2037 testNetwork(done, params);
2039 it('Allows selection
of ProjectCoin
', function(done) {
2041 selectText: "PRJ - ProjectCoin",
2042 phrase: "abandon abandon ability",
2043 firstAddress: "PXZG97saRseSCftfe1mcFmfAA7pf6qBbaz",
2044 firstPubKey: "025f84297a93a33bccb735c931140ddb4279fe9d55a571ee7731259e3e19d0c7fe",
2045 firstPrivKey: "JRR5uB6daEtSCLNnv7hKSgZ5KmFdHMUcpTzJGtEAi9sWSiQd4hVQ",
2047 testNetwork(done, params);
2049 it('Allows selection
of Phore
', function(done) {
2051 selectText: "PHR - Phore",
2052 phrase: "abandon abandon ability",
2053 firstAddress: "PJThxpoXAG6hqrmdeQQbVDX4TJtFTMMymC",
2054 firstPubKey: "022ef3c4cbc0481fd925ecac51f09f2976ea024b0863b543b1b481181e1ef34265",
2055 firstPrivKey: "YPzQxHMA2Pm5S2p8Xwhmhm2PnH6ooYHrWNXiAKCCA2CjMtHyNzuh",
2057 testNetwork(done, params);
2059 it('Allows selection
of Safecoin
', function(done) {
2061 selectText: "SAFE - Safecoin",
2062 phrase: "abandon abandon ability",
2063 firstAddress: "RtxHpnhJz6RY8k9owP3ua5QWraunmewB1G",
2064 firstPubKey: "0383956cd23c1124324c92ac69f4bcf71ad973892a83aceb4085041afb082f6db9",
2065 firstPrivKey: "Uznk2AHWqpSGRw8dmG3t3Q3rJJwyn3TcjzWh9EgDCQ9jU34DWF6m",
2067 testNetwork(done, params);
2069 it('Allows selection
of Blocknode
', function(done) {
2071 selectText: "BND - Blocknode",
2072 phrase: "abandon abandon ability",
2073 firstAddress: "BG8xZSAur2jYLG9VXt8dYfkKxxeR7w9bSe",
2074 firstPubKey: "03e91c00dcfca87c80f57691e34e0e4c55a18eb79048dbdd5f6d9c83daefea6459",
2075 firstPrivKey: "C6gySxND85cLnLgsjTfUxXmMzh8JrSR24vpQnUHqVMqGYy36k4ho",
2077 testNetwork(done, params);
2079 it('Allows selection
of Blocknode Testnet
', function(done) {
2081 selectText: "tBND - Blocknode Testnet",
2082 phrase: "abandon abandon ability",
2083 firstAddress: "bSptsFyDktFSKpWveRywJsDoJA2TC6qfHv",
2084 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2085 firstPrivKey: "MPuJVFnTAhFFvtLqgYL32FBF1g7jPraowuN5tV9EF2AtkYXCfkE3",
2087 testNetwork(done, params);
2089 it('Allows selection
of LitecoinZ
', function(done) {
2091 selectText: "LTZ - LitecoinZ",
2092 phrase: "abandon abandon ability",
2093 firstAddress: "L1VTXju7hLgKV4T7fGXS9sKsnm2gmtRCmyw",
2094 firstPubKey: "03ea84a1cc8b43ea8330bc2f363e706a9ff2d48858185c42c296d06ddcb94bc827",
2095 firstPrivKey: "L1PktmLfTgVRQZsqs2ZoFBBqnVXi5hVAimJt8tmfT2ye95WH9zEd",
2097 testNetwork(done, params);
2099 it('Allows selection
of BlockStamp
', function(done) {
2101 selectText: "BST - BlockStamp",
2102 phrase: "abandon abandon ability",
2103 firstAddress: "15gypKtim4cVTj137ApfryG17RkvSbPazZ",
2104 firstPubKey: "0277bc537f8354004f8a77e07fb78b38f291df7bc07819c2d7eab049b8d10b3f7f",
2105 firstPrivKey: "L1NmycTQz17fXBMzK25aBTnN7v5U6rz3AURjL72xyKg21zmAmgt7",
2107 testNetwork(done, params);
2109 it('Allows selection
of DEXON
', function(done) {
2111 selectText: "DXN - DEXON",
2112 phrase: "abandon abandon ability",
2113 firstAddress: "0x136a58788033E028CCd740FbDec6734358DB56Ec",
2114 firstPubKey: "0x028d7fa8c3417904cec37946db8d12bba51d85dde25156651f216260e0ff641cf4",
2115 firstPrivKey: "0x8d7d8479dac38e786d4e493159dd655e116871d17ed803af6bb70207c60298ff",
2117 testNetwork(done, params);
2119 it('Allows selection
of Ellaism
', function(done) {
2121 selectText: "ELLA - Ellaism",
2122 phrase: "abandon abandon ability",
2123 firstAddress: "0xa8B0BeA09eeBc41062308546a01d6E544277e2Ca",
2124 firstPubKey: "0x03698fee21c52ad4b4772df3da92ddf0278da529da231c2ebfb167c9e3cc88f29f",
2125 firstPrivKey: "0xe10bc99fcea6f5bca20c1b6e5386a18991b8d16d658b36881b7aca792e06bac2",
2127 testNetwork(done, params);
2129 it('Allows selection
of Ethersocial Network
', function(done) {
2131 selectText: "ESN - Ethersocial Network",
2132 phrase: "abandon abandon ability",
2133 firstAddress: "0x6EE99Be2A0C7F887a71e21C8608ACF0aa0D2b767",
2134 firstPubKey: "0x028df59c64daa4f1036fe0dc832c4e36d9df0692a7ed9a062d48a4662a01d2c7b3",
2135 firstPrivKey: "0x44e0316578fd8168022039d5dfd5838e70826686a4b05dec9c88100c30049fce",
2137 testNetwork(done, params);
2139 it('Allows selection
of Stellar
', function(done) {
2141 selectText: "XLM - Stellar",
2142 phrase: "abandon abandon ability",
2143 firstAddress: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2144 firstPubKey: "GCUK3NYYUXA2QGN6KU5RR36WAKN3Y5EANZV65XNAWN4XM4CHQ3G4DMO2",
2145 firstPrivKey: "SA35HYGAHWYYLCW2P5EDHGWAYQW2C5F25KH4KFWEXLG5I4CPKPZTLRM5",
2147 testNetwork(done, params);
2149 it('Allows selection
of Wagerr
', function(done) {
2151 selectText: "WGR - Wagerr",
2152 phrase: "abandon abandon ability",
2153 firstAddress: "WYiVgQU39VcQxcnacoCiaZHZZLjDCJoS95",
2154 firstPubKey: "0343cfa1ed85e02fdc782c3c8b0b5febe7653c30a0c4319bef2e7d462e67245e46",
2155 firstPrivKey: "WagfoYsRKgtBwBMgwYWuboY2DpGjJBpFcneqzSegZg4ppvYLWcry",
2157 testNetwork(done, params);
2159 it('Allows selection
of Groestlcoin
', function(done) {
2161 selectText: "GRS - Groestlcoin",
2162 phrase: "abandon abandon ability",
2163 firstAddress: "FZycsFvZ1eH1hbtyjBpAgJSukVw1bN6PBN",
2164 firstPubKey: "03c1d0c7b272a762b4b697bdb1b3b36e26add3215e69f7251db16c5a51c84b7b4c",
2165 firstPrivKey: "KzQVqEsQrKjb4K6bViRqqQJc9nXrvEAxDy2AiPf6tfEkRW7rgNfg",
2167 testNetwork(done, params);
2169 it('Allows selection
of Groestlcoin Testnet
', function(done) {
2171 selectText: "GRS - Groestlcoin Testnet",
2172 phrase: "abandon abandon ability",
2173 firstAddress: "mucaU5iiDaJDb69BHLeDv8JFfGiygRPne9",
2174 firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
2175 firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJpRHpNq",
2177 testNetwork(done, params);
2179 it('Allows selection
of Elastos
', function(done) {
2181 selectText: "ELA - Elastos",
2182 phrase: "abandon abandon ability",
2183 firstAddress: "EMccDcsn3SwPDcfeQMf3w7utqi8ioWYtkg",
2184 firstPubKey: "02c936d5025b06acc283bf9562700279fd1ea3ce7ee204afca0c07be77bc3b4822",
2185 firstPrivKey: "608f7e64b46a1df51ba6b5b38b0599196afd1f36572b1ec696d7aae65d05045d",
2187 testNetwork(done, params);
2189 it('Allows selection
of Energyweb
', function(done) {
2191 selectText: "EWT - EnergyWeb",
2192 phrase: "abandon abandon ability",
2193 firstAddress: "0x22171474844Fc7E8E99A3A69CCf1eDb5574FdD4c",
2194 firstPubKey: "0x03eee63d4d201168802b43f392e61f148a478935055cd990549452c741f4c34b84",
2195 firstPrivKey: "0x325aa9e82d03b3773859d84bece81a598df8478d361cfbc59efc27385e0e3611",
2197 testNetwork(done, params);
2199 it('Allows selection
of Thought
', function(done) {
2201 selectText: "THT - Thought",
2202 phrase: "abandon abandon ability",
2203 firstAddress: "4B1Bh9GibDarFQrhtYU8krpc7WSjgGfYvo",
2204 firstPubKey: "0390e4598e7924f3b0369020394b133545db6bd37fa3aa4648aafbce46330c28cc",
2205 firstPrivKey: "KCwL3y6VVrgzJFqtCkh2RV9M1zruX9NymKsWheb7by1dWLd2QkFx",
2207 testNetwork(done, params);
2209 it('Allows selection
of EtherCore
', function(done) {
2211 selectText: "ERE - EtherCore",
2212 phrase: "abandon abandon ability",
2213 firstAddress: "0x119e6EAC3Ce1b473D62d9fD847fb0ea222eF1D9e",
2214 firstPubKey: "0x02cfeb9a4d8003b5c919c1eb67c91e06b3c08e602a336f74017fc7c756a2550ca9",
2215 firstPrivKey: "0x6bb6e036aaf39326d3c74345ec34ef0c73b1608acb409306c9ba73d22de6abf0",
2217 testNetwork(done, params);
2219 it('Allows selection
of RBTC
- RSK
', function(done) {
2221 selectText: "RBTC - RSK",
2222 phrase: "abandon abandon ability",
2223 firstAddress: "RGtz5TDdtviAZ9haz1YAUNQzcGVFm5bQrP",
2224 firstPubKey: "0219d9b5087ab68edc8a714969d8cb70e7159417b47a05932b227e6f417c7962b9",
2225 firstPrivKey: "UsiDPMcpYqCwtzGXo4wiPZp7cwBaKdmbmseioTc1rFQsg21adFc8",
2227 testNetwork(done, params);
2229 it('Allows selection
of tRBTC
- RSK Testnet
', function(done) {
2231 selectText: "tRBTC - RSK Testnet",
2232 phrase: "abandon abandon ability",
2233 firstAddress: "RHkrWgnSdJHxQAqEsMErhUUa4icXY6xUUC",
2234 firstPubKey: "03f77eb7bd83e92ef47be1abddae7f71fb0bc8a7a1ee4b193662a86ed2705ffc5b",
2235 firstPrivKey: "UpqfuSEDKoacrPh4wMV4sJZqCB6DJfYe81oWBr4eb7y9FWQWoo2A",
2237 testNetwork(done, params);
2239 it('Allows selection
of Argoneum
', function(done) {
2241 selectText: "AGM - Argoneum",
2242 phrase: "abandon abandon ability",
2243 firstAddress: "MWgLPvJkaJwH6hrXFs1MimAC4FwC1kYRhe",
2244 firstPubKey: "0348e5252045fee1d3b1e5bce25dbc16284d5b6c3bfff9c305d4ffa6078c16f3f8",
2245 firstPrivKey: "VJXpuMEFnK8USLyo5tgF7M4cBXU44U8MUor1KRTQ6t9DVno9AAgg",
2247 testNetwork(done, params);
2250 // BIP39 seed is set from phrase
2251 it('Sets the bip39 seed
from the prhase
', function(done) {
2252 driver.findElement(By.css('.phrase
'))
2253 .sendKeys('abandon abandon ability
');
2254 driver.sleep(generateDelay).then(function() {
2255 driver.findElement(By.css('.seed
'))
2256 .getAttribute("value")
2257 .then(function(seed) {
2258 expect(seed).toBe("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3");
2264 // BIP32 root key is set from phrase
2265 it('Sets the bip39 root key
from the prhase
', function(done) {
2266 driver.findElement(By.css('.phrase
'))
2267 .sendKeys('abandon abandon ability
');
2268 driver.sleep(generateDelay).then(function() {
2269 driver.findElement(By.css('.root
-key
'))
2270 .getAttribute("value")
2271 .then(function(seed) {
2272 expect(seed).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
2278 // Tabs show correct addresses when changed
2279 it('Shows the correct address when tab is changed
', function(done) {
2280 driver.findElement(By.css('.phrase
'))
2281 .sendKeys('abandon abandon ability
');
2282 driver.sleep(generateDelay).then(function() {
2283 driver.findElement(By.css('#bip32
-tab a
'))
2285 driver.sleep(generateDelay).then(function() {
2286 getFirstAddress(function(address) {
2287 expect(address).toBe("17uQ7s2izWPwBmEVFikTmZUjbBKWYdJchz");
2294 // BIP44 derivation path is shown
2295 it('Shows the derivation path
for bip44 tab
', function(done) {
2296 driver.findElement(By.css('.phrase
'))
2297 .sendKeys('abandon abandon ability
');
2298 driver.sleep(generateDelay).then(function() {
2299 driver.findElement(By.css('#bip44
.path
'))
2300 .getAttribute("value")
2301 .then(function(path) {
2302 expect(path).toBe("m/44'/0'/0'/0");
2308 // BIP44 extended private key is shown
2309 it('Shows the extended private key for bip44 tab', function(done) {
2310 driver.findElement(By.css('.phrase'))
2311 .sendKeys('abandon abandon ability');
2312 driver.sleep(generateDelay).then(function() {
2313 driver.findElement(By.css('.extended-priv-key'))
2314 .getAttribute("value
")
2315 .then(function(path) {
2316 expect(path).toBe("xprvA2DxxvPZcyRvYgZMGS53nadR32mVDeCyqQYyFhrCVbJNjPoxMeVf7QT5g7mQASbTf9Kp4cryvcXnu2qurjWKcrdsr91jXymdCDNxKgLFKJG
");
2322 // BIP44 extended public key is shown
2323 it('Shows the extended public key for bip44 tab', function(done) {
2324 driver.findElement(By.css('.phrase'))
2325 .sendKeys('abandon abandon ability');
2326 driver.sleep(generateDelay).then(function() {
2327 driver.findElement(By.css('.extended-pub-key'))
2328 .getAttribute("value
")
2329 .then(function(path) {
2330 expect(path).toBe("xpub6FDKNRvTTLzDmAdpNTc49ia9b4byd6vqCdUa46Fp3vqMcC96uBoufCmZXQLiN5AK3iSCJMhf9gT2sxkpyaPepRuA7W3MujV5tGmF5VfbueM
");
2336 // BIP44 account field changes address list
2337 it('Changes the address list if bip44 account is changed', function(done) {
2338 driver.findElement(By.css('#bip44 .account'))
2340 driver.findElement(By.css('.phrase'))
2341 .sendKeys('abandon abandon ability');
2342 driver.sleep(generateDelay).then(function() {
2343 getFirstAddress(function(address) {
2344 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H
");
2350 // BIP44 change field changes address list
2351 it('Changes the address list if bip44 change is changed', function(done) {
2352 driver.findElement(By.css('#bip44 .change'))
2354 driver.findElement(By.css('.phrase'))
2355 .sendKeys('abandon abandon ability');
2356 driver.sleep(generateDelay).then(function() {
2357 getFirstAddress(function(address) {
2358 expect(address).toBe("1KAGfWgqfVbSSXY56fNQ7YnhyKuoskHtYo
");
2364 // BIP32 derivation path can be set
2365 it('Can use a custom bip32 derivation path', function(done) {
2366 driver.findElement(By.css('#bip32-tab a'))
2368 driver.findElement(By.css('#bip32 .path'))
2370 driver.findElement(By.css('#bip32 .path'))
2372 driver.findElement(By.css('.phrase'))
2373 .sendKeys('abandon abandon ability');
2374 driver.sleep(generateDelay).then(function() {
2375 getFirstAddress(function(address) {
2376 expect(address).toBe("16pYQQdLD1hH4hwTGLXBaZ9Teboi1AGL8L
");
2382 // BIP32 can use hardened derivation paths
2383 it('Can use a hardened derivation paths', function(done) {
2384 driver.findElement(By.css('#bip32-tab a'))
2386 driver.findElement(By.css('#bip32 .path'))
2388 driver.findElement(By.css('#bip32 .path'))
2390 driver.findElement(By.css('.phrase
'))
2391 .sendKeys('abandon abandon ability
');
2392 driver.sleep(generateDelay).then(function() {
2393 getFirstAddress(function(address) {
2394 expect(address).toBe("14aXZeprXAE3UUKQc4ihvwBvww2LuEoHo4");
2400 // BIP32 extended private key is shown
2401 it('Shows the BIP32 extended
private key
', function(done) {
2402 driver.findElement(By.css('#bip32
-tab a
'))
2404 driver.findElement(By.css('.phrase
'))
2405 .sendKeys('abandon abandon ability
');
2406 driver.sleep(generateDelay).then(function() {
2407 driver.findElement(By.css('.extended
-priv
-key
'))
2408 .getAttribute("value")
2409 .then(function(privKey) {
2410 expect(privKey).toBe("xprv9va99uTVE5aLiutUVLTyfxfe8v8aaXjSQ1XxZbK6SezYVuikA9MnjQVTA8rQHpNA5LKvyQBpLiHbBQiiccKiBDs7eRmBogsvq3THFeLHYbe");
2416 // BIP32 extended public key is shown
2417 it('Shows the BIP32 extended
public key
', function(done) {
2418 driver.findElement(By.css('#bip32
-tab a
'))
2420 driver.findElement(By.css('.phrase
'))
2421 .sendKeys('abandon abandon ability
');
2422 driver.sleep(generateDelay).then(function() {
2423 driver.findElement(By.css('.extended
-pub
-key
'))
2424 .getAttribute("value")
2425 .then(function(pubKey) {
2426 expect(pubKey).toBe("xpub69ZVZQzP4T8dwPxwbMzz36cNgwy4yzTHmETZMyihzzXXNi3thgg3HCow1RtY252wdw5rS8369xKnraN5Q93y3FkFfJp2XEHWUrkyXsjS93P");
2432 // Derivation path is shown in table
2433 it('Shows the derivation path
in the table
', function(done) {
2434 driver.findElement(By.css('.phrase
'))
2435 .sendKeys('abandon abandon ability
');
2436 driver.sleep(generateDelay).then(function() {
2437 getFirstPath(function(path) {
2438 expect(path).toBe("m/44'/0'/0'/0/0");
2444 // Derivation path for address can be hardened
2445 it('Can derive hardened addresses', function(done) {
2446 driver.findElement(By.css('#bip32-tab a'))
2448 driver.executeScript(function() {
2449 $(".hardened
-addresses
").prop("checked
", true);
2451 driver.findElement(By.css('.phrase'))
2452 .sendKeys('abandon abandon ability');
2453 driver.sleep(generateDelay).then(function() {
2454 getFirstAddress(function(address) {
2455 expect(address).toBe("18exLzUv7kfpiXRzmCjFDoC9qwNLFyvwyd
");
2461 // Derivation path visibility can be toggled
2462 it('Can toggle visibility of the derivation path column', function(done) {
2463 driver.findElement(By.css('.phrase'))
2464 .sendKeys('abandon abandon ability');
2465 driver.sleep(generateDelay).then(function() {
2466 driver.findElement(By.css('.index-toggle'))
2468 testColumnValuesAreInvisible(done, "index
");
2473 it('Shows the address in the table', function(done) {
2474 driver.findElement(By.css('.phrase'))
2475 .sendKeys('abandon abandon ability');
2476 driver.sleep(generateDelay).then(function() {
2477 getFirstAddress(function(address) {
2478 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
2484 // Addresses are shown in order of derivation path
2485 it('Shows the address in order of derivation path', function(done) {
2486 driver.findElement(By.css('.phrase'))
2487 .sendKeys('abandon abandon ability');
2488 driver.sleep(generateDelay).then(function() {
2489 testRowsAreInCorrectOrder(done);
2493 // Address visibility can be toggled
2494 it('Can toggle visibility of the address column', function(done) {
2495 driver.findElement(By.css('.phrase'))
2496 .sendKeys('abandon abandon ability');
2497 driver.sleep(generateDelay).then(function() {
2498 driver.findElement(By.css('.address-toggle'))
2500 testColumnValuesAreInvisible(done, "address
");
2504 // Public key is shown in table
2505 it('Shows the public key in the table', function(done) {
2506 driver.findElement(By.css('.phrase'))
2507 .sendKeys('abandon abandon ability');
2508 driver.sleep(generateDelay).then(function() {
2509 driver.findElements(By.css('.pubkey'))
2510 .then(function(els) {
2512 .then(function(pubkey) {
2513 expect(pubkey).toBe("033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3
");
2520 // Public key visibility can be toggled
2521 it('Can toggle visibility of the public key column', function(done) {
2522 driver.findElement(By.css('.phrase'))
2523 .sendKeys('abandon abandon ability');
2524 driver.sleep(generateDelay).then(function() {
2525 driver.findElement(By.css('.public-key-toggle'))
2527 testColumnValuesAreInvisible(done, "pubkey
");
2531 // Private key is shown in table
2532 it('Shows the private key in the table', function(done) {
2533 driver.findElement(By.css('.phrase'))
2534 .sendKeys('abandon abandon ability');
2535 driver.sleep(generateDelay).then(function() {
2536 driver.findElements(By.css('.privkey'))
2537 .then(function(els) {
2539 .then(function(pubkey) {
2540 expect(pubkey).toBe("L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE
");
2547 // Private key visibility can be toggled
2548 it('Can toggle visibility of the private key column', function(done) {
2549 driver.findElement(By.css('.phrase'))
2550 .sendKeys('abandon abandon ability');
2551 driver.sleep(generateDelay).then(function() {
2552 driver.findElement(By.css('.private-key-toggle'))
2554 testColumnValuesAreInvisible(done, "privkey
");
2558 // More addresses can be generated
2559 it('Can generate more rows in the table', function(done) {
2560 driver.findElement(By.css('.phrase'))
2561 .sendKeys('abandon abandon ability');
2562 driver.sleep(generateDelay).then(function() {
2563 driver.findElement(By.css('.more'))
2565 driver.sleep(generateDelay).then(function() {
2566 driver.findElements(By.css('.address'))
2567 .then(function(els) {
2568 expect(els.length).toBe(40);
2575 // A custom number of additional addresses can be generated
2576 it('Can generate more rows in the table', function(done) {
2577 driver.findElement(By.css('.phrase'))
2578 .sendKeys('abandon abandon ability');
2579 driver.sleep(generateDelay).then(function() {
2580 driver.findElement(By.css('.rows-to-add'))
2582 driver.findElement(By.css('.rows-to-add'))
2584 driver.findElement(By.css('.more'))
2586 driver.sleep(generateDelay).then(function() {
2587 driver.findElements(By.css('.address'))
2588 .then(function(els) {
2589 expect(els.length).toBe(21);
2596 // Additional addresses are shown in order of derivation path
2597 it('Shows additional addresses in order of derivation path', function(done) {
2598 driver.findElement(By.css('.phrase'))
2599 .sendKeys('abandon abandon ability');
2600 driver.sleep(generateDelay).then(function() {
2601 driver.findElement(By.css('.more'))
2603 driver.sleep(generateDelay).then(function() {
2604 testRowsAreInCorrectOrder(done);
2609 // BIP32 root key can be set by the user
2610 it('Allows the user to set the BIP32 root key', function(done) {
2611 driver.findElement(By.css('.root-key'))
2612 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2613 driver.sleep(generateDelay).then(function() {
2614 getFirstAddress(function(address) {
2615 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
2621 // Setting BIP32 root key clears the existing phrase, passphrase and seed
2622 it('Confirms the existing phrase should be cleared', function(done) {
2623 driver.findElement(By.css('.phrase'))
2624 .sendKeys('A non-blank but invalid value');
2625 driver.findElement(By.css('.root-key'))
2626 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2627 driver.switchTo().alert().accept();
2628 driver.findElement(By.css('.phrase'))
2629 .getAttribute("value
").then(function(value) {
2630 expect(value).toBe("");
2635 // Clearing of phrase, passphrase and seed can be cancelled by user
2636 it('Allows the clearing of the phrase to be cancelled', function(done) {
2637 driver.findElement(By.css('.phrase'))
2638 .sendKeys('abandon abandon ability');
2639 driver.sleep(generateDelay).then(function() {
2640 driver.findElement(By.css('.root-key'))
2642 driver.findElement(By.css('.root-key'))
2644 driver.switchTo().alert().dismiss();
2645 driver.findElement(By.css('.phrase'))
2646 .getAttribute("value
").then(function(value) {
2647 expect(value).toBe("abandon abandon ability
");
2653 // Custom BIP32 root key is used when changing the derivation path
2654 it('Can set derivation path for root key instead of phrase', function(done) {
2655 driver.findElement(By.css('#bip44 .account'))
2657 driver.findElement(By.css('.root-key'))
2658 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
2659 driver.sleep(generateDelay).then(function() {
2660 getFirstAddress(function(address) {
2661 expect(address).toBe("1Nq2Wmu726XHCuGhctEtGmhxo3wzk5wZ1H
");
2667 // Incorrect mnemonic shows error
2668 it('Shows an error for incorrect mnemonic', function(done) {
2669 driver.findElement(By.css('.phrase'))
2670 .sendKeys('abandon abandon abandon');
2671 driver.sleep(feedbackDelay).then(function() {
2672 driver.findElement(By.css('.feedback'))
2674 .then(function(feedback) {
2675 expect(feedback).toBe("Invalid mnemonic
");
2681 // Incorrect word shows suggested replacement
2682 it('Shows word suggestion for incorrect word', function(done) {
2683 driver.findElement(By.css('.phrase'))
2684 .sendKeys('abandon abandon abiliti');
2685 driver.sleep(feedbackDelay).then(function() {
2686 driver.findElement(By.css('.feedback'))
2688 .then(function(feedback) {
2689 var msg = "abiliti not
in wordlist
, did you mean ability
?";
2690 expect(feedback).toBe(msg);
2696 // Github pull request 48
2697 // First four letters of word shows that word, not closest
2698 // since first four letters gives unique word in BIP39 wordlist
2699 // eg ille should show illegal, not idle
2700 it('Shows word suggestion based on first four chars', function(done) {
2701 driver.findElement(By.css('.phrase'))
2703 driver.sleep(feedbackDelay).then(function() {
2704 driver.findElement(By.css('.feedback'))
2706 .then(function(feedback) {
2707 var msg = "ille not
in wordlist
, did you mean illegal
?";
2708 expect(feedback).toBe(msg);
2714 // Incorrect BIP32 root key shows error
2715 it('Shows error for incorrect root key', function(done) {
2716 driver.findElement(By.css('.root-key'))
2717 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpj');
2718 driver.sleep(feedbackDelay).then(function() {
2719 driver.findElement(By.css('.feedback'))
2721 .then(function(feedback) {
2722 var msg = "Invalid root key
";
2723 expect(feedback).toBe(msg);
2729 // Derivation path not starting with m shows error
2730 it('Shows error for derivation path not starting with m', function(done) {
2731 driver.findElement(By.css('#bip32-tab a'))
2733 driver.findElement(By.css('#bip32 .path'))
2735 driver.findElement(By.css('#bip32 .path'))
2737 driver.findElement(By.css('.phrase'))
2738 .sendKeys('abandon abandon ability');
2739 driver.sleep(feedbackDelay).then(function() {
2740 driver.findElement(By.css('.feedback'))
2742 .then(function(feedback) {
2743 var msg = "First character must be
'm'";
2744 expect(feedback).toBe(msg);
2750 // Derivation path containing invalid characters shows useful error
2751 it('Shows error for derivation path not starting with m', function(done) {
2752 driver.findElement(By.css('#bip32-tab a'))
2754 driver.findElement(By.css('#bip32 .path'))
2756 driver.findElement(By.css('#bip32 .path'))
2757 .sendKeys('m/1/0wrong1/1');
2758 driver.findElement(By.css('.phrase'))
2759 .sendKeys('abandon abandon ability');
2760 driver.sleep(feedbackDelay).then(function() {
2761 driver.findElement(By.css('.feedback'))
2763 .then(function(feedback) {
2764 var msg = "Invalid characters
0wrong1 found at depth
2";
2765 expect(feedback).toBe(msg);
2771 // Github Issue 11: Default word length is 15
2772 // https://github.com/iancoleman/bip39/issues/11
2773 it('Sets the default word length to 15', function(done) {
2774 driver.findElement(By.css('.strength'))
2775 .getAttribute("value
")
2776 .then(function(strength) {
2777 expect(strength).toBe("15");
2782 // Github Issue 12: Generate more rows with private keys hidden
2783 // https://github.com/iancoleman/bip39/issues/12
2784 it('Sets the correct hidden column state on new rows', function(done) {
2785 driver.findElement(By.css('.phrase'))
2786 .sendKeys("abandon abandon ability
");
2787 driver.sleep(generateDelay).then(function() {
2788 driver.findElement(By.css('.private-key-toggle'))
2790 driver.findElement(By.css('.more'))
2792 driver.sleep(generateDelay).then(function() {
2793 driver.findElements(By.css('.privkey'))
2794 .then(function(els) {
2795 expect(els.length).toBe(40);
2797 testColumnValuesAreInvisible(done, "privkey
");
2802 // Github Issue 19: Mnemonic is not sensitive to whitespace
2803 // https://github.com/iancoleman/bip39/issues/19
2804 it('Ignores excess whitespace in the mnemonic', function(done) {
2805 var doublespace = " ";
2806 var mnemonic = "urge cat
" + doublespace + "bid
";
2807 driver.findElement(By.css('.phrase'))
2808 .sendKeys(mnemonic);
2809 driver.sleep(generateDelay).then(function() {
2810 driver.findElement(By.css('.root-key'))
2811 .getAttribute("value
")
2812 .then(function(seed) {
2813 expect(seed).toBe("xprv9s21ZrQH143K3isaZsWbKVoTtbvd34Y1ZGRugGdMeBGbM3AgBVzTH159mj1cbbtYSJtQr65w6L5xy5L9SFC7c9VJZWHxgAzpj4mun5LhrbC
");
2819 // Github Issue 23: Part 1: Use correct derivation path when changing tabs
2820 // https://github.com/iancoleman/bip39/issues/23
2821 // This test was failing for default timeout of 5000ms so changed it to +10s
2822 it('Uses the correct derivation path when changing tabs', function(done) {
2823 // 1) and 2) set the phrase
2824 driver.findElement(By.css('.phrase'))
2825 .sendKeys("abandon abandon ability
");
2826 driver.sleep(generateDelay).then(function() {
2827 // 3) select bip32 tab
2828 driver.findElement(By.css('#bip32-tab a'))
2830 driver.sleep(generateDelay).then(function() {
2831 // 4) switch from bitcoin to litecoin
2832 selectNetwork("LTC
- Litecoin
");
2833 driver.sleep(generateDelay).then(function() {
2834 // 5) Check address is displayed correctly
2835 getFirstAddress(function(address) {
2836 expect(address).toBe("LS8MP5LZ5AdzSZveRrjm3aYVoPgnfFh5T5
");
2837 // 5) Check derivation path is displayed correctly
2838 getFirstPath(function(path) {
2839 expect(path).toBe("m
/0/0");
2846 }, generateDelay + 10000);
2848 // Github Issue 23 Part 2: Coin selection in derivation path
2849 // https://github.com/iancoleman/bip39/issues/23#issuecomment-238011920
2850 it('Uses the correct derivation path when changing coins', function(done) {
2852 driver.findElement(By.css('.phrase'))
2853 .sendKeys("abandon abandon ability
");
2854 driver.sleep(generateDelay).then(function() {
2855 // switch from bitcoin to clam
2856 selectNetwork("CLAM
- Clams
");
2857 driver.sleep(generateDelay).then(function() {
2858 // check derivation path is displayed correctly
2859 getFirstPath(function(path) {
2860 expect(path).toBe("m
/44'/23'/0'/0/0");
2867 // Github Issue 26: When using a Root key derrived altcoins are incorrect
2868 // https://github.com/iancoleman/bip39/issues/26
2869 it('Uses the correct derivation for altcoins with root keys', function(done) {
2870 // 1) 2) and 3) set the root key
2871 driver.findElement(By.css('.root-key'))
2872 .sendKeys("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi
");
2873 driver.sleep(generateDelay).then(function() {
2874 // 4) switch from bitcoin to viacoin
2875 selectNetwork("VIA
- Viacoin
");
2876 driver.sleep(generateDelay).then(function() {
2877 // 5) ensure the derived address is correct
2878 getFirstAddress(function(address) {
2879 expect(address).toBe("Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT
");
2886 // Selecting a language with no existing phrase should generate a phrase in
2888 it('Generate a random phrase when language is selected and no current phrase', function(done) {
2889 driver.findElement(By.css("a
[href
='#japanese']"))
2891 driver.sleep(generateDelay).then(function() {
2892 driver.findElement(By.css(".phrase
"))
2893 .getAttribute("value
").then(function(phrase) {
2894 expect(phrase.search(/[a-z]/)).toBe(-1);
2895 expect(phrase.length).toBeGreaterThan(0);
2901 // Selecting a language with existing phrase should update the phrase to use
2903 it('Updates existing phrases when the language is changed', function(done) {
2904 driver.findElement(By.css(".phrase
"))
2905 .sendKeys("abandon abandon ability
");
2906 driver.sleep(generateDelay).then(function() {
2907 driver.findElement(By.css("a
[href
='#italian']"))
2909 driver.sleep(generateDelay).then(function() {
2910 driver.findElement(By.css(".phrase
"))
2911 .getAttribute("value
").then(function(phrase) {
2912 // Check only the language changes, not the phrase
2913 expect(phrase).toBe("abaco abaco abbaglio
");
2914 getFirstAddress(function(address) {
2915 // Check the address is correct
2916 expect(address).toBe("1Dz5TgDhdki9spa6xbPFbBqv5sjMrx3xgV
");
2924 // Suggested replacement for erroneous word in non-English language
2925 it('Shows word suggestion for incorrect word in non-English language', function(done) {
2926 driver.findElement(By.css('.phrase'))
2927 .sendKeys('abaco abaco zbbaglio');
2928 driver.sleep(feedbackDelay).then(function() {
2929 driver.findElement(By.css('.feedback'))
2931 .then(function(feedback) {
2932 var msg = "zbbaglio not
in wordlist
, did you mean abbaglio
?";
2933 expect(feedback).toBe(msg);
2939 // Japanese word does not break across lines.
2941 // https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md#japanese
2942 it('Does not break Japanese words across lines', function(done) {
2943 driver.findElement(By.css('.phrase'))
2944 .getCssValue("word
-break")
2945 .then(function(value) {
2946 expect(value).toBe("keep
-all
");
2951 // Language can be specified at page load using hash value in url
2952 it('Can set the language from the url hash', function(done) {
2953 driver.get(url + "#japanese
").then(function() {
2954 driver.findElement(By.css('.generate')).click();
2955 driver.sleep(generateDelay).then(function() {
2956 driver.findElement(By.css(".phrase
"))
2957 .getAttribute("value
").then(function(phrase) {
2958 expect(phrase.search(/[a-z]/)).toBe(-1);
2959 expect(phrase.length).toBeGreaterThan(0);
2966 // Entropy can be entered by the user
2967 it('Allows entropy to be entered', function(done) {
2968 driver.findElement(By.css('.use-entropy'))
2970 driver.findElement(By.css('.entropy'))
2971 .sendKeys('00000000 00000000 00000000 00000000');
2972 driver.sleep(generateDelay).then(function() {
2973 driver.findElement(By.css(".phrase
"))
2974 .getAttribute("value
").then(function(phrase) {
2975 expect(phrase).toBe("abandon abandon ability
");
2976 getFirstAddress(function(address) {
2977 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
2984 // A warning about entropy is shown to the user, with additional information
2985 it('Shows a warning about using entropy', function(done) {
2986 driver.findElement(By.css('.use-entropy'))
2988 driver.findElement(By.css('.entropy-container'))
2990 .then(function(containerText) {
2991 var warning = "mnemonic may be insecure
";
2992 expect(containerText).toContain(warning);
2993 driver.findElement(By.css('#entropy-notes'))
2994 .findElement(By.xpath("parent::*"))
2996 .then(function(notesText) {
2997 var detail = "flipping a fair coin
, rolling a fair dice
, noise measurements etc
";
2998 expect(notesText).toContain(detail);
3004 // The types of entropy available are described to the user
3005 it('Shows the types of entropy available', function(done) {
3006 driver.findElement(By.css('.entropy'))
3007 .getAttribute("placeholder
")
3008 .then(function(placeholderText) {
3017 for (var i=0; i<options.length; i++) {
3018 var option = options[i];
3019 expect(placeholderText).toContain(option);
3025 // The actual entropy used is shown to the user
3026 it('Shows the actual entropy used', function(done) {
3027 driver.findElement(By.css('.use-entropy'))
3029 driver.findElement(By.css('.entropy'))
3030 .sendKeys('Not A Very Good Entropy Source At All');
3031 driver.sleep(generateDelay).then(function() {
3032 driver.findElement(By.css('.entropy-container'))
3034 .then(function(text) {
3035 expect(text).toMatch(/Filtered Entropy\s+AedEceAA/);
3041 // Binary entropy can be entered
3042 it('Allows binary entropy to be entered', function(done) {
3043 testEntropyType(done, "01", "binary
");
3046 // Base 6 entropy can be entered
3047 it('Allows base 6 entropy to be entered', function(done) {
3048 testEntropyType(done, "012345", "base
6");
3051 // Base 6 dice entropy can be entered
3052 it('Allows base 6 dice entropy to be entered', function(done) {
3053 testEntropyType(done, "123456", "base
6 (dice
)");
3056 // Base 10 entropy can be entered
3057 it('Allows base 10 entropy to be entered', function(done) {
3058 testEntropyType(done, "789", "base
10");
3061 // Hexadecimal entropy can be entered
3062 it('Allows hexadecimal entropy to be entered', function(done) {
3063 testEntropyType(done, "abcdef
", "hexadecimal
");
3066 // Dice entropy value is shown as the converted base 6 value
3067 // ie 123456 is converted to 123450
3068 it('Shows dice entropy as base 6', function(done) {
3069 driver.findElement(By.css('.use-entropy'))
3071 driver.findElement(By.css('.entropy'))
3072 .sendKeys("123456");
3073 driver.sleep(generateDelay).then(function() {
3074 driver.findElement(By.css('.entropy-container'))
3076 .then(function(text) {
3077 expect(text).toMatch(/Filtered Entropy\s+123450/);
3083 // The number of bits of entropy accumulated is shown
3084 it("Shows the number
of bits
of entropy
for 20 bits
of binary
", function(done) {
3085 testEntropyBits(done, "0000 0000 0000 0000 0000", "20");
3087 it("Shows the number
of bits
of entropy
for 1 bit
of binary
", function(done) {
3088 testEntropyBits(done, "0", "1");
3090 it("Shows the number
of bits
of entropy
for 4 bits
of binary
", function(done) {
3091 testEntropyBits(done, "0000", "4");
3093 it("Shows the number
of bits
of entropy
for 1 character
of base
6 (dice
)", function(done) {
3094 // 6 in card is 0 in base 6, 0 in base 6 is 2.6 bits (rounded down to 2 bits)
3095 testEntropyBits(done, "6", "2");
3097 it("Shows the number
of bits
of entropy
for 1 character
of base
10 with 3 bits
", function(done) {
3098 // 7 in base 10 is 111 in base 2, no leading zeros
3099 testEntropyBits(done, "7", "3");
3101 it("Shows the number
of bits
of entropy
for 1 character
of base
10 with 4 bis
", function(done) {
3102 testEntropyBits(done, "8", "4");
3104 it("Shows the number
of bits
of entropy
for 1 character
of hex
", function(done) {
3105 testEntropyBits(done, "F
", "4");
3107 it("Shows the number
of bits
of entropy
for 2 characters
of base
10", function(done) {
3108 testEntropyBits(done, "29", "6");
3110 it("Shows the number
of bits
of entropy
for 2 characters
of hex
", function(done) {
3111 testEntropyBits(done, "0A
", "8");
3113 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 3 leading zeros
", function(done) {
3114 // hex is always multiple of 4 bits of entropy
3115 testEntropyBits(done, "1A
", "8");
3117 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 2 leading zeros
", function(done) {
3118 testEntropyBits(done, "2A
", "8");
3120 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with 1 leading zero
", function(done) {
3121 testEntropyBits(done, "4A
", "8");
3123 it("Shows the number
of bits
of entropy
for 2 characters
of hex
with no leading zeros
", function(done) {
3124 testEntropyBits(done, "8A
", "8");
3126 it("Shows the number
of bits
of entropy
for 2 characters
of hex starting
with F
", function(done) {
3127 testEntropyBits(done, "FA
", "8");
3129 it("Shows the number
of bits
of entropy
for 4 characters
of hex
with leading zeros
", function(done) {
3130 testEntropyBits(done, "000A
", "16");
3132 it("Shows the number
of bits
of entropy
for 4 characters
of base
6", function(done) {
3133 testEntropyBits(done, "5555", "11");
3135 it("Shows the number
of bits
of entropy
for 4 characters
of base
6 dice
", function(done) {
3136 // uses dice, so entropy is actually 0000 in base 6, which is 4 lots of
3137 // 2.58 bits, which is 10.32 bits (rounded down to 10 bits)
3138 testEntropyBits(done, "6666", "10");
3140 it("Shows the number
of bits
of entropy
for 4 charactes
of base
10", function(done) {
3141 // Uses base 10, which is 4 lots of 3.32 bits, which is 13.3 bits (rounded
3143 testEntropyBits(done, "2227", "13");
3145 it("Shows the number
of bits
of entropy
for 4 characters
of hex
with 2 leading zeros
", function(done) {
3146 testEntropyBits(done, "222F
", "16");
3148 it("Shows the number
of bits
of entropy
for 4 characters
of hex starting
with F
", function(done) {
3149 testEntropyBits(done, "FFFF
", "16");
3151 it("Shows the number
of bits
of entropy
for 10 characters
of base
10", function(done) {
3152 // 10 events at 3.32 bits per event
3153 testEntropyBits(done, "0000101017", "33");
3155 it("Shows the number
of bits
of entropy
for a full deck
of cards
", function(done) {
3156 // cards are not replaced, so a full deck is not 52^52 entropy which is 296
3157 // bits, it's 52!, which is 225 bits
3158 testEntropyBits(done, "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
", "225");
3161 it("Shows details about the entered entropy
", function(done) {
3162 testEntropyFeedback(done,
3166 type: "hexadecimal
",
3170 strength: "less than a second
",
3174 it("Shows details about the entered entropy
", function(done) {
3175 testEntropyFeedback(done,
3177 entropy: "AAAAAAAA
",
3178 filtered: "AAAAAAAA
",
3179 type: "hexadecimal
",
3183 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3187 it("Shows details about the entered entropy
", function(done) {
3188 testEntropyFeedback(done,
3190 entropy: "AAAAAAAA B
",
3191 filtered: "AAAAAAAAB
",
3192 type: "hexadecimal
",
3196 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3200 it("Shows details about the entered entropy
", function(done) {
3201 testEntropyFeedback(done,
3203 entropy: "AAAAAAAA BBBBBBBB
",
3204 filtered: "AAAAAAAABBBBBBBB
",
3205 type: "hexadecimal
",
3209 strength: "less than a second
- Repeats like
\"aaa
\" are easy to guess
",
3213 it("Shows details about the entered entropy
", function(done) {
3214 testEntropyFeedback(done,
3216 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC
",
3217 filtered: "AAAAAAAABBBBBBBBCCCCCCCC
",
3218 type: "hexadecimal
",
3222 strength: "less than a second
",
3226 it("Shows details about the entered entropy
", function(done) {
3227 testEntropyFeedback(done,
3229 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
",
3230 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD
",
3231 type: "hexadecimal
",
3235 strength: "2 minutes
",
3239 it("Shows details about the entered entropy
", function(done) {
3240 testEntropyFeedback(done,
3242 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA
",
3243 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDA
",
3244 type: "hexadecimal
",
3252 it("Shows details about the entered entropy
", function(done) {
3253 testEntropyFeedback(done,
3255 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE
",
3256 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEE
",
3257 type: "hexadecimal
",
3261 strength: "3 years
",
3265 it("Shows details about the entered entropy
", function(done) {
3266 testEntropyFeedback(done,
3268 entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF
",
3269 filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEEFFFFFFFF
",
3270 type: "hexadecimal
",
3274 strength: "centuries
",
3278 it("Shows details about the entered entropy
", function(done) {
3279 testEntropyFeedback(done,
3286 strength: "less than a second
",
3290 it("Shows details about the entered entropy
", function(done) {
3291 testEntropyFeedback(done,
3293 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3294 type: "card (full deck
)",
3298 strength: "centuries
",
3302 it("Shows details about the entered entropy
", function(done) {
3303 testEntropyFeedback(done,
3305 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d
",
3306 type: "card (full deck
, 1 duplicate: 3d
)",
3310 strength: "centuries
",
3314 it("Shows details about the entered entropy
", function(done) {
3315 testEntropyFeedback(done,
3317 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d
",
3318 type: "card (2 duplicates: 3d
4d
, 1 missing: KS
)",
3322 strength: "centuries
",
3326 it("Shows details about the entered entropy
", function(done) {
3327 testEntropyFeedback(done,
3329 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d
",
3330 type: "card (4 duplicates: 3d
4d
5d
..., 1 missing: KS
)",
3334 strength: "centuries
",
3338 it("Shows details about the entered entropy
", function(done) {
3339 testEntropyFeedback(done,
3340 // Next test was throwing uncaught error in zxcvbn
3341 // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2
3343 entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsksac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3344 type: "card (full deck
, 52 duplicates: ac
2c
3c
...)",
3348 strength: "centuries
",
3352 it("Shows details about the entered entropy
", function(done) {
3353 testEntropyFeedback(done,
3354 // Case insensitivity to duplicate cards
3357 type: "card (1 duplicate: AS
)",
3361 strength: "less than a second
",
3365 it("Shows details about the entered entropy
", function(done) {
3366 testEntropyFeedback(done,
3369 type: "card (1 duplicate: as
)",
3373 strength: "less than a second
",
3377 it("Shows details about the entered entropy
", function(done) {
3378 testEntropyFeedback(done,
3379 // Missing cards are detected
3381 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3382 type: "card (1 missing: 9C
)",
3386 strength: "centuries
",
3390 it("Shows details about the entered entropy
", function(done) {
3391 testEntropyFeedback(done,
3393 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3394 type: "card (2 missing: 9C
5D
)",
3398 strength: "centuries
",
3402 it("Shows details about the entered entropy
", function(done) {
3403 testEntropyFeedback(done,
3405 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d7d8d9dtdjd kdah2h3h
5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks
",
3406 type: "card (4 missing: 9C
5D QD
...)",
3410 strength: "centuries
",
3414 it("Shows details about the entered entropy
", function(done) {
3415 testEntropyFeedback(done,
3416 // More than six missing cards does not show message
3418 entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d
6d
8d9d jd kdah2h3h
5h6h7h8h9hthjhqhkh
2s3s4s5s6s7s8s9stsjsqsks
",
3423 strength: "centuries
",
3427 it("Shows details about the entered entropy
", function(done) {
3428 testEntropyFeedback(done,
3429 // Multiple decks of cards increases bits per event
3434 bitsPerEvent: "4.34",
3438 it("Shows details about the entered entropy
", function(done) {
3439 testEntropyFeedback(done,
3444 bitsPerEvent: "4.80",
3448 it("Shows details about the entered entropy
", function(done) {
3449 testEntropyFeedback(done,
3454 bitsPerEvent: "5.01",
3458 it("Shows details about the entered entropy
", function(done) {
3459 testEntropyFeedback(done,
3461 entropy: "3d3d3d3d
",
3464 bitsPerEvent: "5.14",
3468 it("Shows details about the entered entropy
", function(done) {
3469 testEntropyFeedback(done,
3471 entropy: "3d3d3d3d3d
",
3474 bitsPerEvent: "5.22",
3478 it("Shows details about the entered entropy
", function(done) {
3479 testEntropyFeedback(done,
3481 entropy: "3d3d3d3d3d3d
",
3484 bitsPerEvent: "5.28",
3488 it("Shows details about the entered entropy
", function(done) {
3489 testEntropyFeedback(done,
3491 entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d
",
3494 bitsPerEvent: "5.59",
3495 strength: 'less than a second - Repeats like "abcabcabc
" are only slightly harder to guess than "abc
"',
3500 // Entropy is truncated from the left
3501 it('Truncates entropy from the left', function(done) {
3502 // Truncate from left means 0000 is removed from the start
3503 // which gives mnemonic 'avocado zoo zone'
3504 // not 1111 removed from the end
3505 // which gives the mnemonic 'abstract zoo zoo'
3506 var entropy = "00000000 00000000 00000000 00000000";
3507 entropy += "11111111 11111111 11111111 1111"; // Missing last byte
3508 driver.findElement(By.css('.use-entropy'))
3510 driver.findElement(By.css('.entropy'))
3512 driver.sleep(generateDelay).then(function() {
3513 driver.findElement(By.css(".phrase
"))
3514 .getAttribute("value
").then(function(phrase) {
3515 expect(phrase).toBe("avocado zoo zone
");
3521 // Very large entropy results in very long mnemonics
3522 it('Converts very long entropy to very long mnemonics', function(done) {
3524 for (var i=0; i<33; i++) {
3525 entropy += "AAAAAAAA
"; // 3 words * 33 iterations = 99 words
3527 driver.findElement(By.css('.use-entropy'))
3529 driver.findElement(By.css('.entropy'))
3531 driver.sleep(generateDelay).then(function() {
3532 driver.findElement(By.css(".phrase
"))
3533 .getAttribute("value
").then(function(phrase) {
3534 var wordCount = phrase.split(/\s+/g).length;
3535 expect(wordCount).toBe(99);
3541 // Is compatible with bip32jp entropy
3542 // https://bip32jp.github.io/english/index.html
3544 // Is incompatible with:
3546 it('Is compatible with bip32jp.github.io', function(done) {
3547 var entropy = "543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543";
3548 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
";
3549 driver.findElement(By.css('.use-entropy'))
3551 driver.findElement(By.css('.entropy'))
3553 driver.sleep(generateDelay).then(function() {
3554 driver.findElement(By.css(".phrase
"))
3555 .getAttribute("value
").then(function(phrase) {
3556 expect(phrase).toBe(expectedPhrase);
3562 // Blank entropy does not generate mnemonic or addresses
3563 it('Does not generate mnemonic for blank entropy', function(done) {
3564 driver.findElement(By.css('.use-entropy'))
3566 driver.findElement(By.css('.entropy'))
3568 // check there is no mnemonic
3569 driver.sleep(generateDelay).then(function() {
3570 driver.findElement(By.css(".phrase
"))
3571 .getAttribute("value
").then(function(phrase) {
3572 expect(phrase).toBe("");
3573 // check there is no mnemonic
3574 driver.findElements(By.css(".address
"))
3575 .then(function(addresses) {
3576 expect(addresses.length).toBe(0);
3577 // Check the feedback says 'blank entropy'
3578 driver.findElement(By.css(".feedback
"))
3580 .then(function(feedbackText) {
3581 expect(feedbackText).toBe("Blank entropy
");
3589 // Mnemonic length can be selected even for weak entropy
3590 it('Allows selection of mnemonic length even for weak entropy', function(done) {
3591 driver.findElement(By.css('.use-entropy'))
3593 driver.executeScript(function() {
3594 $(".mnemonic
-length
").val("18").trigger("change
");
3596 driver.findElement(By.css('.entropy'))
3597 .sendKeys("012345");
3598 driver.sleep(generateDelay).then(function() {
3599 driver.findElement(By.css(".phrase
"))
3600 .getAttribute("value
").then(function(phrase) {
3601 var wordCount = phrase.split(/\s+/g).length;
3602 expect(wordCount).toBe(18);
3609 // https://github.com/iancoleman/bip39/issues/33
3610 // Final cards should contribute entropy
3611 it('Uses as much entropy as possible for the mnemonic', function(done) {
3612 driver.findElement(By.css('.use-entropy'))
3614 driver.findElement(By.css('.entropy'))
3615 .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
");
3616 driver.sleep(generateDelay).then(function() {
3618 driver.findElement(By.css(".phrase
"))
3619 .getAttribute("value
").then(function(originalPhrase) {
3620 // Set the last 12 cards to be AS
3621 driver.findElement(By.css('.entropy'))
3623 driver.findElement(By.css('.entropy'))
3624 .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
");
3625 driver.sleep(generateDelay).then(function() {
3627 driver.findElement(By.css(".phrase
"))
3628 .getAttribute("value
").then(function(newPhrase) {
3629 expect(originalPhrase).not.toEqual(newPhrase);
3638 // https://github.com/iancoleman/bip39/issues/35
3640 // TODO this doesn't work in selenium with firefox
3641 // see https://stackoverflow.com/q/40360223
3642 it('Shows a qr code on hover for the phrase', function(done) {
3643 if (browser == "firefox
") {
3644 pending("Selenium
+ Firefox bug
for mouseMove
, see
https://stackoverflow.com/q/40360223");
3646 // generate a random mnemonic
3647 var generateEl
= driver
.findElement(By
.css('.generate'));
3649 // toggle qr to show (hidden by default)
3650 var phraseEl
= driver
.findElement(By
.css(".phrase"));
3652 var rootKeyEl
= driver
.findElement(By
.css(".root-key"));
3653 driver
.sleep(generateDelay
).then(function() {
3654 // hover over the root key
3655 driver
.actions().mouseMove(rootKeyEl
).perform().then(function() {
3656 // check the qr code shows
3657 driver
.executeScript(function() {
3658 return $(".qr-container").find("canvas").length
> 0;
3660 .then(function(qrShowing
) {
3661 expect(qrShowing
).toBe(true);
3662 // hover away from the phrase
3663 driver
.actions().mouseMove(generateEl
).perform().then(function() {;
3664 // check the qr code hides
3665 driver
.executeScript(function() {
3666 return $(".qr-container").find("canvas").length
== 0;
3668 .then(function(qrHidden
) {
3669 expect(qrHidden
).toBe(true);
3678 // BIP44 account extendend private key is shown
3679 // github issue 37 - compatibility with electrum
3680 it('Shows the bip44 account extended private key', function(done
) {
3681 driver
.findElement(By
.css(".phrase"))
3682 .sendKeys("abandon abandon ability");
3683 driver
.sleep(generateDelay
).then(function() {
3684 driver
.findElement(By
.css("#bip44 .account-xprv"))
3685 .getAttribute("value")
3686 .then(function(xprv
) {
3687 expect(xprv
).toBe("xprv9yzrnt4zWVJUr1k2VxSPy9ettKz5PpeDMgaVG7UKedhqnw1tDkxP2UyYNhuNSumk2sLE5ctwKZs9vwjsq3e1vo9egCK6CzP87H2cVYXpfwQ");
3693 // BIP44 account extendend public key is shown
3694 // github issue 37 - compatibility with electrum
3695 it('Shows the bip44 account extended public key', function(done
) {
3696 driver
.findElement(By
.css(".phrase"))
3697 .sendKeys("abandon abandon ability");
3698 driver
.sleep(generateDelay
).then(function() {
3699 driver
.findElement(By
.css("#bip44 .account-xpub"))
3700 .getAttribute("value")
3701 .then(function(xprv
) {
3702 expect(xprv
).toBe("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3709 // BIP32 root key can be set as an xpub
3710 it('Generates addresses from xpub as bip32 root key', function(done
) {
3711 driver
.findElement(By
.css('#bip32-tab a'))
3713 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3714 driver
.findElement(By
.css("#root-key"))
3715 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3716 driver
.sleep(generateDelay
).then(function() {
3717 // check the addresses are generated
3718 getFirstAddress(function(address
) {
3719 expect(address
).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug");
3720 // check the xprv key is not set
3721 driver
.findElement(By
.css(".extended-priv-key"))
3722 .getAttribute("value")
3723 .then(function(xprv
) {
3724 expect(xprv
).toBe("NA");
3725 // check the private key is not set
3726 driver
.findElements(By
.css(".privkey"))
3727 .then(function(els
) {
3730 .then(function(privkey
) {
3731 expect(xprv
).toBe("NA");
3741 // xpub for bip32 root key will not work with hardened derivation paths
3742 it('Shows error for hardened derivation paths with xpub root key', function(done
) {
3743 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3744 driver
.findElement(By
.css("#root-key"))
3745 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
3746 driver
.sleep(feedbackDelay
).then(function() {
3747 // Check feedback is correct
3748 driver
.findElement(By
.css('.feedback'))
3750 .then(function(feedback
) {
3751 var msg
= "Hardened derivation path is invalid with xpub key";
3752 expect(feedback
).toBe(msg
);
3753 // Check no addresses are shown
3754 driver
.findElements(By
.css('.addresses tr'))
3755 .then(function(rows
) {
3756 expect(rows
.length
).toBe(0);
3764 // no root key shows feedback
3765 it('Shows feedback for no root key', function(done
) {
3766 // set xpub for account 0 of bip44 for 'abandon abandon ability'
3767 driver
.findElement(By
.css('#bip32-tab a'))
3769 driver
.sleep(feedbackDelay
).then(function() {
3770 // Check feedback is correct
3771 driver
.findElement(By
.css('.feedback'))
3773 .then(function(feedback
) {
3774 expect(feedback
).toBe("Invalid root key");
3781 // display error switching tabs while addresses are generating
3782 it('Can change details while old addresses are still being generated', function(done
) {
3783 // Set to generate 199 more addresses.
3784 // This will take a long time allowing a new set of addresses to be
3785 // generated midway through this lot.
3786 // The newly generated addresses should not include any from the old set.
3787 // Any more than 199 will show an alert which needs to be accepted.
3788 driver
.findElement(By
.css('.rows-to-add'))
3790 driver
.findElement(By
.css('.rows-to-add'))
3793 driver
.findElement(By
.css('.phrase'))
3794 .sendKeys("abandon abandon ability");
3795 driver
.sleep(generateDelay
).then(function() {
3796 // change tabs which should cancel the previous generating
3797 driver
.findElement(By
.css('.rows-to-add'))
3799 driver
.findElement(By
.css('.rows-to-add'))
3801 driver
.findElement(By
.css('#bip32-tab a'))
3803 driver
.sleep(generateDelay
).then(function() {
3804 driver
.findElements(By
.css('.index'))
3805 .then(function(els
) {
3806 // check the derivation paths have the right quantity
3807 expect(els
.length
).toBe(20);
3808 // check the derivation paths are in order
3809 testRowsAreInCorrectOrder(done
);
3813 }, generateDelay
+ 10000);
3816 // padding for binary should give length with multiple of 256
3817 // hashed entropy 1111 is length 252, so requires 4 leading zeros
3818 // prior to issue 49 it would only generate 2 leading zeros, ie missing 2
3819 it('Pads hashed entropy with leading zeros', function(done
) {
3820 driver
.findElement(By
.css('.use-entropy'))
3822 driver
.executeScript(function() {
3823 $(".mnemonic-length").val("15").trigger("change");
3825 driver
.findElement(By
.css('.entropy'))
3827 driver
.sleep(generateDelay
).then(function() {
3828 driver
.findElement(By
.css('.phrase'))
3829 .getAttribute("value")
3830 .then(function(phrase
) {
3831 expect(phrase
).toBe("avocado valid quantum cross link predict excuse edit street able flame large galaxy ginger nuclear");
3837 // Github pull request 55
3838 // https://github.com/iancoleman/bip39/pull/55
3840 it('Can set the derivation path on bip32 tab for bitcoincore', function(done
) {
3841 testClientSelect(done
, {
3843 bip32path: "m/0'/0'",
3844 useHardenedAddresses: "true",
3847 it('Can set the derivation path on bip32 tab for multibit', function(done
) {
3848 testClientSelect(done
, {
3850 bip32path: "m/0'/0",
3851 useHardenedAddresses: null,
3854 it('Can set the derivation path on bip32 tab for coinomi/ledger', function(done
) {
3855 testClientSelect(done
, {
3857 bip32path: "m/44'/0'/0'",
3858 useHardenedAddresses: null,
3863 // https://github.com/iancoleman/bip39/issues/58
3864 // bip32 derivation is correct, does not drop leading zeros
3866 // https://medium.com/@alexberegszaszi/why-do-my-bip32-wallets-disagree-6f3254cc5846
3867 it('Retains leading zeros for bip32 derivation', function(done
) {
3868 driver
.findElement(By
.css(".phrase"))
3869 .sendKeys("fruit wave dwarf banana earth journey tattoo true farm silk olive fence");
3870 driver
.findElement(By
.css(".passphrase"))
3871 .sendKeys("banana");
3872 driver
.sleep(generateDelay
).then(function() {
3873 getFirstAddress(function(address
) {
3874 // Note that bitcore generates an incorrect address
3875 // 13EuKhffWkBE2KUwcbkbELZb1MpzbimJ3Y
3876 // see the medium.com link above for more details
3877 expect(address
).toBe("17rxURoF96VhmkcEGCj5LNQkmN9HVhWb7F");
3884 // Japanese mnemonics generate incorrect bip32 seed
3885 // BIP39 seed is set from phrase
3886 it('Generates correct seed for Japanese mnemonics', function(done
) {
3887 driver
.findElement(By
.css(".phrase"))
3888 .sendKeys("あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あおぞら");
3889 driver
.findElement(By
.css(".passphrase"))
3890 .sendKeys("メートルガバヴァぱばぐゞちぢ十人十色");
3891 driver
.sleep(generateDelay
).then(function() {
3892 driver
.findElement(By
.css(".seed"))
3893 .getAttribute("value")
3894 .then(function(seed
) {
3895 expect(seed
).toBe("a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55");
3901 // BIP49 official test vectors
3902 // https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#test-vectors
3903 it('Generates BIP49 addresses matching the official test vectors', function(done
) {
3904 driver
.findElement(By
.css('#bip49-tab a'))
3906 selectNetwork("BTC - Bitcoin Testnet");
3907 driver
.findElement(By
.css(".phrase"))
3908 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
3909 driver
.sleep(generateDelay
).then(function() {
3910 getFirstAddress(function(address
) {
3911 expect(address
).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
3917 // BIP49 derivation path is shown
3918 it('Shows the bip49 derivation path', function(done
) {
3919 driver
.findElement(By
.css('#bip49-tab a'))
3921 driver
.findElement(By
.css(".phrase"))
3922 .sendKeys("abandon abandon ability");
3923 driver
.sleep(generateDelay
).then(function() {
3924 driver
.findElement(By
.css('#bip49 .path'))
3925 .getAttribute("value")
3926 .then(function(path
) {
3927 expect(path
).toBe("m/49'/0'/0'/0");
3933 // BIP49 extended private key is shown
3934 it('Shows the bip49 extended private key', function(done
) {
3935 driver
.findElement(By
.css('#bip49-tab a'))
3937 driver
.findElement(By
.css(".phrase"))
3938 .sendKeys("abandon abandon ability");
3939 driver
.sleep(generateDelay
).then(function() {
3940 driver
.findElement(By
.css('.extended-priv-key'))
3941 .getAttribute("value")
3942 .then(function(xprv
) {
3943 expect(xprv
).toBe("yprvALYB4DYRG6CzzVgzQZwwqjAA2wjBGC3iEd7KYYScpoDdmf75qMRWZWxoFcRXBJjgEXdFqJ9vDRGRLJQsrL22Su5jMbNFeM9vetaGVqy9Qy2");
3949 // BIP49 extended public key is shown
3950 it('Shows the bip49 extended public key', function(done
) {
3951 driver
.findElement(By
.css('#bip49-tab a'))
3953 driver
.findElement(By
.css(".phrase"))
3954 .sendKeys("abandon abandon ability");
3955 driver
.sleep(generateDelay
).then(function() {
3956 driver
.findElement(By
.css('.extended-pub-key'))
3957 .getAttribute("value")
3958 .then(function(xprv
) {
3959 expect(xprv
).toBe("ypub6ZXXTj5K6TmJCymTWbUxCs6tayZffemZbr2vLvrEP8kceTSENtjm7KHH6thvAKxVar9fGe8rgsPEX369zURLZ68b4f7Vexz7RuXsjQ69YDt");
3965 // BIP49 account field changes address list
3966 it('Can set the bip49 account field', function(done
) {
3967 driver
.findElement(By
.css('#bip49-tab a'))
3969 driver
.findElement(By
.css('#bip49 .account'))
3971 driver
.findElement(By
.css('#bip49 .account'))
3973 driver
.findElement(By
.css(".phrase"))
3974 .sendKeys("abandon abandon ability");
3975 driver
.sleep(generateDelay
).then(function() {
3976 getFirstAddress(function(address
) {
3977 expect(address
).toBe("381wg1GGN4rP88rNC9v7QWsiww63yLVPsn");
3983 // BIP49 change field changes address list
3984 it('Can set the bip49 change field', function(done
) {
3985 driver
.findElement(By
.css('#bip49-tab a'))
3987 driver
.findElement(By
.css('#bip49 .change'))
3989 driver
.findElement(By
.css('#bip49 .change'))
3991 driver
.findElement(By
.css(".phrase"))
3992 .sendKeys("abandon abandon ability");
3993 driver
.sleep(generateDelay
).then(function() {
3994 getFirstAddress(function(address
) {
3995 expect(address
).toBe("3PEM7MiKed5konBoN66PQhK8r3hjGhy9dT");
4001 // BIP49 account extendend private key is shown
4002 it('Shows the bip49 account extended private key', function(done
) {
4003 driver
.findElement(By
.css('#bip49-tab a'))
4005 driver
.findElement(By
.css(".phrase"))
4006 .sendKeys("abandon abandon ability");
4007 driver
.sleep(generateDelay
).then(function() {
4008 driver
.findElement(By
.css('#bip49 .account-xprv'))
4009 .getAttribute("value")
4010 .then(function(xprv
) {
4011 expect(xprv
).toBe("yprvAHtB1M5Wp675aLzFy9TJYK2mSsLkg6mcBRh5DZTR7L4EnYSmYPaL63KFA4ycg1PngW5LfkmejxzosCs17TKZMpRFKc3z5SJar6QAKaFcaZL");
4017 // BIP49 account extendend public key is shown
4018 it('Shows the bip49 account extended public key', function(done
) {
4019 driver
.findElement(By
.css('#bip49-tab a'))
4021 driver
.findElement(By
.css(".phrase"))
4022 .sendKeys("abandon abandon ability");
4023 driver
.sleep(generateDelay
).then(function() {
4024 driver
.findElement(By
.css('#bip49 .account-xpub'))
4025 .getAttribute("value")
4026 .then(function(xprv
) {
4027 expect(xprv
).toBe("ypub6WsXQrcQeTfNnq4j5AzJuSyVzuBF5ZVTYecg1ws2ffbDfLmv5vtadqdj1NgR6C6gufMpMfJpHxvb6JEQKvETVNWCRanNedfJtnTchZiJtsL");
4033 // Test selecting coin where bip49 is unavailable (eg CLAM)
4034 it('Shows an error on bip49 tab for coins without bip49', function(done
) {
4035 driver
.findElement(By
.css('#bip49-tab a'))
4037 driver
.findElement(By
.css(".phrase"))
4038 .sendKeys("abandon abandon ability");
4039 driver
.sleep(generateDelay
).then(function() {
4040 selectNetwork("CLAM - Clams");
4041 // bip49 available is hidden
4042 driver
.findElement(By
.css('#bip49 .available'))
4043 .getAttribute("class")
4044 .then(function(classes
) {
4045 expect(classes
).toContain("hidden");
4046 // bip49 unavailable is shown
4047 driver
.findElement(By
.css('#bip49 .unavailable'))
4048 .getAttribute("class")
4049 .then(function(classes
) {
4050 expect(classes
).not
.toContain("hidden");
4051 // check there are no addresses shown
4052 driver
.findElements(By
.css('.addresses tr'))
4053 .then(function(rows
) {
4054 expect(rows
.length
).toBe(0);
4055 // check the derived private key is blank
4056 driver
.findElement(By
.css('.extended-priv-key'))
4057 .getAttribute("value")
4058 .then(function(xprv
) {
4059 expect(xprv
).toBe('');
4060 // check the derived public key is blank
4061 driver
.findElement(By
.css('.extended-pub-key'))
4062 .getAttribute("value")
4063 .then(function(xpub
) {
4064 expect(xpub
).toBe('');
4075 // Cleared mnemonic and root key still allows addresses to be generated
4076 // https://github.com/iancoleman/bip39/issues/43
4077 it('Clears old root keys from memory when mnemonic is cleared', function(done
) {
4079 driver
.findElement(By
.css(".phrase"))
4080 .sendKeys("abandon abandon ability");
4081 driver
.sleep(generateDelay
).then(function() {
4082 // clear the mnemonic and root key
4083 // using selenium .clear() doesn't seem to trigger the 'input' event
4084 // so clear it using keys instead
4085 driver
.findElement(By
.css('.phrase'))
4086 .sendKeys(Key
.CONTROL
,"a");
4087 driver
.findElement(By
.css('.phrase'))
4088 .sendKeys(Key
.DELETE
);
4089 driver
.findElement(By
.css('.root-key'))
4090 .sendKeys(Key
.CONTROL
,"a");
4091 driver
.findElement(By
.css('.root-key'))
4092 .sendKeys(Key
.DELETE
);
4093 driver
.sleep(generateDelay
).then(function() {
4094 // try to generate more addresses
4095 driver
.findElement(By
.css('.more'))
4097 driver
.sleep(generateDelay
).then(function() {
4098 driver
.findElements(By
.css(".addresses tr"))
4099 .then(function(els
) {
4100 // check there are no addresses shown
4101 expect(els
.length
).toBe(0);
4110 // error trying to generate addresses from xpub with hardened derivation
4111 it('Shows error for hardened addresses with xpub root key', function(done
) {
4112 driver
.findElement(By
.css('#bip32-tab a'))
4114 driver
.executeScript(function() {
4115 $(".hardened-addresses").prop("checked", true);
4117 // set xpub for account 0 of bip44 for 'abandon abandon ability'
4118 driver
.findElement(By
.css("#root-key"))
4119 .sendKeys("xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf");
4120 driver
.sleep(feedbackDelay
).then(function() {
4121 // Check feedback is correct
4122 driver
.findElement(By
.css('.feedback'))
4124 .then(function(feedback
) {
4125 var msg
= "Hardened derivation path is invalid with xpub key";
4126 expect(feedback
).toBe(msg
);
4132 // Litecoin uses ltub by default, and can optionally be set to xprv
4134 // https://github.com/iancoleman/bip39/issues/96
4135 // Issue with extended keys on Litecoin
4136 it('Uses ltub by default for litecoin, but can be set to xprv', function(done
) {
4137 driver
.findElement(By
.css('.phrase'))
4138 .sendKeys("abandon abandon ability");
4139 selectNetwork("LTC - Litecoin");
4140 driver
.sleep(generateDelay
).then(function() {
4141 // check the extended key is generated correctly
4142 driver
.findElement(By
.css('.root-key'))
4143 .getAttribute("value")
4144 .then(function(rootKey
) {
4145 expect(rootKey
).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
4146 // set litecoin to use ltub
4147 driver
.executeScript(function() {
4148 $(".litecoin-use-ltub").prop("checked", false);
4149 $(".litecoin-use-ltub").trigger("change");
4151 driver
.sleep(generateDelay
).then(function() {
4152 driver
.findElement(By
.css('.root-key'))
4153 .getAttribute("value")
4154 .then(function(rootKey
) {
4155 expect(rootKey
).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
4164 // https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
4165 // "warn me emphatically when they have detected invalid input" to the entropy field
4166 // A warning is shown when entropy is filtered and discarded
4167 it('Warns when entropy is filtered and discarded', function(done
) {
4168 driver
.findElement(By
.css('.use-entropy'))
4170 // set entropy to have no filtered content
4171 driver
.findElement(By
.css('.entropy'))
4172 .sendKeys("00000000 00000000 00000000 00000000");
4173 driver
.sleep(generateDelay
).then(function() {
4174 // check the filter warning does not show
4175 driver
.findElement(By
.css('.entropy-container .filter-warning'))
4176 .getAttribute("class")
4177 .then(function(classes
) {
4178 expect(classes
).toContain("hidden");
4179 // set entropy to have some filtered content
4180 driver
.findElement(By
.css('.entropy'))
4181 .sendKeys("10000000 zxcvbn 00000000 00000000 00000000");
4182 driver
.sleep(entropyFeedbackDelay
).then(function() {
4183 // check the filter warning shows
4184 driver
.findElement(By
.css('.entropy-container .filter-warning'))
4185 .getAttribute("class")
4186 .then(function(classes
) {
4187 expect(classes
).not
.toContain("hidden");
4195 // Bitcoin Cash address can be set to use cashaddr format
4196 it('Can use cashaddr format for bitcoin cash addresses', function(done
) {
4197 driver
.executeScript(function() {
4198 $(".use-bch-cashaddr-addresses").prop("checked", true);
4200 driver
.findElement(By
.css('.phrase'))
4201 .sendKeys("abandon abandon ability");
4202 selectNetwork("BCH - Bitcoin Cash");
4203 driver
.sleep(generateDelay
).then(function() {
4204 getFirstAddress(function(address
) {
4205 expect(address
).toBe("bitcoincash:qzlquk7w4hkudxypl4fgv8x279r754dkvur7jpcsps");
4211 // Bitcoin Cash address can be set to use bitpay format
4212 it('Can use bitpay format for bitcoin cash addresses', function(done
) {
4213 driver
.executeScript(function() {
4214 $(".use-bch-bitpay-addresses").prop("checked", true);
4216 driver
.findElement(By
.css('.phrase'))
4217 .sendKeys("abandon abandon ability");
4218 selectNetwork("BCH - Bitcoin Cash");
4219 driver
.sleep(generateDelay
).then(function() {
4220 getFirstAddress(function(address
) {
4221 expect(address
).toBe("CZnpA9HPmvhuhLLPWJP8rNDpLUYXy1LXFk");
4227 // Bitcoin Cash address can be set to use legacy format
4228 it('Can use legacy format for bitcoin cash addresses', function(done
) {
4229 driver
.executeScript(function() {
4230 $(".use-bch-legacy-addresses").prop("checked", true);
4232 driver
.findElement(By
.css('.phrase'))
4233 .sendKeys("abandon abandon ability");
4234 selectNetwork("BCH - Bitcoin Cash");
4235 driver
.sleep(generateDelay
).then(function() {
4236 getFirstAddress(function(address
) {
4237 expect(address
).toBe("1JKvb6wKtsjNoCRxpZ4DGrbniML7z5U16A");
4243 // End of tests ported from old suit, so no more comments above each test now
4245 it('Can generate more addresses from a custom index', function(done
) {
4246 var expectedIndexes
= [
4247 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
4248 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
4250 driver
.findElement(By
.css('.phrase'))
4251 .sendKeys("abandon abandon ability");
4252 driver
.sleep(generateDelay
).then(function() {
4253 // Set start of next lot of rows to be from index 40
4254 // which means indexes 20-39 will not be in the table.
4255 driver
.findElement(By
.css('.more-rows-start-index'))
4257 driver
.findElement(By
.css('.more'))
4259 driver
.sleep(generateDelay
).then(function() {
4260 // Check actual indexes in the table match the expected pattern
4261 driver
.findElements(By
.css(".index"))
4262 .then(function(els
) {
4263 expect(els
.length
).toBe(expectedIndexes
.length
);
4264 var testRowAtIndex = function(i
) {
4265 if (i
>= expectedIndexes
.length
) {
4270 .then(function(actualPath
) {
4271 var noHardened
= actualPath
.replace(/'/g, "");
4272 var pathBits = noHardened.split("/")
4273 var lastBit = pathBits[pathBits.length-1];
4274 var actualIndex = parseInt(lastBit);
4275 var expectedIndex = expectedIndexes[i];
4276 expect(actualIndex).toBe(expectedIndex);
4277 testRowAtIndex(i+1);
4287 it('Can generate BIP141 addresses
with P2WPKH
-in-P2SH semanitcs
', function(done) {
4288 // Sourced from BIP49 official test specs
4289 driver.findElement(By.css('#bip141
-tab a
'))
4291 driver.findElement(By.css('.bip141
-path
'))
4293 driver.findElement(By.css('.bip141
-path
'))
4294 .sendKeys("m/49'/1'/0'/0");
4295 selectNetwork("BTC
- Bitcoin Testnet
");
4296 driver.findElement(By.css(".phrase
"))
4297 .sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
");
4298 driver.sleep(generateDelay).then(function() {
4299 getFirstAddress(function(address) {
4300 expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2
");
4306 it('Can generate BIP141 addresses with P2WSH semanitcs', function(done) {
4307 driver.findElement(By.css('#bip141-tab a'))
4310 driver.executeScript(function() {
4311 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4312 $(".bip141
-semantics option
").filter(function(i,e) {
4313 return $(e).html() == "P2WSH (1-of-1 multisig
)";
4314 }).prop("selected
", true);
4315 $(".bip141
-semantics
").trigger("change
");
4317 driver.findElement(By.css(".phrase
"))
4318 .sendKeys("abandon abandon ability
");
4319 driver.sleep(generateDelay).then(function() {
4320 driver.findElement(By.css("#root
-key
"))
4321 .getAttribute("value
")
4322 .then(function(rootKey) {
4323 expect(rootKey).toBe("ZprvAhadJRUYsNge9uHspaggavxU1BUQ8QwfT4Z9UGq5sKF2mSt1mVy8EckLAaoBdmLHyP5eYDJ3LxtmzMNnLg2MRFe7QN2ueF4NCH4s5PrCDR6
");
4324 getFirstAddress(function(address) {
4325 expect(address).toBe("bc1q2qhee847pv438tgg8hc7mjy38n8dklleshettn344l0tgs0kj5hskz9p9r
");
4332 it('Can generate BIP141 addresses with P2WSH-in-P2SH semanitcs', function(done) {
4333 driver.findElement(By.css('#bip141-tab a'))
4335 // Choose P2WSH-in-P2SH
4336 driver.executeScript(function() {
4337 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4338 $(".bip141
-semantics option
").filter(function(i,e) {
4339 return $(e).html() == "P2WSH nested
in P2SH (1-of-1 multisig
)";
4340 }).prop("selected
", true);
4341 $(".bip141
-semantics
").trigger("change
");
4343 driver.findElement(By.css(".phrase
"))
4344 .sendKeys("abandon abandon ability
");
4345 driver.sleep(generateDelay).then(function() {
4346 driver.findElement(By.css("#root
-key
"))
4347 .getAttribute("value
")
4348 .then(function(rootKey) {
4349 expect(rootKey).toBe("YprvANkMzkodih9AJc6kzDu4NqrxqDKxBnxAXx2vgswCVJs9iM4nWqoZcZ6C9NqbdrgNZjxqnjhUtJYE74mDcycLd1xWY2LV4LEsvZ1DgqxuAKe
");
4350 getFirstAddress(function(address) {
4351 expect(address).toBe("343DLC4vGDyHBbBr9myL8zzZA1MdN9TM1G
");
4358 it('Uses Vprv for bitcoin testnet p2wsh', function(done) {
4359 selectNetwork("BTC
- Bitcoin Testnet
");
4360 driver.findElement(By.css('#bip141-tab a'))
4363 driver.executeScript(function() {
4364 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4365 $(".bip141
-semantics option
").filter(function(i,e) {
4366 return $(e).html() == "P2WSH (1-of-1 multisig
)";
4367 }).prop("selected
", true);
4368 $(".bip141
-semantics
").trigger("change
");
4370 driver.findElement(By.css('.phrase'))
4371 .sendKeys('abandon abandon ability');
4372 driver.sleep(generateDelay).then(function() {
4373 driver.findElement(By.css('.root-key'))
4374 .getAttribute("value
")
4375 .then(function(path) {
4376 expect(path).toBe("Vprv16YtLrHXxePM5ja5hXQbiJs5JKDAc4WcaXo5rZcrVMU6bMhUg1oY7fpPku3i819gvMcHvq1h8aELDsyfCEs19vj1Q3iDHRrESWyJConkoT1
");
4382 it('Uses Uprv for bitcoin testnet p2wsh-in-p2sh', function(done) {
4383 selectNetwork("BTC
- Bitcoin Testnet
");
4384 driver.findElement(By.css('#bip141-tab a'))
4386 // Choose P2WSH-in-P2SH
4387 driver.executeScript(function() {
4388 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4389 $(".bip141
-semantics option
").filter(function(i,e) {
4390 return $(e).html() == "P2WSH nested
in P2SH (1-of-1 multisig
)";
4391 }).prop("selected
", true);
4392 $(".bip141
-semantics
").trigger("change
");
4394 driver.findElement(By.css('.phrase'))
4395 .sendKeys('abandon abandon ability');
4396 driver.sleep(generateDelay).then(function() {
4397 driver.findElement(By.css('.root-key'))
4398 .getAttribute("value
")
4399 .then(function(path) {
4400 expect(path).toBe("Uprv95RJn67y7xyEuRLHenkZYVUx9LkARJzAsVx3ZJMeyHMdVwosWD9K8JTe4Z1FeE4gwBVcnqKF3f82ZvJxkBxHS5E74fYnigxvqeke8ZV3Fp2
");
4406 it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
4407 // This result tested against bitcoinjs-lib test spec for segwit address
4408 // using the first private key of this mnemonic and default path m/0
4409 // https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50
4410 // so whilst not directly comparable, substituting the private key produces
4411 // identical results between this tool and the bitcoinjs-lib test.
4412 // Private key generated is:
4413 // L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP
4414 driver.findElement(By.css('#bip141-tab a'))
4417 driver.executeScript(function() {
4418 $(".bip141
-semantics option
[selected
]").removeAttr("selected
");
4419 $(".bip141
-semantics option
").filter(function(i,e) {
4420 return $(e).html() == "P2WPKH
";
4421 }).prop("selected
", true);
4422 $(".bip141
-semantics
").trigger("change
");
4424 driver.findElement(By.css(".phrase
"))
4425 .sendKeys("abandon abandon ability
");
4426 driver.sleep(generateDelay).then(function() {
4427 getFirstAddress(function(address) {
4428 expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9
");
4434 it('Shows the entropy used by the PRNG when clicking generate', function(done) {
4435 driver.findElement(By.css('.generate')).click();
4436 driver.sleep(generateDelay).then(function() {
4437 driver.findElement(By.css('.entropy'))
4438 .getAttribute("value
")
4439 .then(function(entropy) {
4440 expect(entropy).not.toBe("");
4446 it('Shows the index of each word in the mnemonic', function(done) {
4447 driver.findElement(By.css('.phrase'))
4448 .sendKeys("abandon abandon ability
");
4449 driver.sleep(generateDelay).then(function() {
4450 driver.findElement(By.css('.use-entropy'))
4452 driver.findElement(By.css('.word-indexes'))
4454 .then(function(indexes) {
4455 expect(indexes).toBe("0, 0, 1");
4461 it('Shows the derivation path for bip84 tab', function(done) {
4462 driver.findElement(By.css('#bip84-tab a'))
4464 driver.findElement(By.css('.phrase'))
4465 .sendKeys('abandon abandon ability');
4466 driver.sleep(generateDelay).then(function() {
4467 driver.findElement(By.css('#bip84 .path'))
4468 .getAttribute("value
")
4469 .then(function(path) {
4470 expect(path).toBe("m
/84'/0'/0'/0");
4476 it('Shows the extended private key for bip84 tab', function(done) {
4477 driver.findElement(By.css('#bip84-tab a'))
4479 driver.findElement(By.css('.phrase'))
4480 .sendKeys('abandon abandon ability');
4481 driver.sleep(generateDelay).then(function() {
4482 driver.findElement(By.css('.extended-priv-key'))
4483 .getAttribute("value
")
4484 .then(function(path) {
4485 expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP
");
4491 it('Shows the extended public key for bip84 tab', function(done) {
4492 driver.findElement(By.css('#bip84-tab a'))
4494 driver.findElement(By.css('.phrase'))
4495 .sendKeys('abandon abandon ability');
4496 driver.sleep(generateDelay).then(function() {
4497 driver.findElement(By.css('.extended-pub-key'))
4498 .getAttribute("value
")
4499 .then(function(path) {
4500 expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx
");
4506 it('Changes the address list if bip84 account is changed', function(done) {
4507 driver.findElement(By.css('#bip84-tab a'))
4509 driver.findElement(By.css('#bip84 .account'))
4511 driver.findElement(By.css('.phrase'))
4512 .sendKeys('abandon abandon ability');
4513 driver.sleep(generateDelay).then(function() {
4514 getFirstAddress(function(address) {
4515 expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662
");
4521 it('Changes the address list if bip84 change is changed', function(done) {
4522 driver.findElement(By.css('#bip84-tab a'))
4524 driver.findElement(By.css('#bip84 .change'))
4526 driver.findElement(By.css('.phrase'))
4527 .sendKeys('abandon abandon ability');
4528 driver.sleep(generateDelay).then(function() {
4529 getFirstAddress(function(address) {
4530 expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2
");
4536 it('Passes the official BIP84 test spec for rootpriv', function(done) {
4537 driver.findElement(By.css('#bip84-tab a'))
4539 driver.findElement(By.css('.phrase'))
4540 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4541 driver.sleep(generateDelay).then(function() {
4542 driver.findElement(By.css(".root
-key
"))
4543 .getAttribute("value
")
4544 .then(function(rootKey) {
4545 expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5
");
4551 it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
4552 driver.findElement(By.css('#bip84-tab a'))
4554 driver.findElement(By.css('.phrase'))
4555 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4556 driver.sleep(generateDelay).then(function() {
4557 driver.findElement(By.css("#bip84
.account
-xprv
"))
4558 .getAttribute("value
")
4559 .then(function(rootKey) {
4560 expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE
");
4566 it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
4567 driver.findElement(By.css('#bip84-tab a'))
4569 driver.findElement(By.css('.phrase'))
4570 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4571 driver.sleep(generateDelay).then(function() {
4572 driver.findElement(By.css("#bip84
.account
-xpub
"))
4573 .getAttribute("value
")
4574 .then(function(rootKey) {
4575 expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs
");
4581 it('Passes the official BIP84 test spec for account 0 first address', function(done) {
4582 driver.findElement(By.css('#bip84-tab a'))
4584 driver.findElement(By.css('.phrase'))
4585 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4586 driver.sleep(generateDelay).then(function() {
4587 getFirstAddress(function(address) {
4588 expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu
");
4594 it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
4595 driver.findElement(By.css('#bip84-tab a'))
4597 driver.findElement(By.css('.phrase'))
4598 .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
4599 driver.findElement(By.css('#bip84 .change'))
4601 driver.sleep(generateDelay).then(function() {
4602 getFirstAddress(function(address) {
4603 expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el
");
4609 it('Can display the table as csv', function(done) {
4610 var headings = "path
,address
,public key
,private key
";
4611 var row1 = "m
/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3
,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE
";
4612 var row20 = "m
/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55
,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a
,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab
";
4613 driver.findElement(By.css('.phrase'))
4614 .sendKeys('abandon abandon ability');
4615 driver.sleep(generateDelay).then(function() {
4616 driver.findElement(By.css('.csv'))
4617 .getAttribute("value
")
4618 .then(function(csv) {
4619 expect(csv).toContain(headings);
4620 expect(csv).toContain(row1);
4621 expect(csv).toContain(row20);
4627 it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
4628 // see https://github.com/iancoleman/bip39/issues/155
4629 selectNetwork("ETH
- Ethereum
");
4630 driver.findElement(By.css('#bip32-tab a'))
4632 driver.findElement(By.css('#bip32-path'))
4634 driver.findElement(By.css('#bip32-path'))
4635 .sendKeys("m
/44'/60'/0'");
4636 driver.findElement(By.css('.phrase'))
4637 .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');
4638 driver.sleep(generateDelay).then(function() {
4639 getFirstAddress(function(address) {
4640 expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
4646 it('Can encrypt private keys using BIP38', function(done) {
4647 // see https://github.com/iancoleman/bip39/issues/140
4648 driver.executeScript(function() {
4649 $(".use-bip38
").prop("checked
", true);
4651 driver.findElement(By.css('.bip38-password'))
4652 .sendKeys('bip38password');
4653 driver.findElement(By.css('.rows-to-add'))
4655 driver.findElement(By.css('.rows-to-add'))
4657 driver.findElement(By.css('.phrase'))
4658 .sendKeys('abandon abandon ability');
4659 driver.sleep(bip38delay).then(function() {
4661 getFirstRowValue(function(address) {
4662 expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB
");
4664 getFirstRowValue(function(pubkey) {
4665 expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1
");
4667 getFirstRowValue(function(privkey) {
4668 expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM
");
4674 }, bip38delay + 5000);
4676 it('Shows the checksum for the entropy', function(done) {
4677 driver.findElement(By.css('.use-entropy'))
4679 driver.findElement(By.css('.entropy'))
4680 .sendKeys("00000000000000000000000000000000");
4681 driver.sleep(generateDelay).then(function() {
4682 driver.findElement(By.css('.checksum'))
4684 .then(function(text) {
4685 expect(text).toBe("1");
4691 it('Shows the checksum for the entropy with the correct groupings', function(done) {
4692 driver.findElement(By.css('.use-entropy'))
4694 // create a checksum of 20 bits, which spans multiple words
4695 driver.findElement(By.css('.entropy'))
4696 .sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
");
4697 driver.sleep(generateDelay).then(function() {
4698 driver.findElement(By.css('.checksum'))
4700 .then(function(text) {
4701 // first group is 9 bits, second group is 11
4702 expect(text).toBe("011010111 01110000110");
4708 it('Uses vprv for bitcoin testnet p2wpkh', function(done) {
4709 selectNetwork("BTC
- Bitcoin Testnet
");
4710 driver.findElement(By.css('#bip84-tab a'))
4712 driver.findElement(By.css('.phrase'))
4713 .sendKeys('abandon abandon ability');
4714 driver.sleep(generateDelay).then(function() {
4715 driver.findElement(By.css('.root-key'))
4716 .getAttribute("value
")
4717 .then(function(path) {
4718 expect(path).toBe("vprv9DMUxX4ShgxML9N2YV5CvWEebWrM9aJ5ULpbRRyzyWu6vs4BzTvbfFFrH41N5hVi7MYSfiugd765L3JmAfDM5po36Y8ouCKRDeYQwByCmS7
");
4724 it('Shows a warning if generating weak mnemonics', function(done) {
4725 driver.executeScript(function() {
4726 $(".strength option
[selected
]").removeAttr("selected
");
4727 $(".strength option
[value
=6]").prop("selected
", true);
4728 $(".strength
").trigger("change
");
4730 driver.findElement(By.css(".generate
-container
.warning
"))
4731 .getAttribute("class")
4732 .then(function(classes) {
4733 expect(classes).not.toContain("hidden
");
4738 it('Does not show a warning if generating strong mnemonics', function(done) {
4739 driver.executeScript(function() {
4740 $(".strength option
[selected
]").removeAttr("selected
");
4741 $(".strength option
[value
=12]").prop("selected
", true);
4743 driver.findElement(By.css(".generate
-container
.warning
"))
4744 .getAttribute("class")
4745 .then(function(classes) {
4746 expect(classes).toContain("hidden
");
4751 it('Shows a warning if overriding weak entropy with longer mnemonics', function(done) {
4752 driver.findElement(By.css('.use-entropy'))
4754 driver.findElement(By.css('.entropy'))
4755 .sendKeys("0123456789abcdef
"); // 6 words
4756 driver.executeScript(function() {
4757 $(".mnemonic
-length
").val("12").trigger("change
");
4759 driver.findElement(By.css(".weak
-entropy
-override
-warning
"))
4760 .getAttribute("class")
4761 .then(function(classes) {
4762 expect(classes).not.toContain("hidden
");
4767 it('Does not show a warning if entropy is stronger than mnemonic length', function(done) {
4768 driver.findElement(By.css('.use-entropy'))
4770 driver.findElement(By.css('.entropy'))
4771 .sendKeys("0123456789abcdef0123456789abcdef0123456789abcdef
"); // 18 words
4772 driver.executeScript(function() {
4773 $(".mnemonic
-length
").val("12").trigger("change
");
4775 driver.findElement(By.css(".weak
-entropy
-override
-warning
"))
4776 .getAttribute("class")
4777 .then(function(classes) {
4778 expect(classes).toContain("hidden
");
4783 it('Shows litecoin BIP49 addresses', function(done) {
4784 driver.findElement(By.css('.phrase'))
4785 .sendKeys('abandon abandon ability');
4786 selectNetwork("LTC
- Litecoin
");
4787 driver.findElement(By.css('#bip49-tab a'))
4789 // bip49 addresses are shown
4790 driver.sleep(generateDelay).then(function() {
4791 driver.findElement(By.css('#bip49 .available'))
4792 .getAttribute("class")
4793 .then(function(classes) {
4794 expect(classes).not.toContain("hidden
");
4795 // check first address
4796 getFirstAddress(function(address) {
4797 expect(address).toBe("MFwLPhsXoBuSLL8cLmW9uK6tChkzduV8qN
");
4804 it('Shows Groestlcoin BIP49 addresses', function(done) {
4805 driver.findElement(By.css('.phrase'))
4806 .sendKeys('abandon abandon ability');
4807 selectNetwork("GRS
- Groestlcoin
");
4808 driver.findElement(By.css('#bip49-tab a'))
4810 // bip49 addresses are shown
4811 driver.sleep(generateDelay).then(function() {
4812 driver.findElement(By.css('#bip49 .available'))
4813 .getAttribute("class")
4814 .then(function(classes) {
4815 expect(classes).not.toContain("hidden
");
4816 // check first address
4817 getFirstAddress(function(address) {
4818 expect(address).toBe("3HXSCZwCypLyixMsF4Z1sN49noJtrm8gnX
");
4825 it('Can use root keys to generate segwit table rows', function(done) {
4826 // segwit uses ypub / zpub instead of xpub but the root key should still
4827 // be valid regardless of the encoding used to import that key.
4828 // Maybe this breaks the reason for the different extended key prefixes, but
4829 // since the parsed root key is used behind the scenes anyhow this should be
4831 driver.findElement(By.css('#root-key'))
4832 .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
4833 driver.findElement(By.css('#bip49-tab a'))
4835 // bip49 addresses are shown
4836 driver.sleep(generateDelay).then(function() {
4837 getFirstAddress(function(address) {
4838 expect(address).toBe("3QG2Y9AA4xZ846gKHZqNf7mvVKbLqMKxr2
");
4845 // Allow converting mnemonic back to raw entropy value
4846 it('Converts mnemonics into raw entropy', function(done) {
4847 driver.findElement(By.css('.phrase'))
4848 .sendKeys('abandon abandon about');
4849 driver.sleep(generateDelay).then(function() {
4850 driver.findElement(By.css('.use-entropy'))
4852 driver.findElement(By.css('.entropy'))
4853 .getAttribute("value
")
4854 .then(function(entropy) {
4855 expect(entropy).toBe("00000001");
4856 driver.findElement(By.css('.phrase'))
4857 .getAttribute("value
")
4858 .then(function(phrase) {
4859 expect(phrase).toBe("abandon abandon about
");
4867 // Added Split Phrase Card Output
4868 it('Shows split prase cards', function(done) {
4869 var originalPhrase = "ugly charge strong giant once anchor capable october thumb inject dwarf legal alley mixture shoot
";
4870 var originalWords = originalPhrase.split(' ');
4871 driver.findElement(By.css('.phrase'))
4872 .sendKeys(originalPhrase);
4873 driver.sleep(generateDelay).then(function() {
4874 driver.findElement(By.css('.phraseSplit'))
4875 .getAttribute("value
")
4876 .then(function(cardsStr) {
4877 var cards = cardsStr.split("\n");
4878 expect(cards.length).toBe(3);
4879 // test all 2-of-3 combos can be used to form full phrase
4880 var combos = [[0,1],[0,2],[1,2]];
4881 for (var i=0; i<combos.length; i++) {
4882 var combo = combos[i];
4885 var phrase = cards[a] + " " + cards[b];
4886 // check all original words are present
4887 for (var j=0; j<originalWords.length; j++) {
4888 var originalWord = originalWords[j];
4889 expect(phrase).toContain(originalWord);
4897 // It allows manually specifying the entropy type
4898 it('Allows entropy type to be manually selected', function(done) {
4899 driver.findElement(By.css('.use-entropy'))
4901 // use decimal entropy
4902 driver.findElement(By.css('.entropy'))
4904 // manually change to binary entropy
4905 driver.executeScript(function() {
4906 $(".entropy
-container input
[value
='binary']").click();
4908 driver.sleep(entropyFeedbackDelay).then(function() {
4909 driver.findElement(By.css('.entropy-container'))
4911 .then(function(text) {
4912 // overide 91 to be just 1
4913 var key = "Filtered Entropy
";
4915 var reText = key + "\\s
+" + value;
4916 var re = new RegExp(reText);
4917 expect(text).toMatch(re);
4918 // overide automatic decimal to binary
4919 var key = "Entropy Type
";
4920 var value = "binary
";
4921 var reText = key + "\\s
+" + value;
4922 var re = new RegExp(reText);
4923 expect(text).toMatch(re);
4924 // overide 2 events to 1
4925 var key = "Event Count
";
4927 var reText = key + "\\s
+" + value;
4928 var re = new RegExp(reText);
4929 expect(text).toMatch(re);
4930 // overide log2(10)*2 bits to 1 bit
4931 var key = "Total Bits
";
4933 var reText = key + "\\s
+" + value;
4934 var re = new RegExp(reText);
4935 expect(text).toMatch(re);
4941 // https://github.com/iancoleman/bip39/issues/388
4942 // Make field for bip39 seed editable
4943 it('Generates addresses when seed is set', function(done) {
4944 driver.findElement(By.css('.seed'))
4945 .sendKeys("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3
");
4946 driver.sleep(generateDelay).then(function() {
4947 getFirstAddress(function(address) {
4948 expect(address).toBe("1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug
");
4954 // https://github.com/iancoleman/bip39/issues/169
4955 it('Generates ethereum addresses from a public key', function(done) {
4956 var pubkey = "xpub68UK3hrMEp2jLPxPASgXSiqiUsQsUWZHCeuu6NqcJLt259LMeWzwDyufXLN1QmjLeLRY5he4QfArDDLbsXiw3xN3kFcYtyDy74BY73RPhhW
";
4957 driver.findElement(By.css('.root-key'))
4959 driver.findElement(By.css('#bip32-tab a'))
4961 selectNetwork('ETH - Ethereum');
4962 driver.sleep(generateDelay).then(function() {
4963 getFirstAddress(function(address) {
4964 expect(address).toBe("0x1Bd54748903438C7E386b4a3fCbe16237A316a98");