Skip to content

Commit 698e819

Browse files
authored
Add the ability to delete a transaction to the wallet and RPC (#5286)
* Add the ability to delete a transaction to the wallet and RPC * add unit tests for wallet and rpc
1 parent e4548fa commit 698e819

File tree

9 files changed

+930
-39
lines changed

9 files changed

+930
-39
lines changed
Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
/* This Source Code Form is subject to the terms of the Mozilla Public
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4-
import { NodeUtils, TransactionStatus } from '@ironfish/sdk'
5-
import { Args, ux } from '@oclif/core'
4+
import { Args } from '@oclif/core'
65
import { IronfishCommand } from '../../../command'
76

87
export default class TransactionsDelete extends IronfishCommand {
@@ -19,47 +18,16 @@ export default class TransactionsDelete extends IronfishCommand {
1918
const { args } = await this.parse(TransactionsDelete)
2019
const { transaction } = args
2120

22-
ux.action.start('Opening node')
23-
const node = await this.sdk.node()
24-
await NodeUtils.waitForOpen(node)
25-
ux.action.stop('Done.')
21+
const client = await this.connectRpc()
2622

27-
const accounts = node.wallet.accounts
28-
const transactionHash = Buffer.from(transaction, 'hex')
29-
let deleted = false
23+
const response = await client.wallet.deleteTransaction({ hash: transaction })
3024

31-
for (const account of accounts) {
32-
const transactionValue = await account.getTransaction(transactionHash)
33-
34-
if (transactionValue == null) {
35-
continue
36-
}
37-
38-
const transactionStatus = await node.wallet.getTransactionStatus(
39-
account,
40-
transactionValue,
41-
)
42-
43-
if (
44-
transactionStatus === TransactionStatus.CONFIRMED ||
45-
transactionStatus === TransactionStatus.UNCONFIRMED
46-
) {
47-
this.error(`Transaction ${transaction} is already on a block, so it cannot be deleted`)
48-
}
49-
50-
if (
51-
transactionStatus === TransactionStatus.EXPIRED ||
52-
transactionStatus === TransactionStatus.PENDING
53-
) {
54-
await account.deleteTransaction(transactionValue.transaction)
55-
deleted = true
56-
}
57-
}
58-
59-
if (deleted) {
25+
if (response.content.deleted) {
6026
this.log(`Transaction ${transaction} deleted from wallet`)
6127
} else {
62-
this.log(`No transaction with hash ${transaction} found in wallet`)
28+
this.error(
29+
`Transaction ${transaction} was not deleted. Either it is on a block already or does not exist`,
30+
)
6331
}
6432
}
6533
}

ironfish/src/rpc/clients/client.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ import type {
174174
UseAccountResponse,
175175
} from '../routes'
176176
import { ApiNamespace } from '../routes/namespaces'
177+
import {
178+
DeleteTransactionRequest,
179+
DeleteTransactionResponse,
180+
} from '../routes/wallet/deleteTransaction'
177181

178182
export abstract class RpcClient {
179183
abstract close(): void
@@ -586,6 +590,15 @@ export abstract class RpcClient {
586590
).waitForEnd()
587591
},
588592

593+
deleteTransaction: (
594+
params: DeleteTransactionRequest,
595+
): Promise<RpcResponseEnded<DeleteTransactionResponse>> => {
596+
return this.request<DeleteTransactionResponse>(
597+
`${ApiNamespace.wallet}/deleteTransaction`,
598+
params,
599+
).waitForEnd()
600+
},
601+
589602
estimateFeeRates: (
590603
params?: EstimateFeeRatesRequest,
591604
): Promise<RpcResponseEnded<EstimateFeeRatesResponse>> => {
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
{
2+
"Route wallet/deleteTransaction should return true when deleting a transaction": [
3+
{
4+
"value": {
5+
"encrypted": false,
6+
"version": 4,
7+
"id": "4c199f86-625f-4d70-9ef1-5416197ba2a0",
8+
"name": "existingAccount",
9+
"spendingKey": "42fecb76b31eb44609b56dbfe517f82507f918227213fa79232ea79eef2db753",
10+
"viewKey": "5641e4f8e724d3c6b5bf9da8d157b0f700ab9c75ca549079f9405124b12108dead5fd34c339019d3981ed36ab2fd303cd4d63d58222fb2982d9e529aba157412",
11+
"incomingViewKey": "ef622236566f1b70dfcf2047bc7662080c599bd10b1a37955eb9acdab30f3507",
12+
"outgoingViewKey": "a52cdc2178c2d247296fd30ced237cfafcc982e9f287bca21157f1d94b3832ba",
13+
"publicAddress": "39f13996a551619bf22d0055ac3bb815ca8b1c1d9d36d43a1a72526286664027",
14+
"createdAt": {
15+
"hash": {
16+
"type": "Buffer",
17+
"data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY="
18+
},
19+
"sequence": 1
20+
},
21+
"scanningEnabled": true,
22+
"proofAuthorizingKey": "6ef02a141b510095c7c13d79ce631e7801b19ba145dadeca57957462cc40c708"
23+
},
24+
"head": {
25+
"hash": {
26+
"type": "Buffer",
27+
"data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY="
28+
},
29+
"sequence": 1
30+
}
31+
},
32+
{
33+
"header": {
34+
"sequence": 2,
35+
"previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86",
36+
"noteCommitment": {
37+
"type": "Buffer",
38+
"data": "base64:tSJWkx+7V9qY04v4Au4Um2pKF1qKK6VCC4Gq3V9yCjQ="
39+
},
40+
"transactionCommitment": {
41+
"type": "Buffer",
42+
"data": "base64:ovVuTirVK5+zRp8E31C8Te8+ybxM4uXM1+U6OKn41sc="
43+
},
44+
"target": "9282972777491357380673661573939192202192629606981189395159182914949423",
45+
"randomness": "0",
46+
"timestamp": 1724101482787,
47+
"graffiti": "0000000000000000000000000000000000000000000000000000000000000000",
48+
"noteSize": 4,
49+
"work": "0"
50+
},
51+
"transactions": [
52+
{
53+
"type": "Buffer",
54+
"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=="
55+
}
56+
]
57+
},
58+
{
59+
"type": "Buffer",
60+
"data": "base64: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"
61+
}
62+
],
63+
"Route wallet/deleteTransaction should return false when not deleting a transaction": [
64+
{
65+
"value": {
66+
"encrypted": false,
67+
"version": 4,
68+
"id": "f7c6bf85-5f42-446c-b127-fcd4077dcdef",
69+
"name": "existingAccount",
70+
"spendingKey": "8b91a476376d7def7a5db2e4cc74d54213b94210eab698f3bc7a5121a956c906",
71+
"viewKey": "3db6a3ab0140021a8e8ac37727b9e426d2e2684ed7b3c13cb27befea04a78361f2e32de664d29af5d6688da28b569276ce408016bce0c0df35601a0d6083ed46",
72+
"incomingViewKey": "2923ffcb0a770ba4e1febe690f3be2cf781042c6227e65a33b9314fd7d2c4d05",
73+
"outgoingViewKey": "1a6649a9026c6bd95a758c4653d92bc1873864b8d96df5eeccd84c9037c9ba41",
74+
"publicAddress": "efc9ad599a974b9113b810855012e4d07e5c76ec5262a081de05cadbb2b4cf3f",
75+
"createdAt": {
76+
"hash": {
77+
"type": "Buffer",
78+
"data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY="
79+
},
80+
"sequence": 1
81+
},
82+
"scanningEnabled": true,
83+
"proofAuthorizingKey": "6b4fc75057816604fffc79d70cd9baaa732fa2476c8be084260cb2d573553009"
84+
},
85+
"head": {
86+
"hash": {
87+
"type": "Buffer",
88+
"data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY="
89+
},
90+
"sequence": 1
91+
}
92+
},
93+
{
94+
"header": {
95+
"sequence": 2,
96+
"previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86",
97+
"noteCommitment": {
98+
"type": "Buffer",
99+
"data": "base64:v/C0+lNxuE90GJgCKOYazIlvy+U2APGs+wVplr6CyGc="
100+
},
101+
"transactionCommitment": {
102+
"type": "Buffer",
103+
"data": "base64:cuzMHsViFGG1s+d7SdtxKoXoNM21VFP5o/61OCFvvb8="
104+
},
105+
"target": "9282972777491357380673661573939192202192629606981189395159182914949423",
106+
"randomness": "0",
107+
"timestamp": 1724101484308,
108+
"graffiti": "0000000000000000000000000000000000000000000000000000000000000000",
109+
"noteSize": 4,
110+
"work": "0"
111+
},
112+
"transactions": [
113+
{
114+
"type": "Buffer",
115+
"data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAySF5vigNwaUcBefzDh/9DrmS+7Rrd8ZJNGqFEjkJazy1oFzvCAG5ZD5rAPftHr7o92s506p3oxHqnTA6O1jUAG/VWifg4KUKX57rQAzRsC+jaG/7BhQYlg5539pcZvF8W7E8gpfeI0YlI7ds9OyxuxH0f5KZAhaDT0D2tk5y3LgRlWzY3oMsRSm6xO8eEmydneRorBhL0jxD5G5YNnQqFm86lsPXCFjNby1lPNqWzxyP6nS1yK8a+zU/Gqnpt541x0vOnauY+rzhElgNDTUAsAuuXi7wEiZtDMDmc5INr63z0UN7J2qNCykLLMByBSredVra5vqHLMYzDHFAJeVfJkP0hIJIRZVdZze7A19huML6PSxpOkzGZdNTnGIytbBqMifsLhZu5EB49Qk+f4Df1Hf+ZunJDvGfIPSYIQYgOpN5OZ9iWCx8YK5F8Tt6jY18mWj7UIr8W1kT9VdBs5A2EgeHIcJuJiBRgLYi1d42xEAji+gSpQ1hy529n94jNB2CdN50vBff0/WJ5hj1W/Rj22H1aRV9vYw52gSnxzjcMNnuQVgI8iyipQur7vljYYkJzarluBKISqL62QITPIDxuUXGZVLgbbK18i1tLrl3s11OLhfXx47xhElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwHOfghlQZuvd3ZWFIk9uNBOT/wcp2Kylc5QGSObUHCs2982aMRnbTKV9PzMANJlP6UrXHX3nQS1pj5NLWDaAVDg=="
116+
}
117+
]
118+
},
119+
{
120+
"type": "Buffer",
121+
"data": "base64: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"
122+
},
123+
{
124+
"header": {
125+
"sequence": 3,
126+
"previousBlockHash": "D0D4749863C99A069CE5778049D18438AF3FDBB823F8FEABFC69E6E6FDE23938",
127+
"noteCommitment": {
128+
"type": "Buffer",
129+
"data": "base64:H3+z95bu5SibcW3MeSd/8JV5EWN8dr64T8QmnYbSFAI="
130+
},
131+
"transactionCommitment": {
132+
"type": "Buffer",
133+
"data": "base64:WJO8qQqSda/5PSZHMepvSmnkpk3jMPFzhJSWMaz6PAw="
134+
},
135+
"target": "9255858786337818395603165512831024101510453493377417362192396248796027",
136+
"randomness": "0",
137+
"timestamp": 1724101485748,
138+
"graffiti": "0000000000000000000000000000000000000000000000000000000000000000",
139+
"noteSize": 7,
140+
"work": "0"
141+
},
142+
"transactions": [
143+
{
144+
"type": "Buffer",
145+
"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=="
146+
},
147+
{
148+
"type": "Buffer",
149+
"data": "base64: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"
150+
}
151+
]
152+
}
153+
]
154+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4+
5+
import { useAccountFixture, useMinerBlockFixture, useTxFixture } from '../../../testUtilities'
6+
import { createRouteTest } from '../../../testUtilities/routeTest'
7+
8+
describe('Route wallet/deleteTransaction', () => {
9+
const routeTest = createRouteTest()
10+
11+
it('should return true when deleting a transaction', async () => {
12+
const accountA = await useAccountFixture(routeTest.node.wallet, 'existingAccount')
13+
14+
const block2 = await useMinerBlockFixture(
15+
routeTest.chain,
16+
undefined,
17+
accountA,
18+
routeTest.node.wallet,
19+
)
20+
await expect(routeTest.node.chain).toAddBlock(block2)
21+
await routeTest.node.wallet.scan()
22+
23+
const transaction = await useTxFixture(routeTest.node.wallet, accountA, accountA)
24+
25+
const response = await routeTest.client.wallet.deleteTransaction({
26+
hash: transaction.hash().toString('hex'),
27+
})
28+
29+
expect(response.status).toBe(200)
30+
expect(response.content.deleted).toBe(true)
31+
})
32+
33+
it('should return false when not deleting a transaction', async () => {
34+
const accountA = await useAccountFixture(routeTest.node.wallet, 'existingAccount')
35+
36+
const block2 = await useMinerBlockFixture(
37+
routeTest.chain,
38+
undefined,
39+
accountA,
40+
routeTest.node.wallet,
41+
)
42+
await expect(routeTest.node.chain).toAddBlock(block2)
43+
await routeTest.node.wallet.scan()
44+
45+
const transaction = await useTxFixture(routeTest.node.wallet, accountA, accountA)
46+
47+
const block3 = await useMinerBlockFixture(
48+
routeTest.node.chain,
49+
undefined,
50+
accountA,
51+
routeTest.node.wallet,
52+
[transaction],
53+
)
54+
await routeTest.node.chain.addBlock(block3)
55+
56+
await routeTest.node.wallet.scan()
57+
58+
const response = await routeTest.client.wallet.deleteTransaction({
59+
hash: transaction.hash().toString('hex'),
60+
})
61+
62+
expect(response.status).toBe(200)
63+
expect(response.content.deleted).toBe(false)
64+
})
65+
})

0 commit comments

Comments
 (0)