From 06a9c6b0d29b536dfea16466df674b1ad6d7519a Mon Sep 17 00:00:00 2001 From: Kayos Date: Fri, 27 Mar 2026 12:11:45 -0700 Subject: [PATCH] fix(wallet): resolve audit findings - DI typos, missing dependency, event type consistency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FIXES: 1. Fix Metro DI package typo: dev.zacsweeny.metro → dev.zacsweers.metro - KoiosCardanoClient.kt - DefaultTransactionBuilder.kt - PaymentStatusPoller.kt - WalletModule.kt 2. Add missing dependency: features:messages:impl now depends on features:wallet:impl 3. Standardize event type: Use 'co.sulkta.payment.request' consistently - Updated TimelineItemPaymentContent.EVENT_TYPE - Updated test assertion 4. Fix DI scope inconsistency: PaymentStatusPoller now uses SessionScope (was AppScope but depends on SessionScoped CardanoClient) 5. Fix mixed DI annotations in DefaultPaymentEventSender (was mixing Anvil + Metro, now uses Metro consistently) --- features/messages/impl/build.gradle.kts | 1 + .../wallet/api/timeline/TimelineItemPaymentContent.kt | 3 ++- .../wallet/impl/cardano/DefaultTransactionBuilder.kt | 4 ++-- .../features/wallet/impl/cardano/KoiosCardanoClient.kt | 4 ++-- .../wallet/impl/cardano/PaymentStatusPoller.kt | 10 +++++----- .../android/features/wallet/impl/di/WalletModule.kt | 10 +++++----- .../wallet/impl/payment/DefaultPaymentEventSender.kt | 9 ++++----- .../impl/timeline/TimelineItemPaymentContentTest.kt | 4 ++-- 8 files changed, 23 insertions(+), 22 deletions(-) diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index 01482d0df5..dd2b695022 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -61,6 +61,7 @@ dependencies { implementation(projects.libraries.uiUtils) implementation(projects.libraries.testtags) implementation(projects.features.networkmonitor.api) + implementation(projects.features.wallet.impl) implementation(projects.services.analytics.compose) implementation(projects.services.appnavstate.api) implementation(projects.services.toolbox.api) diff --git a/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt b/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt index 8b0ceffcee..97419456a6 100644 --- a/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt +++ b/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt @@ -72,7 +72,8 @@ data class TimelineItemPaymentContent( } companion object { - const val EVENT_TYPE = "m.payment.cardano" + /** Custom event type for Cardano payment requests (reverse-domain format) */ + const val EVENT_TYPE = "co.sulkta.payment.request" private const val LOVELACE_PER_ADA = 1_000_000.0 /** diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/DefaultTransactionBuilder.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/DefaultTransactionBuilder.kt index e770a2253f..6dc06a0a40 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/DefaultTransactionBuilder.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/DefaultTransactionBuilder.kt @@ -13,8 +13,8 @@ import com.bloxbean.cardano.client.backend.factory.BackendFactory import com.bloxbean.cardano.client.function.helper.SignerProviders import com.bloxbean.cardano.client.quicktx.QuickTxBuilder import com.bloxbean.cardano.client.quicktx.Tx -import dev.zacsweeny.metro.ContributesBinding -import dev.zacsweeny.metro.SessionScope +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SessionScope import io.element.android.features.wallet.api.CardanoClient import io.element.android.features.wallet.api.CardanoException import io.element.android.features.wallet.api.PaymentRequest diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/KoiosCardanoClient.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/KoiosCardanoClient.kt index 1a2149cd41..570a7584ed 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/KoiosCardanoClient.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/KoiosCardanoClient.kt @@ -8,8 +8,8 @@ package io.element.android.features.wallet.impl.cardano import com.bloxbean.cardano.client.backend.api.BackendService import com.bloxbean.cardano.client.backend.factory.BackendFactory -import dev.zacsweeny.metro.ContributesBinding -import dev.zacsweeny.metro.SessionScope +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SessionScope import io.element.android.features.wallet.api.CardanoClient import io.element.android.features.wallet.api.CardanoException import io.element.android.features.wallet.api.ProtocolParameters diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/PaymentStatusPoller.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/PaymentStatusPoller.kt index 4778ec5c5d..7e8aa07cab 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/PaymentStatusPoller.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/cardano/PaymentStatusPoller.kt @@ -6,9 +6,9 @@ package io.element.android.features.wallet.impl.cardano -import dev.zacsweeny.metro.AppScope -import dev.zacsweeny.metro.ContributesBinding -import dev.zacsweeny.metro.SingleIn +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SessionScope +import dev.zacsweers.metro.SingleIn import io.element.android.features.wallet.api.CardanoClient import io.element.android.features.wallet.api.PaymentStatusPoller import io.element.android.features.wallet.api.TxStatus @@ -21,8 +21,8 @@ import javax.inject.Inject /** * Default implementation of [PaymentStatusPoller]. */ -@SingleIn(AppScope::class) -@ContributesBinding(AppScope::class) +@SingleIn(SessionScope::class) +@ContributesBinding(SessionScope::class) class DefaultPaymentStatusPoller @Inject constructor( private val cardanoClient: CardanoClient, ) : PaymentStatusPoller { diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/di/WalletModule.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/di/WalletModule.kt index 59f0ce2584..eaabdbfb8c 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/di/WalletModule.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/di/WalletModule.kt @@ -6,11 +6,11 @@ package io.element.android.features.wallet.impl.di -import dev.zacsweeny.metro.AppScope -import dev.zacsweeny.metro.ContributesTo -import dev.zacsweeny.metro.ObjectFactory -import dev.zacsweeny.metro.Provides -import dev.zacsweeny.metro.SingleIn +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesTo +import dev.zacsweers.metro.ObjectFactory +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.SingleIn import kotlinx.serialization.json.Json /** diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/payment/DefaultPaymentEventSender.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/payment/DefaultPaymentEventSender.kt index faf4a71cff..8b153ef355 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/payment/DefaultPaymentEventSender.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/payment/DefaultPaymentEventSender.kt @@ -6,17 +6,17 @@ package io.element.android.features.wallet.impl.payment -import com.squareup.anvil.annotations.ContributesBinding -import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SessionScope import io.element.android.features.wallet.api.PaymentCardStatus import io.element.android.features.wallet.api.PaymentEventSender import io.element.android.features.wallet.api.PaymentRequest import io.element.android.features.wallet.api.SignedTransaction import io.element.android.features.wallet.api.timeline.TimelineItemPaymentContent -import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import javax.inject.Inject /** * Default implementation of [PaymentEventSender]. @@ -26,9 +26,8 @@ import kotlinx.serialization.json.Json * Event type: co.sulkta.payment.request * Event content: JSON-serialized [PaymentEventData] */ -@Inject @ContributesBinding(SessionScope::class) -class DefaultPaymentEventSender : PaymentEventSender { +class DefaultPaymentEventSender @Inject constructor() : PaymentEventSender { private val json = Json { encodeDefaults = true ignoreUnknownKeys = true diff --git a/features/wallet/impl/src/test/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentContentTest.kt b/features/wallet/impl/src/test/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentContentTest.kt index fb222699fe..a7bdce24f6 100644 --- a/features/wallet/impl/src/test/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentContentTest.kt +++ b/features/wallet/impl/src/test/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentContentTest.kt @@ -98,9 +98,9 @@ class TimelineItemPaymentContentTest { } @Test - fun `type returns m_payment_cardano`() { + fun `type returns payment event type`() { val content = createContent() - assertThat(content.type).isEqualTo("m.payment.cardano") + assertThat(content.type).isEqualTo("co.sulkta.payment.request") } @Test