From c18a2eae37ab97accccd7d5fe2941e1d21b6110d Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Thu, 3 Aug 2023 15:51:29 +0200 Subject: [PATCH 1/3] Remove from pending tx when not in mempool for a while --- .../background/transactions/sources/onchain.ts | 17 +++++++++++++---- .../src/background/transactions/tracking.ts | 5 ++++- packages/extension/src/shared/transactions.ts | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/extension/src/background/transactions/sources/onchain.ts b/packages/extension/src/background/transactions/sources/onchain.ts index 2492408d8..b35f42cfa 100644 --- a/packages/extension/src/background/transactions/sources/onchain.ts +++ b/packages/extension/src/background/transactions/sources/onchain.ts @@ -15,10 +15,19 @@ export async function getTransactionsUpdate(transactions: Transaction[]) { transactionsToCheck.map(async (transaction) => { const network = await getNetwork(transaction.account.networkId) const explorerProvider = new ExplorerProvider(network.explorerApiUrl) - const updatedTransaction = await explorerProvider.transactions.getTransactionsTransactionHash(transaction.hash) - - const status = updatedTransaction.type === "Accepted" ? "ACCEPTED_ON_CHAIN" : "ACCEPTED_ON_MEMPOOL" - return { ...transaction, status } + const txDate = new Date(transaction.timestamp) + const txCreatedSinceInMinutes = (new Date().valueOf() - txDate.valueOf()) / 1000 / 60 + try { + const updatedTransaction = await explorerProvider.transactions.getTransactionsTransactionHash(transaction.hash) + const status = updatedTransaction.type === "Accepted" ? "ACCEPTED_ON_CHAIN" : "ACCEPTED_ON_MEMPOOL" + return { ...transaction, status } + } catch (exception: any) { + if (exception.message.endsWith("not found") && txCreatedSinceInMinutes >= 2) { + return { ...transaction, status: 'REMOVED_FROM_MEMPOOL' } + } else { + throw exception + } + } }) ) diff --git a/packages/extension/src/background/transactions/tracking.ts b/packages/extension/src/background/transactions/tracking.ts index 69c693e2c..283120e54 100644 --- a/packages/extension/src/background/transactions/tracking.ts +++ b/packages/extension/src/background/transactions/tracking.ts @@ -6,6 +6,7 @@ import { accountsEqual } from "../../shared/wallet.service" import { getTransactionsUpdate } from "./sources/onchain" import { getTransactionHistory } from "./sources/voyager" import { transactionsStore } from "./store" +import { partition } from "lodash" export interface TransactionTracker { loadHistory: (accountsToPopulate: WalletAccount[]) => Promise @@ -28,7 +29,9 @@ export const transactionTracker: TransactionTracker = { // is smart enough to filter for just the pending transactions, as the rest needs no update allTransactions, ) - await transactionsStore.push(updatedTransactions) + const [toBeRemoved, toBeKept] = partition(updatedTransactions, (tx) => tx.status === "REMOVED_FROM_MEMPOOL") + await transactionsStore.remove((tx) => toBeRemoved.some((toBeRemovedTx) => tx.hash === toBeRemovedTx.hash)) + await transactionsStore.push(toBeKept) const hasPendingTransactions = getInFlightTransactions(allTransactions).length > 0 return hasPendingTransactions diff --git a/packages/extension/src/shared/transactions.ts b/packages/extension/src/shared/transactions.ts index 817bc0932..afc824cf4 100644 --- a/packages/extension/src/shared/transactions.ts +++ b/packages/extension/src/shared/transactions.ts @@ -5,7 +5,7 @@ import { ReviewTransactionResult } from "./actionQueue/types" import { WalletAccount } from "./wallet.model" import { AlephiumExplorerTransaction } from "./explorer/type" -export type Status = 'NOT_RECEIVED' | 'RECEIVED' | 'PENDING' | 'ACCEPTED_ON_MEMPOOL' | 'ACCEPTED_ON_L2' | 'ACCEPTED_ON_CHAIN' | 'REJECTED'; +export type Status = 'NOT_RECEIVED' | 'RECEIVED' | 'PENDING' | 'ACCEPTED_ON_MEMPOOL' | 'ACCEPTED_ON_L2' | 'ACCEPTED_ON_CHAIN' | 'REJECTED' | 'REMOVED_FROM_MEMPOOL'; // Global Constants for Transactions export const SUCCESS_STATUSES: Status[] = [ From e3963897a67df3c391f61200a81acb68920a64d6 Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Thu, 3 Aug 2023 16:00:35 +0200 Subject: [PATCH 2/3] Add comment --- .../extension/src/background/transactions/sources/onchain.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/extension/src/background/transactions/sources/onchain.ts b/packages/extension/src/background/transactions/sources/onchain.ts index b35f42cfa..b934c6619 100644 --- a/packages/extension/src/background/transactions/sources/onchain.ts +++ b/packages/extension/src/background/transactions/sources/onchain.ts @@ -22,6 +22,8 @@ export async function getTransactionsUpdate(transactions: Transaction[]) { const status = updatedTransaction.type === "Accepted" ? "ACCEPTED_ON_CHAIN" : "ACCEPTED_ON_MEMPOOL" return { ...transaction, status } } catch (exception: any) { + // If the transaction is not found and it has been created for more than 2 minutes + // we can assume it has been removed from the mempool if (exception.message.endsWith("not found") && txCreatedSinceInMinutes >= 2) { return { ...transaction, status: 'REMOVED_FROM_MEMPOOL' } } else { From e47f54bb7a0b22e2681b7a58b4ad581f991e3259 Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Thu, 3 Aug 2023 16:17:14 +0200 Subject: [PATCH 3/3] Fix comments --- .../extension/src/background/transactions/sources/onchain.ts | 2 +- packages/extension/src/background/transactions/tracking.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/background/transactions/sources/onchain.ts b/packages/extension/src/background/transactions/sources/onchain.ts index b934c6619..3cfef253e 100644 --- a/packages/extension/src/background/transactions/sources/onchain.ts +++ b/packages/extension/src/background/transactions/sources/onchain.ts @@ -24,7 +24,7 @@ export async function getTransactionsUpdate(transactions: Transaction[]) { } catch (exception: any) { // If the transaction is not found and it has been created for more than 2 minutes // we can assume it has been removed from the mempool - if (exception.message.endsWith("not found") && txCreatedSinceInMinutes >= 2) { + if (exception.message.includes("not found") && txCreatedSinceInMinutes >= 2) { return { ...transaction, status: 'REMOVED_FROM_MEMPOOL' } } else { throw exception diff --git a/packages/extension/src/background/transactions/tracking.ts b/packages/extension/src/background/transactions/tracking.ts index 283120e54..e1a0f6efc 100644 --- a/packages/extension/src/background/transactions/tracking.ts +++ b/packages/extension/src/background/transactions/tracking.ts @@ -30,7 +30,9 @@ export const transactionTracker: TransactionTracker = { allTransactions, ) const [toBeRemoved, toBeKept] = partition(updatedTransactions, (tx) => tx.status === "REMOVED_FROM_MEMPOOL") - await transactionsStore.remove((tx) => toBeRemoved.some((toBeRemovedTx) => tx.hash === toBeRemovedTx.hash)) + if (toBeRemoved.length > 0) { + await transactionsStore.remove((tx) => toBeRemoved.some((toBeRemovedTx) => tx.hash === toBeRemovedTx.hash)) + } await transactionsStore.push(toBeKept) const hasPendingTransactions = getInFlightTransactions(allTransactions).length > 0