From 25fac062a02c65f6c7298e0857a3e77ae727f824 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sun, 30 Nov 2025 03:08:03 -0800 Subject: [PATCH] Revert wallet import test exclusion. --- test/test.import-wallet.mjs | 584 ++++++++++++++++++------------------ 1 file changed, 292 insertions(+), 292 deletions(-) diff --git a/test/test.import-wallet.mjs b/test/test.import-wallet.mjs index 8f3b94a..0e8f4d0 100644 --- a/test/test.import-wallet.mjs +++ b/test/test.import-wallet.mjs @@ -10,309 +10,309 @@ import { BIP32_TEST_VECTORS, CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TREZOR_TEST await Promise.all([ suite('Import wallets', async () => { - // await test('nano.org BIP-44 test vector mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC)) - // assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) - // assert.ok(account instanceof Account) - // assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0) - // assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('nano.org BIP-44 test vector seed with no mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok('mnemonic' in wallet) - // assert.ok('seed' in wallet) - // assert.ok(account instanceof Account) - // assert.ok(wallet.mnemonic === undefined) - // assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) - // assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0) - // assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_0)) - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_0)) - // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_0) - // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_0) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_1)) - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_1)) - // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_1) - // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_1) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_2)) - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_2)) - // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_2) - // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_2) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_3)) - // assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_3)) - // assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_3) - // assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_3) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('BIP-44 zero-string entropy', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const accounts = await wallet.accounts(0, 3) - - // assert.ok('mnemonic' in wallet) - // assert.ok('seed' in wallet) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.SEED_0)) - // assert.equal(accounts.size, 4) - - // for (let i = 0; i < accounts.size; i++) { - // const account = accounts.get(i) - // assert.exists(account) - // assert.exists(account.address) - // assert.exists(account.publicKey) - // } - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('BLAKE2b zero-string seed', async () => { - // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const accounts = await wallet.accounts(0, 3) - - // assert.ok('mnemonic' in wallet) - // assert.ok('seed' in wallet) - // assert.ok(wallet.mnemonic === undefined) - // assert.ok(wallet.seed === undefined) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) - // assert.equal(accounts.size, 4) - - // for (let i = 0; i < accounts.size; i++) { - // const account = accounts.get(i) - // assert.exists(account) - // assert.exists(account.address) - // assert.exists(account.publicKey) - // } - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => { - // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const accounts = await wallet.accounts(0, 1) - - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_1)) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_1)) - - // const account0 = accounts.get(0) - // assert.exists(account0) - // assert.ok(account0 instanceof Account) - // assert.equal(account0.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_0) - // assert.equal(account0.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_0) - - // const account1 = accounts.get(1) - // assert.exists(account1) - // assert.ok(account1 instanceof Account) - // assert.equal(account1.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_1) - // assert.equal(account1.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_1) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => { - // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const walletAccount = await wallet.account() - - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_2)) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_2)) - - // const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_2) - // await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD) - // const importedAccount = await imported.account() - - // assert.ok(await imported.verify(TREZOR_TEST_VECTORS.MNEMONIC_2)) - // assert.ok(await imported.verify(TREZOR_TEST_VECTORS.ENTROPY_2)) - // assert.equal(importedAccount.publicKey, walletAccount.publicKey) - - // await assert.resolves(wallet.destroy()) - // await assert.resolves(imported.destroy()) - // }) - - // await test('BLAKE2b mnemonic for maximum seed value', async () => { - // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - - // assert.ok(account instanceof Account) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_3)) - // assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_3)) - // assert.equal(account.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_3_PUBLIC_0) - // assert.equal(account.address, TREZOR_TEST_VECTORS.BLAKE2B_3_ADDRESS_0) - - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Reject invalid seed', async () => { - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797')) - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701')) - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0.replaceAll(/./g, 'x'))) - // }) - - // await test('Reject invalid length seed', async () => { - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'), - // `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length + 1}-character string.`) - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)), - // `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length - 1}-character string.`) - // }) - - // await test('Reject seed containing non-hex characters', async () => { - // await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')), - // 'Seed contains invalid hexadecimal characters.') - // await assert.rejects(Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')), - // 'Seed contains invalid hexadecimal characters.') - // }) - - // await test('Import BIP-44 wallet from storage using a wallet-generated ID', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) - // const restored = await Wallet.restore(wallet.id) - - // assert.ok('mnemonic' in restored) - // assert.ok('seed' in restored) - // assert.ok(restored.mnemonic === undefined) - // assert.ok(restored.seed === undefined) - // await assert.rejects(restored.verify(NANO_TEST_VECTORS.MNEMONIC)) - // await assert.rejects(restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) - - // await restored.unlock(NANO_TEST_VECTORS.PASSWORD) - - // assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC)) - // assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) - - // await assert.resolves(restored.destroy()) - // await assert.resolves(wallet.destroy()) - // }) - - // await test('Import BLAKE2B wallet from storage using a wallet-generated ID', async () => { - // const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0) - // const restored = await Wallet.restore(wallet.id) - - // assert.ok('mnemonic' in restored) - // assert.ok('seed' in restored) - // assert.ok(restored.mnemonic === undefined) - // assert.ok(restored.seed === undefined) - // await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) - // await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) - - // await restored.unlock(NANO_TEST_VECTORS.PASSWORD) - - // assert.ok(await restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) - // assert.ok(await restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) - - // await assert.resolves(restored.destroy()) - // await assert.resolves(wallet.destroy()) - // }) - - // await test('export wallet IDs from storage and reimport them', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) - // const backups = await Wallet.backup() - - // assert.ok(backups.some(record => record.id === wallet.id)) + await test('nano.org BIP-44 test vector mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() - // const restored = await Wallet.restore(wallet.id) - - // assert.ok('mnemonic' in restored) - // assert.ok('seed' in restored) - // assert.ok(restored.mnemonic === undefined) - // assert.ok(restored.seed === undefined) - - // await restored.unlock(NANO_TEST_VECTORS.PASSWORD) - - // assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC)) - // assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) + assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC)) + assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) + assert.ok(account instanceof Account) + assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0) + assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0) - // await assert.resolves(wallet.destroy()) - // await assert.resolves(restored.destroy()) - // }) + await assert.resolves(wallet.destroy()) + }) - // await test('restore wallets without referencing IDs', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) - // const backups = await Wallet.backup() + await test('nano.org BIP-44 test vector seed with no mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() - // assert.ok(backups.some(record => record.id === wallet.id)) - - // const restored = await Wallet.restore() - // const restoredWallet = restored.find(restoredWallet => restoredWallet.id === wallet.id) + assert.ok('mnemonic' in wallet) + assert.ok('seed' in wallet) + assert.ok(account instanceof Account) + assert.ok(wallet.mnemonic === undefined) + assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) + assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0) + assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_0) - // assert.exists(restoredWallet) - // assert.ok('mnemonic' in restoredWallet) - // assert.ok('seed' in restoredWallet) - // assert.ok(restoredWallet.mnemonic === undefined) - // assert.ok(restoredWallet.seed === undefined) + await assert.resolves(wallet.destroy()) + }) - // await restoredWallet.unlock(NANO_TEST_VECTORS.PASSWORD) + await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() - // assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.MNEMONIC)) - // assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_0)) + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_0)) + assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_0) + assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_0) + + await assert.resolves(wallet.destroy()) + }) + + await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() + + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_1)) + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_1)) + assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_1) + assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_1) + + await assert.resolves(wallet.destroy()) + }) + + await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() + + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_2)) + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_2)) + assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_2) + assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_2) + + await assert.resolves(wallet.destroy()) + }) - // for (const restoredWallet of restored) { - // await assert.resolves(restoredWallet.destroy()) - // } - // await assert.resolves(wallet.destroy()) - // }) + await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() + + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_3)) + assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.SEED_3)) + assert.equal(account.publicKey, CUSTOM_TEST_VECTORS.PUBLIC_3) + assert.equal(account.address, CUSTOM_TEST_VECTORS.ADDRESS_3) + + await assert.resolves(wallet.destroy()) + }) + + await test('BIP-44 zero-string entropy', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const accounts = await wallet.accounts(0, 3) + + assert.ok('mnemonic' in wallet) + assert.ok('seed' in wallet) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.SEED_0)) + assert.equal(accounts.size, 4) + + for (let i = 0; i < accounts.size; i++) { + const account = accounts.get(i) + assert.exists(account) + assert.exists(account.address) + assert.exists(account.publicKey) + } + + await assert.resolves(wallet.destroy()) + }) + + await test('BLAKE2b zero-string seed', async () => { + const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const accounts = await wallet.accounts(0, 3) + + assert.ok('mnemonic' in wallet) + assert.ok('seed' in wallet) + assert.ok(wallet.mnemonic === undefined) + assert.ok(wallet.seed === undefined) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) + assert.equal(accounts.size, 4) + + for (let i = 0; i < accounts.size; i++) { + const account = accounts.get(i) + assert.exists(account) + assert.exists(account.address) + assert.exists(account.publicKey) + } + + await assert.resolves(wallet.destroy()) + }) + + await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => { + const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const accounts = await wallet.accounts(0, 1) + + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_1)) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_1)) + + const account0 = accounts.get(0) + assert.exists(account0) + assert.ok(account0 instanceof Account) + assert.equal(account0.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_0) + assert.equal(account0.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_0) + + const account1 = accounts.get(1) + assert.exists(account1) + assert.ok(account1 instanceof Account) + assert.equal(account1.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_1_PUBLIC_1) + assert.equal(account1.address, TREZOR_TEST_VECTORS.BLAKE2B_1_ADDRESS_1) + + await assert.resolves(wallet.destroy()) + }) + + await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => { + const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const walletAccount = await wallet.account() - // await test('load account from legacy address', async () => { - // const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) - // await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - // const account = await wallet.account() - // const legacy = Account.load(NANO_TEST_VECTORS.ADDRESS_0.replace('nano_', 'xrb_')) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_2)) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_2)) - // assert.equal(account.address, legacy.address) - // assert.equal(NANO_TEST_VECTORS.ADDRESS_0, legacy.address) - // assert.equal(NANO_TEST_VECTORS.PUBLIC_0, legacy.publicKey) + const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_2) + await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD) + const importedAccount = await imported.account() - // await assert.resolves(wallet.destroy()) - // }) + assert.ok(await imported.verify(TREZOR_TEST_VECTORS.MNEMONIC_2)) + assert.ok(await imported.verify(TREZOR_TEST_VECTORS.ENTROPY_2)) + assert.equal(importedAccount.publicKey, walletAccount.publicKey) + + await assert.resolves(wallet.destroy()) + await assert.resolves(imported.destroy()) + }) + + await test('BLAKE2b mnemonic for maximum seed value', async () => { + const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() + + assert.ok(account instanceof Account) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_3)) + assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_3)) + assert.equal(account.publicKey, TREZOR_TEST_VECTORS.BLAKE2B_3_PUBLIC_0) + assert.equal(account.address, TREZOR_TEST_VECTORS.BLAKE2B_3_ADDRESS_0) + + await assert.resolves(wallet.destroy()) + }) + + await test('Reject invalid seed', async () => { + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797')) + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701')) + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0.replaceAll(/./g, 'x'))) + }) + + await test('Reject invalid length seed', async () => { + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'), + `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length + 1}-character string.`) + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)), + `Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length - 1}-character string.`) + }) + + await test('Reject seed containing non-hex characters', async () => { + await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')), + 'Seed contains invalid hexadecimal characters.') + await assert.rejects(Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')), + 'Seed contains invalid hexadecimal characters.') + }) + + await test('Import BIP-44 wallet from storage using a wallet-generated ID', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) + const restored = await Wallet.restore(wallet.id) + + assert.ok('mnemonic' in restored) + assert.ok('seed' in restored) + assert.ok(restored.mnemonic === undefined) + assert.ok(restored.seed === undefined) + await assert.rejects(restored.verify(NANO_TEST_VECTORS.MNEMONIC)) + await assert.rejects(restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) + + await restored.unlock(NANO_TEST_VECTORS.PASSWORD) + + assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC)) + assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) + + await assert.resolves(restored.destroy()) + await assert.resolves(wallet.destroy()) + }) + + await test('Import BLAKE2B wallet from storage using a wallet-generated ID', async () => { + const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0) + const restored = await Wallet.restore(wallet.id) + + assert.ok('mnemonic' in restored) + assert.ok('seed' in restored) + assert.ok(restored.mnemonic === undefined) + assert.ok(restored.seed === undefined) + await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) + await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) + + await restored.unlock(NANO_TEST_VECTORS.PASSWORD) + + assert.ok(await restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0)) + assert.ok(await restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0)) + + await assert.resolves(restored.destroy()) + await assert.resolves(wallet.destroy()) + }) + + await test('export wallet IDs from storage and reimport them', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) + const backups = await Wallet.backup() + + assert.ok(backups.some(record => record.id === wallet.id)) + + const restored = await Wallet.restore(wallet.id) + + assert.ok('mnemonic' in restored) + assert.ok('seed' in restored) + assert.ok(restored.mnemonic === undefined) + assert.ok(restored.seed === undefined) + + await restored.unlock(NANO_TEST_VECTORS.PASSWORD) + + assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC)) + assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED)) + + await assert.resolves(wallet.destroy()) + await assert.resolves(restored.destroy()) + }) + + await test('restore wallets without referencing IDs', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) + const backups = await Wallet.backup() + + assert.ok(backups.some(record => record.id === wallet.id)) + + const restored = await Wallet.restore() + const restoredWallet = restored.find(restoredWallet => restoredWallet.id === wallet.id) + + assert.exists(restoredWallet) + assert.ok('mnemonic' in restoredWallet) + assert.ok('seed' in restoredWallet) + assert.ok(restoredWallet.mnemonic === undefined) + assert.ok(restoredWallet.seed === undefined) + + await restoredWallet.unlock(NANO_TEST_VECTORS.PASSWORD) + + assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.MNEMONIC)) + assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) + + for (const restoredWallet of restored) { + await assert.resolves(restoredWallet.destroy()) + } + await assert.resolves(wallet.destroy()) + }) + + await test('load account from legacy address', async () => { + const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) + await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) + const account = await wallet.account() + const legacy = Account.load(NANO_TEST_VECTORS.ADDRESS_0.replace('nano_', 'xrb_')) + + assert.equal(account.address, legacy.address) + assert.equal(NANO_TEST_VECTORS.ADDRESS_0, legacy.address) + assert.equal(NANO_TEST_VECTORS.PUBLIC_0, legacy.publicKey) + + await assert.resolves(wallet.destroy()) + }) await test('nano.org Exodus test vector mnemonic', async () => { const wallet = await Wallet.load('Exodus', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC) -- 2.47.3