diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index ba9756ce59..1684f52754 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -576,6 +576,7 @@ internal class ChildFactory @Inject constructor( analyticsSource = route.analyticsSource, analyticsAction = route.analyticsAction, nextScreen = route.nextScreen, + shouldShowBackButton = route.shouldShowBackButton, ), componentFactory = createWalletBackupComponentFactory, ) @@ -587,6 +588,7 @@ internal class ChildFactory @Inject constructor( userWalletId = route.userWalletId, source = route.source, nextScreen = route.nextScreen, + shouldShowBackButton = route.shouldShowBackButton, ), componentFactory = updateAccessCodeComponentFactory, ) diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index b5e2aac206..5cda954ac5 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -405,6 +405,7 @@ sealed class AppRoute(val path: String) : Route { val analyticsAction: String, val isUpgradeFlow: Boolean = false, val nextScreen: AppRoute? = null, + val shouldShowBackButton: Boolean = true, ) : AppRoute(path = "/create_wallet_backup/${userWalletId.stringValue}") @Serializable @@ -412,6 +413,7 @@ sealed class AppRoute(val path: String) : Route { val userWalletId: UserWalletId, val source: String, val nextScreen: AppRoute? = null, + val shouldShowBackButton: Boolean = true, ) : AppRoute(path = "/update_access_code/${userWalletId.stringValue}") @Serializable diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt index a8d3ad4fe0..50543caa9d 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt @@ -38,6 +38,7 @@ class AmountStateConverter( private val iconStateConverter: CryptoCurrencyToIconStateConverter, private val isBalanceHidden: Boolean, private val accountTitleUM: AccountTitleUM, + private val isMaxButtonVisible: Boolean = true, ) : Converter { private val amountFieldConverter by lazy(LazyThreadSafetyMode.NONE) { @@ -72,6 +73,7 @@ class AmountStateConverter( amountTextField = amountFieldConverter.convert(value.value), isPrimaryButtonEnabled = false, appCurrency = appCurrency, + isMaxButtonVisible = isMaxButtonVisible, ) } } \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt index 09e6c0d211..c7b3fa5da0 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt @@ -24,6 +24,7 @@ sealed class AmountState { * @param isEditingDisabled indicated whether amount is editable * @param reduceAmountBy reduces amount to be sent by specified value * @param isIgnoreReduce ignores reduce amount value + * @param isMaxButtonVisible indicates whether the "Max" button is shown */ data class Data( override val isPrimaryButtonEnabled: Boolean, @@ -37,6 +38,7 @@ sealed class AmountState { val isEditingDisabled: Boolean = false, val reduceAmountBy: BigDecimal = BigDecimal.ZERO, val isIgnoreReduce: Boolean = false, + val isMaxButtonVisible: Boolean = true, ) : AmountState() data object Empty : AmountState() { diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt index 12335b79ad..6f8d27de62 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt @@ -88,6 +88,7 @@ internal fun LazyListScope.amountFieldV2( @Composable private fun AmountInfo(amountUM: AmountState, onMaxAmountClick: () -> Unit, modifier: Modifier = Modifier) { val tokenIconState = (amountUM as? AmountState.Data)?.tokenIconState ?: CurrencyIconState.Loading + val isMaxButtonVisible = (amountUM as? AmountState.Data)?.isMaxButtonVisible != false Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), @@ -106,22 +107,24 @@ private fun AmountInfo(amountUM: AmountState, onMaxAmountClick: () -> Unit, modi amountUM = amountUM, modifier = Modifier.weight(1f), ) - Text( - text = stringResourceSafe(R.string.send_max_amount), - style = TangemTheme.typography.caption1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier - .padding(end = 16.dp) - .clip(RoundedCornerShape(16.dp)) - .background(TangemTheme.colors.button.secondary) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple(), - onClick = onMaxAmountClick, - ) - .padding(horizontal = 12.dp, vertical = 4.dp) - .testTag(SendScreenTestTags.MAX_BUTTON), - ) + if (isMaxButtonVisible) { + Text( + text = stringResourceSafe(R.string.send_max_amount), + style = TangemTheme.typography.caption1, + color = TangemTheme.colors.text.primary1, + modifier = Modifier + .padding(end = 16.dp) + .clip(RoundedCornerShape(16.dp)) + .background(TangemTheme.colors.button.secondary) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(), + onClick = onMaxAmountClick, + ) + .padding(horizontal = 12.dp, vertical = 4.dp) + .testTag(SendScreenTestTags.MAX_BUTTON), + ) + } } } diff --git a/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt b/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt new file mode 100644 index 0000000000..b612d7f357 --- /dev/null +++ b/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt @@ -0,0 +1,62 @@ +package com.tangem.common.ui.amountScreen.converters + +import com.google.common.truth.Truth.assertThat +import com.tangem.common.ui.account.AccountTitleUM +import com.tangem.common.ui.amountScreen.AmountScreenClickIntents +import com.tangem.common.ui.amountScreen.models.AmountParameters +import com.tangem.common.ui.amountScreen.models.AmountState +import com.tangem.common.ui.amountScreen.models.EnterAmountBoundary +import com.tangem.common.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter +import com.tangem.core.ui.components.currency.icon.CurrencyIconState +import com.tangem.core.ui.extensions.stringReference +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.currency.CryptoCurrencyStatus +import io.mockk.every +import io.mockk.mockk +import org.junit.jupiter.api.Test +import java.math.BigDecimal + +internal class AmountStateConverterTest { + + private val currency = mockk { + every { symbol } returns "ETH" + every { decimals } returns 18 + every { name } returns "Ethereum" + } + private val status = CryptoCurrencyStatus(currency = currency, value = mockk(relaxed = true)) + private val iconStateConverter = mockk { + every { convert(any()) } returns CurrencyIconState.Loading + } + private val clickIntents = mockk(relaxed = true) + private val accountTitleUM = mockk() + + private fun convert(isMaxButtonVisible: Boolean = true): AmountState = AmountStateConverter( + clickIntents = clickIntents, + appCurrency = AppCurrency.Default, + cryptoCurrencyStatus = status, + maxEnterAmount = EnterAmountBoundary( + amount = BigDecimal.ONE, + fiatAmount = BigDecimal.TEN, + fiatRate = BigDecimal.ONE, + ), + iconStateConverter = iconStateConverter, + isBalanceHidden = false, + accountTitleUM = accountTitleUM, + isMaxButtonVisible = isMaxButtonVisible, + ).convert(AmountParameters(title = stringReference("Wallet"), value = "")) + + @Test + fun `GIVEN no isMaxButtonVisible param WHEN convert THEN Data isMaxButtonVisible is true`() { + val result = convert() + + assertThat((result as AmountState.Data).isMaxButtonVisible).isTrue() + } + + @Test + fun `GIVEN isMaxButtonVisible false WHEN convert THEN Data isMaxButtonVisible is false`() { + val result = convert(isMaxButtonVisible = false) + + assertThat((result as AmountState.Data).isMaxButtonVisible).isFalse() + } +} \ No newline at end of file diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index b65cf76828..f56c107dfd 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -144,7 +144,7 @@ Du hast Deine Wallet erfolgreich gesichert. Diese Wörter können bei Verlust nicht wiederhergestellt werden. Bewahre diese an einem sicheren Ort auf. Sicherung abgeschlossen - Deine geheime Wiederherstellungsphrase ist eine feste Folge von %s zufälligen Wörtern, mit denen Du auf Deiner Wallet zugreifst und sie wiederherstellen kannst. + Deine geheime Wiederherstellungsphrase ist eine feste Folge von%s zufälligen Wörtern, mit denen du auf deine Wallet zugreifst und sie wiederherstellen kannst Diese Worte sind unwiederbringlich verloren. Bewahre diese gut auf. Sicher aufbewahren Speicher diese %s Wörter an einem sicheren Ort und gebe diese niemals an andere weiter. @@ -1676,7 +1676,7 @@ Karte kann nicht umbenannt werden Karte eingefroren Kartenzahlung - Es wird vom Zahlungskonto verschwinden + Es wird aus der App verschwinden Karte schließen Geh zurück Ihre Karte schließen? @@ -1823,6 +1823,24 @@ nicht verifizieren. Du kannst bis zu 3 Karten haben. Lösche eine, um eine neue Karte hinzuzufügen. Maximale Anzahl ausgegebener Karten + Ja — für die Nutzung einer regulierten Visa-Karte ist eine Identitätsprüfung Pflicht. Das KYC wird von Sumsub abgewickelt, dem Compliance-Partner. + Muss ich meine Dokumente teilen? + Nein. Das KYC gilt nur für das Tangem Pay Konto. Deine Tangem Wallet bleibt eine separate, self-custodial und KYC-freie Umgebung. + Ist das KYC mit meiner Wallet verknüpft? + Sumsub — ein weltweit regulierter KYC-Anbieter, dem über 4,000 Finanzinstitute vertrauen — verifiziert deine Identität und speichert die Ergebnisse sicher nach ISO 27001- und SOC 2-Standards. + Wer speichert meine persönlichen Daten und wie werden sie geschützt? + Das Kartenguthaben wird in USDC auf Polygon geführt, du kannst es aber mit jedem Asset (USDT, SOL, ETH, BTC, XRP usw.) über die integrierten Swap-Funktionen von Tangem aufladen. + Welche Kryptowährungen kann ich ausgeben? + Gib Krypto überall aus — ohne Banken, ohne Mittelsmänner, ohne Börsen. Self-Custody trifft auf alltägliches Bezahlen. + Online sowie mit Apple Pay bezahlen + Weltweit akzeptiert + Weltweit nutzbar + Nur 1% FX-Gebühr + Hol dir deine Tangem Pay Karte + Zahl, was du siehst + Keine Kaufgebühren, \n1 USDC = 1 USD + Keine Überraschungen + $0 monatlich,\n$0 Aufladegebühr Holen Sie sich Ihre kostenlose virtuelle Tangem Visa-Karte Nutzen Sie USDC für alltägliche Zahlungen Karte erhalten @@ -1835,7 +1853,7 @@ Verknüpfen Sie eine Zahlungskarte Wir richten eine Wallet ein. Holen Sie sich Ihre Tangem Pay Karte - Bezahlen mit + Pay-Betreuung Zahlungskonto Tangem Pay sitzung abgelaufen Ungültige PIN: Sequenzen oder Wiederholungen vermeiden @@ -1853,7 +1871,7 @@ Service vorübergehend nicht verfügbar Daten können derzeit nicht angezeigt werden, Kartenzahlungen funktionieren jedoch weiterhin. Satz \nPIN-Code - Karte deaktiviert + Konto geschlossen Ersetzen deine Karte Karte oder Ring verwenden, um die Sitzung zu verlängern Karte oder Ring verwenden, um die Sitzung zu verlängern diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index 84c8d58f96..24420b84c8 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -1587,6 +1587,10 @@ Tangem Pay ya está en beta Tarjeta congelada Pago con tarjeta + Desaparecerá de la aplicación + Cerrar la tarjeta + Atrás + ¿Cerrar tu tarjeta? Depósito Disputar Explorar transacción @@ -1709,6 +1713,24 @@ Ocultar el bloque KYC Lo sentimos, no pudimos verificar u identidad. + Sí — para usar una tarjeta Visa regulada, la verificación de identidad es obligatoria. El KYC lo gestiona Sumsub, socio de compliance. + ¿Tengo que compartir mis documentos? + No. El KYC se aplica solo a la cuenta Tangem Pay. Tu Tangem Wallet sigue siendo un entorno independiente, de autocustodia y sin KYC. + ¿El KYC se vincula con mi wallet? + Sumsub — un proveedor global de KYC regulado y de confianza para más de 4,000 instituciones financieras — verifica tu identidad y guarda los resultados de forma segura conforme a las normas ISO 27001 y SOC 2. + ¿Quién almacena mis datos personales y cómo se protegen? + El saldo de la tarjeta está denominado en USDC en Polygon, pero puedes recargarlo con cualquier activo (USDT, SOL, ETH, BTC, XRP, etc.) usando los swaps integrados de Tangem. + ¿Qué cripto puedo gastar? + Gasta cripto en cualquier lugar — sin bancos, sin intermediarios y sin exchanges. El poder de la autocustodia unido a los pagos del día a día. + Compra online y con Apple Pay + Aceptada en todo el mundo + Úsala en todo el mundo + Solo 1% de FX-fee + Consigue tu tarjeta Tangem Pay + Paga lo que ves + Sin comisiones por compra, 1 USDC = 1 USD + Sin sorpresas + $0 al mes,\n$0 de recarga Obtén tu tarjeta virtual Tangem Visa gratuita Usa USDC para pagos cotidianos Obtener tarjeta @@ -1719,6 +1741,7 @@ Se creará una cuenta de pago separada sin divulgar tus direcciones y activos Privacidad inigualable Obtén tu tarjeta Tangem Pay en minutos + Soporte Pay Cuenta de pago Tangem Pay sesión expirada PIN no válido: evitar secuencias o repeticiones @@ -1736,7 +1759,7 @@ Servicio temporalmente no disponible No es posible mostrar los datos en este momento, pero los pagos con tarjeta siguen funcionando. Establecer \nCódigo PIN - Tarjeta desactivada + Cuenta cerrada Usa la tarjeta o el anillo para renovar la sesión Usa la tarjeta o el anillo para renovar la sesión Restablecer acceso diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index c3f3bb8e2c..5858ef2704 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -1530,6 +1530,10 @@ Tangem Pay en version bêta Carte gelée Paiement par carte + Il disparaîtra de l’application + Clôturer la carte + Retour + Fermer votre carte ? Dépôt Litige Explorer la transaction @@ -1651,6 +1655,24 @@ Masquer le bloc KYC Désolé, nous n\'avons pas pu vérifier votre identité. + Oui — pour utiliser une carte Visa réglementée, la vérification d’identité est obligatoire. Le KYC est géré par Sumsub, partenaire conformité. + Dois-je fournir mes documents ? + Non. Le KYC s’applique uniquement au compte Tangem Pay. Votre Tangem Wallet reste un environnement distinct, en self-custody et sans KYC. + Le KYC est-il lié à mon wallet ? + Sumsub — prestataire KYC réglementé à l’échelle mondiale et approuvé par plus de 4,000 institutions financières — vérifie votre identité et stocke les résultats de manière sécurisée selon les normes ISO 27001 et SOC 2. + Qui stocke mes données personnelles et comment sont-elles protégées ? + Le solde de la carte est libellé en USDC sur Polygon, mais vous pouvez la recharger avec n’importe quel actif (USDT, SOL, ETH, BTC, XRP, etc.) grâce aux swaps intégrés de Tangem. + Quelles cryptos puis-je dépenser ? + Dépensez vos cryptos partout — sans banque, sans intermédiaire, sans exchange. La self-custody au service des paiements du quotidien. + Paiement en ligne et via Apple Pay + Acceptée partout + Utilisez-la partout + FX-fee ne sont que de 1% + Obtenez votre carte Tangem Pay + Payez ce que vous voyez + Aucun frais d’achat, \n1 USDC = 1 USD + Sans surprise + $0 par mois,\n$0 de recharge Obtenez votre carte virtuelle Tangem Visa gratuite Utilisez USDC pour les paiements quotidiens Obtenir la carte @@ -1661,6 +1683,7 @@ Un compte de paiement séparé sera créé sans divulguer vos adresses et actifs Confidentialité inégalée Obtenez votre carte Tangem Pay en minutes + Assistance Pay Compte de paiement Tangem Pay session expirée Code PIN invalide : évitez les séquences ou les répétitions @@ -1678,7 +1701,7 @@ Service temporairement indisponible Les données ne peuvent pas être affichées pour le moment, mais les paiements par carte fonctionnent toujours. Définir le \ncode PIN - Carte désactivée + Compte clôturé Utilisez carte ou bague pour renouveler la session Utilisez carte ou bague pour renouveler la session Restaurer l\'accès diff --git a/core/res/src/main/res/values-it/strings.xml b/core/res/src/main/res/values-it/strings.xml index 83d4fa8fa7..6f56516eb7 100644 --- a/core/res/src/main/res/values-it/strings.xml +++ b/core/res/src/main/res/values-it/strings.xml @@ -75,6 +75,10 @@ Tangem Pay ora in beta Carta congelata Pagamento con carta + Sparirà dall’app + Chiudere la carta + Indietro + Chiudere la carta? Deposito Contestazione Esplora transazione @@ -183,6 +187,24 @@ Rifiutato Spiacenti, non siamo riusciti a verificare la tua identità. + Sì — per usare una carta Visa regolamentata, la verifica dell’identità è obbligatoria. Il KYC è gestito da Sumsub, partner compliance. + Devo condividere i miei documenti? + No. Il KYC si applica solo all’account Tangem Pay. Il tuo Tangem Wallet resta un ambiente separato, self-custodial e senza KYC. + Il KYC è associato al mio wallet? + Sumsub — provider KYC regolamentato a livello globale e scelto da oltre 4,000 istituzioni finanziarie — verifica la tua identità e conserva in modo sicuro i risultati secondo gli standard ISO 27001 e SOC 2. + Chi conserva i miei dati personali e come vengono protetti? + Il saldo della carta è denominato in USDC su Polygon, ma puoi ricaricarla con qualsiasi asset (USDT, SOL, ETH, BTC, XRP ecc.) tramite gli swap integrati di Tangem. + Quali crypto posso spendere? + Spendi crypto ovunque — senza banche, senza intermediari, senza exchange. La self-custody incontra i pagamenti di ogni giorno. + Acquista online e con Apple Pay + Accettata ovunque + Usala ovunque + Solo 1% di FX-fee + Ottieni la tua carta Tangem Pay + Paga ciò che vedi + Nessuna commissione sugli acquisti, 1 USDC = 1 USD + Nessuna sorpresa + $0 al mese, \n$0 di ricarica Ottieni la tua carta virtuale Tangem Visa gratuita Usa USDC per i pagamenti quotidiani Ottieni carta @@ -193,6 +215,7 @@ Verrà creato un conto di pagamento separato senza divulgare i tuoi indirizzi e asset Privacy senza rivali Ottieni la tua carta Tangem Pay in pochi minuti + Assistenza Pay Conto di pagamento Tangem Pay sessione scaduta PIN non valido: evitare sequenze o ripetizioni @@ -209,7 +232,7 @@ Stiamo risolvendo un problema tecnico. Riprova più tardi. Servizio temporaneamente non disponibile Al momento non è possibile visualizzare i dati, ma i pagamenti con carta continuano a funzionare. - Carta disattivata + Conto chiuso Usa la carta o l\'anello per rinnovare la sessione Usa la carta o l\'anello per rinnovare la sessione Tangem Pay sessione scaduta diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 561ce263e1..cd1d2c518a 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -91,6 +91,7 @@ カスタムトークンの追加 トークンの管理 クレジットカードまたは銀行口座 + トークンを追加 アドレスまたはQRコードを共有 自分のポートフォリオ間で 受け取る @@ -652,6 +653,11 @@ Tangemへのフィードバック 取引を送信できません コインの説明エラー + アプリを正常にご利用いただくため、最新バージョンにアップデートしてください + アップデートが必要です + アップデート + アプリを正常にご利用いただくため、最新バージョンにアップデートしてください。 + アップデートが必要です 残高不足 取引手数料 エラーが発生しました @@ -777,8 +783,8 @@ Koinosネットワークでは、ネットワーク手数料としてManaが必要です。あなたは%1$s / %2$sManaを持っています。 Manaレベル 追加・管理 - 暗号資産を入金またはカードで購入 - 入金して、運用や取引を始めましょう。 + 暗号資産を購入または受け取って、ウォレットを使い始めましょう。 + はじめての暗号資産を手に入れる 暗号資産および取引の追跡を開始するには、トークンを追加してください トークンの管理 QRコードをスキャンして送金するか、アプリに接続します。 @@ -1659,11 +1665,13 @@ カードを凍結できませんでした。しばらくしてからもう一度お試しください。 一時停止 カードが凍結されています + 凍結を解除 サポートを受ける 理由:%s %s・%s MCC %s その他 + PINコード Root化された端末では使用できません 完了 拒否 @@ -1739,6 +1747,7 @@ 変更 現在の利用限度額 1日の利用限度額を読み込めませんでした。もう一度お試しください。 + 読み込み直して再試行 1日の利用限度額を表示できません いつでも再度変更できます 1日の上限を設定しました @@ -1788,6 +1797,24 @@ 本人確認ができませんでした。 最大3枚までカードを保有できます。新しいカードを追加するには、いずれかのカードを削除してください。 カード発行枚数の上限に達しました + はい。規制対象の Visa カードを利用するには、本人確認が必須です。KYC は のコンプライアンスパートナーである Sumsub が担当します。 + 本人確認書類の提出は必要ですか? + いいえ。KYC は Tangem Pay アカウントにのみ適用されます。Tangem Wallet 自体は、引き続き独立したセルフカストディ型の非 KYC 環境です。 + KYC は私のウォレットに紐づきますか? + Sumsub は世界的に規制された KYC プロバイダーで、4,000+ の金融機関に信頼されています。ISO 27001 と SOC 2 に準拠し、本人確認結果を安全に保管します。 + 個人データは誰が保管し、どう保護されますか? + カード残高は Polygon 上の USDC 建てですが、Tangem の内蔵スワップ機能を使えば、任意の資産(USDT、SOL、ETH、BTC、XRP など)でチャージできます。 + どの暗号資産を使えますか? + 銀行なし、中間業者なし、取引所なしで、どこでも暗号資産を使えます。セルフカストディの力を、日常の支払いに。 + オンライン決済や Apple Pay に対応 + 世界中で使える + 世界中で使える + 為替手数料は 1% だけ + Tangem Payカードを手に入れよう + 見たまま支払い + 購入手数料なし、\n1 USDC = 1 USD + あとから驚きなし + 月額 0 ドル、\nチャージ 0 ドル 無料のTangem Visaバーチャルカードを入手 日常の支払いにUSDCを利用 カードをGET @@ -1818,7 +1845,7 @@ サービスは一時的に利用できません 現在、データを表示できませんが、カードでのお支払いは引き続きご利用いただけます。 \nPINコードの設定 - カード無効化済み + 口座は閉鎖されました カードを交換中 カードまたはリングでセッションを更新してください カードまたはリングでセッションを更新してください diff --git a/core/res/src/main/res/values-pt-rBR/strings.xml b/core/res/src/main/res/values-pt-rBR/strings.xml index d3bf24d22d..5b10e64077 100644 --- a/core/res/src/main/res/values-pt-rBR/strings.xml +++ b/core/res/src/main/res/values-pt-rBR/strings.xml @@ -1823,6 +1823,24 @@ Seu perfil. Você pode ter até 3 cartões. Exclua um para adicionar um novo. Número máximo de cartões emitidos + Sim — para usar um cartão Visa regulado, a verificação de identidade é obrigatória. O KYC é feito pela Sumsub, parceira de compliance. + Preciso enviar meus documentos? + Não. O KYC se aplica apenas à conta Tangem Pay. Sua Tangem Wallet continua sendo um ambiente separado, de autocustódia e sem KYC. + O KYC fica vinculado à minha wallet? + A Sumsub — provedora global de KYC, regulamentada e confiável para mais de 4,000 instituições financeiras — verifica sua identidade e armazena os resultados com segurança, seguindo os padrões ISO 27001 e SOC 2. + Quem armazena meus dados pessoais e como eles são protegidos? + O saldo do cartão é denominado em USDC na Polygon, mas você pode carregá-lo com qualquer ativo (USDT, SOL, ETH, BTC, XRP etc.) usando os swaps integrados da Tangem. + Quais criptos posso gastar? + Gaste cripto em qualquer lugar — sem bancos, sem intermediários, sem exchanges. A força da autocustódia nos pagamentos do dia a dia. + Compre online e com Apple Pay + Aceito no mundo todo + Use no mundo todo + Taxa FX de só 1% + Peça seu cartão Tangem Pay + Pague o que vê + Sem taxa de compra, 1 USDC = 1 USD + Sem surpresas + $0 por mês, \n$0 de recarga Obtenha seu cartão virtual Visa Tangem grátis. Use USDC para pagamentos do dia a dia. Obter cartão @@ -1853,7 +1871,7 @@ Serviço temporariamente indisponível Não foi possível exibir os detalhes. No entanto, os pagamentos com cartão ainda estão funcionando. Defina o código PIN. - Cartão desativado + Conta encerrada Substituindo seu cartão Use o cartão ou anel para renovar a sessão Use o cartão ou anel para renovar a sessão diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index a230e50164..8a14eae2d6 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -1665,6 +1665,10 @@ Tangem Pay в режиме beta Карта заморожена Оплата картой + Она сразу пропадёт из приложения + Закрыть карту + Назад + Закрыть карту? Пополнение Оспорить Посмотреть в обозревателе @@ -1675,11 +1679,13 @@ Не удалось заморозить карту, попробуйте еще раз Заморозить Карта заморожена + Разморозить Обратиться в поддержку + Причина: %s %s・%s MCC %s Другое - Невозможно использовать на устройствах с root-доступом. + Нельзя использовать на устройствах с root-доступом Успешно завершено Отклонено В процессе @@ -1786,6 +1792,24 @@ Скрыть KYC с главной Извините, мы не смогли подтвердить ваш профиль. + Да — для использования регулируемой карты Visa нужна обязательная проверка личности. KYC проводит Sumsub, комплаенс-партнёр. + Нужно предоставить документы? + Нет. KYC привязывается только к Tangem Pay. Сам Tangem Wallet остаётся полностью отдельной self-custodial средой без KYC. + KYC будет связан с моим кошельком? + Sumsub — глобально регулируемый KYC-провайдер, которому доверяют более 4,000 финансовых организаций, — проверяет личность и безопасно хранит результаты по стандартам ISO 27001 и SOC 2. + Кто хранит мои персональные данные и как они защищены? + Баланс карты работает на USDC в сети Polygon, но пополнить его можно любым активом (USDT, SOL, ETH, BTC, XRP и др.) через удобные встроенные свопы Tangem. + Какую крипту можно тратить? + Тратьте крипту где угодно — без банков, посредников и бирж. Сила self-custody для повседневных платежей. + Платите онлайн и c Apple Pay + Принимается везде + За покупки не в USD + FX-комиссия 1% + Откройте карту Tangem Pay + Платите сколько видите + Без комиссии за покупки, 1 USDC = 1 USD + Без сюрпризов + $0 в месяц, \n$0 за пополнение Откройте бесплатную виртуальную карту Tangem Visa Оплачивайте ежедневные покупки в USDC Открыть карту @@ -1795,7 +1819,7 @@ Сколько видишь – столько платишь Мы создадим отдельный платежный счет без раскрытия ваших активов \nи их адресов Абсолютная приватность - Откройте виртуальную \nTangem Pay Card + Откройте виртуальную\nTangem Pay Card Поддержка Pay Платежный аккаунт Tangem Pay · Cессия истекла @@ -1813,7 +1837,7 @@ Мы устраняем техническую проблему. Пожалуйста, попробуйте позже. Сервис временно недоступен Не можем показать данные карты, но оплаты продолжают работать. - Карта отключена + Аккаунт закрыт Используйте карту или кольцо для обновления сессии Используйте карту или кольцо для обновления сессии Обновить сессию diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml index e2f072ac6b..459ad0e281 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -1582,6 +1582,10 @@ Tangem Pay у режимі beta Картку заморожено Оплата карткою + Воно зникне з застосунку + Закрити картку + Назад + Закрити вашу картку? Депозит Оскаржити Переглянути транзакцію @@ -1703,6 +1707,24 @@ Приховати блок KYC Вибачте, ми не змогли підтвердити вашу особу. + Так — для користування регульованою карткою Visa обов’язкова верифікація особи. KYC проводить Sumsub, compliance-партнер. + Чи потрібно надавати документи? + Ні. KYC стосується лише акаунта Tangem Pay. Сам Tangem Wallet залишається окремим self-custodial середовищем без KYC. + KYC буде пов’язаний із моїм гаманцем? + Sumsub — глобально регульований KYC-провайдер, якому довіряють понад 4,000 фінансових установ, — перевіряє особу та безпечно зберігає результати відповідно до стандартів ISO 27001 і SOC 2. + Хто зберігає мої персональні дані та як вони захищені? + Баланс картки номінований в USDC у мережі Polygon, але поповнювати його можна будь-яким активом (USDT, SOL, ETH, BTC, XRP тощо) через вбудовані свопи Tangem. + Яку крипту можна витрачати? + Витрачайте крипту будь-де — без банків, посередників і бірж. Сила self-custody для щоденних платежів. + Платіть онлайн і через Apple Pay + Приймається по всьому світу + Користуйтеся всюди + FX-комісія лише 1% + Отримайте картку Tangem Pay + Платіть скільки бачите + Без комісії за покупки, 1 USDC = 1 USD + Без сюрпризів + $0 на місяць, \n$0 за поповнення Отримайте безкоштовну віртуальну картку Tangem Visa Використовуйте USDC для щоденних платежів Отримати картку @@ -1713,6 +1735,7 @@ Буде створено окремий платіжний рахунок без розкриття ваших адрес та активів Неперевершена конфіденційність Отримайте картку Tangem Pay за лічені хвилини + Підтримка Pay Платіжний акаунт Tangem Pay · Сесія закінчилася Слабкий ПІН: не використовуйте повторів або послідовностей. @@ -1730,7 +1753,7 @@ Сервіс тимчасово недоступний Не можемо показати дані картки, але оплати продовжують працювати. Встановіть \nPIN-код - Картку деактивовано + Рахунок закрито Використайте картку або кільце для поновлення сесії Використайте картку або кільце для поновлення сесії Відновити доступ diff --git a/core/res/src/main/res/values-zh-rCN/strings.xml b/core/res/src/main/res/values-zh-rCN/strings.xml index 4d111438f9..ebf8761cf7 100644 --- a/core/res/src/main/res/values-zh-rCN/strings.xml +++ b/core/res/src/main/res/values-zh-rCN/strings.xml @@ -1786,6 +1786,24 @@ 您的个人资料。 您最多可以添加 3 张卡片。删除一张即可添加新卡片。 最大发卡量 + 需要。使用合规监管的 Visa 卡,必须完成身份验证。KYC 由 Sumsub(的合规合作伙伴)处理。 + 我需要提供证件吗? + 不会。KYC 仅适用于 Tangem Pay 账户。你的 Tangem Wallet 仍是独立的、自托管、无需 KYC 的环境。 + KYC 会关联我的钱包吗? + Sumsub 是受全球监管的 KYC 服务商,已获 4,000+ 家金融机构信赖;其依据 ISO 27001 和 SOC 2 标准验证身份并安全保存结果。 + 谁会存储我的个人数据?如何保护? + 卡片余额以 Polygon 上的 USDC 计价,但你可通过 Tangem 内置的便捷兑换功能,使用任意资产(USDT、SOL、ETH、BTC、XRP 等)充值。 + 我可以花哪些加密资产? + 随时随地花加密资产——无需银行、无需中介、无需交易所。自托管的自由,结合日常支付体验。 + 可在线支付,也支持 Apple Pay + 全球受理 + 全球都能用 + 汇兑费仅 1% + 获取你的 Tangem Pay 卡 + 看多少,付多少 + 无消费手续费,\n1 USDC = 1 USD + 没有隐藏费用 + 月费 0 美元,\n充值费 0 美元 免费领取您的 Tangem Visa 虚拟卡 使用 USDC 进行日常支付 获取卡片 @@ -1816,7 +1834,7 @@ 服务暂时不可用 无法显示详细信息。但刷卡支付功能仍然可用。 设置 PIN 码 - 卡片已停用 + 账户已关闭 更换您的卡片 用卡或戒指续期会话 用卡或戒指续期会话 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 3db7971b52..0211276e64 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -318,6 +318,10 @@ Tangem Pay現已開放測試版 卡片已凍結 信用卡支付 + 它將從應用程式中消失 + 關閉卡片 + 返回 + 關閉您的卡片? 充值 爭議 探索交易 @@ -409,6 +413,24 @@ 已拒絕 抱歉,我們無法驗證 您的身份 + 需要。使用受監管的 Visa 卡,必須完成身分驗證。KYC 由 Sumsub(的合規合作夥伴)處理。 + 我需要提交證件嗎? + 不會。KYC 僅適用於 Tangem Pay 帳戶。你的 Tangem Wallet 仍是獨立、自我託管且無需 KYC 的環境。 + KYC 會和我的錢包綁定嗎? + Sumsub 是受全球監管的 KYC 服務商,獲 4,000+ 家金融機構信賴;其依 ISO 27001 與 SOC 2 標準完成驗證並安全保存結果。 + 誰會保存我的個人資料?如何保障安全? + 卡片餘額以 Polygon 上的 USDC 計價,但你可透過 Tangem 內建的便捷兌換功能,用任意資產(USDT、SOL、ETH、BTC、XRP 等)儲值。 + 我可以使用哪些加密資產消費? + 隨時隨地花用加密資產——無需銀行、無需中介、無需交易所。自我託管的掌控力,結合日常支付。 + 可線上付款,也支援 Apple Pay + 全球受理 + 全球都能用 + 匯兌費僅 1% + 取得你的 Tangem Pay 卡 + 看多少,付多少 + 消費零手續費,\n1 USDC = 1 USD + 沒有隱藏費用 + 月費 0 美元,\n儲值費 0 美元 獲取您的免費 Tangem Visa 虛擬卡 使用 USDC 進行日常支付 获取卡片 @@ -419,6 +441,7 @@ 將創建單獨的支付帳戶,且不會透露您的地址和資產 無與倫比的隱私 立即獲取你的 Tangem Pay 卡 + Pay 客服 付款帳戶 Tangem Pay 工作階段已過期 這將產生一組新的卡片資料。您的舊資料將停止使用。此操作無法復原。 @@ -426,7 +449,7 @@ 我们正在修复技术问题。请稍后再试。 服務暫時無法使用 目前無法顯示資料,但卡片支付仍可正常使用。 - 卡片已停用 + 帳戶已關閉 用卡或戒指續期會話 用卡或戒指續期會話 Tangem Pay 工作階段已過期 diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/model/P2PEthPoolIntegration.kt b/domain/staking/src/main/java/com/tangem/domain/staking/model/P2PEthPoolIntegration.kt index 1b68a63e0c..a1baf275df 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/model/P2PEthPoolIntegration.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/model/P2PEthPoolIntegration.kt @@ -45,7 +45,7 @@ class P2PEthPoolIntegration( override val enterMinimumAmount: BigDecimal = DEFAULT_MINIMUM_STAKE - override val exitMinimumAmount: BigDecimal? = null + override val exitMinimumAmount: BigDecimal = DEFAULT_MINIMUM_UNSTAKE override val enterArgs: StakingActionArgs = StakingActionArgs( amountRequirement = StakingAmountRequirement( @@ -59,7 +59,7 @@ class P2PEthPoolIntegration( override val exitArgs: StakingActionArgs = StakingActionArgs( amountRequirement = StakingAmountRequirement( isRequired = true, - minimum = null, + minimum = exitMinimumAmount, maximum = null, ), isPartialAmountDisabled = false, @@ -107,6 +107,7 @@ class P2PEthPoolIntegration( private const val MAX_COOLDOWN_DAYS = 4 private const val MAX_AMOUNT_SCALE = 1 private val DEFAULT_MINIMUM_STAKE = BigDecimal("0.01") + private val DEFAULT_MINIMUM_UNSTAKE = BigDecimal("0.01") private val AVAILABILITY_THRESHOLD = BigDecimal("2") private const val TERMS_OF_SERVICE_URL = "https://www.p2p.org/terms-of-use" diff --git a/domain/staking/src/test/kotlin/com/tangem/domain/staking/model/P2PEthPoolIntegrationTest.kt b/domain/staking/src/test/kotlin/com/tangem/domain/staking/model/P2PEthPoolIntegrationTest.kt index 29ea60484e..2d32510e90 100644 --- a/domain/staking/src/test/kotlin/com/tangem/domain/staking/model/P2PEthPoolIntegrationTest.kt +++ b/domain/staking/src/test/kotlin/com/tangem/domain/staking/model/P2PEthPoolIntegrationTest.kt @@ -146,5 +146,21 @@ internal class P2PEthPoolIntegrationTest { assertThat(integration.enterMinimumAmount).isEqualTo(BigDecimal("0.01")) } + + @Test + fun `minimum unstake is 0_01 ETH`() { + val integration = P2PEthPoolIntegration(StakingIntegrationID.P2PEthPool, emptyList(), emptyMap()) + + assertThat(integration.exitMinimumAmount).isEqualTo(BigDecimal("0.01")) + } + + @Test + fun `exit args expose minimum unstake requirement of 0_01 ETH`() { + val integration = P2PEthPoolIntegration(StakingIntegrationID.P2PEthPool, emptyList(), emptyMap()) + + val exitRequirement = integration.exitArgs!!.amountRequirement!! + assertThat(exitRequirement.isRequired).isTrue() + assertThat(exitRequirement.minimum).isEqualTo(BigDecimal("0.01")) + } } } \ No newline at end of file diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt index 0c2bc00e51..a4cd0e88fb 100644 --- a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt @@ -13,6 +13,7 @@ interface CreateWalletBackupComponent : ComposableContentComponent { val analyticsSource: String, val analyticsAction: String, val nextScreen: AppRoute? = null, + val shouldShowBackButton: Boolean = true, ) interface Factory : ComponentFactory diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/UpdateAccessCodeComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/UpdateAccessCodeComponent.kt index 7c7627342b..7ebac8a85d 100644 --- a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/UpdateAccessCodeComponent.kt +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/UpdateAccessCodeComponent.kt @@ -10,6 +10,7 @@ interface UpdateAccessCodeComponent : ComposableContentComponent { val userWalletId: UserWalletId, val source: String, val nextScreen: AppRoute? = null, + val shouldShowBackButton: Boolean = true, ) interface Factory : ComponentFactory } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt index 75ba090edd..2f9245f98b 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt @@ -67,6 +67,11 @@ internal class CreateWalletBackupModel @Inject constructor( } } + fun isBackButtonVisible(route: CreateWalletBackupRoute): Boolean = when (route) { + is CreateWalletBackupRoute.RecoveryPhraseStart -> params.shouldShowBackButton + else -> true + } + fun onManualBackupStarted() { analyticsEventHandler.send( event = WalletSettingsAnalyticEvents.RecoveryPhraseScreen( diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/DefaultCreateWalletBackupComponent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/DefaultCreateWalletBackupComponent.kt index 7ac2d2ca7e..3d682b9540 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/DefaultCreateWalletBackupComponent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/DefaultCreateWalletBackupComponent.kt @@ -65,6 +65,7 @@ internal class DefaultCreateWalletBackupComponent @AssistedInject constructor( stackState = stackState, modifier = modifier, showTopBar = currentRoute !is CreateWalletBackupRoute.BackupCompleted, + showBackButton = model.isBackButtonVisible(currentRoute), onBackClick = model::onBack, ) } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/ui/CreateWalletBackupContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/ui/CreateWalletBackupContent.kt index 2ec840a129..f53d781a48 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/ui/CreateWalletBackupContent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/ui/CreateWalletBackupContent.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.arkivanov.decompose.extensions.compose.stack.Children import com.arkivanov.decompose.extensions.compose.stack.animation.slide @@ -23,6 +24,7 @@ import com.tangem.features.hotwallet.createwalletbackup.routing.CreateWalletBack internal fun CreateWalletBackupContent( stackState: ChildStack, showTopBar: Boolean, + showBackButton: Boolean, onBackClick: () -> Unit, modifier: Modifier = Modifier, ) { @@ -34,13 +36,19 @@ internal fun CreateWalletBackupContent( .systemBarsPadding(), ) { if (showTopBar) { - TangemTopAppBar( - modifier = Modifier, - startButton = TopAppBarButtonUM.Back( - onBackClicked = onBackClick, - ), - title = stringResourceSafe(id = R.string.common_backup), - ) + if (showBackButton) { + TangemTopAppBar( + modifier = Modifier, + startButton = TopAppBarButtonUM.Back(onBackClicked = onBackClick), + title = stringResourceSafe(id = R.string.common_backup), + ) + } else { + TangemTopAppBar( + modifier = Modifier, + title = stringResourceSafe(id = R.string.common_backup), + titleAlignment = Alignment.CenterHorizontally, + ) + } } Children( diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/DefaultUpdateAccessCodeComponent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/DefaultUpdateAccessCodeComponent.kt index 790f91c922..66d8a7d7cc 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/DefaultUpdateAccessCodeComponent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/DefaultUpdateAccessCodeComponent.kt @@ -55,11 +55,13 @@ internal class DefaultUpdateAccessCodeComponent @AssistedInject constructor( @Composable override fun Content(modifier: Modifier) { val stackState by innerStack.subscribeAsState() + val currentRoute = stackState.active.configuration BackHandler(onBack = model::onChildBack) SetAccessCodeContent( onBackClick = model::onChildBack, + showBackButton = model.isBackButtonVisible(currentRoute), stackState = stackState, ) } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeContent.kt index 5ff0f472db..ad6402dd3d 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeContent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeContent.kt @@ -23,6 +23,7 @@ import com.tangem.features.hotwallet.updateaccesscode.routing.UpdateAccessCodeRo @Composable internal fun SetAccessCodeContent( onBackClick: () -> Unit, + showBackButton: Boolean, stackState: ChildStack, ) { Column( @@ -32,17 +33,17 @@ internal fun SetAccessCodeContent( .imePadding() .systemBarsPadding(), ) { - if (stackState.active.configuration is UpdateAccessCodeRoute.SetupFinished) { + if (showBackButton) { TangemTopAppBar( modifier = Modifier, title = stringResourceSafe(R.string.access_code_navtitle), - titleAlignment = Alignment.CenterHorizontally, + startButton = TopAppBarButtonUM.Back(onBackClick), ) } else { TangemTopAppBar( modifier = Modifier, title = stringResourceSafe(R.string.access_code_navtitle), - startButton = TopAppBarButtonUM.Back(onBackClick), + titleAlignment = Alignment.CenterHorizontally, ) } Children( diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeModel.kt index b822a2ca71..8309b39ebb 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/updateaccesscode/UpdateAccessCodeModel.kt @@ -45,6 +45,12 @@ internal class UpdateAccessCodeModel @Inject constructor( } } + fun isBackButtonVisible(route: UpdateAccessCodeRoute): Boolean = when (route) { + is UpdateAccessCodeRoute.SetAccessCode -> params.shouldShowBackButton + is UpdateAccessCodeRoute.ConfirmAccessCode -> true + is UpdateAccessCodeRoute.SetupFinished -> false + } + override fun onNewAccessCodeInput(userWalletId: UserWalletId, accessCode: String) { analyticsEventHandler.send(WalletSettingsAnalyticEvents.ReEnterAccessCodeScreen(source = params.source)) stackNavigation.push(UpdateAccessCodeRoute.ConfirmAccessCode(userWalletId, accessCode)) diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt index a4276d56a6..5f75691356 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt @@ -20,6 +20,7 @@ import com.tangem.domain.models.account.Account import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.staking.StakingBalanceEntry import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.staking.model.P2PEthPoolIntegration import com.tangem.domain.staking.model.Period import com.tangem.domain.staking.model.StakingIntegration import com.tangem.domain.staking.model.StakingTarget @@ -261,6 +262,7 @@ internal class SetInitialDataStateTransformer( walletTitle = stringReference(userWalletProvider().name), prefixText = resourceReference(R.string.common_from), ).convert(account), + isMaxButtonVisible = integration !is P2PEthPoolIntegration, ).convert( AmountParameters( title = stringReference(userWalletProvider().name), diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModel.kt index ac8975a3e1..f0585fb4f5 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModel.kt @@ -80,14 +80,16 @@ internal class TangemPayHotWalletOnboardingModel @Inject constructor( TangemLogger.i("[TangemPay][HWO]Hot wallet created") clearAppsFlyerDeeplinkUseCase(AppsFlyerDeeplinkSource.TangemPayHotWalletOnboarding) - router.replaceCurrent( + router.replaceAll( AppRoute.CreateWalletBackup( userWalletId = userWallet.walletId, analyticsSource = AnalyticsParam.ScreensSources.TangemPayHotWalletOnboarding.value, analyticsAction = WalletSettingsAnalyticEvents.RecoveryPhraseScreenAction.Backup.value, + shouldShowBackButton = false, nextScreen = AppRoute.UpdateAccessCode( userWalletId = userWallet.walletId, source = AnalyticsParam.ScreensSources.TangemPayHotWalletOnboarding.value, + shouldShowBackButton = false, nextScreen = AppRoute.TangemPayOnboarding( mode = AppRoute.TangemPayOnboarding.Mode.FirstSetup(userWallet.walletId), ), diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingScreen.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingScreen.kt index 7af6c55773..6435e64bb2 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingScreen.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingScreen.kt @@ -61,7 +61,9 @@ private fun Content(state: TangemPayHotWalletOnboardingUM, modifier: Modifier = .verticalScroll(rememberScrollState()), ) { Text( - modifier = Modifier.padding(40.dp), + modifier = Modifier + .fillMaxWidth() + .padding(40.dp), text = stringResourceSafe(R.string.tangempay_onboarding_title), style = TangemTheme.typography.h2, color = TangemTheme.colors.text.primary1, @@ -73,12 +75,14 @@ private fun Content(state: TangemPayHotWalletOnboardingUM, modifier: Modifier = contentDescription = null, contentScale = ContentScale.FillWidth, ) - Features(modifier = Modifier.padding(horizontal = 40.dp)) + Features( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 40.dp), + ) Spacer(Modifier.weight(1f)) Column( - modifier = Modifier - .padding(horizontal = 16.dp) - .padding(bottom = 16.dp), + modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp), ) { NavigationPrimaryButton( diff --git a/features/tangempay/onboarding/impl/src/test/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModelTest.kt b/features/tangempay/onboarding/impl/src/test/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModelTest.kt index 2ba50a36c5..a2d4591f4d 100644 --- a/features/tangempay/onboarding/impl/src/test/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModelTest.kt +++ b/features/tangempay/onboarding/impl/src/test/kotlin/com/tangem/features/tangempay/hotwallet/TangemPayHotWalletOnboardingModelTest.kt @@ -82,8 +82,12 @@ internal class TangemPayHotWalletOnboardingModelTest { coVerify { clearAppsFlyerDeeplinkUseCase(AppsFlyerDeeplinkSource.TangemPayHotWalletOnboarding) } verify { - router.replaceCurrent( - match { it is AppRoute.CreateWalletBackup && it.userWalletId == testUserWalletId }, + router.replaceAll( + match { route -> + route is AppRoute.CreateWalletBackup && + route.userWalletId == testUserWalletId && + !route.shouldShowBackButton + }, ) } } @@ -102,7 +106,7 @@ internal class TangemPayHotWalletOnboardingModelTest { assertThat(model.uiState.value.isLoading).isFalse() verify { uiMessageSender.send(match { true }) } coVerify(exactly = 0) { clearAppsFlyerDeeplinkUseCase(any()) } - verify(exactly = 0) { router.replaceCurrent(any()) } + verify(exactly = 0) { router.replaceAll(*anyVararg()) } } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt index 0321bc421a..89fe896c13 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt @@ -1,6 +1,7 @@ package com.tangem.feature.wallet.deeplink import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.common.routing.deeplink.DeeplinkConst import com.tangem.common.routing.deeplink.DeeplinkConst.PROMO_CODE_KEY import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -91,7 +92,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( multiNetworkStatusSupplier .invoke(MultiNetworkStatusProducer.Params(userWallet.walletId)) .first { statuses -> - statuses.any { status -> status.network.rawId == Blockchain.Bitcoin.id } + statuses.any { status -> status.network.rawId == Blockchain.Bitcoin.toNetworkId() } } }, ) @@ -104,7 +105,9 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( TangemLogger.withTag(LOG_TAG).d("All user cryptoCurrencies on main ${cryptoCurrencies?.size}") - val bitcoinCurrency = cryptoCurrencies?.firstOrNull { it.id.rawNetworkId == Blockchain.Bitcoin.id } + val bitcoinCurrency = cryptoCurrencies?.firstOrNull { + it.id.rawNetworkId == Blockchain.Bitcoin.toNetworkId() + } TangemLogger.withTag(LOG_TAG).d("BitcoinCurrency $bitcoinCurrency") val bitcoinStatus = networkStatuses?.firstOrNull { status -> diff --git a/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt b/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt index a2e0fbda2f..16a9f088b1 100644 --- a/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt +++ b/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt @@ -5,6 +5,7 @@ package com.tangem.feature.wallet.presentation.wallet.deeplink import arrow.core.Either import com.google.common.truth.Truth import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.common.routing.deeplink.DeeplinkConst import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.ui.UiMessage @@ -92,13 +93,13 @@ class DefaultPromoDeeplinkHandlerTest { every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) val ethStatus = buildNetworkStatus(rawNetworkId = "ethereum", address = "0x123") - val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz") + val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qxyz") coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flow { emit(emptySet()) emit(setOf(ethStatus)) emit(setOf(btcStatus)) } - val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id) + val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId()) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoin) coEvery { activateBitcoinPromocodeUseCase.invoke(any(), "bc1qxyz", promoCode) } returns Either.Right("ok") val dispatcherProvider = testDispatcherProvider(testScheduler) @@ -203,9 +204,9 @@ class DefaultPromoDeeplinkHandlerTest { val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to "PROMO123") val userWallet = mockUserWallet("ABCDEF") every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) - val btcUnreachable = buildUnreachableNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id) + val btcUnreachable = buildUnreachableNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId()) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcUnreachable)) - val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id) + val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId()) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoin) val dispatcherProvider = testDispatcherProvider(testScheduler) @@ -245,9 +246,9 @@ class DefaultPromoDeeplinkHandlerTest { val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to promoCode) val userWallet = mockUserWallet("ABCDEF") every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) - val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz") + val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qxyz") coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatus)) - val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id) + val btcCoin = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId()) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoin) coEvery { activateBitcoinPromocodeUseCase.invoke(any(), "bc1qxyz", promoCode) } returns Either.Right("ok") val dispatcherProvider = testDispatcherProvider(testScheduler) @@ -363,9 +364,9 @@ class DefaultPromoDeeplinkHandlerTest { val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to promoCode) val userWallet = mockUserWallet("ABCDEF") every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) - val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz") + val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qxyz") coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatus)) - val btcCurrency = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id) + val btcCurrency = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId()) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCurrency) coEvery { activateBitcoinPromocodeUseCase.invoke(any(), "bc1qxyz", promoCode) } returns Either.Left(error) val dispatcherProvider = testDispatcherProvider(testScheduler) @@ -397,7 +398,7 @@ class DefaultPromoDeeplinkHandlerTest { val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to "PROMO123") val userWallet = mockUserWallet("ABCDEF") every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) - val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz") + val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qxyz") coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatus)) val ethOnly = buildCryptoCurrency(rawNetworkId = "ethereum") coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(ethOnly) @@ -433,7 +434,7 @@ class DefaultPromoDeeplinkHandlerTest { every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet) val ethStatus = buildNetworkStatus(rawNetworkId = "ethereum", address = "0x123") - val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz") + val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qxyz") coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flow { emit(emptySet()) emit(setOf(ethStatus)) @@ -487,19 +488,19 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCard = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcard", derivationPath = dpCard, ) val btcStatusCustom = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcustom", derivationPath = dpCustom, ) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatusCard, btcStatusCustom)) - val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCustom) - val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCard) + val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCustom) + val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCard) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf( btcCoinCustom, btcCoinCard, @@ -544,18 +545,18 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCard = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcard", derivationPath = dpCard, ) val btcStatusCustom = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcustom", derivationPath = dpCustom, ) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatusCard, btcStatusCustom)) - val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCard) + val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCard) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoinCard) coEvery { activateBitcoinPromocodeUseCase.invoke(any(), "bc1qcard", promoCode) } returns Either.Right("ok") @@ -607,12 +608,12 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCard = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcard", derivationPath = dpCard, ) val btcStatusCustom = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcustom", derivationPath = dpCustom, ) @@ -666,14 +667,14 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCard = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcard", derivationPath = dpCard, ) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatusCard)) - val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCustom) - val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCard) + val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCustom) + val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCard) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf( btcCoinCustom, btcCoinCard, @@ -725,13 +726,13 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCustom = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcustom", derivationPath = dpCustom, ) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatusCustom)) - val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCard) + val btcCoinCard = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCard) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoinCard) val dispatcherProvider = testDispatcherProvider(testScheduler) @@ -780,13 +781,13 @@ class DefaultPromoDeeplinkHandlerTest { val dpCustom = Network.DerivationPath.Custom("m/84'/0'/0'") val btcStatusCard = buildNetworkStatus( - rawNetworkId = Blockchain.Bitcoin.id, + rawNetworkId = Blockchain.Bitcoin.toNetworkId(), address = "bc1qcard", derivationPath = dpCard, ) coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatusCard)) - val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.id, derivationPath = dpCustom) + val btcCoinCustom = buildCryptoCurrency(rawNetworkId = Blockchain.Bitcoin.toNetworkId(), derivationPath = dpCustom) coEvery { multiWalletCryptoCurrenciesSupplier.getSyncOrNull(any()) } returns setOf(btcCoinCustom) val dispatcherProvider = testDispatcherProvider(testScheduler)