From 1144d4dee930fc97e5b5f3732239676b511724ea Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 12 Dec 2025 20:09:29 -0300 Subject: [PATCH 1/7] fix: set hasCompletedBoost as true when booted activity is evicted --- .../ui/screens/wallets/activity/ActivityDetailScreen.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index ec593c539..9d34e9a90 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -606,7 +606,9 @@ private fun ActivityDetailContent( if (hasCPFP) { true } else if (activity.txType == PaymentType.SENT) { - activity.boostTxIds.any { boostTxDoesExist[it] == false } + val anyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } + val thisActivityWasEvicted = !activity.doesExist + anyBoostTxEvicted || thisActivityWasEvicted } else { false } From f88c9f4ca84c5ddb292974e18ddd1767d9c268cc Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 12 Dec 2025 20:13:30 -0300 Subject: [PATCH 2/7] chore: lint --- .../bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index 9d34e9a90..fb5521c25 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -606,7 +606,7 @@ private fun ActivityDetailContent( if (hasCPFP) { true } else if (activity.txType == PaymentType.SENT) { - val anyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } + val anyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } val thisActivityWasEvicted = !activity.doesExist anyBoostTxEvicted || thisActivityWasEvicted } else { From df9da6fa0021e315ad19787541b810f81a9644da Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 12 Dec 2025 20:15:40 -0300 Subject: [PATCH 3/7] chore: lint --- .../ui/screens/wallets/activity/ActivityDetailScreen.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index fb5521c25..1c4f288ac 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -606,9 +606,9 @@ private fun ActivityDetailContent( if (hasCPFP) { true } else if (activity.txType == PaymentType.SENT) { - val anyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } - val thisActivityWasEvicted = !activity.doesExist - anyBoostTxEvicted || thisActivityWasEvicted + val isAnyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } + val isActivityEvicted = !activity.doesExist + isAnyBoostTxEvicted || isActivityEvicted } else { false } From 730d920c5147d6bee32276832b3911cb59d23b75 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Sat, 13 Dec 2025 10:15:41 -0300 Subject: [PATCH 4/7] fix: keep isBoosted state --- app/src/main/java/to/bitkit/services/CoreService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/services/CoreService.kt b/app/src/main/java/to/bitkit/services/CoreService.kt index 34b18f06b..bef441a3e 100644 --- a/app/src/main/java/to/bitkit/services/CoreService.kt +++ b/app/src/main/java/to/bitkit/services/CoreService.kt @@ -854,7 +854,6 @@ class ActivityService( val updatedActivity = replacedActivity.copy( doesExist = false, - isBoosted = false, updatedAt = System.currentTimeMillis().toULong() / 1000u ) updateActivity(replacedActivity.id, Activity.Onchain(updatedActivity)) From 6dc865abefced48dc1837645c0fa15cdd7002ab1 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Sat, 13 Dec 2025 10:28:03 -0300 Subject: [PATCH 5/7] fix: display boosted and evicted as already boosted --- .../ui/screens/wallets/activity/ActivityDetailScreen.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index 1c4f288ac..19098d485 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -601,17 +601,20 @@ private fun ActivityDetailContent( is Activity.Lightning -> false is Activity.Onchain -> { val activity = item.v1 + val isActivityEvicted = !activity.doesExist + if (activity.isBoosted && activity.boostTxIds.isNotEmpty()) { val hasCPFP = activity.boostTxIds.any { boostTxDoesExist[it] == true } if (hasCPFP) { true } else if (activity.txType == PaymentType.SENT) { val isAnyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } - val isActivityEvicted = !activity.doesExist - isAnyBoostTxEvicted || isActivityEvicted + isAnyBoostTxEvicted } else { false } + } else if (activity.isBoosted && isActivityEvicted) { + true } else { false } From eec263540b7d3dcfee627580ab3941b1fc6fb966 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Sat, 13 Dec 2025 10:35:15 -0300 Subject: [PATCH 6/7] refactor: code cleanup --- .../wallets/activity/ActivityDetailScreen.kt | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index 19098d485..cf6d43c35 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -603,19 +603,32 @@ private fun ActivityDetailContent( val activity = item.v1 val isActivityEvicted = !activity.doesExist - if (activity.isBoosted && activity.boostTxIds.isNotEmpty()) { - val hasCPFP = activity.boostTxIds.any { boostTxDoesExist[it] == true } - if (hasCPFP) { + // Not boosted → no completed boost + if (!activity.isBoosted) { + false + } + // Boosted but evicted from mempool → show as boosted + else if (isActivityEvicted) { + true + } + // Boosted with CPFP transactions + else if (activity.boostTxIds.isNotEmpty()) { + val hasActiveCPFP = activity.boostTxIds.any { boostTxDoesExist[it] == true } + val hasEvictedBoostTx = activity.boostTxIds.any { boostTxDoesExist[it] == false } + + // CPFP exists → boost completed + if (hasActiveCPFP) { + true + } + // SENT tx with evicted boost → show as already boosted + else if (activity.txType == PaymentType.SENT && hasEvictedBoostTx) { true - } else if (activity.txType == PaymentType.SENT) { - val isAnyBoostTxEvicted = activity.boostTxIds.any { boostTxDoesExist[it] == false } - isAnyBoostTxEvicted } else { false } - } else if (activity.isBoosted && isActivityEvicted) { - true - } else { + } + // Boosted but no boost tx IDs tracked yet + else { false } } From 6e3b2e3667a22f0e039665a71d9d32aca122861c Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Sat, 13 Dec 2025 11:03:14 -0300 Subject: [PATCH 7/7] fix: remove transaction replaced toast --- .../java/to/bitkit/viewmodels/AppViewModel.kt | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index 232d496dd..2ecfe0f73 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -312,7 +312,6 @@ class AppViewModel @Inject constructor( private suspend fun handleOnchainTransactionReplaced(event: Event.OnchainTransactionReplaced) { activityRepo.handleOnchainTransactionReplaced(event.txid, event.conflicts) - notifyTransactionReplaced(event) } private suspend fun handlePaymentFailed(event: Event.PaymentFailed) { @@ -397,25 +396,6 @@ class AppViewModel @Inject constructor( testTag = "TransactionUnconfirmedToast", ) - private suspend fun notifyTransactionReplaced(event: Event.OnchainTransactionReplaced) { - val isReceive = activityRepo.isReceivedTransaction(event.txid) - toast( - type = Toast.ToastType.INFO, - title = when (isReceive) { - true -> R.string.wallet__toast_received_transaction_replaced_title - else -> R.string.wallet__toast_transaction_replaced_title - }.let { context.getString(it) }, - description = when (isReceive) { - true -> R.string.wallet__toast_received_transaction_replaced_description - else -> R.string.wallet__toast_transaction_replaced_description - }.let { context.getString(it) }, - testTag = when (isReceive) { - true -> "ReceivedTransactionReplacedToast" - else -> "TransactionReplacedToast" - }, - ) - } - private fun notifyPaymentFailed() = toast( type = Toast.ToastType.ERROR, title = context.getString(R.string.wallet__toast_payment_failed_title),