*/\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
--- /dev/null
+//! 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 })
+ }
+}
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
* 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
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
})\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
})\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
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
})\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
})\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
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
})\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
})\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
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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
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
})\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
})\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
})\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
})\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
})\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
})\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
})\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
})\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