diff --git a/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt index 628c041112..d91c57c086 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/CreateSecondTwinWalletTask.kt @@ -34,6 +34,11 @@ class CreateSecondTwinWalletTask( return } + if (!TwinsHelper.isTwinsCompatible(firstCardId, card.cardId)) { + callback(CompletionResult.Failure(IncompatibleTwinCard)) + return + } + session.setMessage(preparingMessage) PurgeWalletCommand(publicKey).run(session) { response -> when (response) { diff --git a/app/src/main/java/com/tangem/tap/domain/twins/IncompatibleTwinCard.kt b/app/src/main/java/com/tangem/tap/domain/twins/IncompatibleTwinCard.kt new file mode 100644 index 0000000000..10afdb020a --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/twins/IncompatibleTwinCard.kt @@ -0,0 +1,12 @@ +package com.tangem.tap.domain.twins + +import com.tangem.common.core.TangemError +import com.tangem.tap.tangemSdkManager +import com.tangem.wallet.R + +object IncompatibleTwinCard : TangemError(code = 50005) { + override var customMessage: String = tangemSdkManager.getString( + R.string.twin_error_wrong_twin, + ) + override val messageResId: Int? = null +} \ No newline at end of file diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 6966257f9a..ed6016a6d2 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -428,6 +428,7 @@ на: %s В процессе… Вы отсканировали ту же карту. Для создания twin-кошелька вам необходимо отсканировать карту с номером %d + Вы отсканировали не ту twin-карту. Пожалуйста, попробуйте отсканировать другую Это карта, которую вы держите в руках. У парной карты номер %s.\n\nОбе карты можно использовать для вывода средств из этого кошелька. Один кошелек. Две карты. Сканировать карту #%s diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml index 87318128aa..711e9ca9c5 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -374,6 +374,7 @@ 無法加載交易 進行中… 您掃描了同一張卡片。要創建雙錢包,您需要掃描編號為 %d 的卡 + 你掃描錯了胞胎卡。請嘗試另一個 這一個是你手裡拿著的,另一個是編號為 %s 的,這兩張卡都可以用來從這個錢包中提取資金 一個錢包,兩張卡片 掃描卡片 #%s diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index b958ba0f9f..6b09dce789 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -420,6 +420,7 @@ to: %s In progress… You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d + You\'ve scanned wrong twin card. Please try another one This one that you are holding in your hands and the other one with number %s.\n\nBoth cards can be used to extract funds from this wallet. One wallet. Two cards. Scan the card #%s diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt index f6aa02a2c5..73c31f5a28 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt @@ -4,8 +4,17 @@ import com.tangem.crypto.CryptoUtils import com.tangem.domain.models.scan.CardDTO object TwinsHelper { - private val firstCardSeries = listOf("CB61", "CB64") - private val secondCardSeries = listOf("CB62", "CB65") + + /** + * Card compatibility + * cb61 <-> cb62 + * cb64 <-> cb65 + * + */ + private const val FIRST_CARD_FIRST_SERIES = "CB61" + private const val SECOND_CARD_FIRST_SERIES = "CB62" + private const val FIRST_CARD_SECOND_SERIES = "CB64" + private const val SECOND_CARD_SECOND_SERIES = "CB65" @Suppress("MagicNumber") fun verifyTwinPublicKey(issuerData: ByteArray, cardWalletPublicKey: ByteArray?): Boolean { @@ -16,10 +25,15 @@ object TwinsHelper { return CryptoUtils.verify(cardWalletPublicKey, publicKey, signedKey) } - fun getTwinCardNumber(cardId: String): TwinCardNumber? = when { - firstCardSeries.any(cardId::startsWith) -> TwinCardNumber.First - secondCardSeries.any(cardId::startsWith) -> TwinCardNumber.Second - else -> null + fun getTwinCardNumber(cardId: String): TwinCardNumber? { + val isFirstCard = cardId.startsWith(FIRST_CARD_FIRST_SERIES) || + cardId.startsWith(FIRST_CARD_SECOND_SERIES) + if (isFirstCard) return TwinCardNumber.First + + val isSecondCard = cardId.startsWith(SECOND_CARD_FIRST_SERIES) || + cardId.startsWith(SECOND_CARD_SECOND_SERIES) + if (isSecondCard) return TwinCardNumber.Second + return null } @Suppress("MagicNumber") @@ -30,6 +44,25 @@ object TwinsHelper { val twinCardNumber = getTwinCardNumber(cardId)?.number ?: 1 return "$twinCardId #$twinCardNumber" } + + /** + * Twins compatibility + * cb61 <-> cb62 + * cb64 <-> cb65 + */ + fun isTwinsCompatible(firstCardId: String, secondCardId: String): Boolean { + if (firstCardId.startsWith(FIRST_CARD_FIRST_SERIES) && + secondCardId.startsWith(SECOND_CARD_FIRST_SERIES) + ) { + return true + } + if (firstCardId.startsWith(FIRST_CARD_SECOND_SERIES) && + secondCardId.startsWith(SECOND_CARD_SECOND_SERIES) + ) { + return true + } + return false + } } enum class TwinCardNumber(val number: Int) {