```javascript
import { Wallet } from 'libnemo'
-const wallet = await Wallet.create(password)
-const wallet = await Wallet.load(password, mnemonic, salt?)
-const wallet = await Wallet.load(password, seed)
+const wallet = await Wallet.create('BIP-44', password)
+const wallet = await Wallet.load('BIP-44', password, mnemonic, salt?)
+const wallet = await Wallet.load('BIP-44', password, seed)
-const wallet = await Wallet.create(password)
-const wallet = await Wallet.load(password, seed)
-const wallet = await Wallet.load(password, mnemonic)
+const wallet = await Wallet.create('BLAKE2b', password)
+const wallet = await Wallet.load('BLAKE2b', password, seed)
+const wallet = await Wallet.load('BLAKE2b', password, mnemonic)
```
```javascript
* @param {string} [salt=''] - Used when generating the final seed\r
* @returns {Wallet} A newly instantiated Wallet\r
*/\r
- static async create (password: string, type: 'BIP-44' | 'BLAKE2b', mnemonicSalt?: string): Promise<Wallet>\r
- static async create (password: unknown, type: unknown, mnemonicSalt?: unknown): Promise<Wallet> {\r
- if (typeof password !== 'string') {\r
- throw new TypeError('Password must be a string')\r
+ static async create (type: WalletType, password: string, mnemonicSalt?: string): Promise<Wallet>\r
+ static async create (type: unknown, password: unknown, mnemonicSalt?: unknown): Promise<Wallet> {\r
+ if (type === 'Ledger') {\r
+ Wallet.#isInternal = true\r
+ return new this(type)\r
}\r
- const passwordBuffer = utf8.toBuffer(password)\r
- password = undefined\r
if (type !== 'BIP-44' && type !== 'BLAKE2b') {\r
throw new TypeError('Invalid wallet type')\r
}\r
+ if (typeof password !== 'string') {\r
+ throw new TypeError('Invalid password', { cause: typeof password })\r
+ }\r
+ const passwordBuffer = utf8.toBuffer(password)\r
+ password = undefined\r
if (mnemonicSalt !== undefined && typeof mnemonicSalt !== 'string') {\r
throw new TypeError('Mnemonic salt must be a string')\r
}\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. Discard as soon as possible after loading the wallet.\r
* @param {string} type - Algorithm used to generate wallet and child accounts\r
+ * @param {string} password - Encrypts the wallet to lock and unlock it. Discard as soon as possible after loading the wallet.\r
* @param {string} seed - Used to derive child accounts\r
* @returns Wallet in a locked state\r
*/\r
- static async load (password: string, type: 'BIP-44' | 'BLAKE2b', seed: string): Promise<Wallet>\r
+ static async load (type: 'BIP-44' | 'BLAKE2b', password: string, 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. Discard as soon as possible after loading the wallet.\r
* @param {string} type - Algorithm used to generate wallet and child accounts\r
+ * @param {string} password - Encrypts the wallet to lock and unlock it. Discard as soon as possible after loading the wallet.\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 (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 = undefined\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
+ static async load (type: 'BIP-44' | 'BLAKE2b', password: string, mnemonicPhrase: string, mnemonicSalt?: string): Promise<Wallet>\r
+ static async load (type: WalletType, password: string, secret: string, mnemonicSalt?: string): Promise<Wallet> {\r
Wallet.#isInternal = true\r
const self = new this(type)\r
- await _load(self, passwordBuffer, secret, mnemonicSalt)\r
+ await _load(self, password, secret, mnemonicSalt)\r
return self\r
}\r
\r
}\r
}\r
\r
- constructor (type: WalletType, id?: string) {\r
- if (!Wallet.#isInternal && type !== 'Ledger') {\r
+ constructor (type: WalletType, id?: string)\r
+ constructor (type: unknown, id?: string) {\r
+ if (!Wallet.#isInternal) {\r
throw new Error(`Wallet cannot be instantiated directly. Use 'await Wallet.create()' instead.`)\r
}\r
+ if (type !== 'BIP-44' && type !== 'BLAKE2b' && type !== 'Ledger') {\r
+ throw new TypeError('Invalid wallet type', { cause: type })\r
+ }\r
Wallet.#isInternal = false\r
this.#accounts = new AccountList()\r
this.#id = id ?? crypto.randomUUID()\r
* is responsible for using Ledger technology to back up these pieces of data.\r
*/\r
export class Ledger extends Wallet {\r
- static #isInternal: boolean = false\r
static #derivationPath: Uint8Array = new Uint8Array([\r
LEDGER_ADPU_CODES.bip32DerivationLevel,\r
...dec.toBytes(BIP44_PURPOSE + HARDENED_OFFSET, 4),\r
...dec.toBytes(BIP44_COIN_NANO + HARDENED_OFFSET, 4)\r
])\r
+ static #isInternal: boolean = false\r
+ static INTERNAL: Symbol = Symbol('Ledger')\r
\r
static DynamicTransport: typeof TransportBLE | typeof TransportUSB | typeof TransportHID\r
static get listenTimeout (): 30000 { return 30000 }\r
static async create (): Promise<Ledger> {\r
try {\r
if (this.isUnsupported) throw new Error('Browser is unsupported')\r
- Ledger.#isInternal = true\r
+ this.#isInternal = true\r
const self = new this()\r
await Database.add({ [self.id]: { id: self.id, type: 'Ledger' } }, Wallet.DB_NAME)\r
return self\r
}\r
\r
#accounts: AccountList\r
- #vault: undefined\r
#status: DeviceStatus = 'DISCONNECTED'\r
get status (): DeviceStatus { return this.#status }\r
\r
Ledger.#isInternal = false\r
super('Ledger')\r
this.#accounts = new AccountList()\r
- this.#vault = undefined\r
}\r
\r
/**\r
*/\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
import { Bip39 } from '#crypto'
import { NamedData } from '#types'
-import { hex } from '../convert'
+import { hex, utf8 } from '../convert'
import { Database } from '../database'
import { Wallet } from '.'
* @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<void> {
+export async function _load (wallet: Wallet, password: string, secret: string, mnemonicSalt?: string): Promise<void>
+export async function _load (wallet: Wallet, password: unknown, secret: unknown, mnemonicSalt?: unknown): Promise<void> {
+ if (typeof password !== 'string') {
+ throw new TypeError('Password must be a string')
+ }
+ if (typeof secret !== 'string') {
+ throw new TypeError('Wallet secret must be a string')
+ }
+ if (mnemonicSalt !== undefined && typeof mnemonicSalt !== 'string') {
+ throw new TypeError('Mnemonic salt must be a string')
+ }
try {
const data: NamedData = {
action: 'load',
type: wallet.type,
- password
+ password: utf8.toBuffer(password)
}
+ password = undefined
if (/^(?:[A-F0-9]{64}){1,2}$/i.test(secret)) {
data.seed = hex.toBuffer(secret)
} else if (await Bip39.validate(secret)) {
} else {
throw new TypeError('Invalid wallet data')
}
+ secret = undefined
+ mnemonicSalt = undefined
const result = wallet.vault.request<ArrayBuffer>(data)
const { iv, salt, encrypted } = await result
const record = {
const COUNT = 0x200
await test(`Time to create ${COUNT} BIP-44 accounts`, async () => {
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BIP-44')
+ const wallet = await Wallet.create('BIP-44', NANO_TEST_VECTORS.PASSWORD)
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)
const start = performance.now()
})
await test(`Time to create ${COUNT} BLAKE2b accounts`, async () => {
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b')
+ const wallet = await Wallet.create('BLAKE2b', NANO_TEST_VECTORS.PASSWORD)
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)
const start = performance.now()
})
await test(`Time to create 1 BIP-44 account ${COUNT} times`, async () => {
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BIP-44')
+ const wallet = await Wallet.create('BIP-44', NANO_TEST_VECTORS.PASSWORD)
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)
const times = []
})
await test(`Time to create 1 BLAKE2b account ${COUNT} times`, async () => {
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b')
+ const wallet = await Wallet.create('BLAKE2b', NANO_TEST_VECTORS.PASSWORD)
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)
const times = []
const times = []
for (let i = 0; i < COUNT; i++) {
const start = performance.now()
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BIP-44')
+ const wallet = await Wallet.create('BIP-44', NANO_TEST_VECTORS.PASSWORD)
const end = performance.now()
times.push(end - start)
await wallet.destroy()
const times = []
for (let i = 0; i < COUNT; i++) {
const start = performance.now()
- const wallet = await Wallet.create(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b')
+ const wallet = await Wallet.create('BLAKE2b', NANO_TEST_VECTORS.PASSWORD)
const end = performance.now()
times.push(end - start)
await wallet.destroy()
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(PASSWORD, 'BLAKE2b', BLAKE2B_SEED)\r
+ const wallet = await Wallet.load('BLAKE2b', PASSWORD, 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(PASSWORD, 'BIP-44', BIP39_SEED)\r
+ const wallet = await Wallet.load('BIP-44', PASSWORD, 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(PASSWORD, 'BIP-44', BIP39_SEED)\r
+ const wallet = await Wallet.load('BIP-44', PASSWORD, 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
const { PASSWORD } = NANO_TEST_VECTORS\r
\r
await test('destroy BIP-44 wallet before unlocking', async () => {\r
- const wallet = await Wallet.create(PASSWORD, 'BIP-44')\r
+ const wallet = await Wallet.create('BIP-44', PASSWORD)\r
\r
await assert.resolves(wallet.destroy())\r
await assert.rejects(wallet.unlock(PASSWORD))\r
})\r
\r
await test('BIP-44 wallet with random entropy', async () => {\r
- const wallet = await Wallet.create(PASSWORD, 'BIP-44')\r
+ const wallet = await Wallet.create('BIP-44', PASSWORD)\r
await wallet.unlock(PASSWORD)\r
\r
assert.ok('id' in wallet)\r
})\r
\r
await test('BLAKE2b wallet with random entropy', async () => {\r
- const wallet = await Wallet.create(PASSWORD, 'BLAKE2b')\r
+ const wallet = await Wallet.create('BLAKE2b', PASSWORD)\r
await wallet.unlock(PASSWORD)\r
\r
assert.ok('id' in wallet)\r
const invalidArgs = [null, true, false, 0, 1, 2, { foo: 'bar' }]\r
for (const arg of invalidArgs) {\r
//@ts-expect-error\r
- await assert.rejects(Wallet.create(PASSWORD, 'BIP-44', arg))\r
+ await assert.rejects(Wallet.create('BIP-44', PASSWORD, arg))\r
}\r
})\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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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
})\r
\r
await test('derive low indexed accounts from the given BIP-44 seed', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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 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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\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
})\r
\r
await test('nano.org BIP-44 test vector seed with no mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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
})\r
\r
await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_0)\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
})\r
\r
await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_1)\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
})\r
\r
await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_2)\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
})\r
\r
await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', CUSTOM_TEST_VECTORS.MNEMONIC_3)\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
})\r
\r
await test('BIP-44 zero-string entropy', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD)\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
})\r
\r
await test('BLAKE2b zero-string seed', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_0)\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
})\r
\r
await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_1)\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
})\r
\r
await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_2)\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(TREZOR_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_2)\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
})\r
\r
await test('BLAKE2b mnemonic for maximum seed value', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_3)\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
})\r
\r
await test('Reject invalid seed', async () => {\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
+ 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED + 'f'),\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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)),\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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')),\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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')),\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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\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
})\r
\r
await test('Import BLAKE2B wallet from storage using a wallet-generated ID', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_0)\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
})\r
\r
await test('export wallet IDs from storage and reimport them', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\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.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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\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 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\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
\r
//@ts-expect-error\r
})\r
\r
await test('locking and unlocking a Blake2bWallet with a password', async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_0)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_1)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BLAKE2b', TREZOR_TEST_VECTORS.ENTROPY_1)\r
+ const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, 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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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
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(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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
if (account.index == null) {\r
})\r
\r
await test('sweeper fails gracefully for ineligible accounts', { skip: true }, async () => {\r
- const wallet = await Wallet.load(NANO_TEST_VECTORS.PASSWORD, 'BIP-44', NANO_TEST_VECTORS.BIP39_SEED)\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 results = await Tools.sweep(rpc, wallet, NANO_TEST_VECTORS.ADDRESS_1)\r
\r