]> git.codecow.com Git - libnemo.git/commitdiff
Extract wallet load into separate module.
authorChris Duncan <chris@zoso.dev>
Sun, 10 Aug 2025 05:16:28 +0000 (22:16 -0700)
committerChris Duncan <chris@zoso.dev>
Sun, 10 Aug 2025 05:16:28 +0000 (22:16 -0700)
src/lib/wallet/ledger.ts
src/lib/wallet/load.ts [new file with mode: 0644]
src/lib/wallet/wallet.ts
test/test.blocks.mjs
test/test.derive-accounts.mjs
test/test.import-wallet.mjs
test/test.lock-unlock.mjs
test/test.tools.mjs

index eab4086561b20fed6828fc644575bbf2da5a259b..024aac8bbd14c17471338dea36332fee68e8def2 100644 (file)
@@ -354,7 +354,7 @@ export class Ledger extends Wallet {
        */\r
        async verify (mnemonic: string): Promise<boolean>\r
        async verify (secret: string): Promise<boolean> {\r
-               const testWallet = await Wallet.load('BIP-44', '', secret)\r
+               const testWallet = await Wallet.load('', 'BIP-44', secret)\r
                await testWallet.unlock('')\r
                const testAccount = await testWallet.account(0)\r
                const testOpenBlock = await new Block(testAccount.address, '0', testAccount.publicKey, testAccount.address)\r
diff --git a/src/lib/wallet/load.ts b/src/lib/wallet/load.ts
new file mode 100644 (file)
index 0000000..b2eb3c5
--- /dev/null
@@ -0,0 +1,48 @@
+//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+//! SPDX-License-Identifier: GPL-3.0-or-later
+
+import { Bip39 } from '#crypto'
+import { NamedData } from '#types'
+import { hex, utf8 } from '../convert'
+import { Database } from '../database'
+import { Wallet } from './wallet'
+
+/**
+* Imports an existing HD wallet by using an entropy value generated using a
+* cryptographically strong pseudorandom number generator.NamedD
+*
+* @param {string} password - Encrypts the wallet to lock and unlock it
+* @param {string} [salt=''] - Used when generating the final seed
+* @returns {Wallet} A newly instantiated Wallet
+*/
+export async function _load (wallet: Wallet, password: ArrayBuffer, secret: string, mnemonicSalt?: string): Promise<Wallet> {
+       try {
+               const data: NamedData = {
+                       action: 'load',
+                       type: wallet.type,
+                       password
+               }
+               if (/^(?:[A-F0-9]{64}){1,2}$/i.test(secret)) {
+                       data.seed = hex.toBuffer(secret)
+               } else if (await Bip39.validate(secret)) {
+                       data.mnemonicPhrase = secret.toLowerCase()
+                       if (mnemonicSalt != null) data.mnemonicSalt = mnemonicSalt
+               } else {
+                       throw new TypeError('Invalid wallet data')
+               }
+               const result = wallet.safe.request<ArrayBuffer>(data)
+               const { iv, salt, encrypted } = await result
+               const record = {
+                       id: wallet.id,
+                       type: wallet.type,
+                       iv,
+                       salt,
+                       encrypted
+               }
+               await Database.add({ [wallet.id]: record }, Wallet.DB_NAME)
+               return wallet
+       } catch (err) {
+               await wallet.destroy()
+               throw new Error('Error creating new Wallet', { cause: err })
+       }
+}
index bffd2456243f9cedbf157a599008b914bffcadca..1a36248925fd4aca83ea08615da2bf45f7677a77 100644 (file)
@@ -8,6 +8,7 @@ import { Block } from '../block'
 import { ADDRESS_GAP } from '../constants'\r
 import { bytes, hex, utf8 } from '../convert'\r
 import { Database } from '../database'\r
+import { _load } from './load'\r
 import { Rpc } from '../rpc'\r
 import { default as SafeWorker } from './safe'\r
 import { WorkerQueue } from './worker-queue'\r
@@ -88,52 +89,41 @@ export class Wallet {
        * Imports an existing HD wallet by using an entropy value generated using a\r
        * cryptographically strong pseudorandom number generator.NamedD\r
        *\r
-       * @param {string} password - Encrypts the wallet to lock and unlock it\r
-       * @param {string} [salt=''] - Used when generating the final seed\r
-       * @returns {Wallet} A newly instantiated Wallet\r
+       * @param {string} password - Encrypts the wallet to lock and unlock it. Discard as soon as possible after loading the wallet.\r
+       * @param {string} type - Algorithm used to generate wallet and child accounts\r
+       * @param {string} seed - Used to derive child accounts\r
+       * @returns Wallet in a locked state\r
        */\r
-       static async load (type: 'BIP-44' | 'BLAKE2b', password: string, seed: string): Promise<Wallet>\r
+       static async load (password: string, type: 'BIP-44' | 'BLAKE2b', seed: string): Promise<Wallet>\r
        /**\r
        * Imports an existing HD wallet by using an entropy value generated using a\r
        * cryptographically strong pseudorandom number generator.\r
        *\r
-       * @param {string} password - Encrypts the wallet to lock and unlock it\r
-       * @param {string} [salt=''] - Used when generating the final seed\r
-       * @returns {Wallet} A newly instantiated Wallet\r
+       * @param {string} password - Encrypts the wallet to lock and unlock it. Discard as soon as possible after loading the wallet.\r
+       * @param {string} type - Algorithm used to generate wallet and child accounts\r
+       * @param {string} mnemonicPhrase - Used to derive the wallet seed\r
+       * @param {string} [mnemonicSalt] - Used to alter the seed derived from the mnemonic phrase\r
+       * @returns Wallet in a locked state\r
        */\r
-       static async load (type: 'BIP-44' | 'BLAKE2b', password: string, mnemonicPhrase: string, mnemonicSalt?: string): Promise<Wallet>\r
-       static async load (type: 'BIP-44' | 'BLAKE2b', password: string, secret: string, mnemonicSalt?: string): Promise<Wallet> {\r
+       static async load (password: string, type: 'BIP-44' | 'BLAKE2b', mnemonicPhrase: string, mnemonicSalt?: string): Promise<Wallet>\r
+       static async load (password: unknown, type: unknown, secret: unknown, mnemonicSalt?: unknown): Promise<Wallet> {\r
+               if (typeof password !== 'string') {\r
+                       throw new TypeError('Password must be a string')\r
+               }\r
+               const passwordBuffer = utf8.toBuffer(password)\r
+               password = ''\r
+               if (type !== 'BIP-44' && type !== 'BLAKE2b') {\r
+                       throw new TypeError('Invalid wallet type', { cause: type })\r
+               }\r
+               if (typeof secret !== 'string') {\r
+                       throw new TypeError('Wallet secret must be a string')\r
+               }\r
+               if (mnemonicSalt !== undefined && typeof mnemonicSalt !== 'string') {\r
+                       throw new TypeError('Mnemonic salt must be a string')\r
+               }\r
                Wallet.#isInternal = true\r
                const self = new this(type)\r
-               try {\r
-                       const data: NamedData = {\r
-                               action: 'load',\r
-                               type,\r
-                               password: utf8.toBuffer(password)\r
-                       }\r
-                       if (/^(?:[A-F0-9]{64}){1,2}$/i.test(secret)) {\r
-                               data.seed = hex.toBuffer(secret)\r
-                       } else if (await Bip39.validate(secret)) {\r
-                               data.mnemonicPhrase = secret.toLowerCase()\r
-                               if (mnemonicSalt != null) data.mnemonicSalt = mnemonicSalt\r
-                       } else {\r
-                               throw new TypeError('Invalid wallet data')\r
-                       }\r
-                       const result = self.#safe.request<ArrayBuffer>(data)\r
-                       const { iv, salt, encrypted } = await result\r
-                       const record = {\r
-                               id: self.id,\r
-                               type,\r
-                               iv,\r
-                               salt,\r
-                               encrypted\r
-                       }\r
-                       await Database.add({ [self.id]: record }, Wallet.DB_NAME)\r
-                       return self\r
-               } catch (err) {\r
-                       await self.destroy()\r
-                       throw new Error('Error creating new Wallet', { cause: err })\r
-               }\r
+               return _load(self, passwordBuffer, secret, mnemonicSalt)\r
        }\r
 \r
        /**\r
index 81fe264a8c7ce5126bf0643d94b3c1cf68290a74..900b55e21582816289e8d5e0ccd17b55cac432d0 100644 (file)
@@ -98,7 +98,7 @@ await Promise.all([
                const { ADDRESS_0, BIP39_SEED, BLAKE2B_ADDRESS_1, BLAKE2B_PUBLIC_1, BLAKE2B_SEED, OPEN_BLOCK, PASSWORD, PRIVATE_0, RECEIVE_BLOCK, SEND_BLOCK } = NANO_TEST_VECTORS\r
 \r
                await test('sign open block with BLAKE2b wallet', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', PASSWORD, BLAKE2B_SEED)\r
+                       const wallet = await Wallet.load(PASSWORD, 'BLAKE2b', BLAKE2B_SEED)\r
                        await assert.resolves(wallet.unlock(PASSWORD))\r
 \r
                        const block = new Block(BLAKE2B_ADDRESS_1, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
@@ -111,7 +111,7 @@ await Promise.all([
                })\r
 \r
                await test('sign open block with BIP-44 wallet', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', PASSWORD, BIP39_SEED)\r
+                       const wallet = await Wallet.load(PASSWORD, 'BIP-44', BIP39_SEED)\r
                        await assert.resolves(wallet.unlock(PASSWORD))\r
 \r
                        const block = new Block(ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
@@ -123,7 +123,7 @@ await Promise.all([
                })\r
 \r
                await test('fail to sign open block with wallet when locked', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', PASSWORD, BIP39_SEED)\r
+                       const wallet = await Wallet.load(PASSWORD, 'BIP-44', BIP39_SEED)\r
                        const block = new Block(ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
                                .receive(OPEN_BLOCK.link, OPEN_BLOCK.balance)\r
 \r
index 1fee8fd04d74bad78a0d84138b9aeb2a3b2bdc8a..dda65fbe2dada4fac9d9bccc97b86b18451ad72a 100644 (file)
@@ -20,7 +20,7 @@ await Promise.all([
        suite('Derive accounts from BIP-44 wallet', async () => {\r
 \r
                await test('derive the first account from the given BIP-44 seed', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -36,7 +36,7 @@ await Promise.all([
                })\r
 \r
                await test('derive low indexed accounts from the given BIP-44 seed', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(1, 2)\r
 \r
@@ -52,7 +52,7 @@ await Promise.all([
                })\r
 \r
                await test('derive high indexed accounts from the given seed', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(0x70000000, 0x7000000f)\r
 \r
@@ -72,7 +72,7 @@ await Promise.all([
        suite('Derive accounts from BLAKE2b wallet', async () => {\r
 \r
                await test('derive the second account from the given BLAKE2b seed', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account(1)\r
 \r
@@ -90,7 +90,7 @@ await Promise.all([
                })\r
 \r
                await test('derive low indexed accounts from the given BLAKE2B seed', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(2, 3)\r
 \r
@@ -106,7 +106,7 @@ await Promise.all([
                })\r
 \r
                await test('derive high indexed accounts from the given seed', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(0x70000000, 0x7000000f)\r
 \r
index 784199c5ffe9b29a261ca8d55409e6fed9ca5fce..925f7974964a69fc1d57d66a45242ae8fe7418ac 100644 (file)
@@ -24,7 +24,7 @@ await Promise.all([
        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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -38,7 +38,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -54,7 +54,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_0)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -67,7 +67,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_1)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -80,7 +80,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_2)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -93,7 +93,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_3)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -106,7 +106,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', 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
@@ -126,7 +126,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_0)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(0, 3)\r
 \r
@@ -148,7 +148,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_1)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const accounts = await wallet.accounts(0, 1)\r
 \r
@@ -167,14 +167,14 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', 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
+                       const imported = await Wallet.load(TREZOR_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_2)\r
                        await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD)\r
                        const importedAccount = await imported.account()\r
 \r
@@ -187,7 +187,7 @@ await Promise.all([
                })\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
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_3)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
 \r
@@ -201,27 +201,27 @@ await Promise.all([
                })\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
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797'))\r
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701'))\r
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', 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
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', 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
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', 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
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', 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
+                       await assert.rejects(Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', 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 wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        const restored = await Wallet.restore(wallet.id)\r
 \r
                        assert.ok('mnemonic' in restored)\r
@@ -242,7 +242,7 @@ await Promise.all([
                })\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 wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_0)\r
                        const restored = await Wallet.restore(wallet.id)\r
 \r
                        assert.ok('mnemonic' in restored)\r
@@ -263,7 +263,7 @@ await Promise.all([
                })\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 wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        const backups = await Wallet.export()\r
 \r
                        assert.ok(backups.some(record => record.id === wallet.id))\r
index 727cf0252d1fd314e62dbf08ce037a798e3413cd..e15b0f62039685c501fb814daec3f820495f997e 100644 (file)
@@ -24,7 +24,7 @@ await Promise.all([
        suite('Lock and unlock wallets', async () => {\r
 \r
                await test('locking and unlocking a Bip44Wallet with a password', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
 \r
                        assert.ok('mnemonic' in wallet)\r
                        assert.ok('seed' in wallet)\r
@@ -41,7 +41,7 @@ await Promise.all([
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with different passwords', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const lockResult = await wallet.lock()\r
 \r
@@ -58,7 +58,7 @@ await Promise.all([
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with invalid input', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
 \r
                        //@ts-expect-error\r
@@ -70,7 +70,7 @@ await Promise.all([
                })\r
 \r
                await test('locking and unlocking a Blake2bWallet with a password', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_0)\r
 \r
                        assert.ok('mnemonic' in wallet)\r
                        assert.ok('seed' in wallet)\r
@@ -87,7 +87,7 @@ await Promise.all([
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with different passwords', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_1)\r
 \r
                        await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.PASSWORD), { message: 'Failed to unlock wallet' })\r
                        assert.ok('mnemonic' in wallet)\r
@@ -101,7 +101,7 @@ await Promise.all([
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with no input', async () => {\r
-                       const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_1)\r
 \r
                        //@ts-expect-error\r
                        await assert.rejects(wallet.unlock(), { message: 'Failed to unlock wallet' })\r
index b9b1f5c65b9661dc6011a0fa5e808733e2edf32d..fa8ae1812aba97c302b9cdf098f735493e6cebf2 100644 (file)
@@ -137,7 +137,7 @@ await Promise.all([
                })\r
 \r
                await test('should verify a block using the public key', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
                        if (account.index == null) {\r
@@ -152,7 +152,7 @@ await Promise.all([
                })\r
 \r
                await test('should reject a block using the wrong public key', async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const account = await wallet.account()\r
                        if (account.index == null) {\r
@@ -178,7 +178,7 @@ await Promise.all([
                })\r
 \r
                await test('sweeper fails gracefully for ineligible accounts', { skip: true }, async () => {\r
-                       const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+                       const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
                        const results = await Tools.sweep(rpc, wallet, NANO_TEST_VECTORS.ADDRESS_1)\r
 \r