await Promise.all([\r
suite('Import wallets', async () => {\r
\r
- // await test('nano.org BIP-44 test vector mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
- // assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
- // assert.ok(account instanceof Account)\r
- // assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\r
- // assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('nano.org BIP-44 test vector seed with no mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok('mnemonic' in wallet)\r
- // assert.ok('seed' in wallet)\r
- // assert.ok(account instanceof Account)\r
- // assert.ok(wallet.mnemonic === undefined)\r
- // assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
- // assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\r
- // assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_0))\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_0))\r
- // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_0)\r
- // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_0)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_1))\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_1))\r
- // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_1)\r
- // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_1)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_2))\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_2))\r
- // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_2)\r
- // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_2)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_3))\r
- // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_3))\r
- // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_3)\r
- // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_3)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('BIP-44 zero-string entropy', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const accounts = await wallet.accounts(0, 3)\r
-\r
- // assert.ok('mnemonic' in wallet)\r
- // assert.ok('seed' in wallet)\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.SEED_0))\r
- // assert.equal(accounts.size, 4)\r
-\r
- // for (let i = 0; i < accounts.size; i++) {\r
- // const account = accounts.get(i)\r
- // assert.exists(account)\r
- // assert.exists(account.address)\r
- // assert.exists(account.publicKey)\r
- // }\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('BLAKE2b zero-string seed', async () => {\r
- // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const accounts = await wallet.accounts(0, 3)\r
-\r
- // assert.ok('mnemonic' in wallet)\r
- // assert.ok('seed' in wallet)\r
- // assert.ok(wallet.mnemonic === undefined)\r
- // assert.ok(wallet.seed === undefined)\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
- // assert.equal(accounts.size, 4)\r
-\r
- // for (let i = 0; i < accounts.size; i++) {\r
- // const account = accounts.get(i)\r
- // assert.exists(account)\r
- // assert.exists(account.address)\r
- // assert.exists(account.publicKey)\r
- // }\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => {\r
- // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const accounts = await wallet.accounts(0, 1)\r
-\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_1))\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_1))\r
-\r
- // const account0 = accounts.get(0)\r
- // assert.exists(account0)\r
- // assert.ok(account0 instanceof Account)\r
- // assert.equal(account0.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_0)\r
- // assert.equal(account0.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_0)\r
-\r
- // const account1 = accounts.get(1)\r
- // assert.exists(account1)\r
- // assert.ok(account1 instanceof Account)\r
- // assert.equal(account1.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_1)\r
- // assert.equal(account1.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_1)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => {\r
- // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const walletAccount = await wallet.account()\r
-\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_2))\r
-\r
- // const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_2)\r
- // await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD)\r
- // const importedAccount = await imported.account()\r
-\r
- // assert.ok(await imported.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
- // assert.ok(await imported.verify(TREZOR_TEST_VECTORS.ENTROPY_2))\r
- // assert.equal(importedAccount.publicKey, walletAccount.publicKey)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // await assert.resolves(imported.destroy())\r
- // })\r
-\r
- // await test('BLAKE2b mnemonic for maximum seed value', async () => {\r
- // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
-\r
- // assert.ok(account instanceof Account)\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_3))\r
- // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_3))\r
- // assert.equal(account.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_3_PUBLIC_0)\r
- // assert.equal(account.address, TREZOR_TEST_VECTORS.BLAKE2B_3_ADDRESS_0)\r
-\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Reject invalid seed', async () => {\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797'))\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701'))\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0.replaceAll(/./g, 'x')))\r
- // })\r
-\r
- // await test('Reject invalid length seed', async () => {\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'),\r
- // `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length + 1}-character string.`)\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)),\r
- // `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length - 1}-character string.`)\r
- // })\r
-\r
- // await test('Reject seed containing non-hex characters', async () => {\r
- // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')),\r
- // 'Seed contains invalid hexadecimal characters.')\r
- // await assert.rejects(Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')),\r
- // 'Seed contains invalid hexadecimal characters.')\r
- // })\r
-\r
- // await test('Import BIP-44 wallet from storage using a wallet-generated ID', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- // const restored = await Wallet.restore(wallet.id)\r
-\r
- // assert.ok('mnemonic' in restored)\r
- // assert.ok('seed' in restored)\r
- // assert.ok(restored.mnemonic === undefined)\r
- // assert.ok(restored.seed === undefined)\r
- // await assert.rejects(restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
- // await assert.rejects(restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
-\r
- // await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
-\r
- // assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
- // assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
-\r
- // await assert.resolves(restored.destroy())\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('Import BLAKE2B wallet from storage using a wallet-generated ID', async () => {\r
- // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0)\r
- // const restored = await Wallet.restore(wallet.id)\r
-\r
- // assert.ok('mnemonic' in restored)\r
- // assert.ok('seed' in restored)\r
- // assert.ok(restored.mnemonic === undefined)\r
- // assert.ok(restored.seed === undefined)\r
- // await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
- // await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
-\r
- // await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
-\r
- // assert.ok(await restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
- // assert.ok(await restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
-\r
- // await assert.resolves(restored.destroy())\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
-\r
- // await test('export wallet IDs from storage and reimport them', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- // const backups = await Wallet.backup()\r
-\r
- // assert.ok(backups.some(record => record.id === wallet.id))\r
+ await test('nano.org BIP-44 test vector mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
\r
- // const restored = await Wallet.restore(wallet.id)\r
-\r
- // assert.ok('mnemonic' in restored)\r
- // assert.ok('seed' in restored)\r
- // assert.ok(restored.mnemonic === undefined)\r
- // assert.ok(restored.seed === undefined)\r
-\r
- // await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
-\r
- // assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
- // assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+ assert.ok(account instanceof Account)\r
+ assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\r
+ assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0)\r
\r
- // await assert.resolves(wallet.destroy())\r
- // await assert.resolves(restored.destroy())\r
- // })\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
\r
- // await test('restore wallets without referencing IDs', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- // const backups = await Wallet.backup()\r
+ await test('nano.org BIP-44 test vector seed with no mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
\r
- // assert.ok(backups.some(record => record.id === wallet.id))\r
-\r
- // const restored = await Wallet.restore()\r
- // const restoredWallet = restored.find(restoredWallet => restoredWallet.id === wallet.id)\r
+ assert.ok('mnemonic' in wallet)\r
+ assert.ok('seed' in wallet)\r
+ assert.ok(account instanceof Account)\r
+ assert.ok(wallet.mnemonic === undefined)\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+ assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\r
+ assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0)\r
\r
- // assert.exists(restoredWallet)\r
- // assert.ok('mnemonic' in restoredWallet)\r
- // assert.ok('seed' in restoredWallet)\r
- // assert.ok(restoredWallet.mnemonic === undefined)\r
- // assert.ok(restoredWallet.seed === undefined)\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
\r
- // await restoredWallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
\r
- // assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
- // assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_0))\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_0))\r
+ assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_0)\r
+ assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_0)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
+\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_1))\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_1))\r
+ assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_1)\r
+ assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_1)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
+\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_2))\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_2))\r
+ assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_2)\r
+ assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_2)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
\r
- // for (const restoredWallet of restored) {\r
- // await assert.resolves(restoredWallet.destroy())\r
- // }\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
+ await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
+\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_3))\r
+ assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_3))\r
+ assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_3)\r
+ assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_3)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('BIP-44 zero-string entropy', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const accounts = await wallet.accounts(0, 3)\r
+\r
+ assert.ok('mnemonic' in wallet)\r
+ assert.ok('seed' in wallet)\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.SEED_0))\r
+ assert.equal(accounts.size, 4)\r
+\r
+ for (let i = 0; i < accounts.size; i++) {\r
+ const account = accounts.get(i)\r
+ assert.exists(account)\r
+ assert.exists(account.address)\r
+ assert.exists(account.publicKey)\r
+ }\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('BLAKE2b zero-string seed', async () => {\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const accounts = await wallet.accounts(0, 3)\r
+\r
+ assert.ok('mnemonic' in wallet)\r
+ assert.ok('seed' in wallet)\r
+ assert.ok(wallet.mnemonic === undefined)\r
+ assert.ok(wallet.seed === undefined)\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
+ assert.equal(accounts.size, 4)\r
+\r
+ for (let i = 0; i < accounts.size; i++) {\r
+ const account = accounts.get(i)\r
+ assert.exists(account)\r
+ assert.exists(account.address)\r
+ assert.exists(account.publicKey)\r
+ }\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => {\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const accounts = await wallet.accounts(0, 1)\r
+\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_1))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_1))\r
+\r
+ const account0 = accounts.get(0)\r
+ assert.exists(account0)\r
+ assert.ok(account0 instanceof Account)\r
+ assert.equal(account0.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_0)\r
+ assert.equal(account0.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_0)\r
+\r
+ const account1 = accounts.get(1)\r
+ assert.exists(account1)\r
+ assert.ok(account1 instanceof Account)\r
+ assert.equal(account1.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_1)\r
+ assert.equal(account1.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_1)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => {\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const walletAccount = await wallet.account()\r
\r
- // await test('load account from legacy address', async () => {\r
- // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
- // const account = await wallet.account()\r
- // const legacy = Account.load(NANO_TEST_VECTORS.ADDRESS_0.replace('nano_', 'xrb_'))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_2))\r
\r
- // assert.equal(account.address, legacy.address)\r
- // assert.equal(NANO_TEST_VECTORS.ADDRESS_0, legacy.address)\r
- // assert.equal(NANO_TEST_VECTORS.PUBLIC_0, legacy.publicKey)\r
+ const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_2)\r
+ await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD)\r
+ const importedAccount = await imported.account()\r
\r
- // await assert.resolves(wallet.destroy())\r
- // })\r
+ assert.ok(await imported.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
+ assert.ok(await imported.verify(TREZOR_TEST_VECTORS.ENTROPY_2))\r
+ assert.equal(importedAccount.publicKey, walletAccount.publicKey)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ await assert.resolves(imported.destroy())\r
+ })\r
+\r
+ await test('BLAKE2b mnemonic for maximum seed value', async () => {\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
+\r
+ assert.ok(account instanceof Account)\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_3))\r
+ assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_3))\r
+ assert.equal(account.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_3_PUBLIC_0)\r
+ assert.equal(account.address, TREZOR_TEST_VECTORS.BLAKE2B_3_ADDRESS_0)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('Reject invalid seed', async () => {\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797'))\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701'))\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0.replaceAll(/./g, 'x')))\r
+ })\r
+\r
+ await test('Reject invalid length seed', async () => {\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'),\r
+ `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length + 1}-character string.`)\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)),\r
+ `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length - 1}-character string.`)\r
+ })\r
+\r
+ await test('Reject seed containing non-hex characters', async () => {\r
+ await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')),\r
+ 'Seed contains invalid hexadecimal characters.')\r
+ await assert.rejects(Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')),\r
+ 'Seed contains invalid hexadecimal characters.')\r
+ })\r
+\r
+ await test('Import BIP-44 wallet from storage using a wallet-generated ID', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const restored = await Wallet.restore(wallet.id)\r
+\r
+ assert.ok('mnemonic' in restored)\r
+ assert.ok('seed' in restored)\r
+ assert.ok(restored.mnemonic === undefined)\r
+ assert.ok(restored.seed === undefined)\r
+ await assert.rejects(restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ await assert.rejects(restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+\r
+ assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ await assert.resolves(restored.destroy())\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('Import BLAKE2B wallet from storage using a wallet-generated ID', async () => {\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0)\r
+ const restored = await Wallet.restore(wallet.id)\r
+\r
+ assert.ok('mnemonic' in restored)\r
+ assert.ok('seed' in restored)\r
+ assert.ok(restored.mnemonic === undefined)\r
+ assert.ok(restored.seed === undefined)\r
+ await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
+ await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
+\r
+ await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+\r
+ assert.ok(await restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
+ assert.ok(await restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
+\r
+ await assert.resolves(restored.destroy())\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('export wallet IDs from storage and reimport them', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const backups = await Wallet.backup()\r
+\r
+ assert.ok(backups.some(record => record.id === wallet.id))\r
+\r
+ const restored = await Wallet.restore(wallet.id)\r
+\r
+ assert.ok('mnemonic' in restored)\r
+ assert.ok('seed' in restored)\r
+ assert.ok(restored.mnemonic === undefined)\r
+ assert.ok(restored.seed === undefined)\r
+\r
+ await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+\r
+ assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ await assert.resolves(restored.destroy())\r
+ })\r
+\r
+ await test('restore wallets without referencing IDs', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const backups = await Wallet.backup()\r
+\r
+ assert.ok(backups.some(record => record.id === wallet.id))\r
+\r
+ const restored = await Wallet.restore()\r
+ const restoredWallet = restored.find(restoredWallet => restoredWallet.id === wallet.id)\r
+\r
+ assert.exists(restoredWallet)\r
+ assert.ok('mnemonic' in restoredWallet)\r
+ assert.ok('seed' in restoredWallet)\r
+ assert.ok(restoredWallet.mnemonic === undefined)\r
+ assert.ok(restoredWallet.seed === undefined)\r
+\r
+ await restoredWallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+\r
+ assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ for (const restoredWallet of restored) {\r
+ await assert.resolves(restoredWallet.destroy())\r
+ }\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
+ await test('load account from legacy address', async () => {\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const account = await wallet.account()\r
+ const legacy = Account.load(NANO_TEST_VECTORS.ADDRESS_0.replace('nano_', 'xrb_'))\r
+\r
+ assert.equal(account.address, legacy.address)\r
+ assert.equal(NANO_TEST_VECTORS.ADDRESS_0, legacy.address)\r
+ assert.equal(NANO_TEST_VECTORS.PUBLIC_0, legacy.publicKey)\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
\r
await test('nano.org Exodus test vector mnemonic', async () => {\r
const wallet = await Wallet.load('Exodus', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC)\r