]> git.codecow.com Git - libnemo.git/commitdiff
Revert wallet import test exclusion.
authorChris Duncan <chris@zoso.dev>
Sun, 30 Nov 2025 11:08:03 +0000 (03:08 -0800)
committerChris Duncan <chris@zoso.dev>
Sun, 30 Nov 2025 11:08:03 +0000 (03:08 -0800)
test/test.import-wallet.mjs

index 8f3b94abaf694b9810a76058e79c0a9df9fc772c..0e8f4d00758c35b6ff2b99371fc1a3ab90ffece1 100644 (file)
@@ -10,309 +10,309 @@ import { BIP32_TEST_VECTORS, CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TREZOR_TEST
 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