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