From 5a245db899a7ff1d98957347f250b703eb390bbd Mon Sep 17 00:00:00 2001 From: Mat Date: Thu, 15 Aug 2024 14:02:24 -0700 Subject: [PATCH 1/2] Add the ability to delete a transaction to the wallet and RPC --- .../commands/wallet/transactions/delete.ts | 46 +++---------------- ironfish/src/rpc/clients/client.ts | 13 ++++++ .../rpc/routes/wallet/deleteTransaction.ts | 42 +++++++++++++++++ ironfish/src/rpc/routes/wallet/index.ts | 1 + ironfish/src/wallet/wallet.ts | 43 +++++++++++++++++ 5 files changed, 106 insertions(+), 39 deletions(-) create mode 100644 ironfish/src/rpc/routes/wallet/deleteTransaction.ts diff --git a/ironfish-cli/src/commands/wallet/transactions/delete.ts b/ironfish-cli/src/commands/wallet/transactions/delete.ts index f26e54417a..ab448ca688 100644 --- a/ironfish-cli/src/commands/wallet/transactions/delete.ts +++ b/ironfish-cli/src/commands/wallet/transactions/delete.ts @@ -1,8 +1,7 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { NodeUtils, TransactionStatus } from '@ironfish/sdk' -import { Args, ux } from '@oclif/core' +import { Args } from '@oclif/core' import { IronfishCommand } from '../../../command' export default class TransactionsDelete extends IronfishCommand { @@ -19,47 +18,16 @@ export default class TransactionsDelete extends IronfishCommand { const { args } = await this.parse(TransactionsDelete) const { transaction } = args - ux.action.start('Opening node') - const node = await this.sdk.node() - await NodeUtils.waitForOpen(node) - ux.action.stop('Done.') + const client = await this.connectRpc() - const accounts = node.wallet.accounts - const transactionHash = Buffer.from(transaction, 'hex') - let deleted = false + const response = await client.wallet.deleteTransaction({ hash: transaction }) - for (const account of accounts) { - const transactionValue = await account.getTransaction(transactionHash) - - if (transactionValue == null) { - continue - } - - const transactionStatus = await node.wallet.getTransactionStatus( - account, - transactionValue, - ) - - if ( - transactionStatus === TransactionStatus.CONFIRMED || - transactionStatus === TransactionStatus.UNCONFIRMED - ) { - this.error(`Transaction ${transaction} is already on a block, so it cannot be deleted`) - } - - if ( - transactionStatus === TransactionStatus.EXPIRED || - transactionStatus === TransactionStatus.PENDING - ) { - await account.deleteTransaction(transactionValue.transaction) - deleted = true - } - } - - if (deleted) { + if (response.content.deleted) { this.log(`Transaction ${transaction} deleted from wallet`) } else { - this.log(`No transaction with hash ${transaction} found in wallet`) + this.error( + `Transaction ${transaction} was not deleted. Either it is on a block already or does not exist`, + ) } } } diff --git a/ironfish/src/rpc/clients/client.ts b/ironfish/src/rpc/clients/client.ts index f8b70ac435..e1c1f859eb 100644 --- a/ironfish/src/rpc/clients/client.ts +++ b/ironfish/src/rpc/clients/client.ts @@ -174,6 +174,10 @@ import type { UseAccountResponse, } from '../routes' import { ApiNamespace } from '../routes/namespaces' +import { + DeleteTransactionRequest, + DeleteTransactionResponse, +} from '../routes/wallet/deleteTransaction' export abstract class RpcClient { abstract close(): void @@ -586,6 +590,15 @@ export abstract class RpcClient { ).waitForEnd() }, + deleteTransaction: ( + params: DeleteTransactionRequest, + ): Promise> => { + return this.request( + `${ApiNamespace.wallet}/deleteTransaction`, + params, + ).waitForEnd() + }, + estimateFeeRates: ( params?: EstimateFeeRatesRequest, ): Promise> => { diff --git a/ironfish/src/rpc/routes/wallet/deleteTransaction.ts b/ironfish/src/rpc/routes/wallet/deleteTransaction.ts new file mode 100644 index 0000000000..24d0ab4f94 --- /dev/null +++ b/ironfish/src/rpc/routes/wallet/deleteTransaction.ts @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +import * as yup from 'yup' +import { ApiNamespace } from '../namespaces' +import { routes } from '../router' +import { AssertHasRpcContext } from '../rpcContext' + +export type DeleteTransactionRequest = { + hash: string +} + +export type DeleteTransactionResponse = { + deleted: boolean +} + +export const DeleteTransactionRequestSchema: yup.ObjectSchema = yup + .object({ + hash: yup.string().defined(), + }) + .defined() +export const DeleteTransactionResponseSchema: yup.ObjectSchema = yup + .object({ + deleted: yup.boolean().defined(), + }) + .defined() + +routes.register( + `${ApiNamespace.wallet}/deleteTransaction`, + DeleteTransactionRequestSchema, + async (request, context): Promise => { + AssertHasRpcContext(request, context, 'wallet') + + const hash = Buffer.from(request.data.hash, 'hex') + + const deleted = await context.wallet.deleteTransaction(hash) + + request.end({ + deleted, + }) + }, +) diff --git a/ironfish/src/rpc/routes/wallet/index.ts b/ironfish/src/rpc/routes/wallet/index.ts index 775f5ebbe5..7794c13cb3 100644 --- a/ironfish/src/rpc/routes/wallet/index.ts +++ b/ironfish/src/rpc/routes/wallet/index.ts @@ -9,6 +9,7 @@ export * from './burnAsset' export * from './create' export * from './createAccount' export * from './createTransaction' +export * from './deleteTransaction' export * from './estimateFeeRates' export * from './exportAccount' export * from './getAccountNotesStream' diff --git a/ironfish/src/wallet/wallet.ts b/ironfish/src/wallet/wallet.ts index a978edb6ef..52cdedd73f 100644 --- a/ironfish/src/wallet/wallet.ts +++ b/ironfish/src/wallet/wallet.ts @@ -1195,6 +1195,49 @@ export class Wallet { } } + /** + * Delete a transaction from all accounts in the wallet if it has not yet been + * added to a block + */ + async deleteTransaction(hash: Buffer, tx?: IDatabaseTransaction): Promise { + let deleted = false + + await this.walletDb.db.withTransaction(tx, async (tx) => { + for (const account of this.accountById.values()) { + const transactionValue = await account.getTransaction(hash, tx) + + if (transactionValue == null) { + continue + } + + const transactionStatus = await this.getTransactionStatus( + account, + transactionValue, + undefined, + tx, + ) + + if ( + transactionStatus === TransactionStatus.CONFIRMED || + transactionStatus === TransactionStatus.UNCONFIRMED + ) { + // TODO: How do we handle errors at this point. Should we? + return false + } + + if ( + transactionStatus === TransactionStatus.EXPIRED || + transactionStatus === TransactionStatus.PENDING + ) { + await account.deleteTransaction(transactionValue.transaction, tx) + deleted = true + } + } + }) + + return deleted + } + async getTransactionStatus( account: Account, transaction: TransactionValue, From 9444fe5f7a754bdc89efd03751cc319e82f89fab Mon Sep 17 00:00:00 2001 From: Mat Date: Mon, 19 Aug 2024 14:06:48 -0700 Subject: [PATCH 2/2] add unit tests for wallet and rpc --- .../deleteTransaction.test.ts.fixture | 154 ++++++ .../routes/wallet/deleteTransaction.test.ts | 65 +++ .../__fixtures__/wallet.test.ts.fixture | 446 ++++++++++++++++++ ironfish/src/wallet/wallet.test.ts | 160 +++++++ ironfish/src/wallet/wallet.ts | 1 - 5 files changed, 825 insertions(+), 1 deletion(-) create mode 100644 ironfish/src/rpc/routes/wallet/__fixtures__/deleteTransaction.test.ts.fixture create mode 100644 ironfish/src/rpc/routes/wallet/deleteTransaction.test.ts diff --git a/ironfish/src/rpc/routes/wallet/__fixtures__/deleteTransaction.test.ts.fixture b/ironfish/src/rpc/routes/wallet/__fixtures__/deleteTransaction.test.ts.fixture new file mode 100644 index 0000000000..1a8d501952 --- /dev/null +++ b/ironfish/src/rpc/routes/wallet/__fixtures__/deleteTransaction.test.ts.fixture @@ -0,0 +1,154 @@ +{ + "Route wallet/deleteTransaction should return true when deleting a transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "4c199f86-625f-4d70-9ef1-5416197ba2a0", + "name": "existingAccount", + "spendingKey": "42fecb76b31eb44609b56dbfe517f82507f918227213fa79232ea79eef2db753", + "viewKey": "5641e4f8e724d3c6b5bf9da8d157b0f700ab9c75ca549079f9405124b12108dead5fd34c339019d3981ed36ab2fd303cd4d63d58222fb2982d9e529aba157412", + "incomingViewKey": "ef622236566f1b70dfcf2047bc7662080c599bd10b1a37955eb9acdab30f3507", + "outgoingViewKey": "a52cdc2178c2d247296fd30ced237cfafcc982e9f287bca21157f1d94b3832ba", + "publicAddress": "39f13996a551619bf22d0055ac3bb815ca8b1c1d9d36d43a1a72526286664027", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "6ef02a141b510095c7c13d79ce631e7801b19ba145dadeca57957462cc40c708" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:tSJWkx+7V9qY04v4Au4Um2pKF1qKK6VCC4Gq3V9yCjQ=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:ovVuTirVK5+zRp8E31C8Te8+ybxM4uXM1+U6OKn41sc=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724101482787, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAvSSGna5IX1qe2USicxdfVZ/QnSPcUKF22K4SNWq9RQmCClfrCxW+rge/LSe/Y9mojk/VzUseMRxhjSa2mlc1PYJGTA++vBSxzPHqL6tV9zCkcig9pv9Mhtl0yD2lbQJFOtVm7rN0GGjQ2A2/AvjJxd5wIiImUU/tyTrkBVQtB30J0j8ZX+ZOMK7C4QR7QOWkcg9XgYQAgVKxErCWmkfCfTMnxtzn8pIde6EnlUw+sVaXwssuvoEoM1lyVmlgmYqqhv8hQrX/is4AvL38NxFwkrpjPvzY0UXEC+WVwUNVaT0pEPPoCjoL31ZEhlxIt94MIqVBYcj1P87pYvZhkFUUlLlKZFZU7fEyPmfK3uK94tN1krktpik2HzC4iTj4PrlRZeLrDCnA1TREfLVcwusiEmWVY+nfK9P8ojuHqWvUsrtkC1c6micFWNF+F3f5J5q+mV1tL55dQUWD5xjVYIPRw3WJDFL7OlEHsu1AJGh8c35IAq/FYUYRmy9Jg1ArjNk88TW3HkU0NFUviCIJizWLp4TC4M+OC8qq/qeaLZTXzg0oZzhsFDzGCKKx+bz/q3x0Hz2EiTJRYRqRK8jnTo//G/t9K/IztrTLj/PoLBQXLpsSnczmYkl4qElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw5PWUUWTxkg/aG55GiCwAs8LK9rccClxxZcxgTrpEWtCMRC28oL/J7dxme3XbEBGMI+HO9kI5YApJVbeQr3RvBg==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + } + ], + "Route wallet/deleteTransaction should return false when not deleting a transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "f7c6bf85-5f42-446c-b127-fcd4077dcdef", + "name": "existingAccount", + "spendingKey": "8b91a476376d7def7a5db2e4cc74d54213b94210eab698f3bc7a5121a956c906", + "viewKey": "3db6a3ab0140021a8e8ac37727b9e426d2e2684ed7b3c13cb27befea04a78361f2e32de664d29af5d6688da28b569276ce408016bce0c0df35601a0d6083ed46", + "incomingViewKey": "2923ffcb0a770ba4e1febe690f3be2cf781042c6227e65a33b9314fd7d2c4d05", + "outgoingViewKey": "1a6649a9026c6bd95a758c4653d92bc1873864b8d96df5eeccd84c9037c9ba41", + "publicAddress": "efc9ad599a974b9113b810855012e4d07e5c76ec5262a081de05cadbb2b4cf3f", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "6b4fc75057816604fffc79d70cd9baaa732fa2476c8be084260cb2d573553009" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:v/C0+lNxuE90GJgCKOYazIlvy+U2APGs+wVplr6CyGc=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:cuzMHsViFGG1s+d7SdtxKoXoNM21VFP5o/61OCFvvb8=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724101484308, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAySF5vigNwaUcBefzDh/9DrmS+7Rrd8ZJNGqFEjkJazy1oFzvCAG5ZD5rAPftHr7o92s506p3oxHqnTA6O1jUAG/VWifg4KUKX57rQAzRsC+jaG/7BhQYlg5539pcZvF8W7E8gpfeI0YlI7ds9OyxuxH0f5KZAhaDT0D2tk5y3LgRlWzY3oMsRSm6xO8eEmydneRorBhL0jxD5G5YNnQqFm86lsPXCFjNby1lPNqWzxyP6nS1yK8a+zU/Gqnpt541x0vOnauY+rzhElgNDTUAsAuuXi7wEiZtDMDmc5INr63z0UN7J2qNCykLLMByBSredVra5vqHLMYzDHFAJeVfJkP0hIJIRZVdZze7A19huML6PSxpOkzGZdNTnGIytbBqMifsLhZu5EB49Qk+f4Df1Hf+ZunJDvGfIPSYIQYgOpN5OZ9iWCx8YK5F8Tt6jY18mWj7UIr8W1kT9VdBs5A2EgeHIcJuJiBRgLYi1d42xEAji+gSpQ1hy529n94jNB2CdN50vBff0/WJ5hj1W/Rj22H1aRV9vYw52gSnxzjcMNnuQVgI8iyipQur7vljYYkJzarluBKISqL62QITPIDxuUXGZVLgbbK18i1tLrl3s11OLhfXx47xhElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwHOfghlQZuvd3ZWFIk9uNBOT/wcp2Kylc5QGSObUHCs2982aMRnbTKV9PzMANJlP6UrXHX3nQS1pj5NLWDaAVDg==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + }, + { + "header": { + "sequence": 3, + "previousBlockHash": "D0D4749863C99A069CE5778049D18438AF3FDBB823F8FEABFC69E6E6FDE23938", + "noteCommitment": { + "type": "Buffer", + "data": "base64:H3+z95bu5SibcW3MeSd/8JV5EWN8dr64T8QmnYbSFAI=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:WJO8qQqSda/5PSZHMepvSmnkpk3jMPFzhJSWMaz6PAw=" + }, + "target": "9255858786337818395603165512831024101510453493377417362192396248796027", + "randomness": "0", + "timestamp": 1724101485748, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 7, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAKfamQt03AlTN7ezYLEIwTyZTmERzm7h3VV2uvUdsSoe06f+UxuaFp7A0w0HllDuN0ab6kbpjsp7EMMixgk3JQazBdWJ9jq1m/qneU8nep5WKp5SB38IWfNjaH9tH13C4nXC69lSGg46LK4wqvQQG3fue4VrzXj+j617W+bq+e3cDX4a1MChp7IBye7OgJRiKD0/P9DxRT6/w4wncZZi8MWP76tIh7G3wk2dHKurnQf+Ve+RW4cMHDNqf/4m1wapeX/nbR7LFpRexxtAfRkxWWHscfrweJsmbcSwDe5GWlUQcXhadkg6PAJD+zV4+LpddAOW+CHYbu072lGwnM7DZFPHVTnDHVKergfW5Vh4G9a1VsFB89c1afvlrrqvZXw9nyZj/Ozx7Dki+EDad21xXatOHOEMnHuHrP+gjViY0lRYycsW5UiseZim/pBvS4YlDTwNrNX09g01q7pQonRr42t8mQbsJyLQt8veMUKo5tncUhetOdb27e1RdPnkKKnP1aKMwc3hihO7QPiaMUSlR9/YHba+gE3MTx4TYFgBOSi5soH29D2ydRLausrCzN+Z+gdPSDIR+wxPAsoewkaNT3ngOPL+fmq5fBs7YoD1M0na+NkwnZqvUvElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwU32KfIQDpXNIzkvETpwBeIlW4VvwQBUu9K3zZmtQlfPU51FGHPkCdkTg8ZZbT9Nv89jd+VOCKZuOh6F0OMjSCQ==" + }, + { + "type": "Buffer", + "data": "base64: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" + } + ] + } + ] +} \ No newline at end of file diff --git a/ironfish/src/rpc/routes/wallet/deleteTransaction.test.ts b/ironfish/src/rpc/routes/wallet/deleteTransaction.test.ts new file mode 100644 index 0000000000..2625414dfb --- /dev/null +++ b/ironfish/src/rpc/routes/wallet/deleteTransaction.test.ts @@ -0,0 +1,65 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +import { useAccountFixture, useMinerBlockFixture, useTxFixture } from '../../../testUtilities' +import { createRouteTest } from '../../../testUtilities/routeTest' + +describe('Route wallet/deleteTransaction', () => { + const routeTest = createRouteTest() + + it('should return true when deleting a transaction', async () => { + const accountA = await useAccountFixture(routeTest.node.wallet, 'existingAccount') + + const block2 = await useMinerBlockFixture( + routeTest.chain, + undefined, + accountA, + routeTest.node.wallet, + ) + await expect(routeTest.node.chain).toAddBlock(block2) + await routeTest.node.wallet.scan() + + const transaction = await useTxFixture(routeTest.node.wallet, accountA, accountA) + + const response = await routeTest.client.wallet.deleteTransaction({ + hash: transaction.hash().toString('hex'), + }) + + expect(response.status).toBe(200) + expect(response.content.deleted).toBe(true) + }) + + it('should return false when not deleting a transaction', async () => { + const accountA = await useAccountFixture(routeTest.node.wallet, 'existingAccount') + + const block2 = await useMinerBlockFixture( + routeTest.chain, + undefined, + accountA, + routeTest.node.wallet, + ) + await expect(routeTest.node.chain).toAddBlock(block2) + await routeTest.node.wallet.scan() + + const transaction = await useTxFixture(routeTest.node.wallet, accountA, accountA) + + const block3 = await useMinerBlockFixture( + routeTest.node.chain, + undefined, + accountA, + routeTest.node.wallet, + [transaction], + ) + await routeTest.node.chain.addBlock(block3) + + await routeTest.node.wallet.scan() + + const response = await routeTest.client.wallet.deleteTransaction({ + hash: transaction.hash().toString('hex'), + }) + + expect(response.status).toBe(200) + expect(response.content.deleted).toBe(false) + }) +}) diff --git a/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture b/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture index e6f96e3967..5a812a0cb9 100644 --- a/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture +++ b/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture @@ -7378,5 +7378,451 @@ "sequence": 1 } } + ], + "Wallet deleteTransaction should delete a pending transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "9298fcf2-a079-48b0-b117-dccf085bc139", + "name": "accountA", + "spendingKey": "b5515f7ed1dbc32d6508f6a4cf3ccab20022a8dcd04838ea5e87c64658a0c44a", + "viewKey": "47fd97c80179feb4b3e9a14fa7068a8f2b514b969de1daff06baa81988ecdcd2416a8152ac80bf2e6491ab4657a58c45bb18f8d10eb115382dec65ff4dbeba9c", + "incomingViewKey": "41ae68a798b824830a3399c36660bbc3ec3be5ea2687258138cd6cdfd90efc03", + "outgoingViewKey": "739e390f643f3aeb97df69d238f2f231bb8c65c60c3b0955313a5c0bd2c12156", + "publicAddress": "b6a2a5c5d5bda6ae86a4ed6be4188c093a467ac65fc80a5b5a50454615d274f0", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "562af8d84c8b03dd1e9ee45d4ba2fa489d1671eb7d1b3e9e00a5ab178f85ff02" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "value": { + "encrypted": false, + "version": 4, + "id": "ac0ea86d-73ec-4dc6-a53c-43827c068416", + "name": "accountB", + "spendingKey": "d15e3d1e3025450e94f94d8b8b5a609d7180f7e22e123a069b3379368b909e21", + "viewKey": "91e583329c137391c88f6e863cc4a7c5ad9dde30b1eadb1957274726fbec96c8631263a888c691e754710034cb138759be67df8e17b652dac6745e30a77c0736", + "incomingViewKey": "edecdda6920f01f04100013b9c1df43e468104bafd6b0368ab8962f297a4b703", + "outgoingViewKey": "bcdb7d24322a7a9ce66448ed0faebb54c9f8c5e981be4fa756790c69dfd98615", + "publicAddress": "8f5445f7de1eb951e62e58b5a70b025632650ff89452e3943cd51b8905dd931e", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "9be05afa8583038ae73e5afa138948418c996faa7998378a390f49977c335d04" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:wLrqkbGBzeCb9GqEdr20AT4sLUOmK0zZmF6Qd6hSTBA=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:NZzZvHi2Vu2WlTexqNWeL+uBEEOGQHvK50zi3d25V2c=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724100965066, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAARoNwhuFWjC0lcbQMWkCUusqkHx/gRPtdSmJM9UImwZ6E4AX7nub7eoeT8ekyTi1EtRNt6XwBFIlc3sGvE2SzGPqTUYTSdcwMfI2Il4+RKX6pVhotabGoXIb0QskMUJUkVoj+rl/qrmI1d6BymkWP0zEMxZXaTz1hkQvRkDpOfJ0CE7XfZd4k6yth7SgLiXkfKwcjf9l3kJdPRSlvIBbWekok9KIxXLlufcsB8N+K+sO3DDzRytMUM2aNdpr5SHU3UtZYgXKPzZs0U+aQ9kj3TTkDAc4v9t33Fso8RQ075Kvp07DDQ6oQoIAjee+Mv0lKl8CLIFVkMxrGWJFRIU4YUg7lGFY2rJi8X3isYxNCAZvl39JpUTxicK+ufR3kQzpS/U3+hOVdx4aXCdYcvvMBZoEkSrTV073D0D2EPDi4wimmJLSRDHl1dW8b1zzrvBgf9Dmgo8RAtqgoMkvDqqqg6cjeX0I3eezTNJTawQwzV08SpLZqZ0GwHX+IybuiVz/wdZePtgIzAs3EY8TsagqgObkwtuu3u51dxzLBuqmP58XatJBY158VRuDikwBQYTYY1dr3cWPvkD+i5QTfhb0BGjrMxmRyXPmVV0NxEnoyxPM+PE7gnqTtkElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwWPPGWHq+gbRrHTKY6UJngUViLlvnkWKQtYfhFYX1Ec9SRI5Ym2ny7+qeZKtOTBwXCy2DNq9nJkVijGwU88i2Ag==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + } + ], + "Wallet deleteTransaction should delete an expired transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "38aab35e-5980-4776-9ecb-a3cb7eb09538", + "name": "accountA", + "spendingKey": "8232647e841239cac7cbc2b7585a76ea0701b7fe1e31bbd3f8acf1782a05cc26", + "viewKey": "2d14962cbf935de87bf2569fc731efa5506e5266c5de16a768dfc03f85e8917363ac7bee2fff2405f7100141e62e4fde21f3c97c6ab2213d9b9cb9a9ed9900da", + "incomingViewKey": "d479a3c9640bbede3e2ed2024681e712ab24fee45976cc6f6c3b6916e0383c05", + "outgoingViewKey": "9a6c1e997bc259b196afe13eb4344d543a9d741b149368d1c24b7c1da925dae9", + "publicAddress": "2eb9558b3e016e0f4de1bb9653a5a58929e22b675720700b2e3cf70fea78ee44", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "7fdaab7910b100d0f8238ac96850a1cdeb162aeca0e022b67bfc33df0ed23102" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "value": { + "encrypted": false, + "version": 4, + "id": "2dbd6571-c831-4b4c-b085-f7bffa6b197c", + "name": "accountB", + "spendingKey": "81a3bf6a6b81fe33f04b1e5875be04177e3f1cbc70d1440fd8e58e37d75525df", + "viewKey": "cc7304b6f2698135242d37f74a8c3906b3002abcd80d5b575993a7caa378c042a7fac91a9618261d5ff52580972d4ff0eb7453f86812b96828cbda01b99c59cb", + "incomingViewKey": "f2b39fbbf6f5c350b1f28cb666cb0d5d3bcddef0f94d1bfb1baaa7a9dc853c04", + "outgoingViewKey": "05c71ecc608c9e0599fbdcf425763323e6743ec8ddb7c12a7fde5e74e018de0c", + "publicAddress": "e0c91fd96a52af2ac2a3a7146d919959d06d2e361e6c401420a4935355f61035", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "443a31903e4f6522bc358e40bb7e239cbc2073c5e9e45d28128cab1d2b87cc08" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:pUAoKu/QQdf1LbBGN7RjVDlSC3o+qY8GFSrg+4dxS20=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:YWnU20srVrXmXKIUPTHUXjoKTSwTN4geHpBDBMlf6kg=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724100967063, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAaH7GTXP3mm8KOKRXAKf3IoZh2/JGl9H/+DjMnCNi4SyYlHGR+RtX0ZUVVHRZZZ7oDWi6HjhUa2GhcT1ZmT2YySE9oneY1KdZCooiGzDKPiiYpzjoe8rnTp88wnaeczmRmQzGSlj4jKMBLALyOpwa1mcupSEnI2N9qsL692px8NUPUoY6hbSKc81bsOPlX6puIgKj0P+9TM95M4J+hW74pw4ZAkUDnNxv/IySQHOL5VKrtqbMADXBbWikU1nYLXNfSzywMixQa9borqmJY2ZVB72zabQvZSA/3zBOWDjJWjt+pcWNeW5QPy0ySog94cYVSCkc9T2po8z6yNmC6JEhi77nBWqRYGH21uAGtPe/EG1gJo8VwbBPX1Qortc2upYZAxZk+w++zMkylmtyZp8jbLL7Y6PXkbyF2ePXrPs1KHBhdY/EDPNroVWv8I0uEa0JGplKS27imfTYgDhZpm5KdWeTnb0GQexL/0hoDJXYKNqBegx2ZO8XBhqqWzoI9eznP4FCufmdbNiVEMqsjRPsfmlSGxssxHo/QpHx+UZJNCaqOL6JIUFCtQ9t2EhTC2Z5UxWA7y8OlAQmAKbzw5cJbMzCXykh9H2RFSOXnTK6WPighm8VkBc42klyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwwRxsSMwG+rNTD2W+HfsEk3FftCZihXNl1gfNEYoWHnHopf/nPt7ExrjnPwOYJE63BqzmcmV5wQG72RH8GpgqDQ==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + }, + { + "header": { + "sequence": 3, + "previousBlockHash": "A2DD0C56F72918F96F2F89EDF9EBFA608966F8FE499D14D10759AAA5971B09F6", + "noteCommitment": { + "type": "Buffer", + "data": "base64:RXAUT0iYB+5W6/TuTTjwm78Zop7ulcthwJHvSknl6yc=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:2Njk1LecucLbwq6DBSF9sW6xEHlczpm2cJ8ioL+6WGc=" + }, + "target": "9255858786337818395603165512831024101510453493377417362192396248796027", + "randomness": "0", + "timestamp": 1724100968743, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 5, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAACXZ6cM4aaaJBUgEZhPs7nYzH1K/Vvph5dlayMmaAcAC2xVDm4p6PukI58uoUWymoqVheHN+AitilvNM/0MhwqtKJ4TAyekORYC+Iwe7hRf+YW1Y1B0YxWXfy43ROsPWFrBt3gIV74a6KY1e6G8xrrJuUDY9pCNuOdTJtyI2TL2AWiHplehTJpRl9kiFLOEzx6Rfs9svEZxnXJlpWMZX2Z9r9k7l5U7BV+IfPHyhBUUaDSxmdeKRQHpe1yngemRYHJxemB8tKWvEtAIMiC3n5MiPsU/WjrQJPtOVt3zS9Zv707bWyUqXn005KYwonznrBLWl+I96kJeglbmPsdJcpMh5xRXBmPVCmlCVvWaZ/EgkyLHN51S8SlaWbXqJlYlo+eREQw/OFT8v8o+aPqPYI5KJ8uvQeTnWbuOGCU41G/LS+/jM5WCPRm2yM4vstvnLf2eeJ7x8LWal2Oqls/27YWpnSHWhm42cB23DyY0sDh/UhObMbe+i1txreo5MetRiSkJByLUzpSSyulqhVBy/KUsNn/zdKmGqg1TaLaczxs4GRz7m3H23zs/IqhS50qcHD5zrjzbe9EBNdK4xndW/YxJIc7zwAd6+onAVrtDjl9vMyeg0E8/3UBklyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDW3MD1Ai3RimwLuhmH17g6DCqnRC12dItRMRqdamYR2xCn/DnOgCzUZt5jkM4p+eHetx4aWwzWe1HyhnwQI/Dg==" + } + ] + } + ], + "Wallet deleteTransaction should not delete an unconfirmed transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "dee72893-bed1-4eaa-a87a-f0fc9b67e2d3", + "name": "accountA", + "spendingKey": "5ef7a6782a63da0a30eaf2603e0bc7f944b686f5a9b18c33108b3574730fc779", + "viewKey": "4562776b3e18207e5d7646ee8aac9ddec3241b74b773100a6b107ccde01cdc530ccf09843e61615d5406b8a6ea183e785894bf6809e481280c0d94d8951316d1", + "incomingViewKey": "6ba3a58f6634efca56b248ef63b40f663385182c82f136c69200e4a87446f600", + "outgoingViewKey": "693fd07b99cadba67dac5e6bdfc700f1d644fc57b330db75a35e5c91b96e3332", + "publicAddress": "af9a8901aae7ac3f2f877aae3887cc6709f9a97ae4289dd4408cea5751e7401c", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "ed51efe8f5c0cb08c7dbc37d16a132085a00923b002dc131e3f2cc41b8614004" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "value": { + "encrypted": false, + "version": 4, + "id": "9bb06817-6052-4fb7-8662-2df9151b0de9", + "name": "accountB", + "spendingKey": "b4dd73b6072a9158999330f2d761f557a3a3f87f2134fe7e709edbced2ea3702", + "viewKey": "8fe421ef6bbbe0d9f6790f402e27b176fc297170fd23c948379705678d69222819fa62f8094e33392f95c5c22f43c0028029c65b391c33eec2c17f236b93edc8", + "incomingViewKey": "989ea06e8ca92e887e83f8e79691a3e1781c9b7f663bdbb4bd0aa604a0e5a707", + "outgoingViewKey": "27db7e9a2351732239bea52f5c2a6d23d369272731997066955cbbdc84c746a4", + "publicAddress": "de6b4bd98e7300bdf44cfe446dce4ff03e9c3134d798448b1d571f39d807e764", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "d1d9b98fc5970371df0c56a317eda876de0acebe22916c3a46424ccc923af50c" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:v0D3ij6hu6PRuSP8Nc1U99SX+UCrqKY+vJsC1b0+xRw=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:0xvYggH6C84XDvVTOxCrgEiUixqXvn7OlZBKLJ3OYLo=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724100969461, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAeB7oPIjsBursuXrk9K+0/ledNRQfEuyRytKBJxY0wwS58gSufhs/HRecqLeFsPtt6Iyzo/jGY0XnsVhylTmP/XU6+ZQg2kXkrvnQTNkMrQep7YPBpyA+3NgrOD6K49Dw5+swLe3dwe3JZyh3lEpxJv3R3dazdgrm/VEhSVHOqHYIL7jo9C0O2A8xErBy+nahquSRtGxd/8zNO4weT3I9PlFGRr6Mqc6R3hkEbE54mVKQB/dy5tRidCEIRBAU2csRG7mP3Dg0pQ02s9TbHyUn5ATyoqoj2iHp858RlqdfmJy7kWXKLopjYoFTK5tEQPWxqALDJqKfxQrWWBbvhpnIFjFWAL8INc8alJuNFUmw9Hm51SaRv/iARueEG0g3aGEqgnZvTg8u/VTHebZWYuZOUCU5yHfznQub4NFMn9LsIFjxedM7gM+ZDAjNA4ubNmc+cGXkyPE6zyPRhAUuF5VKzkWWfZwgm4dKz7aAPTr31YZC3GFDMv6U6BynafyW4vbPzQYqLHIVvznn4KZtOPJwH93l+sSZRA2Ae7i9Is/UJKC7ZiuYm+Ubt22OsdVjQtrwKcDXr/qCGzgDanl5vNvolQckoLGvKm2kg/DaVuKQbiVys0pnsnkBJElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDF+CQlFndjM0Zi6xhYmDfFY2kYG88koo9o7QxX9GCCjdftiSZ2PTj4RLXTRnp+hL2v+M3wekw0z/W14qiGqGDA==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + }, + { + "header": { + "sequence": 3, + "previousBlockHash": "F2300EC6976E42141BE76C2CE4431B2F9E52416F364751531DAA4D518ACDC263", + "noteCommitment": { + "type": "Buffer", + "data": "base64:h22WzyQM28FdJwz/5+pdskBv4M5M9VSQ5Esnd9PptWc=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:ADXSeNDKREYcMrm2aojZKeUZ5y6xpkyApOnN2+Rtcvo=" + }, + "target": "9255858786337818395603165512831024101510453493377417362192396248796027", + "randomness": "0", + "timestamp": 1724100971333, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 7, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAWuXyFyURf7TI49aQu7GhkswV4nuhYoi2mBfOK7MLo9qDZAee8uASIWVyjq215+2bSEqHCf/Req5va/8Li4SDxGJMy8sspgu9XZesD/jGPBKRXKJkGBqcvfilx/l07eQ1rmQgK5OPPuND7W4uui5JckguPNv+Ms8iwPZA+kHa6OwNo6isziINTn5Ly8bTZeu085pPi5mg1SPybYusZdaSgO4epZT5xyGYuo0kS7J9somEBXmeUSzrOXwlEol3BOftlBjlbCQoylsbfbvD5iWT8+uFVCsestaaxrwYjnz8vGCDwH87UhbrEKtHDAYMaw2ZibLq8bOAbVUcKY6G6NvvNYDD1xSMZj7jyw84cVThcEqm6hh2O/Z5A+ktqmfX6uVrVcQZ8Yq8mfH7Egd9Au2Moi9isUzU2CksBOy/xStizNQ8xjKYAIPEeXIqiLEZxIlnJD1JokaiMMj58ySNhabxF84cy/v0hdgeqHBNv0APj6KHxJqqDHGIkeuOpTbn1CAs1mqwYSIEDvgvYnGvObcfEl2hZEPiTURrfAEQSs1ITIknQFgNz4ZFgXJxu5Ym5iYDB4nIr6f0Q2DJY8uuD/LdU/WruV/x6HXGk9rWjmnSA1vvpKSv/g2eAUlyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJLlsyvR4YHwp0t+d//ENNvGl3kw6nwLxrXNbWEWIiW40iKL7h9c3CjEfv1GpO1rJigB8nkbEWzhy4rGYXpXlCw==" + }, + { + "type": "Buffer", + "data": "base64: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" + } + ] + } + ], + "Wallet deleteTransaction should not delete a confirmed transaction": [ + { + "value": { + "encrypted": false, + "version": 4, + "id": "acca6d83-f008-41b1-8d40-dc9a97663b5c", + "name": "accountA", + "spendingKey": "c756d38921a46c1d55ca6a0448725886a3993806ce60053dbac252dd33e5d50c", + "viewKey": "12d84f9b163ad48517b4a05ed652c745f84fa65a09e79458dbf9fda4e660196e6576e7ec77103f48ead592a0f34596252cfc9ec476ff3042b4d9eb25f78151ae", + "incomingViewKey": "91d48dc8142707ec98c14c3e48d777ba6734c4e5c1d53b42e4a82fe05f73fa07", + "outgoingViewKey": "e1e5c7ada22d37327207f40eb1fa52ce1db2dcd5e3b80351e846c42dffdf9c9a", + "publicAddress": "84ebcb862a655cdfabbb0bbb02d658dbbb3dd49df5841dcf68ea5304f5e8aa51", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "d431c4e1ffd3c3453cbb17c48358c4e3b98932361f7c7c680736ebc542172c01" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "value": { + "encrypted": false, + "version": 4, + "id": "b8b3740b-145e-4053-adac-490ea46c60ae", + "name": "accountB", + "spendingKey": "d32165bf91624c164c6f60ec3a4f1ca8e1c9a1a01b941bd7c1fe997a40a4c8b3", + "viewKey": "889200a0b629ece12c6b39b96b035c48cb3b5dbf628026ae8ebcbee0858bbd3fd308734614cd9d05640ed66fac51982b24768791e9272189c739dbfee67e64db", + "incomingViewKey": "0601dfb90e1041464efcb33b47995e33c3e554de2e1dacac7bd6a99c6ffc0406", + "outgoingViewKey": "e9556a3bd75f8543ba605bee1438e90212470811e213bca650aa2e543f5b582e", + "publicAddress": "a6b3cee0444f0d898bfc2f992a526c340a2191e981269f0924ad682b7efb6156", + "createdAt": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + }, + "scanningEnabled": true, + "proofAuthorizingKey": "58707418a3de3e872e964f03487105907508bcc627aef4b576c8238d6207e50d" + }, + "head": { + "hash": { + "type": "Buffer", + "data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY=" + }, + "sequence": 1 + } + }, + { + "header": { + "sequence": 2, + "previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86", + "noteCommitment": { + "type": "Buffer", + "data": "base64:Bd5SAql/hUmGTdJ2N61gbJnqDhl/BfhRNC+oTUD5MkI=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:xQfm61+YatBK+iBtnu/Q2AK6zbJxX1E6h/ayzF3Oz6E=" + }, + "target": "9282972777491357380673661573939192202192629606981189395159182914949423", + "randomness": "0", + "timestamp": 1724100971960, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 4, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAzun/Nqui8jL55f3iArrAu4zaR3jY4g9yJ385X/5n7S2QInwUvlX+FqXNICJxzoJJwHu8+RVkq7HPplT2RQ36dtsQT9izxs7Hs7rwcOpHTe+nGJt+qrHTk87eiizTtct681FBD5CP1XlfvTbqnJ8GfwNbBcW4+SrGYyCjZeXgVSkU5qU0f7jj6nFjJUfGHiG9iqu2rqmi377QjJzegXsu25Z0t1cSxC0nzQCC74mmMDuSS9InrVaIu1pI7KsnpnWJZLBNTvZCuQWAf+hSOjI0bZau0Bpgaqo1zl1R33KxACj/mXgHnS3W59cTrxXGUgeEK0tVLmUh19J3nc50qHWjVHeRL/ZYMgz0SUR0Jactqc5sdR1kIW87BpjTbpblxFNWnehKszn1/MDgtiF1WkgvedwWOd23u0/6L7cmD6Nj9RC55Rjxk/DQQypSqNkemJJihLSKN3oaIPgbM8ztbAF2I6qo6qAHGisjb7mwtEz7NR92IYec7yUMnEVdvy7rUznheqAO8vsn0cEoQ5d9f34tAUG2+w6KyRpP+qtcYBWH1XA41LY5omLe3jaqiHRl073ZFpQ8E8aR0rf1TRJV5ziuTcEoGAaN1jHEmYyni+5+N+GVsPQp+KMJfklyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwxzHYas8i9jKqt5xn6RWsp+vbNAjHqsECxw5gfgQKlEwtS+wMdFKy+9cFj2uDCqM44HjrxCPWi4rOwn1gQ3a7Cg==" + } + ] + }, + { + "type": "Buffer", + "data": "base64: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" + }, + { + "header": { + "sequence": 3, + "previousBlockHash": "781548CE5FD03C6D168EF77DC67124DE7D56BAC14307ADF4CBA0C4E9699DE4DA", + "noteCommitment": { + "type": "Buffer", + "data": "base64:1fh9L0r9ikvGSJc7aZfQUvp5hDfFNUQtStrDTGKMsQQ=" + }, + "transactionCommitment": { + "type": "Buffer", + "data": "base64:xjzofuNy07Pasq14U5aEyu444juTuEyOJvxvxf6kIds=" + }, + "target": "9255858786337818395603165512831024101510453493377417362192396248796027", + "randomness": "0", + "timestamp": 1724100973876, + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", + "noteSize": 7, + "work": "0" + }, + "transactions": [ + { + "type": "Buffer", + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAANTu+S0UWAVMJKt07vEuPyxIIgbTJpojSAVDDPRuXPbCyjL9XfR76aM9P74HMHJ1pA9s+6KZw7x1E4PKM0FRvqS/ccJMqapDvWRquaFvnKbSSi9PW+zJ70pbrTSvOOwx9BLvkkgJTkBgy6qymW9eVhmlVKStMZwpFqjdP7QyeDnUWMuoFLJFEPceBYQItsgqs4fL0YI1ukGjJDO003HQNntOjrg22IdddtgCp5yx+sEGDr+BkGKf0GPWogDsqehF9rkefFW0y6NQU8c4fKECAA/uGz4aEfr5oSrbx5GgFjgRmdL6hIjySMVp+v/O4pM7S9UgbZHlRTHZAEgVKqUWakYGdH6tsD1USDTiGSjb9I2j/AZxXLDCeRBZMHvY+iT8EI1lvw6cKnwnZBxN7CBi67Ob42Y42BcLKoC4Gst57TiKSp57Erj2T+cwA8jJ5tAI/u946jw6uVa1dDIjhNt6ocDoD/qkmwqoNghm2Hu7e4ZstMqc66M2e13EN4HuUeXONV7N3g1z94nFFWqOIuIVPxdP8bEliOlRlOU6HJYUrV55S2IYLRopjAs1VMtx/zAKhtwJvrQF304NYQKxPHmwwA92qw6lxpbIxyvyMFNEgHL1B1iSjd8XpiUlyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwcc3PL5yTsUhdrmHot0sIefDAHWFs5fjUKhj7AfcC18o0faPZGb6bUBvRQNfNzD5alUwXArubL0oNzO5KSHzBCw==" + }, + { + "type": "Buffer", + "data": "base64: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" + } + ] + } ] } \ No newline at end of file diff --git a/ironfish/src/wallet/wallet.test.ts b/ironfish/src/wallet/wallet.test.ts index 3ec5a3949e..00a3b14f8c 100644 --- a/ironfish/src/wallet/wallet.test.ts +++ b/ironfish/src/wallet/wallet.test.ts @@ -784,6 +784,166 @@ describe('Wallet', () => { }) }) + describe('deleteTransaction', () => { + it('should delete a pending transaction', async () => { + const { node, wallet } = nodeTest + + const accountA = await useAccountFixture(node.wallet, 'accountA') + const accountB = await useAccountFixture(node.wallet, 'accountB') + + const block = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet) + await node.chain.addBlock(block) + + await node.wallet.scan() + + const transaction = await useTxFixture(node.wallet, accountA, accountB) + + // ensure account A has the transaction as pending + const txValueA = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueA) + const statusA = await wallet.getTransactionStatus(accountA, txValueA) + expect(statusA).toEqual(TransactionStatus.PENDING) + + // ensure account B has the transaction as pending + const txValueB = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueB) + const statusB = await wallet.getTransactionStatus(accountA, txValueB) + expect(statusB).toEqual(TransactionStatus.PENDING) + + const deleted = await wallet.deleteTransaction(transaction.hash()) + expect(deleted).toEqual(true) + + expect(await accountA.getTransaction(transaction.hash())).toBeUndefined() + expect(await accountB.getTransaction(transaction.hash())).toBeUndefined() + }) + + it('should delete an expired transaction', async () => { + const { node } = nodeTest + + const accountA = await useAccountFixture(node.wallet, 'accountA') + const accountB = await useAccountFixture(node.wallet, 'accountB') + + const block2 = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet) + await node.chain.addBlock(block2) + + await node.wallet.scan() + + const transaction = await useTxFixture( + node.wallet, + accountA, + accountB, + undefined, + undefined, + 3, + ) + + const block3 = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet) + await node.chain.addBlock(block3) + + await node.wallet.scan() + + await node.wallet.expireTransactions(block3.header.sequence) + + // ensure account A has the transaction as expired + const txValueA = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueA) + const statusA = await node.wallet.getTransactionStatus(accountA, txValueA) + expect(statusA).toEqual(TransactionStatus.EXPIRED) + + // ensure account B has the transaction as expired + const txValueB = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueB) + const statusB = await node.wallet.getTransactionStatus(accountA, txValueB) + expect(statusB).toEqual(TransactionStatus.EXPIRED) + + const deleted = await node.wallet.deleteTransaction(transaction.hash()) + expect(deleted).toEqual(true) + + expect(await accountA.getTransaction(transaction.hash())).toBeUndefined() + expect(await accountB.getTransaction(transaction.hash())).toBeUndefined() + }) + + it('should not delete an unconfirmed transaction', async () => { + const { node, wallet } = nodeTest + + const accountA = await useAccountFixture(node.wallet, 'accountA') + const accountB = await useAccountFixture(node.wallet, 'accountB') + + const block = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet) + await node.chain.addBlock(block) + + await node.wallet.scan() + + const transaction = await useTxFixture(node.wallet, accountA, accountB) + + const block3 = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet, [ + transaction, + ]) + await node.chain.addBlock(block3) + + await node.wallet.scan() + + node.config.set('confirmations', 1) + + // ensure account A has the transaction as pending + const txValueA = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueA) + const statusA = await wallet.getTransactionStatus(accountA, txValueA) + expect(statusA).toEqual(TransactionStatus.UNCONFIRMED) + + // ensure account B has the transaction as pending + const txValueB = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueB) + const statusB = await wallet.getTransactionStatus(accountA, txValueB) + expect(statusB).toEqual(TransactionStatus.UNCONFIRMED) + + const deleted = await wallet.deleteTransaction(transaction.hash()) + expect(deleted).toEqual(false) + + expect(await accountA.getTransaction(transaction.hash())).toBeDefined() + expect(await accountB.getTransaction(transaction.hash())).toBeDefined() + }) + + it('should not delete a confirmed transaction', async () => { + const { node, wallet } = nodeTest + + const accountA = await useAccountFixture(node.wallet, 'accountA') + const accountB = await useAccountFixture(node.wallet, 'accountB') + + const block = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet) + await node.chain.addBlock(block) + + await node.wallet.scan() + + const transaction = await useTxFixture(node.wallet, accountA, accountB) + + const block3 = await useMinerBlockFixture(node.chain, undefined, accountA, node.wallet, [ + transaction, + ]) + await node.chain.addBlock(block3) + + await node.wallet.scan() + + // ensure account A has the transaction as pending + const txValueA = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueA) + const statusA = await wallet.getTransactionStatus(accountA, txValueA) + expect(statusA).toEqual(TransactionStatus.CONFIRMED) + + // ensure account B has the transaction as pending + const txValueB = await accountA.getTransaction(transaction.hash()) + Assert.isNotUndefined(txValueB) + const statusB = await wallet.getTransactionStatus(accountA, txValueB) + expect(statusB).toEqual(TransactionStatus.CONFIRMED) + + const deleted = await wallet.deleteTransaction(transaction.hash()) + expect(deleted).toEqual(false) + + expect(await accountA.getTransaction(transaction.hash())).toBeDefined() + expect(await accountB.getTransaction(transaction.hash())).toBeDefined() + }) + }) + describe('createAccount', () => { it('should set createdAt to the chain head', async () => { const node = nodeTest.node diff --git a/ironfish/src/wallet/wallet.ts b/ironfish/src/wallet/wallet.ts index 52cdedd73f..88fba171a4 100644 --- a/ironfish/src/wallet/wallet.ts +++ b/ironfish/src/wallet/wallet.ts @@ -1221,7 +1221,6 @@ export class Wallet { transactionStatus === TransactionStatus.CONFIRMED || transactionStatus === TransactionStatus.UNCONFIRMED ) { - // TODO: How do we handle errors at this point. Should we? return false }