Skip to content

Commit 0cb0da0

Browse files
authored
Add support for cancelling smart account transactions (#374)
* Add support for cancelling smart account transactions * Update * Update
1 parent a699049 commit 0cb0da0

File tree

2 files changed

+108
-82
lines changed

2 files changed

+108
-82
lines changed

src/server/routes/transaction/cancel.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,9 @@ export async function cancelTransaction(fastify: FastifyInstance) {
6666
},
6767
handler: async (request, reply) => {
6868
const { queueId } = request.body;
69-
const walletAddress = request.headers[
70-
"x-backend-wallet-address"
71-
] as string;
72-
const accountAddress = request.headers["x-account-address"] as string;
7369

7470
const { message, transactionHash } = await cancelTransactionAndUpdate({
7571
queueId,
76-
walletAddress,
77-
accountAddress,
7872
});
7973

8074
return reply.status(StatusCodes.OK).send({

src/server/utils/transaction.ts

Lines changed: 108 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ import { TransactionStatusEnum } from "../schemas/transaction";
1010

1111
interface CancelTransactionAndUpdateParams {
1212
queueId: string;
13-
walletAddress: string;
14-
accountAddress: string;
1513
}
1614

1715
export const cancelTransactionAndUpdate = async ({
1816
queueId,
19-
walletAddress,
20-
accountAddress,
2117
}: CancelTransactionAndUpdateParams) => {
2218
const txData = await getTxById({ queueId });
2319
if (!txData) {
@@ -26,87 +22,123 @@ export const cancelTransactionAndUpdate = async ({
2622
};
2723
}
2824

25+
let message = "";
2926
let error = null;
3027
let transferTransactionResult: TransactionResponse | null = null;
3128

32-
let message = "";
33-
34-
switch (txData.status) {
35-
case TransactionStatusEnum.Errored:
36-
error = createCustomError(
37-
`Cannot cancel errored transaction with queueId ${queueId}. Error: ${txData.errorMessage}`,
38-
StatusCodes.BAD_REQUEST,
39-
"TransactionErrored",
40-
);
41-
break;
42-
case TransactionStatusEnum.Cancelled:
43-
error = createCustomError(
44-
`Transaction already cancelled with queueId ${queueId}`,
45-
StatusCodes.BAD_REQUEST,
46-
"TransactionAlreadyCancelled",
47-
);
48-
break;
49-
case TransactionStatusEnum.Queued:
50-
await updateTx({
51-
queueId,
52-
data: {
53-
status: TransactionStatusEnum.Cancelled,
54-
},
55-
});
56-
message = "Transaction cancelled on-database successfully.";
57-
break;
58-
case TransactionStatusEnum.Mined:
59-
error = createCustomError(
60-
`Transaction already mined with queueId ${queueId}`,
61-
StatusCodes.BAD_REQUEST,
62-
"TransactionAlreadyMined",
63-
);
64-
break;
65-
case TransactionStatusEnum.Processed:
66-
case TransactionStatusEnum.Submitted: {
67-
const sdk = await getSdk({
68-
chainId: parseInt(txData.chainId!),
69-
walletAddress: txData.fromAddress!,
70-
accountAddress,
71-
});
29+
if (txData.signerAddress && txData.accountAddress) {
30+
switch (txData.status) {
31+
case TransactionStatusEnum.Errored:
32+
throw createCustomError(
33+
`Cannot cancel user operation because it already errored`,
34+
StatusCodes.BAD_REQUEST,
35+
"TransactionErrored",
36+
);
37+
case TransactionStatusEnum.Cancelled:
38+
throw createCustomError(
39+
`User operation was already cancelled`,
40+
StatusCodes.BAD_REQUEST,
41+
"TransactionAlreadyCancelled",
42+
);
43+
case TransactionStatusEnum.Mined:
44+
throw createCustomError(
45+
`Cannot cancel user operation because it was already mined`,
46+
StatusCodes.BAD_REQUEST,
47+
"TransactionAlreadyMined",
48+
);
49+
case TransactionStatusEnum.Submitted:
50+
case TransactionStatusEnum.Processed:
51+
throw createCustomError(
52+
`Cannot cancel user operation because it was already processed.`,
53+
StatusCodes.BAD_REQUEST,
54+
"TransactionAlreadySubmitted",
55+
);
56+
case TransactionStatusEnum.Queued:
57+
await updateTx({
58+
queueId,
59+
data: {
60+
status: TransactionStatusEnum.Cancelled,
61+
},
62+
});
63+
message = "Transaction cancelled on-database successfully.";
64+
break;
65+
}
66+
} else {
67+
switch (txData.status) {
68+
case TransactionStatusEnum.Errored:
69+
error = createCustomError(
70+
`Cannot cancel errored transaction with queueId ${queueId}. Error: ${txData.errorMessage}`,
71+
StatusCodes.BAD_REQUEST,
72+
"TransactionErrored",
73+
);
74+
break;
75+
case TransactionStatusEnum.Cancelled:
76+
error = createCustomError(
77+
`Transaction already cancelled with queueId ${queueId}`,
78+
StatusCodes.BAD_REQUEST,
79+
"TransactionAlreadyCancelled",
80+
);
81+
break;
82+
case TransactionStatusEnum.Queued:
83+
await updateTx({
84+
queueId,
85+
data: {
86+
status: TransactionStatusEnum.Cancelled,
87+
},
88+
});
89+
message = "Transaction cancelled on-database successfully.";
90+
break;
91+
case TransactionStatusEnum.Mined:
92+
error = createCustomError(
93+
`Transaction already mined with queueId ${queueId}`,
94+
StatusCodes.BAD_REQUEST,
95+
"TransactionAlreadyMined",
96+
);
97+
break;
98+
case TransactionStatusEnum.Processed:
99+
case TransactionStatusEnum.Submitted: {
100+
const sdk = await getSdk({
101+
chainId: parseInt(txData.chainId!),
102+
walletAddress: txData.fromAddress!,
103+
});
72104

73-
const txReceipt = await sdk
74-
.getProvider()
75-
.getTransactionReceipt(txData.transactionHash!);
105+
const txReceipt = await sdk
106+
.getProvider()
107+
.getTransactionReceipt(txData.transactionHash!);
76108

77-
if (txReceipt) {
78-
message =
79-
"Transaction already mined. Cannot cancel transaction on-chain.";
80-
break;
81-
}
109+
if (txReceipt) {
110+
message =
111+
"Transaction already mined. Cannot cancel transaction on-chain.";
112+
break;
113+
}
82114

83-
const gasOverrides = await getDefaultGasOverrides(sdk.getProvider());
84-
transferTransactionResult = await sdk.wallet.sendRawTransaction({
85-
to: txData.fromAddress!,
86-
from: txData.fromAddress!,
87-
data: "0x",
88-
value: "0x00",
89-
nonce: txData.nonce!,
90-
...gasOverrides,
91-
maxFeePerGas: BigNumber.from(gasOverrides.maxFeePerGas).mul(2),
92-
maxPriorityFeePerGas: BigNumber.from(
93-
gasOverrides.maxPriorityFeePerGas,
94-
).mul(2),
95-
});
115+
const gasOverrides = await getDefaultGasOverrides(sdk.getProvider());
116+
transferTransactionResult = await sdk.wallet.sendRawTransaction({
117+
to: txData.fromAddress!,
118+
from: txData.fromAddress!,
119+
data: "0x",
120+
value: "0x00",
121+
nonce: txData.nonce!,
122+
...gasOverrides,
123+
maxFeePerGas: BigNumber.from(gasOverrides.maxFeePerGas).mul(2),
124+
maxPriorityFeePerGas: BigNumber.from(
125+
gasOverrides.maxPriorityFeePerGas,
126+
).mul(2),
127+
});
96128

97-
message = "Cancellation Transaction sent on chain successfully.";
129+
message = "Cancellation Transaction sent on chain successfully.";
98130

99-
await updateTx({
100-
queueId,
101-
data: {
102-
status: TransactionStatusEnum.Cancelled,
103-
},
104-
});
105-
break;
131+
await updateTx({
132+
queueId,
133+
data: {
134+
status: TransactionStatusEnum.Cancelled,
135+
},
136+
});
137+
break;
138+
}
139+
default:
140+
break;
106141
}
107-
108-
default:
109-
break;
110142
}
111143

112144
if (error) {

0 commit comments

Comments
 (0)