]> git.codecow.com Git - libnemo.git/commitdiff
Destroy temporary signing account in block method. Check that wallets are destroyed...
authorChris Duncan <chris@zoso.dev>
Wed, 23 Jul 2025 15:24:23 +0000 (08:24 -0700)
committerChris Duncan <chris@zoso.dev>
Wed, 23 Jul 2025 15:24:23 +0000 (08:24 -0700)
src/lib/block.ts
test/test.create-wallet.mjs
test/test.derive-accounts.mjs
test/test.import-wallet.mjs
test/test.lock-unlock.mjs
test/test.refresh-accounts.mjs
test/test.tools.mjs

index be9a740d3b9e85bc6c06d8c79dc32a228a9b38a5..aff883f4c273d58a8145c5179522d5f68b82ba59 100644 (file)
@@ -166,6 +166,7 @@ abstract class Block {
                        try {
                                const account = await Account.import({ index: 0, privateKey: input }, '')
                                this.signature = await account.sign(this, '')
+                               await account.destroy()
                        } catch (err) {
                                throw new Error(`Failed to sign block`, { cause: err })
                        }
index b3e4badb7694fde6c41b4a9417441871648b1930..f53ae723cef783b7a53bae14f5d01e651796a48c 100644 (file)
@@ -33,7 +33,7 @@ await Promise.all([
                        assert.ok('seed' in wallet)\r
                        assert.ok(/^[A-Fa-f0-9]{128}$/.test(wallet.seed))\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('BLAKE2b wallet with random entropy', async () => {\r
@@ -47,15 +47,15 @@ await Promise.all([
                        assert.ok('seed' in wallet)\r
                        assert.ok(/^[A-Fa-f0-9]{64}$/.test(wallet.seed))\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('BIP-44 replace invalid salt with empty string', async () => {\r
                        const invalidArgs = [null, true, false, 0, 1, 2, { foo: 'bar' }]\r
                        for (const arg of invalidArgs) {\r
                                const wallet = Bip44Wallet.create(NANO_TEST_VECTORS.PASSWORD, arg)\r
-                               await assert.resolves(wallet);\r
-                               (await wallet).destroy()\r
+                               await assert.resolves(wallet)\r
+                               await assert.resolves((await wallet).destroy())\r
                        }\r
                })\r
 \r
index 5dea00356690c4502e1c51938a29f267d3209b2e..b301a2fe3e6ae1ccd641afada4921a98b388c3fb 100644 (file)
@@ -25,7 +25,7 @@ await Promise.all([
                        assert.exists(accounts[0])\r
                        assert.equal(account, accounts[0])\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('derive low indexed accounts from the given BIP-44 seed', async () => {\r
@@ -45,7 +45,7 @@ await Promise.all([
                        assert.equal(accounts[2].address, NANO_TEST_VECTORS.ADDRESS_2)\r
                        assert.equal(accounts[2].index, 2)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('derive high indexed accounts from the given seed', async () => {\r
@@ -64,7 +64,7 @@ await Promise.all([
                                assert.exists(privateKey)\r
                        }\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
        }),\r
 \r
@@ -85,7 +85,7 @@ await Promise.all([
                        assert.exists(accounts[1])\r
                        assert.equal(account, accounts[1])\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('derive low indexed accounts from the given BLAKE2B seed', async () => {\r
@@ -105,7 +105,7 @@ await Promise.all([
                        // assert.equal(accounts[2].address, NANO_TEST_VECTORS.BLAKE2B_ADDRESS_2)\r
                        assert.equal(accounts[2].index, 2)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('derive high indexed accounts from the given seed', async () => {\r
@@ -124,7 +124,7 @@ await Promise.all([
                                assert.exists(privateKey)\r
                        }\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
        })\r
 ])\r
index ccd32e2afd8f34eb822dfc4b28e7e7546304524c..d56c92297a6daa3702a17402b2b9aad4e27db612 100644 (file)
@@ -26,7 +26,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, NANO_TEST_VECTORS.PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('nano.org BIP-44 test vector seed with no mnemonic', async () => {\r
@@ -45,7 +45,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, NANO_TEST_VECTORS.PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Trezor-derived BIP-44 entropy for 12-word mnemonic', async () => {\r
@@ -61,7 +61,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, CUSTOM_TEST_VECTORS.PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Trezor-derived BIP-44 entropy for 15-word mnemonic', async () => {\r
@@ -77,7 +77,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, CUSTOM_TEST_VECTORS.PRIVATE_1)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Trezor-derived BIP-44 entropy for 18-word mnemonic', async () => {\r
@@ -93,7 +93,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, CUSTOM_TEST_VECTORS.PRIVATE_2)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Trezor-derived BIP-44 entropy for 21-word mnemonic', async () => {\r
@@ -109,7 +109,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, CUSTOM_TEST_VECTORS.PRIVATE_3)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('BIP-44 zero-string entropy', async () => {\r
@@ -131,7 +131,7 @@ await Promise.all([
                                assert.exists(privateKey)\r
                        }\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('BLAKE2b zero-string seed', async () => {\r
@@ -153,7 +153,7 @@ await Promise.all([
                                assert.exists(privateKey)\r
                        }\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Trezor-derived BLAKE2b test vectors verified with third-party libraries', async () => {\r
@@ -178,7 +178,7 @@ await Promise.all([
                        const privateKey1 = await accounts[1].export(wallet.seed, 'hex')\r
                        assert.equal(privateKey1, TREZOR_TEST_VECTORS.BLAKE2B_1_PRIVATE_1)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('BLAKE2b seed creates identical wallet as its derived mnemonic', async () => {\r
@@ -202,7 +202,8 @@ await Promise.all([
                        assert.equal(importedAccount.publicKey, walletAccount.publicKey)\r
                        assert.equal(importedAccountPrivateKey, walletAccountPrivateKey)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
+                       await assert.resolves(imported.destroy())\r
                })\r
 \r
                await test('BLAKE2b mnemonic for maximum seed value', async () => {\r
@@ -221,7 +222,7 @@ await Promise.all([
                        const privateKey = await account.export(wallet.seed, 'hex')\r
                        assert.equal(privateKey, TREZOR_TEST_VECTORS.BLAKE2B_3_PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Reject invalid entropy', async () => {\r
@@ -261,7 +262,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, NANO_TEST_VECTORS.MNEMONIC)\r
                        assert.equal(wallet.seed, NANO_TEST_VECTORS.BIP39_SEED)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('Import BLAKE2B wallet from session storage using a wallet-generated ID', async () => {\r
@@ -281,7 +282,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
                        assert.equal(wallet.seed, TREZOR_TEST_VECTORS.ENTROPY_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
        })\r
 ])\r
index 7f463490dcd3942dead480986add8768536b5c1a..c4e0f3ffdadac5bfd3518c59e04d308ccc579604 100644 (file)
@@ -26,7 +26,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, NANO_TEST_VECTORS.MNEMONIC)\r
                        assert.equal(wallet.seed, NANO_TEST_VECTORS.BIP39_SEED)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('locking and unlocking a Bip44Wallet with random bytes', async () => {\r
@@ -49,7 +49,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, NANO_TEST_VECTORS.MNEMONIC)\r
                        assert.equal(wallet.seed, NANO_TEST_VECTORS.BIP39_SEED)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('locking and unlocking a Bip44Wallet Account with a password', async () => {\r
@@ -66,7 +66,7 @@ await Promise.all([
                        assert.equal(unlockResult, true)\r
                        assert.equal(privateKey, NANO_TEST_VECTORS.PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with different passwords', async () => {\r
@@ -81,7 +81,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with different random bytes', async () => {\r
@@ -98,7 +98,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with different valid inputs', async () => {\r
@@ -111,7 +111,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with no input', async () => {\r
@@ -132,7 +132,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Bip44Wallet with invalid input', async () => {\r
@@ -153,7 +153,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('locking and unlocking a Blake2bWallet with a password', async () => {\r
@@ -172,7 +172,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, TREZOR_TEST_VECTORS.MNEMONIC_0)\r
                        assert.equal(wallet.seed, TREZOR_TEST_VECTORS.ENTROPY_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('locking and unlocking a Blake2bWallet with random bytes', async () => {\r
@@ -196,7 +196,7 @@ await Promise.all([
                        assert.equal(wallet.mnemonic, TREZOR_TEST_VECTORS.MNEMONIC_1)\r
                        assert.equal(wallet.seed, TREZOR_TEST_VECTORS.ENTROPY_1)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('locking and unlocking a Blake2bWallet Account with a password', async () => {\r
@@ -213,7 +213,7 @@ await Promise.all([
                        assert.equal(unlockResult, true)\r
                        assert.equal(privateKey, TREZOR_TEST_VECTORS.BLAKE2B_PRIVATE_0)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with different passwords', async () => {\r
@@ -225,7 +225,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with different keys', async () => {\r
@@ -242,7 +242,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with different valid inputs', async () => {\r
@@ -255,7 +255,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with no input', async () => {\r
@@ -276,7 +276,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('fail to unlock a Blake2bWallet with invalid input', async () => {\r
@@ -297,7 +297,7 @@ await Promise.all([
                        assert.nullish(wallet.mnemonic)\r
                        assert.nullish(wallet.seed)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
        })\r
 ])\r
index b4fb138f7519b9280f1540b653ab4248ee985449..9ac26a5230eda16b9d572634b9090a32ecd0288a 100644 (file)
@@ -34,7 +34,7 @@ await Promise.all([
                        assert.exists(account.representative?.address)
                        assert.notEqual(account.representative?.address, '')
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('throw when refreshing unopened account', async () => {
@@ -45,7 +45,7 @@ await Promise.all([
                        await assert.rejects(account.refresh(rpc),
                                { message: 'Account not found' })
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('throw when referencing invalid account index', async () => {
@@ -55,7 +55,7 @@ await Promise.all([
                        await assert.rejects(wallet.account(0x80000000),
                                { message: 'Invalid child key index 0x80000000' })
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('throw with invalid node', async () => {
@@ -67,7 +67,7 @@ await Promise.all([
                        await assert.rejects(account.refresh(invalidNode),
                                { message: 'Account not found' })
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
        }),
 
@@ -82,7 +82,7 @@ await Promise.all([
                        assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_1)
                        assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_1)
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('return successfully for small batch size', async () => {
@@ -94,7 +94,7 @@ await Promise.all([
                        assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_1)
                        assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_1)
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('return successfully for large batch size', async () => {
@@ -106,7 +106,7 @@ await Promise.all([
                        assert.equal(account.address, NANO_TEST_VECTORS.ADDRESS_1)
                        assert.equal(account.publicKey, NANO_TEST_VECTORS.PUBLIC_1)
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('should throw on invalid node URL', async () => {
@@ -119,7 +119,7 @@ await Promise.all([
                        await assert.rejects(wallet.unopened(''))
                        await assert.rejects(wallet.unopened('foo'))
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('should throw on invalid batch size', async () => {
@@ -132,7 +132,7 @@ await Promise.all([
                        await assert.rejects(wallet.unopened(rpc, 'foo'))
                        await assert.rejects(wallet.unopened(rpc, { 'foo': 'bar' }))
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
        }),
 
@@ -149,7 +149,7 @@ await Promise.all([
                        assert.exists(account.frontier)
                        assert.equal(typeof account.frontier, 'string')
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('should get balance, frontier, and representative for multiple accounts', async () => {
@@ -160,7 +160,7 @@ await Promise.all([
                        assert.equal(accounts.length, 1)
                        assert.ok(accounts[0] instanceof Account)
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
 
                await test('should handle failure gracefully', async () => {
@@ -169,7 +169,7 @@ await Promise.all([
 
                        await assert.resolves(wallet.refresh(rpc, 0, 20))
 
-                       await wallet.destroy()
+                       await assert.resolves(wallet.destroy())
                })
        })
 ])
index f9f54c16ff04d885de660a36c8c99fe949373419..605930f758034e2059daf038d8324a802b11c08f 100644 (file)
@@ -113,7 +113,7 @@ await Promise.all([
                        const valid = await sendBlock.verify(account.publicKey)\r
                        assert.equal(valid, true)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('should reject a block using the wrong public key', async () => {\r
@@ -135,7 +135,8 @@ await Promise.all([
                        const valid = await sendBlock.verify(account.publicKey)\r
                        assert.equal(valid, false)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(sendBlock.account.destroy())\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
 \r
                await test('sweeper throws without required parameters', async () => {\r
@@ -147,10 +148,11 @@ await Promise.all([
                        const wallet = await Bip44Wallet.fromSeed(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
                        assert.ok(results)\r
                        assert.equal(results.length, 1)\r
 \r
-                       await wallet.destroy()\r
+                       await assert.resolves(wallet.destroy())\r
                })\r
        })\r
 ])\r