fix(wallet): resolve audit findings - DI typos, missing dependency, event type consistency

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)
This commit is contained in:
Kayos 2026-03-27 12:11:45 -07:00
parent f2b95d6b8a
commit 06a9c6b0d2
8 changed files with 23 additions and 22 deletions

View file

@ -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)

View file

@ -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
/**

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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
/**

View file

@ -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

View file

@ -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