Updated on 2026-08-14
This commit is contained in:
commit
9783f9ce3d
12 changed files with 67 additions and 39 deletions
|
|
@ -73,7 +73,7 @@ private val walletStoresRepository by lazy { WalletStoresRepository.provideDefau
|
||||||
private val walletManagersRepository by lazy {
|
private val walletManagersRepository by lazy {
|
||||||
WalletManagersRepository.provideDefaultImplementation(
|
WalletManagersRepository.provideDefaultImplementation(
|
||||||
walletManagerFactory = WalletManagerFactory(
|
walletManagerFactory = WalletManagerFactory(
|
||||||
blockchainSdkConfig = store.state.globalState.configManager
|
config = store.state.globalState.configManager
|
||||||
?.config
|
?.config
|
||||||
?.blockchainSdkConfig
|
?.blockchainSdkConfig
|
||||||
?: BlockchainSdkConfig(),
|
?: BlockchainSdkConfig(),
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,12 @@ class UserWalletIdBuilder private constructor(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun walletPublicKey(publicKey: ByteArray): UserWalletId {
|
||||||
|
return UserWalletIdBuilder(
|
||||||
|
publicKey = publicKey,
|
||||||
|
).build()!!
|
||||||
|
}
|
||||||
|
|
||||||
private fun findPublicKey(wallets: List<CardDTO.Wallet>): ByteArray? {
|
private fun findPublicKey(wallets: List<CardDTO.Wallet>): ByteArray? {
|
||||||
return wallets.firstOrNull()
|
return wallets.firstOrNull()
|
||||||
?.publicKey
|
?.publicKey
|
||||||
|
|
|
||||||
|
|
@ -199,9 +199,9 @@ object ScanCardProcessor {
|
||||||
val isOnboardingCase = result.data
|
val isOnboardingCase = result.data
|
||||||
if (isOnboardingCase) {
|
if (isOnboardingCase) {
|
||||||
onWalletNotCreated()
|
onWalletNotCreated()
|
||||||
store.dispatchOnMain(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false))
|
store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false))
|
||||||
store.dispatchOnMain(OnboardingSaltPayAction.SetDependencies(manager, config))
|
store.dispatch(OnboardingSaltPayAction.SetDependencies(manager, config))
|
||||||
store.dispatchOnMain(OnboardingSaltPayAction.Update)
|
store.dispatch(OnboardingSaltPayAction.Update)
|
||||||
navigateTo(AppScreen.OnboardingWallet) { onProgressStateChange(it) }
|
navigateTo(AppScreen.OnboardingWallet) { onProgressStateChange(it) }
|
||||||
} else {
|
} else {
|
||||||
delay(DELAY_SDK_DIALOG_CLOSE)
|
delay(DELAY_SDK_DIALOG_CLOSE)
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,11 @@ class GnosisRegistrator(
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun transferFrom(amountToClaim: BigDecimal, signer: TransactionSigner): Result<Unit> {
|
suspend fun transferFrom(amountToClaim: BigDecimal, signer: TransactionSigner): Result<Unit> {
|
||||||
|
if (walletManager.txCount == -1L) {
|
||||||
|
walletManager.safeUpdate().successOr {
|
||||||
|
return Result.Failure(BlockchainSdkError.WrappedThrowable(it.error))
|
||||||
|
}
|
||||||
|
}
|
||||||
val amount = Amount(token, amountToClaim)
|
val amount = Amount(token, amountToClaim)
|
||||||
val feeAmount = walletManager.getFeeToTransferFrom(amount, addressTreasureSafe)
|
val feeAmount = walletManager.getFeeToTransferFrom(amount, addressTreasureSafe)
|
||||||
.extractFeeAmount().successOr { return it }
|
.extractFeeAmount().successOr { return it }
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import com.tangem.blockchain.common.AmountType
|
||||||
import com.tangem.blockchain.common.BlockchainSdkError
|
import com.tangem.blockchain.common.BlockchainSdkError
|
||||||
import com.tangem.blockchain.common.TransactionSigner
|
import com.tangem.blockchain.common.TransactionSigner
|
||||||
import com.tangem.blockchain.extensions.successOr
|
import com.tangem.blockchain.extensions.successOr
|
||||||
|
import com.tangem.common.core.TangemSdkError
|
||||||
import com.tangem.common.extensions.guard
|
import com.tangem.common.extensions.guard
|
||||||
import com.tangem.common.extensions.isZero
|
import com.tangem.common.extensions.isZero
|
||||||
import com.tangem.common.extensions.toHexString
|
import com.tangem.common.extensions.toHexString
|
||||||
|
|
@ -24,9 +25,18 @@ import com.tangem.datasource.config.models.KYCProvider
|
||||||
import com.tangem.datasource.config.models.SaltPayConfig
|
import com.tangem.datasource.config.models.SaltPayConfig
|
||||||
import com.tangem.domain.common.extensions.successOr
|
import com.tangem.domain.common.extensions.successOr
|
||||||
import com.tangem.domain.common.util.UserWalletId
|
import com.tangem.domain.common.util.UserWalletId
|
||||||
|
import com.tangem.datasource.api.paymentology.AttestationResponse
|
||||||
|
import com.tangem.datasource.api.paymentology.PaymentologyApiService
|
||||||
|
import com.tangem.datasource.api.paymentology.RegisterKYCRequest
|
||||||
|
import com.tangem.datasource.api.paymentology.RegisterWalletRequest
|
||||||
|
import com.tangem.datasource.api.paymentology.RegisterWalletResponse
|
||||||
|
import com.tangem.datasource.api.paymentology.RegistrationResponse
|
||||||
|
import com.tangem.datasource.api.paymentology.tryExtractError
|
||||||
|
import com.tangem.domain.common.extensions.successOr
|
||||||
import com.tangem.operations.attestation.AttestWalletKeyResponse
|
import com.tangem.operations.attestation.AttestWalletKeyResponse
|
||||||
import com.tangem.tap.common.extensions.safeUpdate
|
import com.tangem.tap.common.extensions.safeUpdate
|
||||||
import com.tangem.tap.domain.getFirstToken
|
import com.tangem.tap.domain.getFirstToken
|
||||||
|
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
|
||||||
import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError
|
import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
@ -39,11 +49,12 @@ import com.tangem.blockchain.extensions.Result as BlockchainResult
|
||||||
class SaltPayActivationManager(
|
class SaltPayActivationManager(
|
||||||
val cardId: String,
|
val cardId: String,
|
||||||
val cardPublicKey: ByteArray,
|
val cardPublicKey: ByteArray,
|
||||||
val walletPublicKey: ByteArray,
|
|
||||||
private val kycProvider: KYCProvider,
|
private val kycProvider: KYCProvider,
|
||||||
private val paymentologyService: PaymentologyApiService,
|
private val paymentologyService: PaymentologyApiService,
|
||||||
private val gnosisRegistrator: GnosisRegistrator,
|
private val gnosisRegistrator: GnosisRegistrator,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
val walletPublicKey = gnosisRegistrator.walletManager.wallet.publicKey.seedKey
|
||||||
val kycUrlProvider = KYCUrlProvider(walletPublicKey, kycProvider)
|
val kycUrlProvider = KYCUrlProvider(walletPublicKey, kycProvider)
|
||||||
|
|
||||||
private val approvalValue: BigDecimal = BigDecimal(2).pow(256).minus(BigDecimal.ONE)
|
private val approvalValue: BigDecimal = BigDecimal(2).pow(256).minus(BigDecimal.ONE)
|
||||||
|
|
@ -73,18 +84,12 @@ class SaltPayActivationManager(
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun checkRegistration(): Result<RegistrationResponse.Item> {
|
suspend fun checkRegistration(): Result<RegistrationResponse.Item> {
|
||||||
|
val requestItem = CheckRegistrationRequests.Item(cardId, cardPublicKey.toHexString())
|
||||||
|
val request = CheckRegistrationRequests(listOf(requestItem))
|
||||||
|
|
||||||
val response: RegistrationResponse = withContext(Dispatchers.IO) {
|
val response: RegistrationResponse = withContext(Dispatchers.IO) {
|
||||||
performRequest {
|
performRequest {
|
||||||
paymentologyService.api.checkRegistration(
|
paymentologyService.api.checkRegistration(request)
|
||||||
request = CheckRegistrationRequests(
|
|
||||||
requests = listOf(
|
|
||||||
CheckRegistrationRequests.Item(
|
|
||||||
cardId = cardId,
|
|
||||||
publicKey = cardPublicKey.toHexString(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.successOr { return it }
|
.successOr { return it }
|
||||||
|
|
@ -104,14 +109,10 @@ class SaltPayActivationManager(
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun requestAttestationChallenge(): Result<AttestationResponse> {
|
suspend fun requestAttestationChallenge(): Result<AttestationResponse> {
|
||||||
|
val requestItem = CheckRegistrationRequests.Item(cardId, cardPublicKey.toHexString())
|
||||||
return withContext(Dispatchers.IO) {
|
return withContext(Dispatchers.IO) {
|
||||||
performRequest {
|
performRequest {
|
||||||
paymentologyService.api.requestAttestationChallenge(
|
paymentologyService.api.requestAttestationChallenge(requestItem)
|
||||||
request = CheckRegistrationRequests.Item(
|
|
||||||
cardId = cardId,
|
|
||||||
publicKey = cardPublicKey.toHexString(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.successOr { return it }
|
.successOr { return it }
|
||||||
|
|
@ -139,7 +140,9 @@ class SaltPayActivationManager(
|
||||||
pin = pinCode,
|
pin = pinCode,
|
||||||
)
|
)
|
||||||
return withContext(Dispatchers.IO) {
|
return withContext(Dispatchers.IO) {
|
||||||
performRequest { paymentologyService.api.registerWallet(request) }
|
performRequest {
|
||||||
|
paymentologyService.api.registerWallet(request)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.successOr { return it }
|
.successOr { return it }
|
||||||
.tryExtractError()
|
.tryExtractError()
|
||||||
|
|
@ -159,7 +162,13 @@ class SaltPayActivationManager(
|
||||||
|
|
||||||
suspend fun claim(amountToClaim: BigDecimal, signer: TransactionSigner): Result<Unit> {
|
suspend fun claim(amountToClaim: BigDecimal, signer: TransactionSigner): Result<Unit> {
|
||||||
gnosisRegistrator.transferFrom(amountToClaim, signer).successOr {
|
gnosisRegistrator.transferFrom(amountToClaim, signer).successOr {
|
||||||
return Result.Failure(SaltPayActivationError.ClaimTransactionFailed)
|
val userCancelledError = (it.error as? BlockchainSdkError.WrappedTangemError)
|
||||||
|
?.tangemError as? TangemSdkError.UserCancelled
|
||||||
|
|
||||||
|
return when (userCancelledError) {
|
||||||
|
null -> Result.Failure(SaltPayActivationError.ClaimTransactionFailed)
|
||||||
|
else -> Result.Failure(userCancelledError)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Result.Success(Unit)
|
return Result.Success(Unit)
|
||||||
}
|
}
|
||||||
|
|
@ -202,7 +211,6 @@ class SaltPayActivationManager(
|
||||||
gnosisRegistrator = GnosisRegistrator.stub(),
|
gnosisRegistrator = GnosisRegistrator.stub(),
|
||||||
cardId = "",
|
cardId = "",
|
||||||
cardPublicKey = byteArrayOf(),
|
cardPublicKey = byteArrayOf(),
|
||||||
walletPublicKey = byteArrayOf(),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -212,7 +220,7 @@ class KYCUrlProvider(
|
||||||
kycProvider: KYCProvider,
|
kycProvider: KYCProvider,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
val kycRefId = UserWalletId(walletPublicKey).stringValue
|
val kycRefId = UserWalletIdBuilder.walletPublicKey(walletPublicKey).stringValue
|
||||||
|
|
||||||
val requestUrl: String = makeWebRequestUrl(kycProvider)
|
val requestUrl: String = makeWebRequestUrl(kycProvider)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.tangem.Message
|
||||||
import com.tangem.blockchain.common.Amount
|
import com.tangem.blockchain.common.Amount
|
||||||
import com.tangem.blockchain.extensions.successOr
|
import com.tangem.blockchain.extensions.successOr
|
||||||
import com.tangem.common.Filter
|
import com.tangem.common.Filter
|
||||||
|
import com.tangem.common.core.TangemSdkError
|
||||||
import com.tangem.common.extensions.guard
|
import com.tangem.common.extensions.guard
|
||||||
import com.tangem.common.services.Result
|
import com.tangem.common.services.Result
|
||||||
import com.tangem.core.analytics.Analytics
|
import com.tangem.core.analytics.Analytics
|
||||||
|
|
@ -199,7 +200,11 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App
|
||||||
}
|
}
|
||||||
state.saltPayManager.claim(amountToClaim.value!!, signer).successOr {
|
state.saltPayManager.claim(amountToClaim.value!!, signer).successOr {
|
||||||
dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.Claim))
|
dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.Claim))
|
||||||
onException(it.error)
|
if (it.error is TangemSdkError.UserCancelled) {
|
||||||
|
handleInProgress = false
|
||||||
|
} else {
|
||||||
|
onException(it.error)
|
||||||
|
}
|
||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -278,6 +283,7 @@ suspend fun SaltPayActivationManager.update(
|
||||||
|
|
||||||
val registrationResponse = checkRegistration().successOr { return it }
|
val registrationResponse = checkRegistration().successOr { return it }
|
||||||
val amountToClaim = getAmountToClaimIfNeeded(this, currentAmountToClaim)
|
val amountToClaim = getAmountToClaimIfNeeded(this, currentAmountToClaim)
|
||||||
|
dispatchOnMain(OnboardingSaltPayAction.SetAmountToClaim(amountToClaim))
|
||||||
|
|
||||||
val newStep = try {
|
val newStep = try {
|
||||||
determineStep(currentStep, amountToClaim, registrationResponse)
|
determineStep(currentStep, amountToClaim, registrationResponse)
|
||||||
|
|
|
||||||
|
|
@ -67,14 +67,10 @@ data class OnboardingSaltPayState(
|
||||||
if (!scanResponse.cardTypesResolver.isSaltPay()) {
|
if (!scanResponse.cardTypesResolver.isSaltPay()) {
|
||||||
throw IllegalArgumentException("Can't initialize the OnboardingSaltPayMiddleware if card is not SalPay")
|
throw IllegalArgumentException("Can't initialize the OnboardingSaltPayMiddleware if card is not SalPay")
|
||||||
}
|
}
|
||||||
val saltPaySingleWallet = scanResponse.card.wallets.firstOrNull().guard {
|
|
||||||
throw NullPointerException("SaltPay card must have one wallet at least")
|
|
||||||
}
|
|
||||||
|
|
||||||
return SaltPayActivationManager(
|
return SaltPayActivationManager(
|
||||||
cardId = scanResponse.card.cardId,
|
cardId = scanResponse.card.cardId,
|
||||||
cardPublicKey = scanResponse.card.cardPublicKey,
|
cardPublicKey = scanResponse.card.cardPublicKey,
|
||||||
walletPublicKey = saltPaySingleWallet.publicKey,
|
|
||||||
kycProvider = kycProvider,
|
kycProvider = kycProvider,
|
||||||
paymentologyService = paymentologyService,
|
paymentologyService = paymentologyService,
|
||||||
gnosisRegistrator = gnosisRegistrator,
|
gnosisRegistrator = gnosisRegistrator,
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ internal class OnboardingSaltPayView(
|
||||||
val uri = Uri.parse(state.onboardingSaltPayState.saltPayCardArtworkUrl)
|
val uri = Uri.parse(state.onboardingSaltPayState.saltPayCardArtworkUrl)
|
||||||
walletFragment.loadImageIntoImageView(uri, imvFrontCard)
|
walletFragment.loadImageIntoImageView(uri, imvFrontCard)
|
||||||
}
|
}
|
||||||
imvFirstBackupCard.load(R.drawable.card_placeholder_wallet)
|
imvFirstBackupCard.load(R.drawable.img_salt_pay_visa)
|
||||||
|
|
||||||
// if (state.onboardingSaltPayState?.saltPayCardArtworkUrl == null) {
|
// if (state.onboardingSaltPayState?.saltPayCardArtworkUrl == null) {
|
||||||
// //if saltPay url not loaded -> load from resource
|
// //if saltPay url not loaded -> load from resource
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle
|
||||||
cardsWidget.toFolded(false)
|
cardsWidget.toFolded(false)
|
||||||
|
|
||||||
if (viewBackupCount > backupCardsCounts) {
|
if (viewBackupCount > backupCardsCounts) {
|
||||||
flCardsContainer.removeViewAt(viewBackupCount - 1)
|
flCardsContainer.removeViews(0, viewBackupCount - backupCardsCounts)
|
||||||
} else {
|
} else {
|
||||||
flCardsContainer.inflate(R.layout.view_onboarding_card, true)
|
flCardsContainer.inflate(R.layout.view_onboarding_card, true)
|
||||||
}
|
}
|
||||||
|
|
@ -115,7 +115,12 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createLeapfrogWidget(container: FrameLayout, deviceScaleFactor: Float): LeapfrogWidget {
|
private fun createLeapfrogWidget(container: FrameLayout, deviceScaleFactor: Float): LeapfrogWidget {
|
||||||
val leapfrogCalculator = PropertyCalculator(yTranslationFactor = 25f * deviceScaleFactor)
|
val leapfrogCalculator = PropertyCalculator(
|
||||||
|
yTranslationFactor = when (container.childCount) {
|
||||||
|
3 -> 25f
|
||||||
|
else -> 35f
|
||||||
|
} * deviceScaleFactor,
|
||||||
|
)
|
||||||
return LeapfrogWidget(container, leapfrogCalculator)
|
return LeapfrogWidget(container, leapfrogCalculator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ class ConfigValueModel(
|
||||||
val quiknodeApiKey: String,
|
val quiknodeApiKey: String,
|
||||||
val bscQuiknodeSubdomain: String,
|
val bscQuiknodeSubdomain: String,
|
||||||
val bscQuiknodeApiKey: String,
|
val bscQuiknodeApiKey: String,
|
||||||
|
val nowNodesApiKey: String,
|
||||||
|
val getBlockApiKey: String,
|
||||||
val blockcypherTokens: Set<String>?,
|
val blockcypherTokens: Set<String>?,
|
||||||
val infuraProjectId: String?,
|
val infuraProjectId: String?,
|
||||||
val appsFlyer: AppsFlyer,
|
val appsFlyer: AppsFlyer,
|
||||||
|
|
|
||||||
|
|
@ -134,13 +134,13 @@
|
||||||
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
|
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
|
||||||
<string name="main_scan_card_warning_view_title">Scan your card</string>
|
<string name="main_scan_card_warning_view_title">Scan your card</string>
|
||||||
<string name="main_tokens">Tokens</string>
|
<string name="main_tokens">Tokens</string>
|
||||||
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets.</string>
|
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets</string>
|
||||||
<string name="onboarding_access_code_feature_1_title">Protect</string>
|
<string name="onboarding_access_code_feature_1_title">Protect</string>
|
||||||
<string name="onboarding_access_code_feature_2_description">You can set an individual access code on each card later.</string>
|
<string name="onboarding_access_code_feature_2_description">You can set up an individual access code on each card later</string>
|
||||||
<string name="onboarding_access_code_feature_2_title">Personalize</string>
|
<string name="onboarding_access_code_feature_2_title">Personalize</string>
|
||||||
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place.</string>
|
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place</string>
|
||||||
<string name="onboarding_access_code_feature_3_title">Restore</string>
|
<string name="onboarding_access_code_feature_3_title">Restore</string>
|
||||||
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code.</string>
|
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code</string>
|
||||||
<string name="onboarding_access_code_intro_title">Create Access Code</string>
|
<string name="onboarding_access_code_intro_title">Create Access Code</string>
|
||||||
<string name="onboarding_access_code_repeat_code_title">Re-enter your Access Code</string>
|
<string name="onboarding_access_code_repeat_code_title">Re-enter your Access Code</string>
|
||||||
<string name="onboarding_access_code_too_short">Access code must be at least 4 characters long</string>
|
<string name="onboarding_access_code_too_short">Access code must be at least 4 characters long</string>
|
||||||
|
|
@ -178,7 +178,7 @@
|
||||||
<string name="onboarding_navbar_register_wallet">Connect</string>
|
<string name="onboarding_navbar_register_wallet">Connect</string>
|
||||||
<string name="onboarding_navbar_title_creating_backup">Creating a backup</string>
|
<string name="onboarding_navbar_title_creating_backup">Creating a backup</string>
|
||||||
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
|
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
|
||||||
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add Tangem card as your backup</string>
|
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add the Tangem card as your backup</string>
|
||||||
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
|
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
|
||||||
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
|
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
|
||||||
<string name="onboarding_saltpay_title_no_backup_card">No backup card</string>
|
<string name="onboarding_saltpay_title_no_backup_card">No backup card</string>
|
||||||
|
|
@ -219,7 +219,7 @@
|
||||||
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
|
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
|
||||||
<string name="onboarding_top_up_header">Top up your wallet</string>
|
<string name="onboarding_top_up_header">Top up your wallet</string>
|
||||||
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
|
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
|
||||||
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over.</string>
|
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over</string>
|
||||||
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
|
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
|
||||||
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
|
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
|
||||||
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
|
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue