Skip to content

Commit

Permalink
Add the ability to delete a transaction to the wallet and RPC (#5286)
Browse files Browse the repository at this point in the history
* Add the ability to delete a transaction to the wallet and RPC

* add unit tests for wallet and rpc
  • Loading branch information
mat-if authored Aug 20, 2024
1 parent e4548fa commit 698e819
Show file tree
Hide file tree
Showing 9 changed files with 930 additions and 39 deletions.
46 changes: 7 additions & 39 deletions ironfish-cli/src/commands/wallet/transactions/delete.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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`,
)
}
}
}
13 changes: 13 additions & 0 deletions ironfish/src/rpc/clients/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -586,6 +590,15 @@ export abstract class RpcClient {
).waitForEnd()
},

deleteTransaction: (
params: DeleteTransactionRequest,
): Promise<RpcResponseEnded<DeleteTransactionResponse>> => {
return this.request<DeleteTransactionResponse>(
`${ApiNamespace.wallet}/deleteTransaction`,
params,
).waitForEnd()
},

estimateFeeRates: (
params?: EstimateFeeRatesRequest,
): Promise<RpcResponseEnded<EstimateFeeRatesResponse>> => {
Expand Down
Original file line number Diff line number Diff line change
@@ -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:AQEAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUZNPZM48VIhvU2oL9GJuEAi5e90zusgOVVjRj8k6OKtX07xcjgBHM2MYhdnd/zDcREVB7ydgaVF67IaUkBvNPLCqcuEaEFNTlD++J0rZ0m31+sW905Z4z1LqyYD/3G3g/kOP1ho8sllLa7U3ISsgRXs+Aax9DDogZMK+AB8kFQHWaE12vU0ybm4VBK0s4xe6HeakPMe+4+xBx59+6A8Uj/dRgaE8u20oDLmGviARqKHdyKy278hBHfXJM9/7R2VBBYuZzb5MEMl+CrL2gH3jKYx+u+28MkRYMUiRA3/rqV1LxWWix5ozhbX7L2aWMjxRbLhTMOcoaL+u62sbVCPJL/wtPpTcbhPdBiYAijmGsyJb8vlNgDxrPsFaZa+gshnBAAAALh5zUmRv90W2jPooRCJExB2b+vvps4eVXLlQY8U6haWLl5GdJ7m9MNcEgucACxzMPdgYTZKXn2p86spVkMGKLG6C7ZIGLp6XQ/cJmP+MUsjboo2a1pWBTQ7mru/9d26Bq2eZe6S7EAThFkhVvyvd3lMeVTb/zrZqEJuWQz3hl+pGub+8ocfjDud76a+VnCwrq58qpRvSuJWDek2Dc0Cr/yqWtxVnFIiZWPLUMMwM5w6so+tWxrCVAUBxVe05Nh4rAAaS4s31D0TRpyFxKApdWO/jLZ0MLcZHp99LxhYJRP7ZKZVcu7DVJxDhWyCu8Qiiqdi/LpKEu0x/Arhhkg0ihRAHpTl83mKf3hNETP7Rv8SotHfCHXpVbnQ+ZXCXNu/lz9E5vsqnfnEkcncWK4JzE2Nhk4c9xdkJ/Bq1OjMQG3tt4kDC1I5bE0eulWDt+fifXEOh1XRa/UEJgm1g6whNhDpYZCn+INg/nBlfbenn1DwL1mqONURQsdfjDMDEaUET9BKV5pPs0Jug6gkKxq62lb1CW5vVo1aMRvWuyTK3Yi+50+73gDGUmx1YDn1Wm4bPsJ7/yALIEcTkOCXiz4ba2/vE4FlGcG7KE/TniyMQRxmw443N4iWFKDP9oB+VGd1zCUTLE9t4MChHyUEoayozaCxxuq0wEZiH27HQ0g79b2rGQNG2pUNOKGjTFOUkQl3WG5JwOlzZ7diy1ngrgtZZh112Xf9ay/9SPoNM75bLiZC8WWgg4W60E3Y6+LfQtwdsT8wkiSz7Lh1cPyxSm6WJP2qtHd6aplvC6U0Tzw7GZYfGyJhxLSMZjGT/drGsG6KjqnZbDn6zZxkR1+CXxvxweVOSZ0FoB5rpi3kXm+PZ0L7B0pHRupZcp+qAwgmFsJGlygnV8qA3HlXv3V+ZdInkZMteNpZTAvqkpYA0uHhvL8I9WdIe8W4GIIDjZa+MRnt7K/Sle0Mvc4FNWy0m2DaQZsfRfsc03RdyzwCJErsVN9S/ACl9cuOCCmrmAEMcFk1sjk4o+5txVlYw0uCCSW3tdRaByD8D2UCl4GNESSsXPg9aOd3kUaCZFu3ozXj0qhSdvTG2psz5igJGd+gvDbwAWb4fgHgc044MK11HNGlbyMOjGXMu0UYOewF/pvMIuU0FDqiFKII6lkqHnKzGb6rB0Vi/DyLmVKtIR5G1EMfQYQvzuUS3omgNbXbUgNPYiPDdtjsyNCnoT3g438YzYwLzMW87PfxbQr91zayw+JqKbwEPUwPYHxhfmrpovuoDOpN1VS1YaWDsQSMsP3E0N7vY7DSap6Otn/Yvo0B9FvOcae0LSqY5hv/fM+tUbdL8ExD3WtSWv+/MHkTQKvl1NZvB+OmNvyaRVujancJzIEfRVrmWI7eauA/aJdUGcV0zsaXGHHLLWugbXFbHic1pha+kcGenC1CRzP0i8rv1NZyuyZloekvKcz1k/hnHxBRgEZ99KMZc2itHEyR35+2dZw/cTrEUUk5mERbDMgaIDJjcEbPA146fqVX4aTm4y1ro7Fe2sJxGqdPAwqmgLjDhH0moduFz4/2QnqNXcA6Uw4rYxC/RaEuUwZb48REsbm05ZM9DQ=="
}
]
}
]
}
65 changes: 65 additions & 0 deletions ironfish/src/rpc/routes/wallet/deleteTransaction.test.ts
Original file line number Diff line number Diff line change
@@ -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)
})
})
Loading

0 comments on commit 698e819

Please sign in to comment.