//! SPDX-License-Identifier: GPL-3.0-or-later
/**
-* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
-*
-* Do not send any funds to the test vectors below!
-*
-* Sources:
-* https://docs.nano.org/integration-guides/the-basics/#seed
-* https://docs.nano.org/integration-guides/key-management/#test-vectors
-* https://docs.nano.org/integration-guides/key-management/#creating-transactions
-* https://github.com/trezor/python-mnemonic/blob/master/vectors.json
-* https://tools.nanos.cc/?tool=seed
-* https://github.com/BLAKE2/BLAKE2/blob/master/testvectors/blake2b-kat.txt
-* https://github.com/emilbayes/blake2b/blob/master/test-vectors.json#L514-L577
-*/
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ *
+ * Do not send any funds to the test vectors below!
+ *
+ * Sources:
+ * https://docs.nano.org/integration-guides/the-basics/#seed
+ * https://docs.nano.org/integration-guides/key-management/#test-vectors
+ * https://docs.nano.org/integration-guides/key-management/#creating-transactions
+ * https://github.com/trezor/python-mnemonic/blob/master/vectors.json
+ * https://tools.nanos.cc/?tool=seed
+ * https://github.com/BLAKE2/BLAKE2/blob/master/testvectors/blake2b-kat.txt
+ * https://github.com/emilbayes/blake2b/blob/master/test-vectors.json#L514-L577
+ */
export const GENESIS_ADDRESS = 'nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3'
export const MAX_RAW = 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFFn
export const MAX_SUPPLY = 133_248_297_920_938_463_463_374_607_431_768_211_455n
+export const TEST_PASSWORD = crypto.randomUUID()
export const NANO_TEST_VECTORS = Object.freeze({
// from nano.org python sample code
// from nano.org test vectors
MNEMONIC: 'edge defense waste choose enrich upon flee junk siren film clown finish luggage leader kid quick brick print evidence swap drill paddle truly occur',
- PASSWORD: crypto.randomUUID(),
+ MNEMONIC_SALT: 'some password',
BIP39_SEED: '0DC285FDE768F7FF29B66CE7252D56ED92FE003B605907F7A4F683C3DC8586D34A914D3C71FC099BB38EE4A59E5B081A3497B7A323E90CC68F67B5837690310C',
PRIVATE_0: '3BE4FC2EF3F3B7374E6FC4FB6E7BB153F8A2998B3B3DAB50853EABE128024143',
})
export const TREZOR_TEST_VECTORS = Object.freeze({
- PASSWORD: 'TREZOR',
+ MNEMONIC_SALT: 'TREZOR',
ENTROPY_0: "0000000000000000000000000000000000000000000000000000000000000000",
MNEMONIC_0: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>\r
//! SPDX-License-Identifier: GPL-3.0-or-later\r
\r
-'use strict'\r
-\r
import { Block, Rpc, Wallet } from 'libnemo'\r
import { assert, click, isNode, suite, test } from './GLOBALS.mjs'\r
-import { CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS } from './VECTORS.mjs'\r
+import { CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TEST_PASSWORD } from './VECTORS.mjs'\r
\r
await Promise.all([\r
suite('Block processing', async () => {\r
}),\r
\r
suite('Block signing using official test vectors', async () => {\r
- const { ADDRESS_0, BIP39_SEED, BLAKE2B_ADDRESS_1, BLAKE2B_PUBLIC_1, BLAKE2B_SEED, OPEN_BLOCK, PASSWORD, PUBLIC_0, PRIVATE_0, RECEIVE_BLOCK, SEND_BLOCK } = NANO_TEST_VECTORS\r
+ const { ADDRESS_0, BIP39_SEED, BLAKE2B_ADDRESS_1, BLAKE2B_PUBLIC_1, BLAKE2B_SEED, OPEN_BLOCK, PUBLIC_0, PRIVATE_0, RECEIVE_BLOCK, SEND_BLOCK } = NANO_TEST_VECTORS\r
const { EXODUS, LEDGER_NANOS } = CUSTOM_TEST_VECTORS\r
\r
await test('sign open block with BLAKE2b wallet', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', PASSWORD, BLAKE2B_SEED)\r
- await assert.resolves(wallet.unlock(PASSWORD))\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, BLAKE2B_SEED)\r
+ await assert.resolves(wallet.unlock(TEST_PASSWORD))\r
const block = new Block(BLAKE2B_ADDRESS_1, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
.receive(OPEN_BLOCK.link, OPEN_BLOCK.balance)\r
\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
- await assert.resolves(wallet.unlock(PASSWORD))\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, BIP39_SEED)\r
+ await assert.resolves(wallet.unlock(TEST_PASSWORD))\r
const block = new Block(ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
.receive(OPEN_BLOCK.link, OPEN_BLOCK.balance)\r
\r
})\r
\r
await test('sign open block with Exodus wallet', async () => {\r
- const wallet = await Wallet.load('Exodus', PASSWORD, EXODUS.BIP39_SEED_0)\r
- await assert.resolves(wallet.unlock(PASSWORD))\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, EXODUS.BIP39_SEED_0)\r
+ await assert.resolves(wallet.unlock(TEST_PASSWORD))\r
const block = new Block(EXODUS.ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
.receive(OPEN_BLOCK.link, OPEN_BLOCK.balance)\r
\r
})\r
\r
await test('fail to sign open block with wallet without user activation', { skip: isNode }, async () => {\r
- const wallet = await Wallet.load('BIP-44', PASSWORD, BIP39_SEED)\r
- await assert.resolves(wallet.unlock(PASSWORD))\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, BIP39_SEED)\r
+ await assert.resolves(wallet.unlock(TEST_PASSWORD))\r
const block = new Block(ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative)\r
.receive(OPEN_BLOCK.link, OPEN_BLOCK.balance)\r
\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('BIP-44', TEST_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
})\r
\r
await test('sign Ledger-derived open block', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, LEDGER_NANOS.MNEMONIC)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, LEDGER_NANOS.MNEMONIC)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
assert.equal(account.publicKey, LEDGER_NANOS.PUBLIC_0)\r
assert.equal(account.address, LEDGER_NANOS.ADDRESS_0)\r
\r
import { Wallet } from 'libnemo'\r
import { assert, suite, test } from './GLOBALS.mjs'\r
-import { NANO_TEST_VECTORS } from './VECTORS.mjs'\r
+import { TEST_PASSWORD } from './VECTORS.mjs'\r
\r
await Promise.all([\r
suite('Create wallets', async () => {\r
- const { PASSWORD } = NANO_TEST_VECTORS\r
-\r
await test('destroy BIP-44 wallet before unlocking', async () => {\r
- const wallet = await Wallet.create('BIP-44', PASSWORD)\r
+ const wallet = await Wallet.create('BIP-44', TEST_PASSWORD)\r
\r
await assert.resolves(wallet.destroy())\r
- await assert.rejects(wallet.unlock(PASSWORD))\r
+ await assert.rejects(wallet.unlock(TEST_PASSWORD))\r
})\r
\r
await test('BIP-44 wallet with random entropy', async () => {\r
- const wallet = await Wallet.create('BIP-44', PASSWORD)\r
- await wallet.unlock(PASSWORD)\r
+ const wallet = await Wallet.create('BIP-44', TEST_PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
assert.ok('id' in wallet)\r
assert.ok(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(wallet.id))\r
})\r
\r
await test('BLAKE2b wallet with random entropy', async () => {\r
- const wallet = await Wallet.create('BLAKE2b', PASSWORD)\r
- await wallet.unlock(PASSWORD)\r
+ const wallet = await Wallet.create('BLAKE2b', TEST_PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
assert.ok('id' in wallet)\r
assert.ok(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(wallet.id))\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('BIP-44', PASSWORD, arg))\r
+ await assert.rejects(Wallet.create('BIP-44', TEST_PASSWORD, arg))\r
}\r
})\r
\r
\r
import { Wallet } from 'libnemo'\r
import { assert, suite, test } from './GLOBALS.mjs'\r
-import { CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS } from './VECTORS.mjs'\r
+import { CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TEST_PASSWORD } from './VECTORS.mjs'\r
\r
await Promise.all([\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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(1, 2)\r
\r
assert.equal(accounts.size, 2)\r
})\r
\r
await test('derive high 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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0x70000000, 0x7000000f)\r
\r
assert.equal(accounts.size, 0x10)\r
})\r
\r
await test('derive from restored BIP-44 wallet', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
const restored = await Wallet.restore(wallet.id)\r
- await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
const account = await restored.account()\r
\r
assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_0)\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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account(1)\r
\r
assert.equal(account.publicKey, NANO_TEST_VECTORS.BLAKE2B_PUBLIC_1)\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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(2, 3)\r
\r
assert.equal(accounts.size, 2)\r
})\r
\r
await test('derive high 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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0x70000000, 0x7000000f)\r
\r
assert.equal(accounts.size, 0x10)\r
})\r
\r
await test('derive from restored BLAKE2b wallet', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, NANO_TEST_VECTORS.BLAKE2B_SEED)\r
const restored = await Wallet.restore(wallet.id)\r
- await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
const account = await restored.account(1)\r
\r
assert.equal(account.publicKey, NANO_TEST_VECTORS.BLAKE2B_PUBLIC_1)\r
}),\r
\r
suite('Derive accounts from Exodus wallet', async () => {\r
- const { PASSWORD } = NANO_TEST_VECTORS\r
const { ADDRESS_0, ADDRESS_1, BIP39_SEED_0, BIP39_SEED_1, PUBLIC_0, PUBLIC_1 } = CUSTOM_TEST_VECTORS.EXODUS\r
\r
await test('derive the first account from the given Exodus seed', async () => {\r
- const wallet = await Wallet.load('Exodus', PASSWORD, BIP39_SEED_0)\r
- await wallet.unlock(PASSWORD)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, BIP39_SEED_0)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.equal(account.publicKey, PUBLIC_0)\r
})\r
\r
await test('derive low indexed accounts from the given Exodus seed', async () => {\r
- const wallet = await Wallet.load('Exodus', PASSWORD, BIP39_SEED_1)\r
- await wallet.unlock(PASSWORD)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, BIP39_SEED_1)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(1, 2)\r
\r
assert.equal(accounts.size, 2)\r
})\r
\r
await test('derive high indexed accounts from the given Exodus seed', async () => {\r
- const wallet = await Wallet.load('Exodus', PASSWORD, BIP39_SEED_0)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, BIP39_SEED_0)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0x70000000, 0x7000000f)\r
\r
assert.equal(accounts.size, 0x10)\r
})\r
\r
await test('derive from restored Exodus wallet', async () => {\r
- const wallet = await Wallet.load('Exodus', PASSWORD, BIP39_SEED_0)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, BIP39_SEED_0)\r
const restored = await Wallet.restore(wallet.id)\r
- await restored.unlock(PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
const account = await restored.account()\r
\r
assert.equal(account.publicKey, PUBLIC_0)\r
\r
import { Account, Wallet } from 'libnemo'\r
import { assert, suite, test } from './GLOBALS.mjs'\r
-import { BIP32_TEST_VECTORS, CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TREZOR_TEST_VECTORS } from './VECTORS.mjs'\r
+import { CUSTOM_TEST_VECTORS, NANO_TEST_VECTORS, TEST_PASSWORD, TREZOR_TEST_VECTORS } from './VECTORS.mjs'\r
\r
await Promise.all([\r
suite('Import wallets', async () => {\r
\r
await test('nano.org BIP-44 test vector mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
})\r
\r
await test('nano.org BIP-44 test vector seed with no mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok('mnemonic' in wallet)\r
})\r
\r
await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_0)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_0))\r
})\r
\r
await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_1)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_1))\r
})\r
\r
await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_2)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_2))\r
})\r
\r
await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, CUSTOM_TEST_VECTORS.MNEMONIC_3)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.MNEMONIC_3))\r
})\r
\r
await test('BIP-44 zero-string entropy', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.PASSWORD)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0, TREZOR_TEST_VECTORS.MNEMONIC_SALT)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0, 3)\r
\r
assert.ok('mnemonic' in wallet)\r
})\r
\r
await test('BLAKE2b zero-string seed', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0, 3)\r
\r
assert.ok('mnemonic' in wallet)\r
})\r
\r
await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_1)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const accounts = await wallet.accounts(0, 1)\r
\r
assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_1))\r
})\r
\r
await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_2)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const walletAccount = await wallet.account()\r
\r
assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_2))\r
\r
- const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_2)\r
- await imported.unlock(TREZOR_TEST_VECTORS.PASSWORD)\r
+ const imported = await Wallet.load('BLAKE2b', TREZOR_TEST_VECTORS.MNEMONIC_SALT, TREZOR_TEST_VECTORS.MNEMONIC_2)\r
+ await imported.unlock(TREZOR_TEST_VECTORS.MNEMONIC_SALT)\r
const importedAccount = await imported.account()\r
\r
assert.ok(await imported.verify(TREZOR_TEST_VECTORS.MNEMONIC_2))\r
})\r
\r
await test('BLAKE2b mnemonic for maximum seed value', async () => {\r
- const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.MNEMONIC_3)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(account instanceof Account)\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('BIP-44', TEST_PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C797'))\r
+ await assert.rejects(Wallet.load('BIP-44', TEST_PASSWORD, '6CAF5A42BB8074314AAE20295975ECE663BE7AAD945A73613D193B0CC41C79701'))\r
+ await assert.rejects(Wallet.load('BIP-44', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0.replaceAll(/./g, 'x')))\r
})\r
\r
await test('Reject invalid length seed', async () => {\r
- await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'),\r
+ await assert.rejects(Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED + 'f'),\r
`Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length + 1}-character string.`)\r
- await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)),\r
+ await assert.rejects(Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED.slice(0, -1)),\r
`Expected a ${NANO_TEST_VECTORS.BIP39_SEED.length}-character seed, but received ${NANO_TEST_VECTORS.BIP39_SEED.length - 1}-character string.`)\r
})\r
\r
await test('Reject seed containing non-hex characters', async () => {\r
- await assert.rejects(Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')),\r
+ await assert.rejects(Wallet.load('BIP-44', TEST_PASSWORD, TREZOR_TEST_VECTORS.SEED_0.replace(/./, 'g')),\r
'Seed contains invalid hexadecimal characters.')\r
- await assert.rejects(Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')),\r
+ await assert.rejects(Wallet.load('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1.replace(/./, 'g')),\r
'Seed contains invalid hexadecimal characters.')\r
})\r
\r
await test('Import BIP-44 wallet from storage using a wallet-generated ID', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
const restored = await Wallet.restore(wallet.id)\r
\r
assert.ok('mnemonic' in restored)\r
await assert.rejects(restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
await assert.rejects(restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
\r
- await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
\r
assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
})\r
\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('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0)\r
const restored = await Wallet.restore(wallet.id)\r
\r
assert.ok('mnemonic' in restored)\r
await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
await assert.rejects(restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
\r
- await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
\r
assert.ok(await restored.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
assert.ok(await restored.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
})\r
\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('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
const backups = await Wallet.backup()\r
\r
assert.ok(backups.some(record => record.id === wallet.id))\r
assert.ok(restored.mnemonic === undefined)\r
assert.ok(restored.seed === undefined)\r
\r
- await restored.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restored.unlock(TEST_PASSWORD)\r
\r
assert.ok(await restored.verify(NANO_TEST_VECTORS.MNEMONIC))\r
assert.ok(await restored.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
})\r
\r
await test('restore wallets without referencing IDs', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
const backups = await Wallet.backup()\r
\r
assert.ok(backups.some(record => record.id === wallet.id))\r
assert.ok(restoredWallet.mnemonic === undefined)\r
assert.ok(restoredWallet.seed === undefined)\r
\r
- await restoredWallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await restoredWallet.unlock(TEST_PASSWORD)\r
\r
assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
assert.ok(await restoredWallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
})\r
\r
await test('load account from legacy address', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
const legacy = new Account(NANO_TEST_VECTORS.ADDRESS_0.replace('nano_', 'xrb_'))\r
\r
})\r
\r
await test('nano.org Exodus test vector mnemonic', async () => {\r
- const wallet = await Wallet.load('Exodus', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_0)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_0)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_0))\r
})\r
\r
await test('zero entropy Exodus test vector mnemonic', async () => {\r
- const wallet = await Wallet.load('Exodus', NANO_TEST_VECTORS.PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_1)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('Exodus', TEST_PASSWORD, CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_1)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
\r
assert.ok(await wallet.verify(CUSTOM_TEST_VECTORS.EXODUS.MNEMONIC_1))\r
\r
import { Account, Wallet } from 'libnemo'\r
import { assert, suite, test } from './GLOBALS.mjs'\r
-import { NANO_TEST_VECTORS, TREZOR_TEST_VECTORS } from './VECTORS.mjs'\r
+import { NANO_TEST_VECTORS, TEST_PASSWORD, TREZOR_TEST_VECTORS } from './VECTORS.mjs'\r
\r
await Promise.all([\r
suite('Lock and unlock wallets', async () => {\r
\r
await test('locking and unlocking a BIP-44 wallet 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('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
assert.ok(wallet.mnemonic === undefined)\r
assert.ok(wallet.seed === undefined)\r
\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
})\r
\r
await test('change the password on a BIP-44 wallet', async () => {\r
- const wallet = await Wallet.load('BIP-44', '', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC)\r
let isLocked = wallet.isLocked\r
wallet.addEventListener('locked', () => isLocked = true)\r
wallet.addEventListener('unlocked', () => isLocked = false)\r
- await wallet.unlock('')\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
assert.equal(false, isLocked)\r
\r
- await wallet.update(NANO_TEST_VECTORS.PASSWORD)\r
+ const newPassword = crypto.randomUUID()\r
+ await wallet.update(newPassword)\r
wallet.lock()\r
await new Promise(r => setTimeout(r, 1_000))\r
assert.equal(true, isLocked)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(newPassword)\r
\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
})\r
\r
await test('fail to unlock a BIP-44 wallet 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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
+ await wallet.unlock(TEST_PASSWORD)\r
wallet.lock()\r
\r
await assert.rejects(wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
assert.ok(wallet.mnemonic === undefined)\r
assert.ok(wallet.seed === undefined)\r
\r
- await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.PASSWORD), 'Failed to unlock wallet')\r
+ await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.MNEMONIC_SALT), 'Failed to unlock wallet')\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
assert.ok(wallet.mnemonic === undefined)\r
})\r
\r
await test('fail to unlock a BIP-44 wallet 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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
await assert.rejects(wallet.unlock(), 'Failed to unlock wallet')\r
//@ts-expect-error\r
})\r
\r
await test('locking and unlocking a BLAKE2b wallet 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('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_0)\r
\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
assert.ok(wallet.mnemonic === undefined)\r
assert.ok(wallet.seed === undefined)\r
\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
\r
assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.MNEMONIC_0))\r
assert.ok(await wallet.verify(TREZOR_TEST_VECTORS.ENTROPY_0))\r
})\r
\r
await test('fail to unlock a BLAKE2b wallet 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('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1)\r
\r
- await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.PASSWORD), 'Failed to unlock wallet')\r
+ await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.MNEMONIC_SALT), 'Failed to unlock wallet')\r
assert.ok('mnemonic' in wallet)\r
assert.ok('seed' in wallet)\r
assert.ok(wallet.mnemonic === undefined)\r
})\r
\r
await test('fail to unlock a BLAKE2b wallet 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('BLAKE2b', TEST_PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1)\r
\r
await assert.rejects(wallet.unlock(), 'Failed to unlock wallet')\r
//@ts-expect-error\r
\r
await test('wallet automatic lock resets after user activity', { skip: false }, async () => {\r
console.log('Starting autolock test...')\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('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
assert.equal(true, wallet.isLocked)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
assert.equal(false, wallet.isLocked)\r
\r
assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
})\r
\r
await test('configure 10-second autolock', 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('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
assert.equal(true, wallet.isLocked)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
assert.equal(false, wallet.isLocked)\r
await wallet.config({ timeout: 10 })\r
\r
})\r
\r
await test('fail to configure invalid autolock times', 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('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.MNEMONIC_SALT)\r
assert.equal(true, wallet.isLocked)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock(TEST_PASSWORD)\r
assert.equal(false, wallet.isLocked)\r
\r
//@ts-expect-error\r
import { Account, Wallet, Rpc } from 'libnemo'
import { assert, env, suite, test } from './GLOBALS.mjs'
-import { NANO_TEST_VECTORS } from './VECTORS.mjs'
+import { NANO_TEST_VECTORS, TEST_PASSWORD } from './VECTORS.mjs'
const rpc = new Rpc(env.NODE_URL ?? '', env.API_KEY_NAME)
suite('Refreshing account info', { skip: false }, async () => {
await test('fetch balance, frontier, and representative', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const account = await wallet.account()
await account.refresh(rpc)
})
await test('throw when refreshing unopened account', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const account = await wallet.account(0x7fffffff)
await assert.rejects(account.refresh(rpc), 'Account not found')
})
await test('throw when referencing invalid account index', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
await assert.rejects(wallet.account(0x80000000), 'Invalid child key index 0x80000000')
})
await test('throw with invalid node', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const invalidNode = new Rpc('http://invalid.com')
const account = await wallet.account()
suite('Fetch next unopened account', { skip: false }, async () => {
await test('return correct account from test vector', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const account = await wallet.unopened(rpc)
assert.exists(account)
})
await test('return successfully for small batch size', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const account = await wallet.unopened(rpc, 1)
assert.exists(account)
})
await test('return successfully for large batch size', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const account = await wallet.unopened(rpc, 100)
assert.exists(account)
})
await test('should throw on invalid node URL', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
//@ts-expect-error
await assert.rejects(wallet.unopened())
})
await test('should throw on invalid batch size', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
//@ts-expect-error
await assert.rejects(wallet.unopened(rpc, null))
suite('Refreshing wallet accounts', { skip: false }, async () => {
await test('get balance, frontier, and representative for one account', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const accounts = await wallet.refresh(rpc)
const account = accounts.get(0)
})
await test('should get balance, frontier, and representative for multiple accounts', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
const accounts = await wallet.refresh(rpc, 0, 2)
assert.equal(accounts.size, 3)
})
await test('should handle failure gracefully', 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 wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)
+ await wallet.unlock(TEST_PASSWORD)
await assert.resolves(wallet.refresh(rpc, 0, 20))
console.assert(failures.some(call => /.*promise should fail.*/.test(call)) === true, `bad promise not errored`)
console.assert(passes.some(call => /.*promise should fail.*/.test(call)) === false, 'bad promise logged')
- await test('async should pass', async () => {})
+ await test('async should pass', async () => { })
console.assert(failures.some(call => /.*async should pass.*/.test(call)) === false, 'good async errored')
console.assert(passes.some(call => /.*async should pass.*/.test(call)) === true, 'good async not logged')
console.assert(failures.some(call => /.*async should fail.*/.test(call)) === true, 'bad async not errored')
console.assert(passes.some(call => /.*async should fail.*/.test(call)) === false, 'bad async logged')
- await test('function should pass', () => {})
+ await test('function should pass', () => { })
console.assert(failures.some(call => /.*function should pass.*/.test(call)) === false, 'good function errored')
console.assert(passes.some(call => /.*function should pass.*/.test(call)) === true, 'good function not logged')
\r
import { Rpc, Tools, Wallet } from 'libnemo'\r
import { assert, click, env, suite, test } from './GLOBALS.mjs'\r
-import { MAX_RAW, MAX_SUPPLY, NANO_TEST_VECTORS } from './VECTORS.mjs'\r
+import { MAX_RAW, MAX_SUPPLY, NANO_TEST_VECTORS, TEST_PASSWORD } from './VECTORS.mjs'\r
\r
const rpc = new Rpc(env?.NODE_URL ?? '', env?.API_KEY_NAME)\r
\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
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const results = await Tools.sweep(rpc, wallet, NANO_TEST_VECTORS.ADDRESS_1)\r
\r
assert.exists(results)\r
\r
import { Account, Block, Tools, Wallet } from 'libnemo'\r
import { assert, click, suite, test } from './GLOBALS.mjs'\r
-import { NANO_TEST_VECTORS } from './VECTORS.mjs'\r
+import { NANO_TEST_VECTORS, TEST_PASSWORD } from './VECTORS.mjs'\r
\r
await Promise.all([\r
\r
suite('sign with Wallet', async () => {\r
\r
await test('sign an arbitrary string', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
const data = crypto.randomUUID()\r
let signature = ''\r
})\r
\r
await test('verify Block signature using the correct public key', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
const sendBlock = await new Block(account.address, '5618869000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou')\r
.send('nano_1q3hqecaw15cjt7thbtxu3pbzr1eihtzzpzxguoc37bj1wc5ffoh7w74gi6p', '2000000000000000000000000000000')\r
})\r
\r
await test('reject Block signature using the wrong public key', async () => {\r
- const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
- await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+ const wallet = await Wallet.load('BIP-44', TEST_PASSWORD, NANO_TEST_VECTORS.BIP39_SEED)\r
+ await wallet.unlock(TEST_PASSWORD)\r
const account = await wallet.account()\r
const sendBlock = await new Block(account.address, '5618869000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou')\r
.send('nano_1q3hqecaw15cjt7thbtxu3pbzr1eihtzzpzxguoc37bj1wc5ffoh7w74gi6p', '2000000000000000000000000000000')\r