Updated on 2026-08-14

This commit is contained in:
Tangem 2022-12-30 15:32:19 +03:00
commit 8d86f45d50
69 changed files with 1813 additions and 1693 deletions

View file

@ -3,11 +3,11 @@ package com.tangem.tap.common.analytics.converters
import com.tangem.common.Converter
import com.tangem.common.extensions.isZero
import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.util.userWalletId
import com.tangem.tap.common.analytics.events.AnalyticsParam
import com.tangem.tap.common.analytics.events.Basic
import com.tangem.tap.common.analytics.filters.BasicTopUpFilter
import com.tangem.tap.domain.extensions.isMultiwalletAllowed
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.features.wallet.redux.ProgressState
import com.tangem.tap.features.wallet.redux.WalletData
import com.tangem.tap.features.wallet.redux.WalletState
@ -29,7 +29,9 @@ class BasicSignInEventConverter(
currency = cardCurrency,
batch = scanResponse.card.batchId,
).apply {
filterData = scanResponse.card.userWalletId.stringValue
filterData = UserWalletIdBuilder.scanResponse(scanResponse)
.build()
?.stringValue
}
}
}
@ -43,7 +45,7 @@ class BasicTopUpEventConverter(
val cardCurrency = ParamCardCurrencyConverter().convert(scanResponse) ?: return null
val data = BasicTopUpFilter.Data(
walletId = scanResponse.card.userWalletId.stringValue,
walletId = UserWalletIdBuilder.scanResponse(scanResponse).build()?.stringValue ?: "",
cardBalanceState = AnalyticsParam.CardBalanceState.from(value.walletsDataFromStores),
)

View file

@ -10,8 +10,8 @@ import com.tangem.blockchain.common.WalletManager
import com.tangem.blockchain.common.address.Address
import com.tangem.domain.common.CardDTO
import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.util.userWalletId
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
class AdditionalFeedbackInfo {
class EmailWalletInfo(
@ -54,7 +54,7 @@ class AdditionalFeedbackInfo {
cardFirmwareVersion = data.card.firmwareVersion.stringValue
cardIssuer = data.card.issuer.name
signedHashesCount = formatSignedHashes(data.card.wallets)
userWalletId = data.card.userWalletId.stringValue
userWalletId = UserWalletIdBuilder.scanResponse(data).build()?.stringValue ?: ""
}
fun setWalletsInfo(walletManagers: List<WalletManager>) {

View file

@ -57,11 +57,8 @@ val navigationMiddleware: Middleware<AppState> = { _, state ->
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
Settings.ACTION_BIOMETRIC_ENROLL
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> {
Settings.ACTION_FINGERPRINT_ENROLL
}
else -> {
Settings.ACTION_SETTINGS
Settings.ACTION_SECURITY_SETTINGS
}
}
val intent = Intent(settingsAction).apply {

View file

@ -234,6 +234,11 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co
}
}
fun useBiometricsForAccessCode(): Boolean {
val policy = tangemSdk.config.userCodeRequestPolicy
return policy is UserCodeRequestPolicy.AlwaysWithBiometrics && policy.codeType == UserCodeType.AccessCode
}
companion object {
val config = Config(
linkedTerminal = true,

View file

@ -1,6 +1,5 @@
package com.tangem.tap.domain.model
import com.tangem.common.extensions.toHexString
import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.util.UserWalletId
@ -33,23 +32,4 @@ data class UserWallet(
val isLocked: Boolean
get() = scanResponse.card.wallets.isEmpty()
}
/**
* !!! Workaround !!!
*
* Calculate same [UserWalletId] for twins instead
*
* TODO: Remove after [REDACTED_JIRA]
* */
fun UserWallet.isTwinnedWith(other: UserWallet): Boolean {
if (!scanResponse.isTangemTwins() || !other.scanResponse.isTangemTwins()) return false
if (scanResponse.secondTwinPublicKey == null || other.scanResponse.secondTwinPublicKey == null) return false
if (other.scanResponse.secondTwinPublicKey == scanResponse.card.wallets.firstOrNull()?.publicKey?.toHexString()) {
return true
}
if (scanResponse.secondTwinPublicKey == other.scanResponse.card.wallets.firstOrNull()?.publicKey?.toHexString()) {
return true
}
return false
}

View file

@ -1,5 +1,7 @@
package com.tangem.tap.domain.model.builders
import com.tangem.common.card.EllipticCurve
import com.tangem.common.card.FirmwareVersion
import com.tangem.common.extensions.toHexString
import com.tangem.common.services.Result
import com.tangem.domain.common.CardDTO
@ -8,7 +10,6 @@ import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.TapWorkarounds.isStart2Coin
import com.tangem.domain.common.TwinCardNumber
import com.tangem.domain.common.TwinsHelper
import com.tangem.domain.common.util.userWalletId
import com.tangem.operations.attestation.OnlineCardVerifier
import com.tangem.operations.attestation.TangemApi
import com.tangem.tap.domain.model.UserWallet
@ -40,7 +41,16 @@ class UserWalletBuilder(
ProductType.Note -> false
ProductType.Twins -> false
ProductType.SaltPay -> false
ProductType.Wallet -> !card.isStart2Coin
ProductType.Wallet -> when {
card.isStart2Coin -> false
card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable -> true
else -> {
val cardWallets = card.wallets
require(cardWallets.isNotEmpty()) { "Card wallets must not be empty" }
cardWallets.first().curve == EllipticCurve.Secp256k1
}
}
}
fun backupCardsIds(backupCardsIds: Set<String>?) = this.apply {
@ -49,16 +59,20 @@ class UserWalletBuilder(
}
}
suspend fun build(): UserWallet {
suspend fun build(): UserWallet? {
return with(scanResponse) {
UserWallet(
walletId = card.userWalletId,
name = userWalletName,
artworkUrl = loadArtworkUrl(card.cardId, card.cardPublicKey),
cardsInWallet = backupCardsIds.plus(card.cardId),
scanResponse = this,
isMultiCurrency = isMultiCurrency,
)
UserWalletIdBuilder.scanResponse(scanResponse)
.build()
?.let {
UserWallet(
walletId = it,
name = userWalletName,
artworkUrl = loadArtworkUrl(card.cardId, card.cardPublicKey),
cardsInWallet = backupCardsIds.plus(card.cardId),
scanResponse = this,
isMultiCurrency = isMultiCurrency,
)
}
}
}

View file

@ -0,0 +1,70 @@
package com.tangem.tap.domain.model.builders
import com.tangem.common.extensions.calculateSha256
import com.tangem.common.extensions.hexToBytes
import com.tangem.crypto.Secp256k1
import com.tangem.domain.common.CardDTO
import com.tangem.domain.common.ProductType
import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.TapWorkarounds.isTangemTwins
import com.tangem.domain.common.extensions.calculateHmacSha256
import com.tangem.domain.common.util.UserWalletId
class UserWalletIdBuilder private constructor(
private val publicKey: ByteArray?,
private val pairTwinPublicKey: ByteArray? = null,
) {
fun build(): UserWalletId? {
val seed = if (publicKey != null) {
if (pairTwinPublicKey != null) {
Secp256k1.sum(publicKey, pairTwinPublicKey)
} else {
publicKey
}
} else null
return seed?.let {
UserWalletId(value = calculateUserWalletId(it))
}
}
private fun calculateUserWalletId(seed: ByteArray?): ByteArray? {
val message = MESSAGE_FOR_WALLET_ID.toByteArray()
val keyHash = seed?.calculateSha256()
return if (keyHash != null) {
message.calculateHmacSha256(keyHash)
} else null
}
companion object {
private const val MESSAGE_FOR_WALLET_ID = "UserWalletID"
@Throws(IllegalArgumentException::class)
fun card(card: CardDTO): UserWalletIdBuilder {
require(!card.isTangemTwins) {
"For twin cards use scanResponse to ID calculation"
}
return UserWalletIdBuilder(findPublicKey(card.wallets))
}
fun scanResponse(scanResponse: ScanResponse): UserWalletIdBuilder {
return UserWalletIdBuilder(
publicKey = findPublicKey(scanResponse.card.wallets),
pairTwinPublicKey = when (scanResponse.productType) {
ProductType.Twins -> scanResponse.secondTwinPublicKey?.hexToBytes()
ProductType.Note,
ProductType.Wallet,
ProductType.SaltPay,
-> null
},
)
}
private fun findPublicKey(wallets: List<CardDTO.Wallet>): ByteArray? {
return wallets.firstOrNull()
?.publicKey
}
}
}

View file

@ -6,9 +6,9 @@ import com.tangem.common.services.Result
import com.tangem.datasource.api.tangemTech.TangemTechService
import com.tangem.datasource.api.tangemTech.UserTokensResponse
import com.tangem.domain.common.CardDTO
import com.tangem.domain.common.util.userWalletId
import com.tangem.tap.common.AndroidFileReader
import com.tangem.tap.domain.NoDataError
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.demo.DemoHelper
import com.tangem.tap.features.wallet.models.Currency
@ -24,7 +24,7 @@ class UserTokensRepository(
private val networkService: UserTokensNetworkService,
) {
suspend fun getUserTokens(card: CardDTO): List<Currency> {
val userId = card.userWalletId.stringValue
val userId = getUserWalletId(card) ?: return emptyList()
if (DemoHelper.isDemoCardId(card.cardId)) {
return loadTokensOffline(card, userId).ifEmpty { loadDemoCurrencies() }
}
@ -47,14 +47,14 @@ class UserTokensRepository(
}
suspend fun saveUserTokens(card: CardDTO, tokens: List<Currency>) {
val userId = card.userWalletId.stringValue
val userId = getUserWalletId(card) ?: return
val userTokens = tokens.toUserTokensResponse()
networkService.saveUserTokens(userId, userTokens)
storageService.saveUserTokens(userId, userTokens)
}
suspend fun removeUserTokens(card: CardDTO) {
val userId = card.userWalletId.stringValue
val userId = getUserWalletId(card) ?: return
val userTokens = emptyList<Currency>().toUserTokensResponse()
networkService.saveUserTokens(userId, userTokens)
storageService.saveUserTokens(userId, userTokens)
@ -70,7 +70,7 @@ class UserTokensRepository(
}
suspend fun loadBlockchainsToDerive(card: CardDTO): List<BlockchainNetwork> {
val userId = card.userWalletId.stringValue
val userId = getUserWalletId(card) ?: return emptyList()
val blockchainNetworks = loadTokensOffline(card, userId).toBlockchainNetworks()
if (DemoHelper.isDemoCardId(card.cardId)) {
@ -103,6 +103,7 @@ class UserTokensRepository(
coroutineScope { launch { networkService.saveUserTokens(userId = userId, tokens = userTokens) } }
tokens
}
else -> {
val tokens = storageService.getUserTokens(userId) ?: storageService.getUserTokens(card)
tokens.distinct()
@ -114,6 +115,11 @@ class UserTokensRepository(
return storageService.getUserTokens(userId) ?: storageService.getUserTokens(card)
}
private fun getUserWalletId(card: CardDTO): String? {
return UserWalletIdBuilder.card(card).build()
?.stringValue
}
companion object {
const val SORT_DEFAULT_VALUE = "manual"
const val GROUP_DEFAULT_VALUE = "none"

View file

@ -19,7 +19,7 @@ interface UserWalletsListManager {
suspend fun selectWallet(userWalletId: UserWalletId): CompletionResult<UserWallet>
/**
* Save user wallet
* Save provided user wallet and set it as selected
* @param userWallet [UserWallet] to save
* @param canOverride If false, then terminate with [UserWalletListError.WalletAlreadySaved] when user tries to save an
* already saved card
@ -27,6 +27,17 @@ interface UserWalletsListManager {
* */
suspend fun save(userWallet: UserWallet, canOverride: Boolean = false): CompletionResult<Unit>
/**
* Same as [save] but not change selected user wallet ID
* and not terminate with [UserWalletListError.WalletAlreadySaved] if [UserWallet] already saved
*
* Can terminate with [NoSuchElementException] if unable to find [UserWallet] with provided [UserWalletId]
* @param userWalletId update [UserWallet] with that [UserWalletId]
* @param update lambda that receives stored [UserWallet] and returns updated [UserWallet]
* @return [CompletionResult] of operation with updated [UserWallet]
* */
suspend fun update(userWalletId: UserWalletId, update: (UserWallet) -> UserWallet): CompletionResult<UserWallet>
suspend fun delete(userWalletIds: List<UserWalletId>): CompletionResult<Unit>
suspend fun clear(): CompletionResult<Unit>

View file

@ -3,7 +3,6 @@ package com.tangem.tap.domain.userWalletList.implementation
import com.tangem.common.*
import com.tangem.domain.common.util.UserWalletId
import com.tangem.tap.domain.model.UserWallet
import com.tangem.tap.domain.model.isTwinnedWith
import com.tangem.tap.domain.userWalletList.UserWalletListError
import com.tangem.tap.domain.userWalletList.UserWalletsListManager
import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey
@ -11,6 +10,7 @@ import com.tangem.tap.domain.userWalletList.repository.SelectedUserWalletReposit
import com.tangem.tap.domain.userWalletList.repository.UserWalletsKeysRepository
import com.tangem.tap.domain.userWalletList.repository.UserWalletsPublicInformationRepository
import com.tangem.tap.domain.userWalletList.repository.UserWalletsSensitiveInformationRepository
import com.tangem.tap.domain.userWalletList.utils.encryptionKey
import com.tangem.tap.domain.userWalletList.utils.toUserWallets
import com.tangem.tap.domain.userWalletList.utils.updateWith
import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -51,7 +51,7 @@ internal class BiometricUserWalletsListManager(
get() = state.value.isLocked
override val hasSavedUserWallets: Boolean
get() = publicInformationRepository.isNotEmpty()
get() = keysRepository.hasSavedEncryptionKeys()
override suspend fun unlockWithBiometry(): CompletionResult<UserWallet?> {
return unlockWithBiometryInternal()
@ -85,22 +85,35 @@ internal class BiometricUserWalletsListManager(
override suspend fun save(userWallet: UserWallet, canOverride: Boolean): CompletionResult<Unit> {
return if (canOverride) {
saveInternal(userWallet)
saveInternal(userWallet, changeSelectedUserWallet = true)
} else {
val isWalletSaved = state.value.userWallets
.any {
// Workaround, check [UserWallet.isTwinnedWith]
it.cardsInWallet.contains(userWallet.cardId) || it.isTwinnedWith(userWallet)
it.walletId == userWallet.walletId || it.cardsInWallet.contains(userWallet.cardId)
}
if (isWalletSaved) {
CompletionResult.Failure(UserWalletListError.WalletAlreadySaved)
} else {
saveInternal(userWallet)
saveInternal(userWallet, changeSelectedUserWallet = true)
}
}
}
override suspend fun update(
userWalletId: UserWalletId,
update: (UserWallet) -> UserWallet,
): CompletionResult<UserWallet> {
return get(userWalletId)
.map { storedUserWallet ->
update(storedUserWallet)
}
.flatMap { updatedUserWallet ->
saveInternal(updatedUserWallet, changeSelectedUserWallet = false)
.map { updatedUserWallet }
}
}
override suspend fun delete(userWalletIds: List<UserWalletId>): CompletionResult<Unit> {
if (userWalletIds.isEmpty()) {
return CompletionResult.Success(Unit)
@ -113,9 +126,12 @@ internal class BiometricUserWalletsListManager(
.flatMap { keysRepository.delete(userWalletIds) }
.map {
state.update { prevState ->
val newUserWallets = prevState.userWallets.filter { it.walletId !in userWalletIds }
prevState.copy(
encryptionKeys = prevState.encryptionKeys.filter { it.walletId !in userWalletIds },
userWallets = prevState.userWallets.filter { it.walletId !in userWalletIds },
userWallets = newUserWallets,
isLocked = newUserWallets.any { it.isLocked },
)
}
}
@ -137,27 +153,23 @@ internal class BiometricUserWalletsListManager(
}
}
private suspend fun saveInternal(userWallet: UserWallet): CompletionResult<Unit> {
val newEncryptionKeys = state.value.encryptionKeys
.plus(UserWalletEncryptionKey(userWallet))
.distinctBy { it.walletId }
return keysRepository.store(newEncryptionKeys)
.doOnSuccess {
state.update { prevState ->
prevState.copy(
encryptionKeys = newEncryptionKeys,
selectedUserWalletId = userWallet.walletId,
)
}
}
private suspend fun saveInternal(
userWallet: UserWallet,
changeSelectedUserWallet: Boolean,
): CompletionResult<Unit> {
return saveEncryptionKeyIfNotNull(userWallet)
.flatMap { sensitiveInformationRepository.save(userWallet, encryptionKey = it) }
.flatMap { publicInformationRepository.save(userWallet) }
.flatMap { sensitiveInformationRepository.save(userWallet) }
.map { selectedUserWalletRepository.set(userWallet.walletId) }
.flatMap { loadModels() }
.doOnSuccess {
state.update { prevState ->
prevState.copy(
selectedUserWalletId = if (changeSelectedUserWallet) {
userWallet.walletId
} else {
prevState.selectedUserWalletId
},
isLocked = prevState.userWallets.any { it.isLocked },
)
}
@ -183,6 +195,27 @@ internal class BiometricUserWalletsListManager(
}
}
private suspend fun saveEncryptionKeyIfNotNull(userWallet: UserWallet): CompletionResult<ByteArray?> {
val encryptionKey = userWallet.scanResponse.card.encryptionKey
?.let { UserWalletEncryptionKey(userWallet.walletId, it) }
return if (encryptionKey != null) {
keysRepository.save(encryptionKey)
.doOnSuccess {
state.update { prevState ->
prevState.copy(
encryptionKeys = prevState.encryptionKeys
.plus(encryptionKey)
.distinctBy { it.walletId },
)
}
}
.map { encryptionKey.encryptionKey }
} else {
CompletionResult.Success(data = null)
}
}
private suspend fun loadModels(): CompletionResult<Unit> {
return getSavedUserWallets()
.map { userWallets ->

View file

@ -1,56 +0,0 @@
package com.tangem.tap.domain.userWalletList.implementation
import com.tangem.common.CompletionResult
import com.tangem.common.catching
import com.tangem.domain.common.util.UserWalletId
import com.tangem.tap.domain.model.UserWallet
import com.tangem.tap.domain.userWalletList.UserWalletsListManager
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
class DummyUserWalletsListManager : UserWalletsListManager {
override val userWallets: Flow<List<UserWallet>>
get() = flowOf(emptyList())
override val selectedUserWallet: Flow<UserWallet>
get() = flowOf()
override val selectedUserWalletSync: UserWallet?
get() = null
override val isLocked: Flow<Boolean>
get() = flowOf(true)
override val isLockedSync: Boolean
get() = true
override val hasSavedUserWallets: Boolean
get() = false
override suspend fun unlockWithBiometry(): CompletionResult<UserWallet?> {
return CompletionResult.Success(null)
}
override fun lock() {
/* no-op */
}
override suspend fun selectWallet(userWalletId: UserWalletId): CompletionResult<UserWallet> {
return catching {
error("Not implemented")
}
}
override suspend fun save(userWallet: UserWallet, canOverride: Boolean): CompletionResult<Unit> {
return CompletionResult.Success(Unit)
}
override suspend fun delete(userWalletIds: List<UserWalletId>): CompletionResult<Unit> {
return CompletionResult.Success(Unit)
}
override suspend fun clear(): CompletionResult<Unit> {
return CompletionResult.Success(Unit)
}
override suspend fun get(userWalletId: UserWalletId): CompletionResult<UserWallet> {
return catching {
error("Not implemented")
}
}
}

View file

@ -2,19 +2,12 @@ package com.tangem.tap.domain.userWalletList.model
import com.squareup.moshi.JsonClass
import com.tangem.domain.common.util.UserWalletId
import com.tangem.domain.common.util.encryptionKey
import com.tangem.tap.domain.model.UserWallet
@JsonClass(generateAdapter = true)
internal data class UserWalletEncryptionKey(
val walletId: UserWalletId,
val encryptionKey: ByteArray,
) {
constructor(userWallet: UserWallet) : this(
walletId = userWallet.walletId,
encryptionKey = userWallet.scanResponse.card.encryptionKey,
)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is UserWalletEncryptionKey) return false

View file

@ -14,11 +14,11 @@ internal interface UserWalletsKeysRepository {
suspend fun getAll(): CompletionResult<List<UserWalletEncryptionKey>>
/**
* Store the encryption keys for user wallets. Biometric authentication not required
* @param encryptionKeys List of encryption keys for user wallets
* Save the encryption key for user wallet. Biometric authentication not required
* @param encryptionKey [UserWalletEncryptionKey] to save
* @return [CompletionResult] of operation
* */
suspend fun store(encryptionKeys: List<UserWalletEncryptionKey>): CompletionResult<Unit>
suspend fun save(encryptionKey: UserWalletEncryptionKey): CompletionResult<Unit>
/**
* Delete encryption keys for user wallets. Biometric authentication not required
@ -32,4 +32,10 @@ internal interface UserWalletsKeysRepository {
* @return [CompletionResult] of operation
* */
suspend fun clear(): CompletionResult<Unit>
/**
* Determine if the user has saved user wallets
* @return [Boolean] true if user has saved wallets
* */
fun hasSavedEncryptionKeys(): Boolean
}

View file

@ -12,6 +12,4 @@ internal interface UserWalletsPublicInformationRepository {
suspend fun delete(walletIds: List<UserWalletId>): CompletionResult<Unit>
suspend fun clear(): CompletionResult<Unit>
fun isNotEmpty(): Boolean
}

View file

@ -7,7 +7,7 @@ import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey
import com.tangem.tap.domain.userWalletList.model.UserWalletSensitiveInformation
internal interface UserWalletsSensitiveInformationRepository {
suspend fun save(userWallet: UserWallet): CompletionResult<Unit>
suspend fun save(userWallet: UserWallet, encryptionKey: ByteArray?): CompletionResult<Unit>
suspend fun getAll(
encryptionKeys: List<UserWalletEncryptionKey>,
): CompletionResult<Map<UserWalletId, UserWalletSensitiveInformation>>

View file

@ -17,6 +17,7 @@ import com.tangem.tap.domain.userWalletList.UserWalletListError
import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey
import com.tangem.tap.domain.userWalletList.repository.UserWalletsKeysRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
internal class BiometricUserWalletsKeysRepository(
@ -44,10 +45,9 @@ internal class BiometricUserWalletsKeysRepository(
}
}
override suspend fun store(encryptionKeys: List<UserWalletEncryptionKey>): CompletionResult<Unit> {
override suspend fun save(encryptionKey: UserWalletEncryptionKey): CompletionResult<Unit> {
return withContext(Dispatchers.IO) {
encryptionKeys.map { storeEncryptionKey(it) }
.fold()
storeEncryptionKey(encryptionKey)
.mapFailure { error ->
UserWalletListError.SaveEncryptionKeysError(error.cause ?: error)
}
@ -77,6 +77,12 @@ internal class BiometricUserWalletsKeysRepository(
}
}
override fun hasSavedEncryptionKeys(): Boolean {
return runBlocking {
getUserWalletsIds().isNotEmpty()
}
}
private suspend fun getAllInternal(): CompletionResult<List<UserWalletEncryptionKey>> {
return getUserWalletsIds()
.map { userWalletId ->

View file

@ -72,10 +72,6 @@ internal class DefaultUserWalletsPublicInformationRepository(
}
}
override fun isNotEmpty(): Boolean {
return secureStorage.get(StorageKey.UserWalletPublicInformation.name)?.isNotEmpty() == true
}
@JvmName("saveWithPublicInformation")
private suspend fun save(
publicInformation: List<UserWalletPublicInformation>,

View file

@ -9,13 +9,13 @@ import com.tangem.common.catching
import com.tangem.common.mapFailure
import com.tangem.common.services.secure.SecureStorage
import com.tangem.domain.common.util.UserWalletId
import com.tangem.domain.common.util.encryptionKey
import com.tangem.tap.common.extensions.filterNotNull
import com.tangem.tap.domain.model.UserWallet
import com.tangem.tap.domain.userWalletList.UserWalletListError
import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey
import com.tangem.tap.domain.userWalletList.model.UserWalletSensitiveInformation
import com.tangem.tap.domain.userWalletList.repository.UserWalletsSensitiveInformationRepository
import com.tangem.tap.domain.userWalletList.utils.encryptionKey
import com.tangem.tap.domain.userWalletList.utils.sensitiveInformation
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@ -38,11 +38,12 @@ internal class DefaultUserWalletsSensitiveInformationRepository(
Cipher.getInstance("$algorithm/$blockMode/$encryptionPadding")
}
override suspend fun save(userWallet: UserWallet): CompletionResult<Unit> {
override suspend fun save(userWallet: UserWallet, encryptionKey: ByteArray?): CompletionResult<Unit> {
if (encryptionKey == null) return CompletionResult.Success(Unit) // Encryption key is null, do nothing
return catching {
val encryptedSensitiveInformation = userWallet.sensitiveInformation
.encode()
.encryptAndStoreIv(userWallet.walletId.stringValue, userWallet.scanResponse.card.encryptionKey)
.encryptAndStoreIv(userWallet.walletId.stringValue, encryptionKey)
getAllEncrypted().toMutableMap()
.apply { set(userWallet.walletId.stringValue, encryptedSensitiveInformation) }

View file

@ -1,24 +1,20 @@
package com.tangem.domain.common.util
package com.tangem.tap.domain.userWalletList.utils
import com.tangem.common.extensions.calculateSha256
import com.tangem.domain.common.CardDTO
import com.tangem.domain.common.extensions.calculateHmacSha256
val CardDTO.userWalletId: UserWalletId
get() = UserWalletId(findWalletPublicKey(wallets))
val CardDTO.encryptionKey: ByteArray
get() = findWalletPublicKey(wallets)
?.let { calculateEncryptionKey(it) }
?: error("Wallet ID not found")
internal val CardDTO.encryptionKey: ByteArray?
get() = findPublicKey(wallets)?.let { calculateEncryptionKey(it) }
private fun calculateEncryptionKey(publicKey: ByteArray): ByteArray {
val message = MESSAGE_FOR_ENCRYPTION_KEY.toByteArray()
val keyHash = publicKey.calculateSha256()
return message.calculateHmacSha256(keyHash)
}
private fun findWalletPublicKey(wallets: List<CardDTO.Wallet>): ByteArray? {
private fun findPublicKey(wallets: List<CardDTO.Wallet>): ByteArray? {
return wallets.firstOrNull()
?.publicKey
}

View file

@ -20,6 +20,7 @@ import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.models.toBlockchainNetworks
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.withContext
internal class DefaultWalletCurrenciesManager(
@ -64,7 +65,15 @@ internal class DefaultWalletCurrenciesManager(
saveUserCurrencies(card, newCurrencies)
}
.flatMap {
walletAmountsRepository.updateAmountsForUserWallet(
val updatedBlockchains = updatedBlockchainNetworks
.map { it.blockchain }
val updatedWalletStores = walletStoresRepository.get(userWallet.walletId)
.firstOrNull()
?.filter { it.blockchain in updatedBlockchains }
?: return@flatMap CompletionResult.Success(Unit)
walletAmountsRepository.updateAmountsForWalletStores(
walletStores = updatedWalletStores,
userWallet = userWallet,
fiatCurrency = appCurrencyProvider(),
)

View file

@ -29,6 +29,12 @@ interface WalletAmountsRepository {
fiatCurrency: FiatCurrency,
): CompletionResult<Unit>
suspend fun updateAmountsForWalletStores(
walletStores: List<WalletStoreModel>,
userWallet: UserWallet,
fiatCurrency: FiatCurrency,
): CompletionResult<Unit>
/**
* Fetch wallet amounts and fiat rates then update [com.tangem.tap.domain.walletStores.storage.WalletStoresStorage]
* and [com.tangem.tap.domain.walletStores.storage.WalletManagerStorage] with new data

View file

@ -41,7 +41,8 @@ import com.tangem.tap.network.NetworkConnectivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.math.BigDecimal
@ -60,7 +61,7 @@ internal class DefaultWalletAmountsRepository(
else withContext(Dispatchers.Default) {
awaitAll(
async { fetchAmountsForUserWallets(userWallets) },
async { fetchFiatRates(userWallets, fiatCurrency) },
async { fetchFiatRates(userWallets, walletStores = null, fiatCurrency) },
)
.fold()
}
@ -73,46 +74,40 @@ internal class DefaultWalletAmountsRepository(
return updateAmountsForUserWallets(listOf(userWallet), fiatCurrency)
}
override suspend fun updateAmountsForWalletStores(
walletStores: List<WalletStoreModel>,
userWallet: UserWallet,
fiatCurrency: FiatCurrency,
): CompletionResult<Unit> {
return if (walletStores.isEmpty()) CompletionResult.Success(Unit)
else withContext(Dispatchers.Default) {
val userWalletId = userWallet.walletId
val scanResponse = userWallet.scanResponse
awaitAll(
async { fetchAmountForWalletStores(userWalletId, scanResponse, walletStores) },
async { fetchFiatRates(listOf(userWallet), walletStores, fiatCurrency) },
)
.fold()
}
}
override suspend fun updateAmountsForWalletStore(
walletStore: WalletStoreModel,
userWallet: UserWallet,
fiatCurrency: FiatCurrency,
): CompletionResult<Unit> = withContext(Dispatchers.Default) {
val walletId = userWallet.walletId
val scanResponse = userWallet.scanResponse
awaitAll(
async {
// TODO: Find wallet manager via [com.tangem.tap.domain.walletStores.repository.WalletManagersRepository]
val walletManager = walletStore.walletManager
fetchAmountsForWalletStore(walletId, scanResponse, walletStore, walletManager)
},
async { fetchFiatRates(listOf(userWallet), fiatCurrency) },
)
.fold()
}
private suspend fun fetchAmountsForUserWallets(
userWallets: List<UserWallet>,
): CompletionResult<Unit> = withContext(Dispatchers.Default) {
userWallets.map { async { fetchAmountsForUserWallet(it) } }
.awaitAll()
.fold()
): CompletionResult<Unit> {
return updateAmountsForWalletStores(listOf(walletStore), userWallet, fiatCurrency)
}
private suspend fun fetchFiatRates(
userWallets: List<UserWallet>,
walletStores: List<WalletStoreModel>?,
fiatCurrency: FiatCurrency,
): CompletionResult<Unit> {
val walletsIds = userWallets.map { it.walletId }
val walletStores = walletsIds
.flatMap {
walletStoresStorage.getAll()
.first()
.getOrElse(it) { emptyList() }
}
val walletStoresInternal = walletStores ?: getWalletStores(userWallets)
val currencies = walletStores
val currencies = walletStoresInternal
.asSequence()
.flatMap { it.walletsData }
.map { it.currency }
@ -129,7 +124,7 @@ internal class DefaultWalletAmountsRepository(
return when (fiatRatesResult) {
is Result.Success -> {
updateWalletStoresWithFiatRates(
walletStores = walletStores,
walletStores = walletStoresInternal,
fiatRates = fiatRatesResult.data.rates,
)
@ -145,7 +140,6 @@ internal class DefaultWalletAmountsRepository(
error,
"""
Unable to fetch fiat rates
|- User wallets ids: $walletsIds
|- Coins ids: $coinsIds
""".trimIndent(),
)
@ -155,20 +149,34 @@ internal class DefaultWalletAmountsRepository(
}
}
private suspend fun fetchAmountsForUserWallets(
userWallets: List<UserWallet>,
): CompletionResult<Unit> = withContext(Dispatchers.Default) {
userWallets.map { async { fetchAmountsForUserWallet(it) } }
.awaitAll()
.fold()
}
private suspend fun fetchAmountsForUserWallet(
userWallet: UserWallet,
): CompletionResult<Unit> = withContext(Dispatchers.Default) {
val walletId = userWallet.walletId
val userWalletId = userWallet.walletId
val scanResponse = userWallet.scanResponse
val walletStores = walletStoresStorage.getAll()
.first()
.getOrElse(walletId) { emptyList() }
val walletStores = getWalletStores(listOf(userWallet))
fetchAmountForWalletStores(userWalletId, scanResponse, walletStores)
}
private suspend fun fetchAmountForWalletStores(
userWalletId: UserWalletId,
scanResponse: ScanResponse,
walletStores: List<WalletStoreModel>,
): CompletionResult<Unit> = coroutineScope {
walletStores.map { walletStore ->
async {
// TODO: Find wallet manager via [com.tangem.tap.domain.walletStores.repository.WalletManagersRepository]
val walletManager = walletStore.walletManager
fetchAmountsForWalletStore(walletId, scanResponse, walletStore, walletManager)
fetchAmountsForWalletStore(userWalletId, scanResponse, walletStore, walletManager)
}
}
.awaitAll()
@ -176,7 +184,7 @@ internal class DefaultWalletAmountsRepository(
}
private suspend fun fetchAmountsForWalletStore(
walletId: UserWalletId,
userWalletId: UserWalletId,
scanResponse: ScanResponse,
walletStore: WalletStoreModel,
walletManager: WalletManager?,
@ -186,11 +194,15 @@ internal class DefaultWalletAmountsRepository(
}
return when {
hasMissedDerivations -> updateWalletStoreWithMissedDerivation(walletStore)
walletManager == null -> updateWalletStoreWithUnreachable(walletStore)
hasMissedDerivations -> {
updateWalletStoreWithMissedDerivation(walletStore)
}
walletManager == null -> {
updateWalletStoreWithUnreachable(walletStore)
}
else -> {
withInternetConnection { walletManager.update() }
.map { updateWalletManagerWithAmounts(walletId, walletManager) }
.map { updateWalletManagerWithAmounts(userWalletId, walletManager) }
.flatMap {
updateWalletStoreWithAmounts(
walletStore = walletStore,
@ -248,35 +260,6 @@ internal class DefaultWalletAmountsRepository(
return CompletionResult.Success(Unit)
}
private suspend inline fun withInternetConnection(crossinline block: suspend () -> Unit): CompletionResult<Unit> {
return if (!NetworkConnectivity.getInstance().isOnlineOrConnecting()) {
val error = WalletStoresError.NoInternetConnection
Timber.e(error)
CompletionResult.Failure(error)
} else withContext(Dispatchers.IO) {
catching { block() }
}
}
private suspend fun updateWalletManagerWithAmounts(
walletId: UserWalletId,
walletManager: WalletManager,
) = withContext(Dispatchers.Default) {
walletManagersStorage.update { prevManagers ->
val newManagersForUserWallet = prevManagers[walletId].orEmpty()
.toMutableList()
.apply {
replaceByOrAdd(walletManager) {
it.wallet.blockchain == it.wallet.blockchain
}
}
prevManagers.apply {
set(walletId, newManagersForUserWallet)
}
}
}
private suspend fun updateWalletStoreWithError(
walletStore: WalletStoreModel,
wallet: Wallet,
@ -425,4 +408,44 @@ internal class DefaultWalletAmountsRepository(
}
}
}
private suspend inline fun withInternetConnection(crossinline block: suspend () -> Unit): CompletionResult<Unit> {
return if (!NetworkConnectivity.getInstance().isOnlineOrConnecting()) {
val error = WalletStoresError.NoInternetConnection
Timber.e(error)
CompletionResult.Failure(error)
} else withContext(Dispatchers.IO) {
catching { block() }
}
}
private suspend fun updateWalletManagerWithAmounts(
userWalletId: UserWalletId,
walletManager: WalletManager,
) = withContext(Dispatchers.Default) {
walletManagersStorage.update { prevManagers ->
val newManagersForUserWallet = prevManagers[userWalletId].orEmpty()
.toMutableList()
.apply {
replaceByOrAdd(walletManager) {
it.wallet.blockchain == it.wallet.blockchain
}
}
prevManagers.apply {
set(userWalletId, newManagersForUserWallet)
}
}
}
private suspend fun getWalletStores(userWallets: List<UserWallet>): List<WalletStoreModel> {
return userWallets
.map { it.walletId }
.flatMap { userWalletId ->
walletStoresStorage.getAll()
.firstOrNull()
?.get(userWalletId)
.orEmpty()
}
}
}

View file

@ -106,11 +106,7 @@ internal class DefaultWalletManagersRepository(
override suspend fun delete(userWalletIds: List<UserWalletId>): CompletionResult<Unit> = catching {
walletManagersStorage.update { prevManagers ->
prevManagers.apply {
userWalletIds.forEach { userWalletId ->
remove(userWalletId)
}
}
prevManagers.filterKeys { it !in userWalletIds } as HashMap<UserWalletId, List<WalletManager>>
}
}

View file

@ -62,9 +62,11 @@ internal fun WalletStoreModel.updateWithSelf(
): WalletStoreModel {
val oldStore = this
return oldStore.copy(
walletManager = newWalletStore.walletManager,
walletRent = newWalletStore.walletRent,
derivationPath = newWalletStore.derivationPath,
walletsData = oldStore.walletsData.updateWithSelf(newWalletStore.walletsData),
walletRent = newWalletStore.walletRent,
blockchainNetwork = newWalletStore.blockchainNetwork,
walletManager = newWalletStore.walletManager,
)
}

View file

@ -4,10 +4,8 @@ import com.tangem.common.CompletionResult
import com.tangem.common.core.TangemSdkError
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.common.extensions.toHexString
import com.tangem.common.flatMap
import com.tangem.domain.common.TapWorkarounds.isTangemTwins
import com.tangem.domain.common.util.userWalletId
import com.tangem.tap.common.analytics.Analytics
import com.tangem.tap.common.analytics.events.AnalyticsParam
import com.tangem.tap.common.analytics.events.Settings
@ -20,6 +18,7 @@ import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.common.redux.navigation.AppScreen
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.domain.model.builders.UserWalletBuilder
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.features.demo.DemoHelper
import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction
@ -27,6 +26,7 @@ import com.tangem.tap.preferencesStorage
import com.tangem.tap.scope
import com.tangem.tap.store
import com.tangem.tap.tangemSdkManager
import com.tangem.tap.userTokensRepository
import com.tangem.tap.userWalletsListManager
import com.tangem.tap.walletStoresManager
import com.tangem.wallet.R
@ -79,20 +79,16 @@ class DetailsMiddleware {
}
DetailsAction.ScanCard -> {
scope.launch {
tangemSdkManager.scanCard(allowRequestAccessCodeFromRepository = true)
.doOnSuccess { card ->
val isSameWallet = state.scanResponse?.card?.userWalletId
?.equals(card.userWalletId)
?: false
tangemSdkManager.scanProduct(userTokensRepository)
.doOnSuccess { scanResponse ->
val currentUserWalletId = state.scanResponse
?.let { UserWalletIdBuilder.scanResponse(it).build() }
val scannedUserWalletId = UserWalletIdBuilder.scanResponse(scanResponse)
.build()
val isSameWallet = currentUserWalletId == scannedUserWalletId
// !!! Workaround !!!
// TODO: Remove after [REDACTED_JIRA]
val isTwinned = card.wallets.firstOrNull()?.publicKey?.toHexString()
?.equals(state.scanResponse?.secondTwinPublicKey)
?: false
if (isSameWallet || isTwinned) {
store.dispatchOnMain(DetailsAction.PrepareCardSettingsData(card))
if (isSameWallet) {
store.dispatchOnMain(DetailsAction.PrepareCardSettingsData(scanResponse.card))
} else {
store.dispatchDialogShow(
AppDialog.SimpleOkDialogRes(
@ -122,8 +118,10 @@ class DetailsMiddleware {
is DetailsAction.ResetToFactory.Proceed -> {
val card = store.state.detailsState.cardSettingsState?.card ?: return
scope.launch {
val userWalletId = UserWalletIdBuilder.card(card).build()
tangemSdkManager.resetToFactorySettings(card.cardId)
.flatMap { userWalletsListManager.delete(listOf(card.userWalletId)) }
.flatMap { userWalletsListManager.delete(listOfNotNull(userWalletId)) }
.flatMap { tangemSdkManager.deleteSavedUserCodes(setOf(card.cardId)) }
.doOnSuccess {
Analytics.send(Settings.CardSettings.FactoryResetFinished())
@ -275,12 +273,9 @@ class DetailsMiddleware {
private suspend fun saveCurrentWallet(state: DetailsState) {
val scanResponse = state.scanResponse ?: return
val userWallet = UserWalletBuilder(scanResponse).build()
val userWallet = UserWalletBuilder(scanResponse).build() ?: return
userWalletsListManager.save(userWallet)
.doOnFailure { error ->
Timber.e(error, "Wallet saving failed")
}
.doOnSuccess {
Analytics.send(Settings.AppSettings.SaveWalletSwitcherChanged(AnalyticsParam.OnOffState.On))
@ -296,6 +291,9 @@ class DetailsMiddleware {
store.onUserWalletSelected(userWallet)
}
.doOnFailure { error ->
Timber.e(error, "Unable to save user wallet")
}
}
private suspend fun deleteSavedWallets() {
@ -315,6 +313,9 @@ class DetailsMiddleware {
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Home))
}
.doOnFailure { error ->
Timber.e(error, "Unable to delete saved wallets")
}
}
private fun saveAccessCodes(state: DetailsState) {
@ -353,6 +354,9 @@ class DetailsMiddleware {
)
}
}
.doOnFailure { error ->
Timber.e(error, "Unable to delete saved access codes")
}
}
}
}

View file

@ -11,7 +11,6 @@ import com.tangem.tap.domain.extensions.signedHashesCount
import com.tangem.tap.preferencesStorage
import com.tangem.tap.store
import com.tangem.tap.tangemSdkManager
import com.tangem.tap.userWalletsListManager
import org.rekotlin.Action
import java.util.*
@ -57,7 +56,7 @@ private fun handlePrepareScreen(
createBackupAllowed = action.scanResponse.card.backupStatus == CardDTO.BackupStatus.NoBackup,
appCurrency = store.state.globalState.appCurrency,
isBiometricsAvailable = tangemSdkManager.canUseBiometry,
saveWallets = userWalletsListManager.hasSavedUserWallets,
saveWallets = preferencesStorage.shouldSaveUserWallets,
saveAccessCodes = preferencesStorage.shouldSaveAccessCodes,
)
}

View file

@ -15,18 +15,18 @@ data class CardSettingsScreenState(
)
sealed class CardInfo(
val titleRes: TextReference, val subtitle: TextReference, val clickable: Boolean = false,
val titleRes: TextReference,
val subtitle: TextReference,
val clickable: Boolean = false,
) {
class CardId(subtitle: String) : CardInfo(
titleRes = TextReference.Res(R.string.details_row_title_cid),
subtitle = TextReference
.Str(subtitle),
subtitle = TextReference.Str(subtitle),
)
class Issuer(subtitle: String) : CardInfo(
titleRes = TextReference.Res(R.string.details_row_title_issuer),
subtitle = TextReference
.Str(subtitle),
subtitle = TextReference.Str(subtitle),
)
class SignedHashes(hashes: String) : CardInfo(
@ -34,10 +34,7 @@ sealed class CardInfo(
subtitle = TextReference.Res(R.string.details_row_subtitle_signed_hashes_format, hashes),
)
class SecurityMode(
securityOption: SecurityOption,
clickable: Boolean,
) : CardInfo(
class SecurityMode(securityOption: SecurityOption, clickable: Boolean) : CardInfo(
titleRes = TextReference.Res(R.string.card_settings_security_mode),
subtitle = TextReference.Res(securityOption.toTitleRes()),
clickable = clickable,
@ -49,9 +46,9 @@ sealed class CardInfo(
clickable = true,
)
object ResetToFactorySettings : CardInfo(
class ResetToFactorySettings(subtitle: TextReference.Res) : CardInfo(
titleRes = TextReference.Res(R.string.card_settings_reset_card_to_factory),
subtitle = TextReference.Res(R.string.card_settings_reset_card_to_factory_footer),
subtitle = subtitle,
clickable = true,
)
}

View file

@ -8,6 +8,7 @@ import com.tangem.tap.common.analytics.events.Settings
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.features.details.redux.CardSettingsState
import com.tangem.tap.features.details.redux.DetailsAction
import com.tangem.wallet.R
import org.rekotlin.Store
class CardSettingsViewModel(private val store: Store<AppState>) {
@ -46,7 +47,17 @@ class CardSettingsViewModel(private val store: Store<AppState>) {
cardDetails.add(CardInfo.ChangeAccessCode)
}
if (state.resetCardAllowed) {
cardDetails.add(CardInfo.ResetToFactorySettings)
cardDetails.add(
CardInfo.ResetToFactorySettings(
subtitle = TextReference.Res(
if (state.card.backupStatus?.isActive == true) {
R.string.reset_card_with_backup_to_factory_message
} else {
R.string.reset_card_without_backup_to_factory_message
},
),
),
)
}
CardSettingsScreenState(

View file

@ -32,77 +32,64 @@ import com.tangem.tap.features.details.ui.common.SettingsScreensScaffold
import com.tangem.wallet.R
@Composable
fun ResetCardScreen(
state: ResetCardScreenState,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier,
) {
SettingsScreensScaffold(
content = { ResetCardView(state = state, modifier = modifier) },
onBackClick = onBackPressed,
backgroundColor = Color.Transparent,
)
fun ResetCardScreen(state: ResetCardScreenState, onBackPressed: () -> Unit) {
SettingsScreensScaffold(
content = { ResetCardView(state = state) },
onBackClick = onBackPressed,
backgroundColor = Color.Transparent,
)
}
@Composable
fun ResetCardView(
state: ResetCardScreenState,
modifier: Modifier = Modifier,
) {
fun ResetCardView(state: ResetCardScreenState) {
Column(
modifier = modifier
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.SpaceBetween,
) {
Box(
modifier = modifier,
) {
Box {
Image(
painter = painterResource(id = R.drawable.ic_reset_background),
contentDescription = "",
modifier = modifier.offset(y = (-82).dp),
contentDescription = null,
modifier = Modifier.offset(y = (-82).dp),
)
ScreenTitle(titleRes = R.string.card_settings_reset_card_to_factory)
}
Spacer(
modifier = modifier.weight(1f),
)
Spacer(modifier = Modifier.weight(1f))
Column(
modifier = modifier
.offset(y = (-32).dp),
modifier = Modifier.offset(y = (-32).dp),
verticalArrangement = Arrangement.Bottom,
) {
Text(
text = stringResource(id = R.string.common_attention),
modifier = modifier.padding(start = 20.dp, end = 20.dp),
modifier = Modifier.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.headline3,
color = colorResource(id = R.color.text_primary_1),
)
Spacer(modifier = modifier.size(24.dp))
Spacer(modifier = Modifier.size(24.dp))
Text(
text = stringResource(id = R.string.reset_card_to_factory_message),
modifier = modifier
.padding(start = 20.dp, end = 20.dp),
text = stringResource(id = state.descriptionResId),
modifier = Modifier.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.body1,
color = colorResource(id = R.color.text_secondary),
)
Spacer(modifier = modifier.size(28.dp))
Spacer(modifier = Modifier.size(28.dp))
Row(
modifier = modifier
modifier = Modifier
.fillMaxWidth()
.clickable(
onClick = { state.onAcceptWarningToggleClick(!state.accepted) },
)
onClick = { state.onAcceptWarningToggleClick(!state.accepted) },
)
.padding(top = 16.dp, bottom = 16.dp),
) {
IconToggleButton(
checked = state.accepted,
onCheckedChange = state.onAcceptWarningToggleClick,
modifier = modifier.padding(start = 20.dp, end = 20.dp),
modifier = Modifier.padding(start = 20.dp, end = 20.dp),
) {
Icon(
painter = painterResource(
@ -124,15 +111,13 @@ fun ResetCardView(
text = stringResource(id = R.string.reset_card_to_factory_warning_message),
style = TangemTypography.body2,
color = colorResource(id = R.color.text_secondary),
modifier = modifier
.padding(end = 20.dp),
modifier = Modifier.padding(end = 20.dp),
)
}
Spacer(modifier = modifier.size(16.dp))
Spacer(modifier = Modifier.size(16.dp))
Box(
modifier = modifier
.padding(start = 16.dp, end = 16.dp, bottom = 32.dp),
modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 32.dp),
) {
DetailsMainButton(
title = stringResource(id = R.string.reset_card_to_factory_button_title),
@ -146,8 +131,14 @@ fun ResetCardView(
@Composable
@Preview
fun ResetCardScreenPreview(
) {
ResetCardScreen(state = ResetCardScreenState(onAcceptWarningToggleClick = {}, accepted = true) {}, {})
fun ResetCardScreenPreview() {
ResetCardScreen(
state = ResetCardScreenState(
descriptionResId = R.string.reset_card_without_backup_to_factory_message,
accepted = false,
onAcceptWarningToggleClick = {},
onResetButtonClick = {},
),
onBackPressed = {},
)
}

View file

@ -1,6 +1,9 @@
package com.tangem.tap.features.details.ui.resetcard
import androidx.annotation.StringRes
data class ResetCardScreenState(
@StringRes val descriptionResId: Int,
val accepted: Boolean = false,
val onAcceptWarningToggleClick: (Boolean) -> Unit,
val onResetButtonClick: () -> Unit,

View file

@ -3,12 +3,18 @@ package com.tangem.tap.features.details.ui.resetcard
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.features.details.redux.CardSettingsState
import com.tangem.tap.features.details.redux.DetailsAction
import com.tangem.wallet.R
import org.rekotlin.Store
class ResetCardViewModel(private val store: Store<AppState>) {
fun updateState(state: CardSettingsState?): ResetCardScreenState {
return ResetCardScreenState(
descriptionResId = if (state?.card?.backupStatus?.isActive == true) {
R.string.reset_card_with_backup_to_factory_message
} else {
R.string.reset_card_without_backup_to_factory_message
},
accepted = state?.resetConfirmed ?: false,
onAcceptWarningToggleClick = { store.dispatch(DetailsAction.ResetToFactory.Confirm(it)) },
onResetButtonClick = { store.dispatch(DetailsAction.ResetToFactory.Proceed) },

View file

@ -93,7 +93,7 @@ private fun readCard() = scope.launch {
onSuccess = { scanResponse ->
scope.launch {
if (preferencesStorage.shouldSaveUserWallets) {
val userWallet = UserWalletBuilder(scanResponse).build()
val userWallet = UserWalletBuilder(scanResponse).build() ?: return@launch
userWalletsListManager.save(userWallet)
.doOnFailure { error ->
Timber.e(error, "Unable to save user wallet")

View file

@ -11,8 +11,8 @@ import com.tangem.tap.common.extensions.copyToClipboard
import com.tangem.tap.common.extensions.dispatchDialogHide
import com.tangem.tap.common.extensions.dispatchShare
import com.tangem.tap.common.extensions.dispatchToastNotification
import com.tangem.tap.common.extensions.getString
import com.tangem.tap.common.redux.AppDialog
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.redux.AddressData
import com.tangem.tap.store
import com.tangem.wallet.R
@ -62,26 +62,12 @@ class AddressInfoBottomSheetDialog(
Analytics.send(Token.Recieve.ButtonShareAddress())
store.dispatchShare(data.shareUrl)
}
tvReceiveMessage.text = getQRReceiveMessage(tvReceiveMessage.context, stateDialog.currency)
}
}
fun getQRReceiveMessage(context: Context, currency: Currency): String {
return when (currency) {
is Currency.Blockchain -> {
context.getString(
R.string.address_qr_code_message_format,
currency.blockchain.fullName,
currency.currencySymbol,
)
}
is Currency.Token -> {
context.getString(
R.string.address_qr_code_message_token_format,
currency.token.name,
currency.currencySymbol,
currency.blockchain.fullName,
)
}
val blockchain = stateDialog.currency.blockchain
tvReceiveMessage.text = tvReceiveMessage.getString(
id = R.string.address_qr_code_message_format,
blockchain.fullName,
blockchain.currency,
blockchain.fullName,
)
}
}

View file

@ -70,7 +70,10 @@ class OnboardingHelper {
// then open save wallet screen
tangemSdkManager.canUseBiometry &&
preferencesStorage.shouldShowSaveUserWalletScreen -> scope.launch {
store.onCardScanned(scanResponse)
delay(timeMillis = 1_200)
store.dispatchOnMain(
SaveWalletAction.ProvideBackupInfo(
scanResponse = scanResponse,

View file

@ -6,7 +6,6 @@ import com.tangem.common.CompletionResult
import com.tangem.common.extensions.guard
import com.tangem.domain.common.ScanResponse
import com.tangem.domain.common.extensions.withMainContext
import com.tangem.domain.common.util.userWalletId
import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE
import com.tangem.tap.common.analytics.Analytics
import com.tangem.tap.common.analytics.events.AnalyticsParam
@ -25,6 +24,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.domain.TapError
import com.tangem.tap.domain.extensions.makePrimaryWalletManager
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.domain.twins.TwinCardsManager
import com.tangem.tap.features.onboarding.OnboardingHelper
import com.tangem.tap.features.wallet.models.Currency
@ -156,7 +156,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
TwinCardsStep.CreateFirstWallet -> {
scope.launch {
userWalletsListManager.delete(
listOf(getScanResponse().card.userWalletId),
listOfNotNull(UserWalletIdBuilder.scanResponse(getScanResponse()).build()),
)
}
}

View file

@ -88,7 +88,7 @@ internal class SaveWalletMiddleware {
scope.launch {
val userWallet = UserWalletBuilder(scanResponse)
.backupCardsIds(state.backupInfo?.backupCardsIds)
.build()
.build() ?: return@launch
val isFirstSavedWallet = !userWalletsListManager.hasSavedUserWallets

View file

@ -149,7 +149,7 @@ class TokensMiddleware {
&& blockchainsToAdd.isEmpty() && blockchainsToRemove.isEmpty()
) {
store.dispatchDebugErrorNotification("Nothing to save")
store.dispatch(NavigationAction.PopBackTo())
store.dispatchOnMain(NavigationAction.PopBackTo())
return@launch
}
@ -281,13 +281,16 @@ class TokensMiddleware {
) {
val selectedUserWallet = userWalletsListManager.selectedUserWalletSync
if (selectedUserWallet != null) {
val updatedUserWallet = selectedUserWallet.copy(
scanResponse = scanResponse,
)
scope.launch {
userWalletsListManager.save(updatedUserWallet, canOverride = true)
.flatMap {
userWalletsListManager.update(
userWalletId = selectedUserWallet.walletId,
update = { userWallet ->
userWallet.copy(
scanResponse = scanResponse,
)
},
)
.flatMap { updatedUserWallet ->
walletCurrenciesManager.addCurrencies(
userWallet = updatedUserWallet,
currenciesToAdd = currencyList,

View file

@ -12,6 +12,7 @@ import com.tangem.tap.common.analytics.events.MainScreen
import com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken
import com.tangem.tap.common.extensions.dispatchDialogShow
import com.tangem.tap.common.extensions.dispatchErrorNotification
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.safeUpdate
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.common.redux.global.GlobalState
@ -179,21 +180,25 @@ class MultiWalletMiddleware {
}
private fun scanAndUpdateCard(
selectedWallet: UserWallet,
selectedUserWallet: UserWallet,
state: WalletState?,
) = scope.launch {
) = scope.launch(Dispatchers.Default) {
Analytics.send(MainScreen.CardWasScanned())
ScanCardProcessor.scan(
cardId = selectedWallet.cardId,
cardId = selectedUserWallet.cardId,
additionalBlockchainsToDerive = state?.missingDerivations?.map { it.blockchain },
) { scanResponse ->
val userWallet = selectedWallet.copy(
scanResponse = scanResponse,
userWalletsListManager.update(
userWalletId = selectedUserWallet.walletId,
update = { userWallet ->
userWallet.copy(
scanResponse = scanResponse,
)
},
)
userWalletsListManager.save(userWallet, canOverride = true)
.doOnSuccess {
store.state.globalState.tapWalletManager.loadData(userWallet, refresh = true)
.doOnSuccess { updatedUserWallet ->
store.dispatchOnMain(WalletAction.MultiWallet.AddMissingDerivations(emptyList()))
store.state.globalState.tapWalletManager.loadData(updatedUserWallet, refresh = true)
}
}
}

View file

@ -305,7 +305,7 @@ class WalletMiddleware {
val reduxWalletStores = wallStores.mapToReduxModels(state.isMultiwalletAllowed)
store.dispatchOnMain(
WalletAction.WalletStoresChanged.UpdateWalletStores(
reduxWalletStores = reduxWalletStores.toList(),
reduxWalletStores = reduxWalletStores,
),
)
}

View file

@ -1,12 +1,15 @@
package com.tangem.tap.features.wallet.redux.reducers
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider
import com.tangem.blockchain.common.AmountType
import com.tangem.blockchain.common.Token
import com.tangem.blockchain.common.WalletManager
import com.tangem.common.extensions.guard
import com.tangem.tap.common.extensions.dispatchToastNotification
import com.tangem.tap.common.extensions.toFiatString
import com.tangem.tap.common.extensions.toFormattedCurrencyString
import com.tangem.tap.common.redux.navigation.AppScreen
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.domain.getFirstToken
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.wallet.models.Currency
@ -25,13 +28,15 @@ import com.tangem.tap.features.wallet.ui.BalanceStatus
import com.tangem.tap.features.wallet.ui.BalanceWidgetData
import com.tangem.tap.features.wallet.ui.TokenData
import com.tangem.tap.store
import com.tangem.tap.userWalletsListManager
import com.tangem.wallet.R
import java.math.BigDecimal
class MultiWalletReducer {
fun reduce(action: WalletAction.MultiWallet, state: WalletState): WalletState {
return when (action) {
is WalletAction.MultiWallet.AddBlockchains -> {
val walletStores: List<WalletStore> = action.blockchains.mapNotNull { blockchain ->
val walletStores: List<WalletStore> = action.blockchains.map { blockchain ->
val walletManager = action.walletManagers.firstOrNull {
it.wallet.blockchain == blockchain.blockchain &&
(it.wallet.publicKey.derivationPath?.rawPath == blockchain.derivationPath)
@ -65,10 +70,10 @@ class MultiWalletReducer {
)
}
val selectedCurrency = if (!state.isMultiwalletAllowed) {
walletStores.firstOrNull()?.walletsData?.firstOrNull()?.currency
val selectedCurrency = if (state.isMultiwalletAllowed) {
state.selectedCurrency
} else {
state.selectedWalletData?.currency
walletStores.firstOrNull()?.walletsData?.firstOrNull()?.currency
}
state.copy(
walletsStores = walletStores,
@ -106,16 +111,22 @@ class MultiWalletReducer {
newState
}
}
is WalletAction.MultiWallet.AddTokens -> {
addTokens(action.tokens, action.blockchain, state)
}
is WalletAction.MultiWallet.AddToken -> {
addTokens(listOf(action.token), action.blockchain, state)
}
is WalletAction.MultiWallet.AddTokens -> addTokens(action.tokens, action.blockchain, state)
is WalletAction.MultiWallet.AddToken -> addTokens(listOf(action.token), action.blockchain, state)
is WalletAction.MultiWallet.TokenLoaded -> {
val currency = Currency.fromBlockchainNetwork(action.blockchain, action.token)
val walletManager = state.getWalletManager(currency).guard {
throw NullPointerException("MultiWallet.TokenLoaded: WalletManager must be not NULL")
val walletManager = state.getWalletManager(currency)
if (walletManager == null) {
if (userWalletsListManager.hasSavedUserWallets) {
store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Welcome))
} else {
store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Home))
}
FirebaseCrashlytics.getInstance().recordException(
IllegalStateException("MultiWallet.TokenLoaded: walletManager is null"),
)
store.dispatchToastNotification(R.string.internal_error_wallet_manager_not_found)
return state
}
val wallet = walletManager.wallet
val pendingTransactions = wallet.getPendingTransactions()
@ -170,41 +181,28 @@ class MultiWalletReducer {
action.currencies.forEach { updatedState = updatedState.removeWalletData(state.getWalletData(it)) }
updatedState
}
is WalletAction.MultiWallet.SetPrimaryBlockchain ->
state.copy(primaryBlockchain = action.blockchain)
is WalletAction.MultiWallet.SetPrimaryToken ->
state.copy(primaryToken = action.token)
is WalletAction.MultiWallet.SetPrimaryBlockchain -> state.copy(primaryBlockchain = action.blockchain)
is WalletAction.MultiWallet.SetPrimaryToken -> state.copy(primaryToken = action.token)
is WalletAction.MultiWallet.SaveCurrencies -> state
is WalletAction.MultiWallet.ShowWalletBackupWarning -> state.copy(
showBackupWarning = action.show,
)
is WalletAction.MultiWallet.AddMissingDerivations -> state.copy(
missingDerivations = action.blockchains,
)
is WalletAction.MultiWallet.ShowWalletBackupWarning -> state.copy(showBackupWarning = action.show)
is WalletAction.MultiWallet.AddMissingDerivations -> state.copy(missingDerivations = action.blockchains)
is WalletAction.MultiWallet.BackupWallet -> state
is WalletAction.MultiWallet.ScanToGetDerivations -> state.copy(
state = ProgressState.Loading,
)
is WalletAction.MultiWallet.ScanToGetDerivations -> state.copy(state = ProgressState.Loading)
}
}
private fun findWalletRent(walletStore: WalletStore?): WalletRent? {
return walletStore?.walletsData?.firstOrNull {
it.walletRent != null
}?.walletRent
return walletStore?.walletsData?.firstOrNull { it.walletRent != null }?.walletRent
}
private fun getExistentialDeposit(walletManager: WalletManager?): String? {
return (walletManager as? ExistentialDepositProvider)?.getExistentialDeposit()?.toPlainString()
}
}
private fun addTokens(
tokens: List<Token>, blockchain: BlockchainNetwork, state: WalletState,
): WalletState {
val wallets = tokens.mapNotNull { token -> token.toWallet(state, blockchain) }
return state.updateWalletsData(wallets)
private fun addTokens(tokens: List<Token>, blockchain: BlockchainNetwork, state: WalletState): WalletState {
val wallets = tokens.mapNotNull { token -> token.toWallet(state, blockchain) }
return state.updateWalletsData(wallets)
}
}
fun Token.toWallet(state: WalletState, blockchain: BlockchainNetwork): WalletData? {

View file

@ -20,7 +20,6 @@ import com.tangem.tap.domain.extensions.isMultiwalletAllowed
import com.tangem.tap.domain.getFirstToken
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.models.TotalBalance
import com.tangem.tap.features.wallet.models.WalletRent
import com.tangem.tap.features.wallet.redux.AddressData
import com.tangem.tap.features.wallet.redux.Artwork
@ -36,7 +35,6 @@ import com.tangem.tap.features.wallet.redux.replaceSomeWalletsData
import com.tangem.tap.features.wallet.ui.BalanceStatus
import com.tangem.tap.features.wallet.ui.BalanceWidgetData
import com.tangem.tap.proxy.AppStateHolder
import com.tangem.tap.store
import org.rekotlin.Action
import timber.log.Timber
import java.math.BigDecimal
@ -344,8 +342,9 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS
card.settings.isBackupAllowed &&
card.backupStatus == CardDTO.BackupStatus.NoBackup,
walletCardsCount = card.findCardsCount(),
walletsStores = newState.walletsStores,
totalBalance = if (isMultiCurrency) {
TotalBalance(ProgressState.Loading, BigDecimal.ZERO, store.state.globalState.appCurrency)
newState.totalBalance
} else {
null
},
@ -362,13 +361,13 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS
)
}
is WalletAction.LoadData.Success -> {
val selectedCurrency = if (!newState.isMultiwalletAllowed) {
val selectedCurrency = if (newState.isMultiwalletAllowed) {
newState.selectedCurrency
} else {
newState.walletsStores.firstOrNull()
?.walletsData
?.firstOrNull()
?.currency
} else {
newState.selectedWalletData?.currency
}
newState = newState.copy(

View file

@ -36,7 +36,6 @@ import com.tangem.tap.common.extensions.toQrCode
import com.tangem.tap.common.recyclerView.SpaceItemDecoration
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.onboarding.getQRReceiveMessage
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.models.PendingTransaction
import com.tangem.tap.features.wallet.redux.ErrorType
@ -132,12 +131,8 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details),
override fun onStop() {
super.onStop()
store.unsubscribe(this)
}
override fun onDestroy() {
walletDataWatcher.clear()
walletStateWatcher.clear()
super.onDestroy()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -328,8 +323,21 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details),
)
}
ivQrCode.setImageBitmap(state.walletAddresses.selectedAddress.shareUrl.toQrCode())
tvReceiveMessage.text =
getQRReceiveMessage(tvReceiveMessage.context, state.currency)
tvReceiveMessage.text = when (val currency = state.currency) {
is Currency.Blockchain -> tvReceiveMessage.getString(
id = R.string.address_qr_code_message_format,
currency.blockchain.fullName,
currency.currencySymbol,
currency.blockchain.fullName,
)
is Currency.Token -> tvReceiveMessage.getString(
id = R.string.address_qr_code_message_format,
currency.token.name,
currency.currencySymbol,
currency.blockchain.fullName,
)
}
}
}

View file

@ -1,5 +1,6 @@
package com.tangem.tap.features.wallet.ui
import android.content.Context
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
@ -9,6 +10,7 @@ import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionInflater
@ -16,6 +18,7 @@ import by.kirich1409.viewbindingdelegate.viewBinding
import coil.load
import coil.size.Scale
import com.tangem.core.ui.fragments.setStatusBarColor
import com.tangem.core.ui.utils.OneTouchClickListener
import com.tangem.domain.common.TapWorkarounds.isSaltPay
import com.tangem.tap.MainActivity
import com.tangem.tap.common.analytics.Analytics
@ -59,6 +62,13 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
private val viewModel by viewModels<WalletViewModel>()
override fun onAttach(context: Context) {
super.onAttach(context)
activity?.lifecycleScope?.launchWhenCreated {
viewModel.launch()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
@ -81,7 +91,6 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.slide_right)
exitTransition = inflater.inflateTransition(R.transition.fade)
viewModel.launch()
}
override fun onStart() {
@ -110,9 +119,9 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
super.onViewCreated(view, savedInstanceState)
(activity as? AppCompatActivity)?.setSupportActionBar(binding.toolbar)
binding.toolbar.setNavigationOnClickListener {
store.dispatch(WalletAction.ChangeWallet)
}
binding.toolbar.setNavigationOnClickListener(
OneTouchClickListener { store.dispatch(WalletAction.ChangeWallet) },
)
setupWarningsRecyclerView()
walletView.changeWalletView(this, binding)
addCustomActionOnCard()

View file

@ -8,8 +8,10 @@ import com.tangem.tap.store
import com.tangem.tap.userWalletsListManager
import com.tangem.tap.walletStoresManager
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
@ -21,8 +23,10 @@ internal class WalletViewModel : ViewModel() {
private fun bootstrapSelectedWalletStoresChanges() {
userWalletsListManager.selectedUserWallet
.flatMapLatest { selectedWallet ->
walletStoresManager.get(selectedWallet.walletId)
.map { it.walletId }
.distinctUntilChanged()
.flatMapLatest { selectedUserWalletId ->
walletStoresManager.get(selectedUserWalletId)
}
.onEach { walletStores ->
store.dispatch(WalletAction.WalletStoresChanged(walletStores))

View file

@ -24,7 +24,7 @@ class ScanFailsDialog {
Analytics.send(IntroductionProcess.ButtonRequestSupport())
store.dispatch(GlobalAction.SendEmail(ScanFailsEmail()))
}
setNeutralButton(R.string.alert_troubleshooting_scan_card_ok) { _, _ -> }
setNeutralButton(R.string.common_cancel) { _, _ -> }
setOnDismissListener { store.dispatchDialogHide() }
}.create()
}

View file

@ -6,6 +6,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.tangem.tap.common.extensions.beginDelayedTransition
import com.tangem.tap.common.extensions.fitChipsByGroupWidth
import com.tangem.tap.common.extensions.getQuantityString
import com.tangem.tap.common.extensions.getString
import com.tangem.tap.common.extensions.hide
import com.tangem.tap.common.extensions.show
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState
@ -65,7 +66,7 @@ class SingleWalletView : WalletView() {
setupTwinCards(state.twinCardsState, binding)
setupButtons(state.primaryWallet, binding, state.isExchangeServiceFeatureOn)
setupAddressCard(state.primaryWallet, binding)
setupAddressCard(state, binding)
showPendingTransactionsIfPresent(state.primaryWallet.pendingTransactions)
setupBalance(state, state.primaryWallet)
}
@ -146,35 +147,50 @@ class SingleWalletView : WalletView() {
}
}
private fun setupAddressCard(state: WalletData, binding: FragmentWalletBinding) = with(binding.lAddress) {
if (state.walletAddresses != null && state.currency is Currency.Blockchain) {
private fun setupAddressCard(state: WalletState, binding: FragmentWalletBinding) = with(binding.lAddress) {
val primaryWallet = state.primaryWallet
if (primaryWallet?.walletAddresses != null && primaryWallet.currency is Currency.Blockchain) {
binding.lAddress.root.show()
if (state.shouldShowMultipleAddress()) {
if (primaryWallet.shouldShowMultipleAddress()) {
(binding.lAddress.root as? ViewGroup)?.beginDelayedTransition()
chipGroupAddressType.show()
chipGroupAddressType.fitChipsByGroupWidth()
val checkedId = MultipleAddressUiHelper.typeToId(state.walletAddresses.selectedAddress.type)
val checkedId = MultipleAddressUiHelper.typeToId(primaryWallet.walletAddresses.selectedAddress.type)
if (checkedId != View.NO_ID) chipGroupAddressType.check(checkedId)
chipGroupAddressType.setOnCheckedChangeListener { group, checkedId ->
if (checkedId == -1) return@setOnCheckedChangeListener
val type = MultipleAddressUiHelper.idToType(checkedId, state.currency.blockchain)
val type = MultipleAddressUiHelper.idToType(checkedId, primaryWallet.currency.blockchain)
type?.let { store.dispatch(WalletAction.ChangeSelectedAddress(type)) }
}
} else {
chipGroupAddressType.hide()
}
tvAddress.text = state.walletAddresses.selectedAddress.address
tvAddress.text = primaryWallet.walletAddresses.selectedAddress.address
tvExplore.setOnClickListener {
store.dispatch(
WalletAction.ExploreAddress(
state.walletAddresses.selectedAddress.exploreUrl,
primaryWallet.walletAddresses.selectedAddress.exploreUrl,
fragment!!.requireContext(),
),
)
}
setupCardInfo(state)
} else {
binding.lAddress.root.hide()
}
}
private fun setupCardInfo(state: WalletState) {
val textView = binding?.lAddress?.tvInfo
val blockchain = state.primaryWallet?.currency?.blockchain
if (textView != null && blockchain != null) {
textView.text = textView.getString(
id = R.string.address_qr_code_message_format,
blockchain.fullName,
blockchain.currency,
blockchain.fullName,
)
}
}
}

View file

@ -1,6 +1,7 @@
package com.tangem.tap.features.walletSelector.redux
import com.tangem.common.CompletionResult
import com.tangem.common.core.TangemSdkError
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.common.flatMap
@ -19,6 +20,7 @@ import com.tangem.tap.domain.model.UserWallet
import com.tangem.tap.domain.model.WalletStoreModel
import com.tangem.tap.domain.model.builders.UserWalletBuilder
import com.tangem.tap.domain.scanCard.ScanCardProcessor
import com.tangem.tap.preferencesStorage
import com.tangem.tap.scope
import com.tangem.tap.store
import com.tangem.tap.tangemSdkManager
@ -131,21 +133,46 @@ internal class WalletSelectorMiddleware {
private fun addWallet() = scope.launch {
Analytics.send(MyWallets.Button.ScanNewCard)
scanCardInternal { scanResponse ->
val userWallet = UserWalletBuilder(scanResponse).build()
val prevUseBiometricsForAccessCode = tangemSdkManager.useBiometricsForAccessCode()
userWalletsListManager.save(userWallet)
.doOnFailure { error ->
store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error))
}
.doOnSuccess {
Analytics.send(MyWallets.CardWasScanned)
// Update access code policy for access code saving when a card was scanned
tangemSdkManager.setAccessCodeRequestPolicy(
useBiometricsForAccessCode = preferencesStorage.shouldSaveAccessCodes,
)
ScanCardProcessor.scan(
onSuccess = { scanResponse ->
saveUserWalletAndPopBackToWalletScreen(scanResponse)
.doOnFailure { error ->
// Rollback policy if card saving was failed
tangemSdkManager.setAccessCodeRequestPolicy(prevUseBiometricsForAccessCode)
store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error))
}
},
onFailure = { error ->
// Rollback policy if card scanning was failed
tangemSdkManager.setAccessCodeRequestPolicy(prevUseBiometricsForAccessCode)
store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error))
},
onWalletNotCreated = {
// No need to rollback policy, continue with the policy set before the card scan
store.dispatchOnMain(WalletSelectorAction.AddWallet.Success)
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet))
},
)
}
store.dispatchOnMain(WalletSelectorAction.AddWallet.Success)
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet))
store.onUserWalletSelected(userWallet)
}
}
private suspend fun saveUserWalletAndPopBackToWalletScreen(scanResponse: ScanResponse): CompletionResult<Unit> {
val userWallet = UserWalletBuilder(scanResponse).build()
?: return CompletionResult.Failure(TangemSdkError.WalletIsNotCreated())
return userWalletsListManager.save(userWallet)
.doOnSuccess {
Analytics.send(MyWallets.CardWasScanned)
store.dispatchOnMain(WalletSelectorAction.AddWallet.Success)
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet))
store.onUserWalletSelected(userWallet)
}
}
private fun selectWallet(userWalletId: UserWalletId) {
@ -212,9 +239,7 @@ internal class WalletSelectorMiddleware {
Analytics.send(MyWallets.Button.EditWalletTapped)
scope.launch {
userWalletsListManager.get(userWalletId)
.map { it.copy(name = newName) }
.flatMap { userWalletsListManager.save(it, canOverride = true) }
userWalletsListManager.update(userWalletId) { it.copy(name = newName) }
.doOnFailure { error ->
store.dispatchOnMain(WalletSelectorAction.HandleError(error))
}
@ -252,43 +277,32 @@ internal class WalletSelectorMiddleware {
.flatMap { walletStoresManager.delete(userWalletsIds) }
.flatMap { deleteAccessCodes(userWalletsIds) }
.doOnSuccess {
val selectedWallet = userWalletsListManager.selectedUserWalletSync
val selectedUserWallet = userWalletsListManager.selectedUserWalletSync
when {
selectedWallet == null -> {
selectedUserWallet == null -> {
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Welcome))
}
currentSelectedWalletId != selectedWallet.walletId -> {
store.onUserWalletSelected(selectedWallet)
currentSelectedWalletId != selectedUserWallet.walletId -> {
store.onUserWalletSelected(selectedUserWallet)
}
}
}
}
private suspend inline fun scanCardInternal(
crossinline onCardScanned: suspend (ScanResponse) -> Unit,
) {
ScanCardProcessor.scan(
onSuccess = {
onCardScanned(it)
},
onFailure = { error ->
store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error))
},
onWalletNotCreated = {
store.dispatchOnMain(WalletSelectorAction.AddWallet.Success)
store.dispatchOnMain(NavigationAction.PopBackTo())
},
)
}
private suspend fun deleteAccessCodes(userWalletsIds: List<UserWalletId>): CompletionResult<Unit> {
val cardsIds = userWalletsListManager.userWallets.firstOrNull().orEmpty()
.asSequence()
.filter { it.walletId in userWalletsIds }
.flatMap { it.cardsInWallet }
val cardsIds = userWalletsListManager.userWallets.firstOrNull()
?.asSequence()
?.filter { it.walletId in userWalletsIds }
?.flatMap { it.cardsInWallet }
?.toSet()
return tangemSdkManager.deleteSavedUserCodes(cardsIds.toSet())
return if (cardsIds.isNullOrEmpty()) {
CompletionResult.Success(Unit)
} else {
tangemSdkManager.deleteSavedUserCodes(cardsIds.toSet())
}
}
private suspend fun UserWalletModel.updateWalletStoresAndCalculateFiatBalance(

View file

@ -38,7 +38,6 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
fun walletClicked(userWalletId: UserWalletId) = with(state.value) {
when {
editingUserWalletsIds.isNotEmpty() && isWalletLocked(userWalletId, this) -> Unit
editingUserWalletsIds.isNotEmpty() && !editingUserWalletsIds.contains(userWalletId) -> {
editWallet(userWalletId)
}
@ -52,7 +51,7 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
}
fun walletLongClicked(userWalletId: UserWalletId) = with(state.value) {
if (!isWalletLocked(userWalletId, this) && editingUserWalletsIds.isEmpty()) {
if (editingUserWalletsIds.isEmpty()) {
editWallet(userWalletId)
}
}
@ -67,15 +66,15 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
fun renameWallet() = with(state.value) {
if (editingUserWalletsIds.isNotEmpty() && renameWalletDialog == null) {
val editedWalletId = editingUserWalletsIds.first()
val editedWallet = (multiCurrencyWallets + singleCurrencyWallets)
.find { it.id == editedWalletId }
val editedUserWalletId = editingUserWalletsIds.first()
val editedUserWallet = (multiCurrencyWallets + singleCurrencyWallets)
.find { it.id == editedUserWalletId }
if (editedWallet != null) {
if (editedUserWallet != null) {
val dialog = RenameWalletDialog(
currentName = editedWallet.name,
currentName = editedUserWallet.name,
onApply = { newName ->
store.dispatch(WalletSelectorAction.RenameWallet(editedWalletId, newName))
store.dispatch(WalletSelectorAction.RenameWallet(editedUserWalletId, newName))
stateInternal.update { prevState ->
prevState.copy(
renameWalletDialog = null,
@ -137,11 +136,6 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
}
}
private fun isWalletLocked(userWalletId: UserWalletId, state: WalletSelectorScreenState): Boolean = with(state) {
multiCurrencyWallets.find { it.id == userWalletId }?.isLocked
?: singleCurrencyWallets.find { it.id == userWalletId }?.isLocked ?: isLocked
}
private fun subscribeToStoreChanges() {
store.subscribe(this) { appState ->
appState.skip { old, new -> old.walletSelectorState == new.walletSelectorState }

View file

@ -71,7 +71,7 @@ internal class WelcomeMiddleware {
private fun proceedWithCard(state: WelcomeState) = scope.launch {
scanCardInternal { scanResponse ->
val userWallet = UserWalletBuilder(scanResponse).build()
val userWallet = UserWalletBuilder(scanResponse).build() ?: return@scanCardInternal
userWalletsListManager.save(userWallet, canOverride = true)
.doOnFailure { error ->

View file

@ -8,12 +8,12 @@ import com.tangem.domain.common.CardDTO
import com.tangem.domain.common.TapWorkarounds.derivationStyle
import com.tangem.domain.common.extensions.fromNetworkId
import com.tangem.domain.common.extensions.toNetworkId
import com.tangem.domain.common.util.userWalletId
import com.tangem.lib.crypto.UserWalletManager
import com.tangem.lib.crypto.models.Currency
import com.tangem.lib.crypto.models.NativeToken
import com.tangem.lib.crypto.models.NonNativeToken
import com.tangem.tap.domain.extensions.makeWalletManagerForApp
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.wallet.redux.WalletAction
import org.rekotlin.Action
@ -54,7 +54,12 @@ class UserWalletManagerImpl(
}
override fun getWalletId(): String {
return appStateHolder.getActualCard()?.userWalletId?.stringValue ?: ""
return appStateHolder.getActualCard()?.let {
UserWalletIdBuilder.card(it)
.build()
?.stringValue
}
?: ""
}
override suspend fun isTokenAdded(currency: Currency): Boolean {

View file

@ -36,7 +36,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imv_qr_code"
tools:text="@string/address_qr_code_message_token_format" />
tools:text="Send only Ethereum (ETH) from Ethereum network to this address. Using other tokens and networks may result in loss of funds." />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"

View file

@ -137,6 +137,17 @@
</FrameLayout>
<TextView
android:id="@+id/tv_info"
style="@style/TextViewOnboarding.Body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing16"
android:textAlignment="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_explore"
tools:text="Send only Ethereum (ETH) from Ethereum network to this address. Using other tokens and networks may result in loss of funds." />
<View
android:id="@+id/v_payid_divider"
android:layout_width="match_parent"

View file

@ -174,7 +174,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_copy"
tools:text="@string/address_qr_code_message_token_format" />
tools:text="Send only Ethereum (ETH) from Ethereum network to this address. Using other tokens and networks may result in loss of funds." />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -61,7 +61,7 @@ object Versions {
// region Tangem
const val tangemBlockchainSdk = "develop-141"
const val tangemCardSgk = "develop-178"
const val tangemCardSgk = "develop-179"
// endregion Tangem
// region Testing

View file

@ -1,5 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Erneut versuchen</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change Access Code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the Card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Karte scannen</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. You\'ll be notified via email. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check your email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Bilanz: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Erfolg</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Ungültige Adresse</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Entfernen</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_name">Tangem</string>
<string name="common_save_changes">Änderungen speichern</string>
<string name="common_warning">Warnung</string>
@ -61,7 +279,7 @@
<string name="alert_unsupported_card">Diese Karte ist für die Zusammenarbeit mit Tangem nicht geeignet</string>
<string name="alert_developer_card">Die von Ihnen gescannte Karte ist eine Entwicklungskarte. Akzeptieren Sie sie nicht als Zahlungsmittel.</string>
<string name="initial_message_sign_header">Tippen um zu signieren</string>
<string name="initial_message_create_wallet_body">To create wallet, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_create_wallet_body">To create the wallet tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_access_code_body">Tippen Sie um den Zugangscode zu ändern</string>
<string name="initial_message_change_passcode_body">Tippen Sie um den Passcode zu ändern</string>
<string name="disclaimer_title">Nutzungsbedingungen</string>
@ -97,7 +315,6 @@
<string name="alert_failed_to_send_transaction_title">Can\'t send a transaction</string>
<string name="alert_failed_to_send_transaction_message">Reason: %s</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card?</string>
<string name="alert_troubleshooting_scan_card_ok">I\'m okay</string>
<string name="alert_button_request_support">Request support</string>
<string name="alert_button_send_feedback">Send feedback</string>
<string name="warning_button_really_cool">Really cool!</string>
@ -133,8 +350,7 @@
<string name="onboarding_done_header">Success!</string>
<string name="onboarding_done_body">Your card is activated and ready to be used</string>
<string name="onboarding_balance_title">Balance</string>
<string name="address_qr_code_message_format">Send only %s (%s) to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_token_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</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_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="warning_button_ok">OK, ich hab\'s!</string>
@ -217,7 +433,7 @@
<string name="feedback_subject_support_tangem">Tangem feedback</string>
<string name="feedback_subject_support">Feedback</string>
<string name="feedback_preface_rate_negative">Tell us what functions you are missing, and we will try to help you.</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have?</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have</string>
<string name="feedback_preface_tx_failed">Please tell us more about your issue. Every small detail can help.</string>
<string name="feedback_preface_support">Hi support team,</string>
<string name="feedback_data_collection_message">The following information is optional. You can erase it if you don\'t want to share it.</string>
@ -227,6 +443,12 @@
<string name="common_error">Fehler</string>
<string name="common_ok">OK</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>

View file

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Erneut versuchen</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change access code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_to_factory_message">This action will completely remove the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_reset_card_to_factory_footer">Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Karte scannen</string>
<string name="onboarding_navbar_save_wallet">Save your Wallet</string>
<string name="save_user_wallet_agreement_header">Would you like to use %s?</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_code_description">%s will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="save_user_wallet_agreement_allow">Allow to use %s</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="save_user_wallet_agreement_new_feature">New feature</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check you email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Bilanz: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Erfolg</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Ungültige Adresse</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Entfernen</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="save_user_wallet_agreement_description">Save your Wallet feature allows you to use your wallet with biometric auth without tapping your card to the phone to gain access.</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
</resources>

View file

@ -1,5 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Réessayer</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change Access Code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the Card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scannez la carte</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. You\'ll be notified via email. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check your email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Solde : %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Avec succès</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Adresse incorrecte</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Supprimer</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_name">Tangem</string>
<string name="common_save_changes">Sauvegarder les modifications</string>
<string name="common_warning">Alerte</string>
@ -61,7 +279,7 @@
<string name="alert_unsupported_card">Cette carte n\'est pas conçue pour fonctionner avec Tangem</string>
<string name="alert_developer_card">La carte que vous avez scannée est une carte de développement. Ne l\'acceptez pas comme paiement.</string>
<string name="initial_message_sign_header">Touchez pour signer</string>
<string name="initial_message_create_wallet_body">To create wallet, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_create_wallet_body">To create the wallet tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_access_code_body">Touchez, pour modifier le code d\'accès</string>
<string name="initial_message_change_passcode_body">Touchez, pour modifier le mot de passe</string>
<string name="disclaimer_title">Conditions d\'utilisation</string>
@ -97,7 +315,6 @@
<string name="alert_failed_to_send_transaction_title">Can\'t send a transaction</string>
<string name="alert_failed_to_send_transaction_message">Reason: %s</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card?</string>
<string name="alert_troubleshooting_scan_card_ok">I\'m okay</string>
<string name="alert_button_request_support">Request support</string>
<string name="alert_button_send_feedback">Send feedback</string>
<string name="warning_button_really_cool">Really cool!</string>
@ -133,8 +350,7 @@
<string name="onboarding_done_header">Success!</string>
<string name="onboarding_done_body">Your card is activated and ready to be used</string>
<string name="onboarding_balance_title">Balance</string>
<string name="address_qr_code_message_format">Send only %s (%s) to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_token_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</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_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="warning_button_ok">Ok, je l\'ai!</string>
@ -217,7 +433,7 @@
<string name="feedback_subject_support_tangem">Tangem feedback</string>
<string name="feedback_subject_support">Feedback</string>
<string name="feedback_preface_rate_negative">Tell us what functions you are missing, and we will try to help you.</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have?</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have</string>
<string name="feedback_preface_tx_failed">Please tell us more about your issue. Every small detail can help.</string>
<string name="feedback_preface_support">Hi support team,</string>
<string name="feedback_data_collection_message">The following information is optional. You can erase it if you don\'t want to share it.</string>
@ -227,6 +443,12 @@
<string name="common_error">Erreur</string>
<string name="common_ok">OK</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>

View file

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Réessayer</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change access code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_to_factory_message">This action will completely remove the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_reset_card_to_factory_footer">Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scannez la carte</string>
<string name="onboarding_navbar_save_wallet">Save your Wallet</string>
<string name="save_user_wallet_agreement_header">Would you like to use %s?</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_code_description">%s will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="save_user_wallet_agreement_allow">Allow to use %s</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="save_user_wallet_agreement_new_feature">New feature</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check you email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Solde : %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Avec succès</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Adresse incorrecte</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Supprimer</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="save_user_wallet_agreement_description">Save your Wallet feature allows you to use your wallet with biometric auth without tapping your card to the phone to gain access.</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
</resources>

View file

@ -1,5 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Riprova</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change Access Code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the Card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scansiona carta</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. You\'ll be notified via email. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check your email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Saldo: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Con successo</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Indirizzo non valido</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Rimuovere</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_name">Tangem</string>
<string name="common_save_changes">Mantieni le modifiche</string>
<string name="common_warning">Avviso</string>
@ -61,7 +279,7 @@
<string name="alert_unsupported_card">Questa carta non è progettata per funzionare con Tangem</string>
<string name="alert_developer_card">La carta che hai scansionato è una carta di sviluppo. Non utilizzarla come strumento di pagamento.</string>
<string name="initial_message_sign_header">Avvicina per firmare</string>
<string name="initial_message_create_wallet_body">To create wallet, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_create_wallet_body">To create the wallet tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_access_code_body">Avvicina per modificare il codice di accesso</string>
<string name="initial_message_change_passcode_body">Avvicina per modificare la password</string>
<string name="disclaimer_title">Termini del servizio</string>
@ -97,7 +315,6 @@
<string name="alert_failed_to_send_transaction_title">Can\'t send a transaction</string>
<string name="alert_failed_to_send_transaction_message">Reason: %s</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card?</string>
<string name="alert_troubleshooting_scan_card_ok">I\'m okay</string>
<string name="alert_button_request_support">Request support</string>
<string name="alert_button_send_feedback">Send feedback</string>
<string name="warning_button_really_cool">Really cool!</string>
@ -133,8 +350,7 @@
<string name="onboarding_done_header">Success!</string>
<string name="onboarding_done_body">Your card is activated and ready to be used</string>
<string name="onboarding_balance_title">Balance</string>
<string name="address_qr_code_message_format">Send only %s (%s) to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_token_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</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_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="warning_button_ok">Ok, ho capito!</string>
@ -217,7 +433,7 @@
<string name="feedback_subject_support_tangem">Tangem feedback</string>
<string name="feedback_subject_support">Feedback</string>
<string name="feedback_preface_rate_negative">Tell us what functions you are missing, and we will try to help you.</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have?</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have</string>
<string name="feedback_preface_tx_failed">Please tell us more about your issue. Every small detail can help.</string>
<string name="feedback_preface_support">Hi support team,</string>
<string name="feedback_data_collection_message">The following information is optional. You can erase it if you don\'t want to share it.</string>
@ -227,6 +443,12 @@
<string name="common_error">Errore</string>
<string name="common_ok">OK</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>

View file

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Riprova</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change access code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_to_factory_message">This action will completely remove the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_reset_card_to_factory_footer">Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scansiona carta</string>
<string name="onboarding_navbar_save_wallet">Save your Wallet</string>
<string name="save_user_wallet_agreement_header">Would you like to use %s?</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_code_description">%s will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="save_user_wallet_agreement_allow">Allow to use %s</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="save_user_wallet_agreement_new_feature">New feature</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check you email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Saldo: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Con successo</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Indirizzo non valido</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Rimuovere</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="save_user_wallet_agreement_description">Save your Wallet feature allows you to use your wallet with biometric auth without tapping your card to the phone to gain access.</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
</resources>

View file

@ -1,5 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 карты</string>
<string name="shop_2_cards">2 карты</string>
<string name="shop_shipping">Доставка</string>
<string name="shop_free">Бесплатно</string>
<string name="shop_i_have_a_promo_code">У меня есть промо-код…</string>
<string name="shop_total">Итого</string>
<string name="shop_other_payment_methods">Другие способы оплаты</string>
<string name="shop_buy_now">Купить сейчас</string>
<string name="story_meet_title">Встречайте\nTangem</string>
<string name="story_meet_buy">Покупайте</string>
<string name="story_meet_store">Храните</string>
<string name="story_meet_send">Отправляйте</string>
<string name="story_meet_pay">Расплачивайтесь</string>
<string name="story_meet_exchange">Обменивайте</string>
<string name="story_meet_lend">Вкладывайте</string>
<string name="story_meet_borrow">Занимайте</string>
<string name="story_awe_title">Революционный аппаратный кошелек</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности. Приватные ключи надежно хранятся на карте.</string>
<string name="story_backup_title">Все ключи в безопасности</string>
<string name="story_backup_description_1">До</string>
<string name="story_backup_description_2_bold">трех карт</string>
<string name="story_backup_description_3">с одним кошельком</string>
<string name="story_currencies_title">Тысячи криптовалют</string>
<string name="story_currencies_description">Аппаратный кошелек для ваших биткоинов, эфира и многих других валют одновременно — все в одной карте</string>
<string name="story_web3_title">Поддержка DeFi</string>
<string name="story_web3_description">Обменивайте, покупайте NFT, получайте займы и делайте вклады в более чем 100 различных децентрализованных сервисах</string>
<string name="story_finish_title">Кошелек для каждого</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и батареек. Как только понадобится крипта, просто приложите карту к телефону.</string>
<string name="home_button_order">Купить</string>
<string name="search_tokens_title">Поиск токенов</string>
<string name="alert_demo_message">Приложение работает в демонстрационном режиме. Средства на всех счетах ненастоящие.</string>
<string name="alert_demo_feature_disabled">Эта функция недоступна в демонстрационном режиме</string>
<string name="token_details_send_blocked_fee_format">Недостаточно средств для комиссии на вашем %s кошельке для отправки транзакции. Сначала пополните свой %s кошелек.</string>
<string name="currency_subtitle_expanded">Доступные сети</string>
<string name="wallet_connect_network_not_found_format">Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново.</string>
<string name="common_attention">Внимание</string>
<string name="alert_manage_tokens_addresses_message">Внимание! Валюты на разных сетях имеют разные адреса. Убедитесь, что адрес соответствует сети, в которой вы отправляете средства.</string>
<string name="alert_manage_tokens_unsupported_message">Токены в сети Solana не поддерживаются этой картой из-за ограничений прошивки.</string>
<string name="contract_address_copied_message">Адрес контракта скопирован!</string>
<string name="custom_token_contract_address_input_title">Адрес контракта</string>
<string name="custom_token_creation_error_required_field">Обязательное поле</string>
<string name="custom_token_creation_error_network_not_selected">Пожалуйста, выберите сеть</string>
<string name="custom_token_creation_error_wrong_decimals">Количество знаков после запятой должно быть корректным числом не больше %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Адрес контракта некорректен</string>
<string name="custom_token_creation_error_invalid_derivation_path">Путь деривации некорректен</string>
<string name="custom_token_validation_error_not_found">Токены могут быть созданы кем угодно. Остерегайтесь мошеннических токенов, они могут ничего не стоить</string>
<string name="custom_token_validation_error_already_added">Этот токен/сеть уже находится в вашем списке</string>
<string name="custom_token_decimals_input_title">Знаков после запятой</string>
<string name="custom_token_network_input_title">Сеть</string>
<string name="custom_token_network_input_not_selected">Не выбрано</string>
<string name="custom_token_name_input_placeholder">Например, USD Coin</string>
<string name="custom_token_name_input_title">Название токена</string>
<string name="custom_token_token_symbol_input_placeholder">Например, USDC</string>
<string name="custom_token_token_symbol_input_title">Символ токена</string>
<string name="custom_token_derivation_path_input_title">Деривация по BIP44</string>
<string name="custom_token_derivation_path_default">По-умолчанию</string>
<string name="common_server_unavailable">Сервер недоступен, повторите попытку позднее</string>
<string name="main_page_balance">Баланс</string>
<string name="main_processing_full_amount">В сумме учтены не все монеты</string>
<string name="main_tokens">Токены</string>
<string name="main_manage_tokens">Управление токенами</string>
<string name="token_item_no_rate">Нет цены</string>
<string name="wallet_balance_blockchain_unreachable">Сеть недоступна</string>
<string name="token_details_hide_token">Скрыть токен</string>
<string name="token_details_hide_alert_title">Скрыть %s</string>
<string name="token_details_hide_alert_hide">Скрыть</string>
<string name="token_details_hide_alert_message">Вы скрываете токен с главного экрана, но в любой момент сможете добавить его обратно через страницу управления токенами.</string>
<string name="token_details_unable_hide_alert_title">Невозможно скрыть %s</string>
<string name="token_details_unable_hide_alert_message">Токен %s является основной валютой в сети %s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети.</string>
<string name="main_no_backup_warning_title">Бэкап кошелька не был произведен</string>
<string name="main_no_backup_warning_subtitle">Чтобы защитить свои активы, мы советуем вам выполнить эту процедуру</string>
<string name="common_retry">Повторить</string>
<string name="details_chat">Чат</string>
<string name="wallet_currency_subtitle">Сеть %s</string>
<string name="common_understand">Я понял</string>
<string name="common_yes">Да</string>
<string name="common_no">Нет</string>
<string name="russian_bank_card_warning_title">Карты банков РФ в данный момент не принимаются</string>
<string name="russian_bank_card_warning_subtitle">У вас есть карта банка другой страны или платежной системы UnionPay?</string>
<string name="wallet_connect_scanner_error_unsupported_network">Сеть не поддерживается. Пожалуйста, выберите другую сеть.</string>
<string name="card_settings_title">Настройки карты</string>
<string name="card_settings_security_mode">Тип безопасности</string>
<string name="card_settings_change_access_code">Смена кода доступа</string>
<string name="card_settings_change_access_code_footer">Код доступа будет изменен только на данной карте</string>
<string name="common_continue">Продолжить</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Приготовьте свою карту</string>
<string name="scan_card_settings_message">Отсканируйте карту, чтобы изменить ее настройки. Изменения затронут только ту карту, которую вы отсканировали, и не повлияют на другие карты, привязанные к вашему кошельку.</string>
<string name="scan_card_settings_button">Сканировать</string>
<string name="app_settings_title">Настройки приложения</string>
<string name="app_settings_saved_wallet">Cохранение кошелька</string>
<string name="app_settings_saved_wallet_footer">Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту.</string>
<string name="app_settings_saved_access_codes">Сохранение кода доступа</string>
<string name="app_settings_saved_access_codes_footer">Подключите функцию хранения кодов доступа от карт на телефоне в зашифрованном виде, и при работе с картой вместо кода доступа будет запрашиваться биометрическая аутентификация.</string>
<string name="app_settings_off_saved_wallet_alert_message">При отключении функции сохранения кошелька все ранее сохраненные кошельки будут удалены.</string>
<string name="app_settings_off_saved_access_code_alert_message">Все сохраненные коды доступа будут удалены. Вам потребуется вводить код доступа при работе с кошельком.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Подключение к Dapps</string>
<string name="reset_card_without_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька на этой карте, а также отвязыванию карты из приложения. Кошелек невозможно будет восстановить.</string>
<string name="reset_card_with_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька на этой карте, а также отвязыванию карты из приложения. Кошелек невозможно будет восстановить или использовать данную карту для восстановления кода доступа.</string>
<string name="reset_card_to_factory_warning_message">Я понимаю, что после выполнения этого действия у меня больше не будет доступа к текущему кошельку</string>
<string name="reset_card_to_factory_button_title">Сбросить карту</string>
<string name="card_settings_reset_card_to_factory">Сброс к заводским настройкам</string>
<string name="wallet_connect_select_network">Выберите сеть</string>
<string name="main_scan_card_warning_view_title">Отсканируйте карту</string>
<string name="main_scan_card_warning_view_subtitle">Чтобы получить доступ ко всем сетям, вам необходимо отсканировать карту</string>
<string name="wallet_connect_error_unsupported_dapp">Cоединение с этим Dapp сервисом не может быть установлено из-за его технической реализации.</string>
<string name="welcome_unlock_title">C возвращением!</string>
<string name="welcome_unlock_description">Используйте %s или код доступа для входа в приложение</string>
<string name="welcome_unlock">Войти с %s</string>
<string name="welcome_unlock_card">Сканировать карту</string>
<string name="save_user_wallet_agreement_access_title">Доступ в приложение</string>
<string name="save_user_wallet_agreement_access_description">Войдите в приложение и следите за своим балансом без сканирования карты</string>
<string name="save_user_wallet_agreement_code_title">Код доступа</string>
<string name="save_user_wallet_agreement_notice">Обратите внимание, что для совершения транзакции с вашими средствами по-прежнему потребуется ваша карта</string>
<string name="user_wallet_list_title">Мои кошельки</string>
<string name="user_wallet_list_multi_header">Мультивалютные</string>
<string name="user_wallet_list_single_header">Одновалютные</string>
<string name="user_wallet_list_add_button">Добавить новый кошелек</string>
<string name="user_wallet_list_rename_popup_title">Переименование кошелька</string>
<string name="user_wallet_list_rename_popup_placeholder">Имя кошелька</string>
<string name="user_wallet_list_unlock_all">Разблокировать все с %s</string>
<string name="send_extras_error_invalid_destination_tag">Недопустимый Tag. Он не будет добавлен в транзакцию.</string>
<string name="send_extras_error_invalid_memo">Недопустимый Memo. Он не будет добавлен в транзакцию.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Внимание</string>
<string name="saltpay_error_empty_backup_message">Приложите карту с логотипом Visa</string>
<string name="saltpay_error_no_gas_title">Недостаточно средств для активации</string>
<string name="saltpay_error_no_gas_message">Пожалуйста обратитесь в службу поддержки</string>
<string name="saltpay_error_pin_weak_title">Ввод одинаковых цифр является не безопасным</string>
<string name="saltpay_error_pin_weak_message">Данный Код доступа может быть легко взломан</string>
<string name="onboarding_navbar_pin">Код доступа</string>
<string name="onboarding_navbar_register_wallet">Подключиться</string>
<string name="onboarding_navbar_kyc_start">Верификация клиента</string>
<string name="onboarding_navbar_kyc_progress">Подтвердите свою личность</string>
<string name="onboarding_button_pin">Установить Код доступа</string>
<string name="onboarding_button_register_wallet">Зарегистрироваться</string>
<string name="onboarding_button_kyc_start">Верифицировать (Utorg)</string>
<string name="onboarding_button_kyc_waiting">Обновить</string>
<string name="onboarding_title_register_wallet">Подключите свою карту</string>
<string name="onboarding_title_kyc_start">Подтвердите свою личность</string>
<string name="onboarding_title_kyc_waiting">Подтверждение личности в процессе</string>
<string name="onboarding_subtitle_register_wallet">Подключите вашу карту к децентрализованной платежной системе</string>
<string name="onboarding_subtitle_kyc_start">Для начала работы с картой вам необходимо завершить процесс подтверждения личности</string>
<string name="onboarding_subtitle_kyc_waiting">Пожалуйста дождитесь завершения процесса подтверждения личности. Вы будете уведомлены через e-mail. Обычно это занимает не более часа. Вы можете закрыть приложение и вернуться позже.</string>
<string name="onboarding_title_pin">Код доступа</string>
<string name="onboarding_subtitle_pin">Установите Код доступа для вашей SaltPay карты</string>
<string name="onboarding_supplement_button_kyc_waiting">Чат поддержки</string>
<string name="registration_task_alert_message">Пожалуйста, удерживайте карту до завершения операции</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">Для начала процесса бэкапа вам необходимо добавить Tangem карту</string>
<string name="onboarding_saltpay_title_no_backup_card">Бэкап карта не добавлена</string>
<string name="onboarding_saltpay_title_one_backup_card">Бэкап карта создана</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Завершите процесс бэкапа создав код доступа</string>
<string name="onboarding_saltpay_title_prepare_origin">Приготовьте SaltPay карту</string>
<string name="onboarding_saltpay_button_backup_origin">Приложите SaltPay карту</string>
<string name="onboarding_saltpay_title_backup_card">Приложите Tangem карту</string>
<string name="onboarding_chat_button_title">Чат</string>
<string name="onboarding_title_claim">Запросить %s</string>
<string name="onboarding_subtitle_claim">Для начала работы просто запросите начисление wxDai на свой кошелек</string>
<string name="onboarding_button_claim">Запросить</string>
<string name="onboarding_subtitle_success_claim">Поздравляем! Ваша платежная крипто карта теперь активирована!</string>
<string name="onboarding_title_claim_progress">Запрашивается</string>
<string name="onboarding_subtitle_claim_progress">Это займет несколько секунд</string>
<string name="onboarding_title_kyc_retry">Что-то пошло не так</string>
<string name="onboarding_subtitle_kyc_retry">Более подробная информация отправлена на ваш адрес электронной почты.</string>
<string name="onboarding_exit_alert_title">Вы хотите выйти из процесса активации?</string>
<string name="onboarding_exit_alert_message">В этом случае вам будет необходимо начать процесс заново.</string>
<string name="error_wrong_wallet_tapped">Вы использовали карту от другого кошелька. Приложите карту, связанную с этим кошельком.</string>
<string name="details_referral_title">Реферальная программа</string>
<string name="referral_title">Приведи друга в Tangem</string>
<string name="referral_point_currencies_title">Вы</string>
<string name="referral_point_currencies_description_prefix">Получите</string>
<string name="referral_point_currencies_description_suffix">на ваш адрес в сети %s%s за каждый кошелек, который купит ваш друг</string>
<string name="referral_point_discount_title">Ваш друг</string>
<string name="referral_point_discount_description_prefix">Получит</string>
<string name="referral_point_discount_description_value">%s скидку</string>
<string name="referral_point_discount_description_suffix">при покупке карточки на сайте tangem.com</string>
<string name="referral_friends_bought_title">Ваши друзья купили</string>
<string name="referral_promo_code_title">Ваш персональный код</string>
<string name="referral_button_participate">Участвовать</string>
<string name="common_terms_and_conditions">условия участия</string>
<string name="referral_tos_not_enroled_prefix">Нажимая на эту кнопку вы принимаете</string>
<string name="referral_tos_enroled_prefix">Вы приняли</string>
<string name="referral_tos_suffix">в реферальной программе</string>
<string name="internal_error_wallet_manager_not_found">Внутренняя ошибка: не удается найти менеджер кошельков</string>
<string name="common_balance">Баланс: %s</string>
<string name="common_share">Поделиться</string>
<string name="common_copy">Копировать</string>
<string name="common_success">Успешно</string>
<string name="swapping_permission_header">Дать разрешение</string>
<string name="swapping_permission_subheader">Чтобы продолжить, вам нужно разрешить смарт-контракту 1inch использовать ваш %s</string>
<string name="swapping_permission_rows_amount">Количество %s</string>
<string name="swapping_permission_rows_your_wallet">Ваш кошелек</string>
<string name="swapping_permission_rows_spender">Отправитель</string>
<string name="swapping_permission_buttons_approve">Подтвердить</string>
<string name="swapping_swap_of_to">Обмен %s на</string>
<string name="swapping_swap">Обмен</string>
<string name="swapping_insufficient_funds">Недостаточно средств</string>
<string name="swapping_give_permission">Дать разрешение</string>
<string name="swapping_permit_and_swap">Разрешить и обменять</string>
<string name="referral_error_failed_to_load_info">Не удалось загрузить информацию по реферальной программе. Пожалуйста, попробуйте позже.</string>
<string name="referral_error_failed_to_load_info_with_reason">Не удалось загрузить информацию по реферальной программе. Причина: %s. Пожалуйста, попробуйте позже.</string>
<string name="referral_error_failed_to_participate">Не удалось обработать вашу заявку на участие. Причина: %s. Пожалуйста, попробуйте позже. Если проблема сохранится, вы можете обратиться в техподдержку.</string>
<string name="referral_promo_code_copied">Персональный код скопирован!</string>
<string name="referral_share_link">Купи Tangem Wallet со скидкой!\n%s</string>
<string name="warning_existential_deposit_message">Сеть %s использует концепцию экзистенциального депозита. Если баланс вашего счета опустится ниже %s, он будет деактивирован, а все оставшиеся средства будут уничтожены.</string>
<string name="send_validation_invalid_address">Неверный адрес</string>
<string name="user_wallet_list_error_wallet_already_saved">Этот кошелек уже был сохранен, вы можете добавить другой</string>
<string name="common_delete">Удалить</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Включите биометрическую аутентификацию</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">Похоже, что у вас отключена биометрическая аутентификация, она необходима для сохранения кошельков</string>
<string name="common_enable">Включить</string>
<string name="user_wallet_list_editing_count">%d выбрано</string>
<string name="common_biometric_authentication">биометрическую аутентификацию</string>
<string name="common_biometrics">биометрией</string>
<string name="app_name">Tangem</string>
<string name="common_save_changes">Сохранить изменения</string>
<string name="common_warning">Предупреждение</string>
@ -61,9 +279,9 @@
<string name="alert_unsupported_card">Эта карта не предназначена для работы с этим приложением</string>
<string name="alert_developer_card">Карта, которую вы отсканировали, является картой разработчика. Не принимайте её в качестве оплаты.</string>
<string name="initial_message_sign_header">Нажмите, чтобы подписать</string>
<string name="initial_message_create_wallet_body">Чтобы создать кошелек, соедините телефон и карту в точности, как показано выше.</string>
<string name="initial_message_change_access_code_body">Чтобы изменить код доступа, соедините телефон и карту в точности, как показано выше.</string>
<string name="initial_message_change_passcode_body">Чтобы изменить пароль, соедините телефон и карту в точности, как показано выше.</string>
<string name="initial_message_create_wallet_body">Чтобы создать кошелек, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_change_access_code_body">Чтобы изменить код доступа, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_change_passcode_body">Чтобы изменить пароль, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="disclaimer_title">Условия использования</string>
<string name="wallet_notification_no_internet">Нет соединения с интернетом</string>
<string name="send_error_payid_unsupported_by_blockchain">PayString не поддерживается блокчейном</string>
@ -97,7 +315,6 @@
<string name="alert_failed_to_send_transaction_title">Не могу отправить транзакцию</string>
<string name="alert_failed_to_send_transaction_message">Причина: %s</string>
<string name="alert_troubleshooting_scan_card_title">У вас возникли трудности со сканированием карты?</string>
<string name="alert_troubleshooting_scan_card_ok">Отмена</string>
<string name="alert_button_request_support">Обратиться в поддержку</string>
<string name="alert_button_send_feedback">Отправить отзыв</string>
<string name="warning_button_really_cool">Очень круто!</string>
@ -133,8 +350,7 @@
<string name="onboarding_done_header">Успешно!</string>
<string name="onboarding_done_body">Ваша карта активирована и готова к использованию</string>
<string name="onboarding_balance_title">Баланс</string>
<string name="address_qr_code_message_format">Отправляйте только %s (%s) на этот адрес. Иначе это может привести к утрате средств.</string>
<string name="address_qr_code_message_token_format">Отправляйте только %s (%s) из сети %s на этот адрес. Иначе это может привести к утрате средств.</string>
<string name="address_qr_code_message_format">Отправляйте только %s (%s) в сети %s на этот адрес. Использование другой сети может привести к утрате средств.</string>
<string name="onboarding_twins_interrupt_warning">Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала.</string>
<string name="onboarding_twin_exit_warning">Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="warning_button_ok">Понятно!</string>
@ -227,6 +443,12 @@
<string name="common_error">Ошибка</string>
<string name="common_ok">Ок</string>
<string name="wallet_connect_error_failed_to_connect">Не удалось установить сессию WalletConnect. Пожалуйста, повторите попытку позже.</string>
<string name="save_user_wallet_agreement_header_biometrics">Вы хотите использовать биометрию?</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Для операций с вашим кошельком будет запрашиваться биометрия вместо кода доступа карты</string>
<string name="save_user_wallet_agreement_allow_biometrics">Использовать биометрию</string>
<string name="app_settings_enable_biometrics_title">Включите биометрическую аутентификацию</string>
<string name="app_settings_enable_biometrics_description">Перейдите в настройки, чтобы включить биометрическую аутентификацию в приложении Tangem App</string>
<string name="wallet_balance_missing_derivation">Отсканируйте карту</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>

View file

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 карты</string>
<string name="shop_2_cards">2 карты</string>
<string name="shop_shipping">Доставка</string>
<string name="shop_free">Бесплатно</string>
<string name="shop_i_have_a_promo_code">У меня есть промо-код…</string>
<string name="shop_total">Итого</string>
<string name="shop_other_payment_methods">Другие способы оплаты</string>
<string name="shop_buy_now">Купить сейчас</string>
<string name="story_meet_title">Встречайте\nTangem</string>
<string name="story_meet_buy">Покупайте</string>
<string name="story_meet_store">Храните</string>
<string name="story_meet_send">Отправляйте</string>
<string name="story_meet_pay">Расплачивайтесь</string>
<string name="story_meet_exchange">Обменивайте</string>
<string name="story_meet_lend">Вкладывайте</string>
<string name="story_meet_borrow">Занимайте</string>
<string name="story_awe_title">Революционный аппаратный кошелек</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности. Приватные ключи надежно хранятся на карте.</string>
<string name="story_backup_title">Все ключи в безопасности</string>
<string name="story_backup_description_1">До</string>
<string name="story_backup_description_2_bold">трех карт</string>
<string name="story_backup_description_3">с одним кошельком</string>
<string name="story_currencies_title">Тысячи криптовалют</string>
<string name="story_currencies_description">Аппаратный кошелек для ваших биткоинов, эфира и многих других валют одновременно — все в одной карте</string>
<string name="story_web3_title">Поддержка DeFi</string>
<string name="story_web3_description">Обменивайте, покупайте NFT, получайте займы и делайте вклады в более чем 100 различных децентрализованных сервисах</string>
<string name="story_finish_title">Кошелек для каждого</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и батареек. Как только понадобится крипта, просто приложите карту к телефону.</string>
<string name="home_button_order">Купить</string>
<string name="search_tokens_title">Поиск токенов</string>
<string name="alert_demo_message">Приложение работает в демонстрационном режиме. Средства на всех счетах ненастоящие.</string>
<string name="alert_demo_feature_disabled">Эта функция недоступна в демонстрационном режиме</string>
<string name="token_details_send_blocked_fee_format">Недостаточно средств для комиссии на вашем %s кошельке для отправки транзакции. Сначала пополните свой %s кошелек.</string>
<string name="currency_subtitle_expanded">Доступные сети</string>
<string name="wallet_connect_network_not_found_format">Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново.</string>
<string name="common_attention">Внимание</string>
<string name="alert_manage_tokens_addresses_message">Внимание! Валюты на разных сетях имеют разные адреса. Убедитесь, что адрес соответствует сети, в которой вы отправляете средства.</string>
<string name="alert_manage_tokens_unsupported_message">Токены в сети Solana не поддерживаются этой картой из-за ограничений прошивки.</string>
<string name="contract_address_copied_message">Адрес контракта скопирован!</string>
<string name="custom_token_contract_address_input_title">Адрес контракта</string>
<string name="custom_token_creation_error_required_field">Обязательное поле</string>
<string name="custom_token_creation_error_network_not_selected">Пожалуйста, выберите сеть</string>
<string name="custom_token_creation_error_wrong_decimals">Количество знаков после запятой должно быть корректным числом не больше %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Адрес контракта некорректен</string>
<string name="custom_token_creation_error_invalid_derivation_path">Путь деривации некорректен</string>
<string name="custom_token_validation_error_not_found">Токены могут быть созданы кем угодно. Остерегайтесь мошеннических токенов, они могут ничего не стоить</string>
<string name="custom_token_validation_error_already_added">Этот токен/сеть уже находится в вашем списке</string>
<string name="custom_token_decimals_input_title">Знаков после запятой</string>
<string name="custom_token_network_input_title">Сеть</string>
<string name="custom_token_network_input_not_selected">Не выбрано</string>
<string name="custom_token_name_input_placeholder">Например, USD Coin</string>
<string name="custom_token_name_input_title">Название токена</string>
<string name="custom_token_token_symbol_input_placeholder">Например, USDC</string>
<string name="custom_token_token_symbol_input_title">Символ токена</string>
<string name="custom_token_derivation_path_input_title">Деривация по BIP44</string>
<string name="custom_token_derivation_path_default">По-умолчанию</string>
<string name="common_server_unavailable">Сервер недоступен, повторите попытку позднее</string>
<string name="main_page_balance">Баланс</string>
<string name="main_processing_full_amount">В сумме учтены не все монеты</string>
<string name="main_tokens">Токены</string>
<string name="main_manage_tokens">Управление токенами</string>
<string name="token_item_no_rate">Нет цены</string>
<string name="wallet_balance_blockchain_unreachable">Сеть недоступна</string>
<string name="token_details_hide_token">Скрыть токен</string>
<string name="token_details_hide_alert_title">Скрыть %s</string>
<string name="token_details_hide_alert_hide">Скрыть</string>
<string name="token_details_hide_alert_message">Вы скрываете токен с главного экрана, но в любой момент сможете добавить его обратно через страницу управления токенами.</string>
<string name="token_details_unable_hide_alert_title">Невозможно скрыть %s</string>
<string name="token_details_unable_hide_alert_message">Токен %s является основной валютой в сети %s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети.</string>
<string name="main_no_backup_warning_title">Бэкап кошелька не был произведен</string>
<string name="main_no_backup_warning_subtitle">Чтобы защитить свои активы, мы советуем вам выполнить эту процедуру</string>
<string name="common_retry">Повторить</string>
<string name="details_chat">Чат</string>
<string name="wallet_currency_subtitle">Сеть %s</string>
<string name="common_understand">Я понял</string>
<string name="common_yes">Да</string>
<string name="common_no">Нет</string>
<string name="russian_bank_card_warning_title">Карты банков РФ в данный момент не принимаются</string>
<string name="russian_bank_card_warning_subtitle">У вас есть карта банка другой страны или платежной системы UnionPay?</string>
<string name="wallet_connect_scanner_error_unsupported_network">Сеть не поддерживается. Пожалуйста, выберите другую сеть.</string>
<string name="card_settings_title">Настройки карты</string>
<string name="card_settings_security_mode">Тип безопасности</string>
<string name="card_settings_change_access_code">Смена кода доступа</string>
<string name="card_settings_change_access_code_footer">Код доступа будет изменен только на данной карте</string>
<string name="common_continue">Продолжить</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Приготовьте свою карту</string>
<string name="scan_card_settings_message">Отсканируйте карту, чтобы изменить ее настройки. Изменения затронут только ту карту, которую вы отсканировали, и не повлияют на другие карты, привязанные к вашему кошельку.</string>
<string name="scan_card_settings_button">Сканировать</string>
<string name="app_settings_title">Настройки приложения</string>
<string name="app_settings_saved_wallet">Cохранение кошелька</string>
<string name="app_settings_saved_wallet_footer">Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту.</string>
<string name="app_settings_saved_access_codes">Сохранение кода доступа</string>
<string name="app_settings_saved_access_codes_footer">Подключите функцию хранения кодов доступа от карт на телефоне в зашифрованном виде, и при работе с картой вместо кода доступа будет запрашиваться биометрическая аутентификация.</string>
<string name="app_settings_off_saved_wallet_alert_message">При отключении функции сохранения кошелька все ранее сохраненные кошельки будут удалены.</string>
<string name="app_settings_off_saved_access_code_alert_message">Все сохраненные коды доступа будут удалены. Вам потребуется вводить код доступа при работе с кошельком.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Подключение к Dapps</string>
<string name="reset_card_to_factory_message">Это действие приведет к полному удалению кошелька на этой карте. Кошелек невозможно будет восстановить или использовать данную карту для восстановления кода доступа</string>
<string name="reset_card_to_factory_warning_message">Я понимаю, что после выполнения этого действия у меня больше не будет доступа к текущему кошельку</string>
<string name="reset_card_to_factory_button_title">Сбросить карту</string>
<string name="card_settings_reset_card_to_factory">Сброс к заводским настройкам</string>
<string name="card_settings_reset_card_to_factory_footer">Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты. Вы не сможете восстановить текущий кошелек или использовать эту карту для восстановления кода доступа.</string>
<string name="wallet_connect_select_network">Выберите сеть</string>
<string name="main_scan_card_warning_view_title">Отсканируйте карту</string>
<string name="main_scan_card_warning_view_subtitle">Чтобы получить доступ ко всем сетям, вам необходимо отсканировать карту</string>
<string name="wallet_connect_error_unsupported_dapp">Cоединение с этим Dapp сервисом не может быть установлено из-за его технической реализации.</string>
<string name="welcome_unlock_title">C возвращением!</string>
<string name="welcome_unlock_description">Используйте %s или код доступа для входа в приложение</string>
<string name="welcome_unlock">Войти с %s</string>
<string name="welcome_unlock_card">Сканировать карту</string>
<string name="onboarding_navbar_save_wallet">Сохраните ваш кошелек</string>
<string name="save_user_wallet_agreement_header">Вы хотите использовать %s?</string>
<string name="save_user_wallet_agreement_header_biometrics">Вы хотите использовать биометрию?</string>
<string name="save_user_wallet_agreement_access_title">Доступ в приложение</string>
<string name="save_user_wallet_agreement_access_description">Войдите в приложение и следите за своим балансом без сканирования карты</string>
<string name="save_user_wallet_agreement_code_title">Код доступа</string>
<string name="save_user_wallet_agreement_code_description">Для операций с вашим кошельком будет запрашиваться %s вместо кода доступа карты</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Для операций с вашим кошельком будет запрашиваться биометрия вместо кода доступа карты</string>
<string name="save_user_wallet_agreement_notice">Обратите внимание, что для совершения транзакции с вашими средствами по-прежнему потребуется ваша карта</string>
<string name="save_user_wallet_agreement_allow">Использовать %s</string>
<string name="save_user_wallet_agreement_allow_biometrics">Использовать биометрию</string>
<string name="save_user_wallet_agreement_new_feature">Новый функционал</string>
<string name="user_wallet_list_title">Мои кошельки</string>
<string name="user_wallet_list_multi_header">Мультивалютные</string>
<string name="user_wallet_list_single_header">Одновалютные</string>
<string name="user_wallet_list_add_button">Добавить новый кошелек</string>
<string name="user_wallet_list_rename_popup_title">Переименование кошелька</string>
<string name="user_wallet_list_rename_popup_placeholder">Имя кошелька</string>
<string name="user_wallet_list_unlock_all">Разблокировать все с %s</string>
<string name="send_extras_error_invalid_destination_tag">Недопустимый Tag. Он не будет добавлен в транзакцию.</string>
<string name="send_extras_error_invalid_memo">Недопустимый Memo. Он не будет добавлен в транзакцию.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Внимание</string>
<string name="saltpay_error_empty_backup_message">Приложите карту с логотипом Visa</string>
<string name="saltpay_error_no_gas_title">Недостаточно средств для активации</string>
<string name="saltpay_error_no_gas_message">Пожалуйста обратитесь в службу поддержки</string>
<string name="saltpay_error_pin_weak_title">Ввод одинаковых цифр является не безопасным</string>
<string name="saltpay_error_pin_weak_message">Данный Код доступа может быть легко взломан</string>
<string name="onboarding_navbar_pin">Код доступа</string>
<string name="onboarding_navbar_register_wallet">Подключиться</string>
<string name="onboarding_navbar_kyc_start">Верификация клиента</string>
<string name="onboarding_navbar_kyc_progress">Подтвердите свою личность</string>
<string name="onboarding_button_pin">Установить Код доступа</string>
<string name="onboarding_button_register_wallet">Зарегистрироваться</string>
<string name="onboarding_button_kyc_start">Верифицировать (Utorg)</string>
<string name="onboarding_button_kyc_waiting">Обновить</string>
<string name="onboarding_title_register_wallet">Подключите свою карту</string>
<string name="onboarding_title_kyc_start">Подтвердите свою личность</string>
<string name="onboarding_title_kyc_waiting">Подтверждение личности в процессе</string>
<string name="onboarding_subtitle_register_wallet">Подключите вашу карту к децентрализованной платежной системе</string>
<string name="onboarding_subtitle_kyc_start">Для начала работы с картой вам необходимо завершить процесс подтверждения личности</string>
<string name="onboarding_subtitle_kyc_waiting">Пожалуйста дождитесь завершения процесса подтверждения личности. Вы будете уведомлены через e-mail. Обычно это занимает не более часа. Вы можете закрыть приложение и вернуться позже.</string>
<string name="onboarding_title_pin">Код доступа</string>
<string name="onboarding_subtitle_pin">Установите Код доступа для вашей SaltPay карты</string>
<string name="onboarding_supplement_button_kyc_waiting">Чат поддержки</string>
<string name="registration_task_alert_message">Пожалуйста, удерживайте карту до завершения операции</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">Для начала процесса бэкапа вам необходимо добавить Tangem карту</string>
<string name="onboarding_saltpay_title_no_backup_card">Бэкап карта не добавлена</string>
<string name="onboarding_saltpay_title_one_backup_card">Бэкап карта создана</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Завершите процесс бэкапа создав код доступа</string>
<string name="onboarding_saltpay_title_prepare_origin">Приготовьте SaltPay карту</string>
<string name="onboarding_saltpay_button_backup_origin">Приложите SaltPay карту</string>
<string name="onboarding_saltpay_title_backup_card">Приложите Tangem карту</string>
<string name="onboarding_chat_button_title">Чат</string>
<string name="onboarding_title_claim">Запросить %s</string>
<string name="onboarding_subtitle_claim">Для начала работы просто запросите начисление wxDai на свой кошелек</string>
<string name="onboarding_button_claim">Запросить</string>
<string name="onboarding_subtitle_success_claim">Поздравляем! Ваша платежная крипто карта теперь активирована!</string>
<string name="onboarding_title_claim_progress">Запрашивается</string>
<string name="onboarding_subtitle_claim_progress">Это займет несколько секунд</string>
<string name="onboarding_title_kyc_retry">Что-то пошло не так</string>
<string name="onboarding_subtitle_kyc_retry">Более подробная информация отправлена на ваш адрес электронной почты.</string>
<string name="onboarding_exit_alert_title">Вы хотите выйти из процесса активации?</string>
<string name="onboarding_exit_alert_message">В этом случае вам будет необходимо начать процесс заново.</string>
<string name="error_wrong_wallet_tapped">Вы использовали карту от другого кошелька. Приложите карту, связанную с этим кошельком.</string>
<string name="details_referral_title">Реферальная программа</string>
<string name="referral_title">Приведи друга в Tangem</string>
<string name="referral_point_currencies_title">Вы</string>
<string name="referral_point_currencies_description_prefix">Получите</string>
<string name="referral_point_currencies_description_suffix">на ваш адрес в сети %s%s за каждый кошелек, который купит ваш друг</string>
<string name="referral_point_discount_title">Ваш друг</string>
<string name="referral_point_discount_description_prefix">Получит</string>
<string name="referral_point_discount_description_value">%s скидку</string>
<string name="referral_point_discount_description_suffix">при покупке карточки на сайте tangem.com</string>
<string name="referral_friends_bought_title">Ваши друзья купили</string>
<string name="referral_promo_code_title">Ваш персональный код</string>
<string name="referral_button_participate">Участвовать</string>
<string name="common_terms_and_conditions">условия участия</string>
<string name="referral_tos_not_enroled_prefix">Нажимая на эту кнопку вы принимаете</string>
<string name="referral_tos_enroled_prefix">Вы приняли</string>
<string name="referral_tos_suffix">в реферальной программе</string>
<string name="internal_error_wallet_manager_not_found">Внутренняя ошибка: не удается найти менеджер кошельков</string>
<string name="common_balance">Баланс: %s</string>
<string name="common_share">Поделиться</string>
<string name="common_copy">Копировать</string>
<string name="common_success">Успешно</string>
<string name="swapping_permission_header">Дать разрешение</string>
<string name="swapping_permission_subheader">Чтобы продолжить, вам нужно разрешить смарт-контракту 1inch использовать ваш %s</string>
<string name="swapping_permission_rows_amount">Количество %s</string>
<string name="swapping_permission_rows_your_wallet">Ваш кошелек</string>
<string name="swapping_permission_rows_spender">Отправитель</string>
<string name="swapping_permission_buttons_approve">Подтвердить</string>
<string name="swapping_swap_of_to">Обмен %s на</string>
<string name="swapping_swap">Обмен</string>
<string name="swapping_insufficient_funds">Недостаточно средств</string>
<string name="swapping_give_permission">Дать разрешение</string>
<string name="swapping_permit_and_swap">Разрешить и обменять</string>
<string name="referral_error_failed_to_load_info">Не удалось загрузить информацию по реферальной программе. Пожалуйста, попробуйте позже.</string>
<string name="referral_error_failed_to_load_info_with_reason">Не удалось загрузить информацию по реферальной программе. Причина: %s. Пожалуйста, попробуйте позже.</string>
<string name="referral_error_failed_to_participate">Не удалось обработать вашу заявку на участие. Причина: %s. Пожалуйста, попробуйте позже. Если проблема сохранится, вы можете обратиться в техподдержку.</string>
<string name="referral_promo_code_copied">Персональный код скопирован!</string>
<string name="referral_share_link">Купи Tangem Wallet со скидкой!\n%s</string>
<string name="warning_existential_deposit_message">Сеть %s использует концепцию экзистенциального депозита. Если баланс вашего счета опустится ниже %s, он будет деактивирован, а все оставшиеся средства будут уничтожены.</string>
<string name="send_validation_invalid_address">Неверный адрес</string>
<string name="user_wallet_list_error_wallet_already_saved">Этот кошелек уже был сохранен, вы можете добавить другой</string>
<string name="common_delete">Удалить</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Включите биометрическую аутентификацию</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">Похоже, что у вас отключена биометрическая аутентификация, она необходима для сохранения кошельков</string>
<string name="common_enable">Включить</string>
<string name="save_user_wallet_agreement_description">Функция сохранения кошелька позволяет вам использовать свой кошелек с биометрической аутентификацией, не прикладывая карту к телефону для получения доступа.</string>
<string name="user_wallet_list_editing_count">%d выбрано</string>
<string name="common_biometric_authentication">биометрическую аутентификацию</string>
<string name="common_biometrics">биометрией</string>
<string name="app_settings_enable_biometrics_title">Включите биометрическую аутентификацию</string>
<string name="app_settings_enable_biometrics_description">Перейдите в настройки, чтобы включить биометрическую аутентификацию в приложении Tangem App</string>
<string name="wallet_balance_missing_derivation">Отсканируйте карту</string>
</resources>

View file

@ -1,5 +1,223 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Retry</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change Access Code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the Card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scan card</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. You\'ll be notified via email. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated!</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check your email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Balance: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Success</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Invalid address</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Delete</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_name">Tangem</string>
<string name="common_save_changes">Save changes</string>
<string name="common_warning">Warning</string>
@ -54,16 +272,16 @@
<string name="details_manage_security_long_tap">Long Tap</string>
<string name="details_manage_security_long_tap_description">This mechanism protects against proximity attacks on a card. It will enforce a delay between reception and execution of a command.</string>
<string name="details_manage_security_passcode">Passcode</string>
<string name="details_manage_security_passcode_description">Before executing any command entailing a change of the card state you will have to enter the passcode.</string>
<string name="details_manage_security_passcode_description">Before executing any command entailing a change of the card state, you will have to enter the passcode.</string>
<string name="details_manage_security_access_code">Access code</string>
<string name="details_manage_security_access_code_description">You will have to submit the correct access code before scanning the card</string>
<string name="alert_card_signed_transactions">This card has been already topped up and signed transactions in the past. Consider immediate withdrawal of all funds if you have received this card from an untrusted source. If it\'s your card, there is nothing to worry about.</string>
<string name="alert_unsupported_card">This card is not designed to work with this app</string>
<string name="alert_developer_card">The card you scanned is a development card. Don\'t accept it as a payment.</string>
<string name="initial_message_sign_header">Tap to sign</string>
<string name="initial_message_create_wallet_body">To create wallet, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_change_access_code_body">To change the access code, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_change_passcode_body">To change the passcode, connect your phone and the card exactly as it shown above</string>
<string name="initial_message_create_wallet_body">To create the wallet tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_access_code_body">To change the access code tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_passcode_body">To change the passcode tap the card as shown above and do not remove until the end of the operation</string>
<string name="disclaimer_title">Terms of Service</string>
<string name="wallet_notification_no_internet">No internet connection</string>
<string name="send_error_payid_unsupported_by_blockchain">PayString unsupported by blockchain</string>
@ -97,7 +315,6 @@
<string name="alert_failed_to_send_transaction_title">Can\'t send a transaction</string>
<string name="alert_failed_to_send_transaction_message">Reason: %s</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card?</string>
<string name="alert_troubleshooting_scan_card_ok">I\'m okay</string>
<string name="alert_button_request_support">Request support</string>
<string name="alert_button_send_feedback">Send feedback</string>
<string name="warning_button_really_cool">Really cool!</string>
@ -133,8 +350,7 @@
<string name="onboarding_done_header">Success!</string>
<string name="onboarding_done_body">Your card is activated and ready to be used</string>
<string name="onboarding_balance_title">Balance</string>
<string name="address_qr_code_message_format">Send only %s (%s) to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_token_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</string>
<string name="address_qr_code_message_format">Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds.</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_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="warning_button_ok">Ok, Got it!</string>
@ -217,7 +433,7 @@
<string name="feedback_subject_support_tangem">Tangem feedback</string>
<string name="feedback_subject_support">Feedback</string>
<string name="feedback_preface_rate_negative">Tell us what functions you are missing, and we will try to help you.</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have?</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have</string>
<string name="feedback_preface_tx_failed">Please tell us more about your issue. Every small detail can help.</string>
<string name="feedback_preface_support">Hi support team,</string>
<string name="feedback_data_collection_message">The following information is optional. You can erase it if you don\'t want to share it.</string>
@ -227,6 +443,12 @@
<string name="common_error">Error</string>
<string name="common_ok">OK</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>

View file

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
<string name="shop_free">Free</string>
<string name="shop_i_have_a_promo_code">I have a promo code…</string>
<string name="shop_total">Total</string>
<string name="shop_other_payment_methods">Other payment methods</string>
<string name="shop_buy_now">Buy now</string>
<string name="story_meet_title">Meet\nTangem</string>
<string name="story_meet_buy">Buy</string>
<string name="story_meet_store">Store</string>
<string name="story_meet_send">Send</string>
<string name="story_meet_pay">Pay</string>
<string name="story_meet_exchange">Exchange</string>
<string name="story_meet_lend">Lend</string>
<string name="story_meet_borrow">Borrow</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_backup_description_1">Up to</string>
<string name="story_backup_description_2_bold">3 physical cards</string>
<string name="story_backup_description_3">to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
<string name="token_details_send_blocked_fee_format">Not enough funds for fee on your %s wallet to send a transaction. Top up your %s wallet first.</string>
<string name="currency_subtitle_expanded">Available networks</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="common_attention">Attention</string>
<string name="alert_manage_tokens_addresses_message">Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in Solana network are not supported by this card due to firmware limitation.</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="custom_token_contract_address_input_title">Contract address</string>
<string name="custom_token_creation_error_required_field">Required field</string>
<string name="custom_token_creation_error_network_not_selected">Please select the network</string>
<string name="custom_token_creation_error_wrong_decimals">Decimal number must be a valid integer, no higher than %d</string>
<string name="custom_token_creation_error_invalid_contract_address">Contract address is invalid</string>
<string name="custom_token_creation_error_invalid_derivation_path">Derivation path is invalid</string>
<string name="custom_token_validation_error_not_found">Note that tokens can be created by anyone. Be aware of adding scam tokens, they can cost nothing.</string>
<string name="custom_token_validation_error_already_added">This token/network has already been added to your list</string>
<string name="custom_token_decimals_input_title">Decimals</string>
<string name="custom_token_network_input_title">Network</string>
<string name="custom_token_network_input_not_selected">Not selected</string>
<string name="custom_token_name_input_placeholder">E.g. USD Coin</string>
<string name="custom_token_name_input_title">Name</string>
<string name="custom_token_token_symbol_input_placeholder">E.g. USDC</string>
<string name="custom_token_token_symbol_input_title">Token symbol</string>
<string name="custom_token_derivation_path_input_title">BIP44 coin type</string>
<string name="custom_token_derivation_path_default">Default</string>
<string name="common_server_unavailable">The server is not available, please try again later</string>
<string name="main_page_balance">Total balance</string>
<string name="main_processing_full_amount">The amount does not include some of your funds</string>
<string name="main_tokens">Tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="token_item_no_rate">No rate</string>
<string name="wallet_balance_blockchain_unreachable">Network is unreachable</string>
<string name="token_details_hide_token">Hide token</string>
<string name="token_details_hide_alert_title">Hide %s</string>
<string name="token_details_hide_alert_hide">Hide</string>
<string name="token_details_hide_alert_message">You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_details_unable_hide_alert_message">The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="main_no_backup_warning_title">Your wallet has not been backed up</string>
<string name="main_no_backup_warning_subtitle">To protect your assets, we advise you to carry out this procedure</string>
<string name="common_retry">Retry</string>
<string name="details_chat">Chat</string>
<string name="wallet_currency_subtitle">%s network</string>
<string name="common_understand">I understand</string>
<string name="common_yes">Yes</string>
<string name="common_no">No</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not accepted at the moment</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card of another country or a UnionPay card?</string>
<string name="wallet_connect_scanner_error_unsupported_network">This network is not supported. Please select another network.</string>
<string name="card_settings_title">Card Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_change_access_code">Change Access Code</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card only</string>
<string name="common_continue">Continue</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_button">Scan Card</string>
<string name="app_settings_title">App Settings</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes.</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_subtitle">Connect to Dapps</string>
<string name="reset_card_to_factory_message">This action will completely remove the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_to_factory_warning_message">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_button_title">Reset the Card</string>
<string name="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_reset_card_to_factory_footer">Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="wallet_connect_select_network">Select network</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="welcome_unlock_title">Welcome back!</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock">Log in with %s</string>
<string name="welcome_unlock_card">Scan card</string>
<string name="onboarding_navbar_save_wallet">Save your wallet</string>
<string name="save_user_wallet_agreement_header">Would you like to use %s?</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_code_title">Access code</string>
<string name="save_user_wallet_agreement_code_description">%s will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="save_user_wallet_agreement_allow">Allow to use %s</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="save_user_wallet_agreement_new_feature">New feature</string>
<string name="user_wallet_list_title">My Wallets</string>
<string name="user_wallet_list_multi_header">Multi-currency</string>
<string name="user_wallet_list_single_header">Single-currency</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_rename_popup_title">Rename Wallet</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
<string name="user_wallet_list_unlock_all">Unlock all with %s</string>
<string name="send_extras_error_invalid_destination_tag">Invalid Tag. It won\'t be added to the transaction.</string>
<string name="send_extras_error_invalid_memo">Invalid Memo. It won\'t be added to the transaction.</string>
<string name="send_extras_hint_destination_tag">Tag</string>
<string name="send_extras_hint_memo">Memo</string>
<string name="saltpay_error_empty_backup_title">Attention</string>
<string name="saltpay_error_empty_backup_message">Tap the card with the visa logo</string>
<string name="saltpay_error_no_gas_title">No funds for activation</string>
<string name="saltpay_error_no_gas_message">Please contact support</string>
<string name="saltpay_error_pin_weak_title">Four identical digits isn\'t safe</string>
<string name="saltpay_error_pin_weak_message">Such a PIN can be brute-forced easily</string>
<string name="onboarding_navbar_pin">Pin code</string>
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_kyc_start">KYC</string>
<string name="onboarding_navbar_kyc_progress">Verify your identity</string>
<string name="onboarding_button_pin">Set PIN code</string>
<string name="onboarding_button_register_wallet">Register</string>
<string name="onboarding_button_kyc_start">Verify via Utorg</string>
<string name="onboarding_button_kyc_waiting">Refresh</string>
<string name="onboarding_title_register_wallet">Connect your card</string>
<string name="onboarding_title_kyc_start">Verify your identity</string>
<string name="onboarding_title_kyc_waiting">KYC is in progress</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_kyc_start">To start using your card you have to pass the KYC process</string>
<string name="onboarding_subtitle_kyc_waiting">Please wait until the verification is completed. Usually it takes up to 1 hour. You can close the app and come back later.</string>
<string name="onboarding_title_pin">PIN Code</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="registration_task_alert_message">Please hold the card until the operation complete</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_title_no_backup_card">No backup card</string>
<string name="onboarding_saltpay_title_one_backup_card">Backup card ready</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_prepare_origin">Prepare the SaltPay card</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_title_claim">Claim %s</string>
<string name="onboarding_subtitle_claim">To get started, simply claim wxDAI to your wallet</string>
<string name="onboarding_button_claim">Claim</string>
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated</string>
<string name="onboarding_title_claim_progress">Claiming</string>
<string name="onboarding_subtitle_claim_progress">It will take a few seconds</string>
<string name="onboarding_title_kyc_retry">Something went wrong</string>
<string name="onboarding_subtitle_kyc_retry">Please check your email for further instructions</string>
<string name="onboarding_exit_alert_title">Do you want to exit the activation process?</string>
<string name="onboarding_exit_alert_message">In this case, you will need to start from the beginning.</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="details_referral_title">Referral program</string>
<string name="referral_title">Refer your friends to Tangem</string>
<string name="referral_point_currencies_title">You</string>
<string name="referral_point_currencies_description_prefix">Will get</string>
<string name="referral_point_currencies_description_suffix">for each wallet bought by your friend on your %s network address%s</string>
<string name="referral_point_discount_title">Your friend</string>
<string name="referral_point_discount_description_prefix">Will get a</string>
<string name="referral_point_discount_description_value">%s discount</string>
<string name="referral_point_discount_description_suffix">when buying a card on tangem.com</string>
<string name="referral_friends_bought_title">Your friends bought</string>
<string name="referral_promo_code_title">Your personal code</string>
<string name="referral_button_participate">Participate</string>
<string name="common_terms_and_conditions">terms and conditions</string>
<string name="referral_tos_not_enroled_prefix">By tapping this button you accept</string>
<string name="referral_tos_enroled_prefix">You\'ve accepted</string>
<string name="referral_tos_suffix">of the referral program</string>
<string name="internal_error_wallet_manager_not_found">Internal error: wallet manager not found</string>
<string name="common_balance">Balance: %s</string>
<string name="common_share">Share</string>
<string name="common_copy">Copy</string>
<string name="common_success">Success</string>
<string name="swapping_permission_header">Give Permission</string>
<string name="swapping_permission_subheader">To continue you need to allow 1inch smart contracts to use your %s</string>
<string name="swapping_permission_rows_amount">Amount %s</string>
<string name="swapping_permission_rows_your_wallet">Your Wallet</string>
<string name="swapping_permission_rows_spender">Spender</string>
<string name="swapping_permission_buttons_approve">Approve</string>
<string name="swapping_swap_of_to">Swap of %s to</string>
<string name="swapping_swap">Swap</string>
<string name="swapping_insufficient_funds">Insufficient funds</string>
<string name="swapping_give_permission">Give Permission</string>
<string name="swapping_permit_and_swap">Permit and Swap</string>
<string name="referral_error_failed_to_load_info">Failed to load the information about the referral program. Please try again later.</string>
<string name="referral_error_failed_to_load_info_with_reason">Failed to load the information about the referral program. Reason: %s. Please try again later.</string>
<string name="referral_error_failed_to_participate">Your participation request could not be processed. Reason: %s. Please try again later. If the problem persists — feel free to contact our support.</string>
<string name="referral_promo_code_copied">Personal code copied!</string>
<string name="referral_share_link">Buy Tangem Wallet with discount!\n%s</string>
<string name="warning_existential_deposit_message">%s network has a concept of Existential Deposit. If your account drops below %s it will be deactivated and any remaining funds will be destroyed.</string>
<string name="send_validation_invalid_address">Invalid address</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="common_delete">Delete</string>
<string name="details_row_privacy_policy">Privacy policy</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="common_enable">Enable</string>
<string name="save_user_wallet_agreement_description">Save your Wallet feature allows you to use your wallet with biometric auth without tapping your card to the phone to gain access.</string>
<string name="user_wallet_list_editing_count">%d selected</string>
<string name="common_biometric_authentication">biometric authentication</string>
<string name="common_biometrics">biometrics</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
</resources>

View file

@ -0,0 +1,25 @@
package com.tangem.core.ui.utils
import android.os.SystemClock
import android.view.View
/**
* Implementation of click listener for preventing multiple click events
*
* @property action action that called when a view has been clicked
*/
class OneTouchClickListener(private val action: () -> Unit) : View.OnClickListener {
private var lastClickTimeMs: Long = 0L
override fun onClick(v: View?) {
if (SystemClock.elapsedRealtime() - lastClickTimeMs > CLICK_DELAY_MS) {
lastClickTimeMs = SystemClock.elapsedRealtime()
action()
}
}
companion object {
private const val CLICK_DELAY_MS = 500L
}
}

View file

@ -1,17 +1,15 @@
package com.tangem.domain.common.util
import com.tangem.common.extensions.calculateSha256
import com.tangem.common.extensions.hexToBytes
import com.tangem.common.extensions.toHexString
import com.tangem.domain.common.extensions.calculateHmacSha256
class UserWalletId(
val stringValue: String,
) {
val value = stringValue.hexToBytes()
constructor(walletPublicKey: ByteArray?) : this(
stringValue = walletPublicKey?.let { calculateUserWalletId(it).toHexString() } ?: "",
constructor(value: ByteArray?) : this(
stringValue = value?.toHexString() ?: "",
)
override fun equals(other: Any?): Boolean {
@ -32,12 +30,4 @@ class UserWalletId(
"UserWalletId(${take(3)}...${takeLast(3)})"
}
}
}
private fun calculateUserWalletId(publicKey: ByteArray): ByteArray {
val message = MESSAGE_FOR_WALLET_ID.toByteArray()
val keyHash = publicKey.calculateSha256()
return message.calculateHmacSha256(keyHash)
}
private const val MESSAGE_FOR_WALLET_ID = "UserWalletID"
}