From 1416494a7e0c7e9fd10f0f98f5693ae8debd6f4a Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Mon, 6 Jan 2025 18:04:47 +0100 Subject: [PATCH] fix(restore): activity after CPFP (transfer) boost --- e2e/boost.e2e.js | 4 +- e2e/{channels.e2e.js => transfer.e2e.js} | 22 ++++++++++ src/screens/Activity/ActivityDetail.tsx | 10 ++--- src/screens/Wallets/BoostPrompt.tsx | 2 +- src/store/slices/activity.ts | 2 +- src/store/utils/activity.ts | 4 +- src/store/utils/backup.ts | 11 ++++- src/utils/boost.ts | 52 +----------------------- 8 files changed, 44 insertions(+), 63 deletions(-) rename e2e/{channels.e2e.js => transfer.e2e.js} (95%) diff --git a/e2e/boost.e2e.js b/e2e/boost.e2e.js index 18c85fdfd..2b0f01787 100644 --- a/e2e/boost.e2e.js +++ b/e2e/boost.e2e.js @@ -129,7 +129,7 @@ d('Boost', () => { await waitFor(element(by.id('CPFPBoost'))) .toBeVisible() .withTimeout(30000); - await element(by.id('CostomFeeButton')).tap(); + await element(by.id('CustomFeeButton')).tap(); await element(by.id('Plus')).tap(); await element(by.id('Minus')).tap(); await element(by.id('RecomendedFeeButton')).tap(); @@ -240,7 +240,7 @@ d('Boost', () => { await waitFor(element(by.id('RBFBoost'))) .toBeVisible() .withTimeout(30000); - await element(by.id('CostomFeeButton')).tap(); + await element(by.id('CustomFeeButton')).tap(); await element(by.id('Plus')).tap(); await element(by.id('Minus')).tap(); await element(by.id('RecomendedFeeButton')).tap(); diff --git a/e2e/channels.e2e.js b/e2e/transfer.e2e.js similarity index 95% rename from e2e/channels.e2e.js rename to e2e/transfer.e2e.js index 28491c89d..d2355ff02 100644 --- a/e2e/channels.e2e.js +++ b/e2e/transfer.e2e.js @@ -199,6 +199,7 @@ d('Transfer', () => { // check channel status await element(by.id('NavigationClose')).tap(); + await sleep(1000); await element(by.id('Settings')).tap(); await element(by.id('AdvancedSettings')).atIndex(0).tap(); await element(by.id('Channels')).tap(); @@ -220,6 +221,27 @@ d('Transfer', () => { await element(by.id('ActivityShort-1')).tap(); await expect(element(by.id('StatusTransfer'))).toBeVisible(); + // boost the transfer + await element(by.id('BoostButton')).tap(); + await waitFor(element(by.id('CPFPBoost'))) + .toBeVisible() + .withTimeout(30000); + await element(by.id('GRAB')).swipe('right', 'slow', 0.95, 0.5, 0.5); // Swipe to confirm + + // check Activity + await waitFor(element(by.id('BoostingIcon'))) + .toBeVisible() + .withTimeout(30000); + + // reset & restore again + await restoreWallet(seed); + + // check activity after restore + await element(by.id('WalletsScrollView')).scrollTo('bottom', NaN, 0.85); + await expect(element(by.id('BoostingIcon'))).toBeVisible(); + await element(by.id('ActivityShort-1')).tap(); + await expect(element(by.id('StatusBoosting'))).toBeVisible(); + markComplete('transfer-1'); }); diff --git a/src/screens/Activity/ActivityDetail.tsx b/src/screens/Activity/ActivityDetail.tsx index 5156a79a4..16ffd4baf 100644 --- a/src/screens/Activity/ActivityDetail.tsx +++ b/src/screens/Activity/ActivityDetail.tsx @@ -352,7 +352,7 @@ const OnchainActivityDetail = ({ if (isBoosted) { status = ( - + {t('activity_boosting')} @@ -361,7 +361,7 @@ const OnchainActivityDetail = ({ if (confirmed) { status = ( - + {t('activity_confirmed')} @@ -455,7 +455,7 @@ const OnchainActivityDetail = ({
+ + + } onPress={onSwitchView} /> diff --git a/src/store/slices/activity.ts b/src/store/slices/activity.ts index 2e85a1920..cdccedc10 100644 --- a/src/store/slices/activity.ts +++ b/src/store/slices/activity.ts @@ -31,9 +31,9 @@ const { actions, reducer } = activitySlice; export const { addActivityItem, addActivityItems, + updateActivityItems, removeActivityItem, resetActivityState, - updateActivityItems, } = actions; export default reducer; diff --git a/src/store/utils/activity.ts b/src/store/utils/activity.ts index 8b609253d..33ccf7fea 100644 --- a/src/store/utils/activity.ts +++ b/src/store/utils/activity.ts @@ -91,7 +91,7 @@ export const updateOnChainActivityList = async (): Promise> => { ); return ok(''); } - const { selectedNetwork, selectedWallet } = getCurrentWallet(); + const { selectedNetwork } = getCurrentWallet(); const boostedTransactions = currentWallet.boostedTransactions[selectedNetwork]; @@ -104,8 +104,6 @@ export const updateOnChainActivityList = async (): Promise> => { const boostFormattedItems = await formatBoostedActivityItems({ items: activityItems, boostedTransactions, - selectedWallet, - selectedNetwork, }); dispatch(updateActivityItems(boostFormattedItems)); diff --git a/src/store/utils/backup.ts b/src/store/utils/backup.ts index de55352a6..b17549839 100644 --- a/src/store/utils/backup.ts +++ b/src/store/utils/backup.ts @@ -26,7 +26,11 @@ import { getWidgetsStore, } from '../helpers'; import { getDefaultSettingsShape } from '../shapes/settings'; -import { addActivityItems, TActivity } from '../slices/activity'; +import { + addActivityItems, + resetActivityState, + TActivity, +} from '../slices/activity'; import { backupError, backupStart, backupSuccess } from '../slices/backup'; import { updateBlocktank } from '../slices/blocktank'; import { initialMetadataState, updateMetadata } from '../slices/metadata'; @@ -45,6 +49,7 @@ import { TSlashtagsState } from '../types/slashtags'; import { getDefaultWalletShape } from '../shapes/wallet'; import { IWalletItem, TTransfer } from '../types/wallet'; import { restoreBoostedTransactions, restoreTransfers } from '../slices/wallet'; +import { updateOnChainActivityList } from './activity'; export enum EBackupCategory { wallet = 'bitkit_wallet', @@ -285,9 +290,13 @@ const performWalletRestore = async (): Promise< return ok({ backupExists: false }); } + // because activity has been updated already before this point + // we need to reset the activity state to show boosts correctly + dispatch(resetActivityState()); dispatch(restoreBoostedTransactions(backup.boostedTransactions)); dispatch(restoreTransfers(backup.transfers)); dispatch(backupSuccess({ category: EBackupCategory.wallet })); + updateOnChainActivityList(); // Restore success return ok({ backupExists: true }); diff --git a/src/utils/boost.ts b/src/utils/boost.ts index 22d4e3aeb..374267075 100644 --- a/src/utils/boost.ts +++ b/src/utils/boost.ts @@ -50,42 +50,6 @@ export const getBoostedTransactionParents = ({ }); }; -/** - * Determines if a given txId has any boosted parents. - * // TODO: Migrate to Beignet - * @param {string} txId - * @param {IBoostedTransactions} [boostedTransactions] - * @param {TWalletName} [selectedWallet] - * @param {EAvailableNetwork} [selectedNetwork] - * @returns {boolean} - */ -export const hasBoostedParents = ({ - wallet, - txId, - boostedTransactions, - selectedWallet = getSelectedWallet(), - selectedNetwork = getSelectedNetwork(), -}: { - wallet: TWallet; - txId: string; - boostedTransactions?: IBoostedTransactions; - selectedWallet?: TWalletName; - selectedNetwork?: EAvailableNetwork; -}): boolean => { - if (!boostedTransactions) { - boostedTransactions = getBoostedTransactions({ - selectedWallet, - selectedNetwork, - }); - } - const boostedParents = getBoostedTransactionParents({ - wallet, - txId, - boostedTransactions, - }); - return boostedParents.length > 0; -}; - /** * Returns the initially boosted transaction's activity item for a given txId. * @param {string} txId @@ -99,21 +63,15 @@ const getRootParentActivity = async ({ txId, items, boostedTransactions, - selectedWallet = getSelectedWallet(), - selectedNetwork = getSelectedNetwork(), }: { txId: string; items: TOnchainActivityItem[]; boostedTransactions?: IBoostedTransactions; - selectedWallet?: TWalletName; - selectedNetwork?: EAvailableNetwork; }): Promise => { const wallet = await getOnChainWalletAsync(); + if (!boostedTransactions) { - boostedTransactions = getBoostedTransactions({ - selectedWallet, - selectedNetwork, - }); + boostedTransactions = getBoostedTransactions(); } const boostedParents = getBoostedTransactionParents({ wallet, @@ -158,13 +116,9 @@ export const getParentsActivity = ({ export const formatBoostedActivityItems = async ({ items, boostedTransactions, - selectedWallet, - selectedNetwork, }: { items: TOnchainActivityItem[]; boostedTransactions: IBoostedTransactions; - selectedWallet: TWalletName; - selectedNetwork: EAvailableNetwork; }): Promise => { const wallet = await getOnChainWalletAsync(); const formattedItems: TOnchainActivityItem[] = []; @@ -193,8 +147,6 @@ export const formatBoostedActivityItems = async ({ txId, items, boostedTransactions, - selectedWallet, - selectedNetwork, }); // If no root parent (RBF), just add the item marked as boosted