Updated on 2026-08-14

This commit is contained in:
Tangem 2023-02-14 13:49:44 +03:00
commit 6f69f29219
34 changed files with 504 additions and 479 deletions

View file

@ -162,6 +162,7 @@ fun View.animateVisibility(
hiddenVisibility: Int = View.GONE,
) {
if (show) {
if (this.visibility == View.VISIBLE) return
this.animate()
.alpha(1f)
.setDuration(durationMillis)
@ -170,6 +171,7 @@ fun View.animateVisibility(
this.isVisible = true
}
} else {
if (this.visibility == hiddenVisibility) return
this.animate()
.alpha(0f)
.setDuration(durationMillis)

View file

@ -1,5 +1,6 @@
package com.tangem.tap.domain
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.BlockchainSdkConfig
import com.tangem.blockchain.common.Token
@ -38,6 +39,7 @@ import com.tangem.tap.walletStoresManager
import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.rekotlin.Action
import timber.log.Timber
class TapWalletManager {
@ -233,20 +235,20 @@ class TapWalletManager {
val primaryWalletManager = walletManagerFactory.makePrimaryWalletManager(data)
if (blockchain != Blockchain.Unknown && primaryWalletManager != null) {
val primaryToken = data.cardTypesResolver.getPrimaryToken()
dispatchOnMain(WalletAction.MultiWallet.SetPrimaryBlockchain(blockchain))
if (primaryToken != null) {
primaryWalletManager.addToken(primaryToken)
dispatchOnMain(WalletAction.MultiWallet.SetPrimaryToken(primaryToken))
}
dispatchOnMain(
val blockchainNetwork = BlockchainNetwork.fromWalletManager(primaryWalletManager)
val actionsList = listOfNotNull<Action>(
WalletAction.MultiWallet.AddBlockchains(
blockchains = listOf(BlockchainNetwork.fromWalletManager(primaryWalletManager)),
walletManagers = listOf(primaryWalletManager),
),
data.cardTypesResolver.getPrimaryToken()?.let {
primaryWalletManager.addToken(it)
primaryWalletManager.wallet.setAmount(Amount(it))
WalletAction.MultiWallet.AddToken(it, blockchainNetwork, false)
},
WalletAction.LoadFiatRate(),
)
dispatchOnMain(*actionsList.toTypedArray())
}
}

View file

@ -18,8 +18,7 @@ object NoFundsForActivationDialog {
return AlertDialog.Builder(context).apply {
setTitle(R.string.saltpay_error_no_gas_title)
setMessage(R.string.saltpay_error_no_gas_message)
// TODO: SaltPay: change onboarding_supplement_button_kyc_waiting -> to appropriate string
setPositiveButton(R.string.onboarding_supplement_button_kyc_waiting) { _, _ ->
setPositiveButton(R.string.chat_button_title) { _, _ ->
val config = store.state.globalState.configManager?.config?.saltPayConfig?.zendesk.guard {
store.dispatchDebugErrorNotification("SaltPayConfig not initialized")
return@setPositiveButton

View file

@ -2,7 +2,6 @@ package com.tangem.tap.features.wallet.redux
import android.content.Context
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.Token
import com.tangem.blockchain.common.Wallet
import com.tangem.blockchain.common.WalletManager
@ -99,8 +98,6 @@ sealed class WalletAction : Action {
data class RemoveWallet(val currency: Currency) : MultiWallet()
data class RemoveWallets(val currencies: List<Currency>) : MultiWallet()
data class SetPrimaryBlockchain(val blockchain: Blockchain) : MultiWallet()
data class SetPrimaryToken(val token: Token) : MultiWallet()
data class ShowWalletBackupWarning(val show: Boolean) : MultiWallet()
object BackupWallet : MultiWallet()
object ScheduleCheckForMissingDerivation : MultiWallet()

View file

@ -11,6 +11,7 @@ import com.tangem.tap.common.extensions.toQrCode
import com.tangem.tap.common.redux.global.CryptoCurrencyName
import com.tangem.tap.common.toggleWidget.WidgetState
import com.tangem.tap.domain.configurable.warningMessage.WarningMessage
import com.tangem.tap.domain.getFirstToken
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState
import com.tangem.tap.features.wallet.models.Currency
@ -37,8 +38,6 @@ data class WalletState(
val isMultiwalletAllowed: Boolean = false,
val cardCurrency: CryptoCurrencyName? = null,
val selectedCurrency: Currency? = null,
val primaryBlockchain: Blockchain? = null,
val primaryToken: Token? = null,
val isTestnet: Boolean = false,
val totalBalance: TotalBalance? = null,
val showBackupWarning: Boolean = false,
@ -75,13 +74,30 @@ data class WalletState(
val walletManagers: List<WalletManager>
get() = walletsStores.mapNotNull { it.walletManager }
val primaryWallet: WalletData? = walletsStores.firstOrNull()?.walletsData?.firstOrNull()
private val primaryWalletStore: WalletStore?
get() = if (isMultiwalletAllowed || walletsStores.isEmpty() || walletsStores.size > 1) null
else walletsStores[0]
val primaryWalletManager: WalletManager? = if (walletsStores.isNotEmpty()) walletsStores[0].walletManager else null
private val primaryWalletManager: WalletManager?
get() = primaryWalletStore?.walletManager
val primaryWalletData: WalletData?
get() = primaryWalletStore?.walletsData?.firstOrNull()
val primaryBlockchain: Blockchain?
get() = primaryWalletManager?.wallet?.blockchain
val primaryToken: Token?
get() = primaryWalletManager?.wallet?.getFirstToken()
val primaryTokenData: WalletData?
get() = primaryWalletStore?.walletsData?.toMutableList()
?.apply { remove(primaryWalletData) }
?.firstOrNull()
val shouldShowDetails: Boolean =
primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard &&
primaryWallet?.currencyData?.status != BalanceStatus.UnknownBlockchain
primaryWalletData?.currencyData?.status != BalanceStatus.EmptyCard &&
primaryWalletData?.currencyData?.status != BalanceStatus.UnknownBlockchain
val hasSavedWallets: Boolean
get() = userWalletsListManager.hasSavedUserWallets

View file

@ -1,6 +1,5 @@
package com.tangem.tap.features.wallet.redux.middlewares
import com.tangem.blockchain.common.Blockchain
import com.tangem.common.extensions.isZero
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.common.extensions.toFiatRateString
@ -19,7 +18,6 @@ import com.tangem.tap.features.wallet.redux.WalletMainButton
import com.tangem.tap.features.wallet.redux.WalletStore
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 java.math.BigDecimal
@ -49,15 +47,6 @@ internal fun WalletStoreModel.mapToReduxModel(): WalletStore {
walletsData = walletsData.mapToReduxModels(walletRent, appCurrencySymbol),
)
.updateTokenModels(blockchainWalletData.status.amount)
.setupIfHadCardSingleToken(
blockchain = blockchain,
walletsDataModel = walletsData,
appCurrencySymbol = appCurrencySymbol,
blockchainWalletData = blockchainWalletData.mapToReduxModel(
walletRent = walletRent,
appCurrencySymbol = appCurrencySymbol,
),
)
}
@Suppress("LongMethod", "ComplexMethod")
@ -123,7 +112,6 @@ private fun WalletDataModel.mapToReduxModel(
amountFormatted = amountFormatted,
fiatAmount = fiatAmount,
fiatAmountFormatted = fiatAmountFormatted,
token = null,
amountToCreateAccount = (status as? WalletDataModel.NoAccount)
?.amountToCreateAccount
?.toString(),
@ -147,45 +135,4 @@ private fun WalletStore.updateTokenModels(blockchainAmount: BigDecimal): WalletS
)
}
return updateWallets(updatedTokensWalletData)
}
private fun WalletStore.setupIfHadCardSingleToken(
blockchain: Blockchain,
walletsDataModel: List<WalletDataModel>,
appCurrencySymbol: String,
blockchainWalletData: WalletData,
): WalletStore {
// Card with single token contains only 2 model - blockchain and token
if (walletsData.size != 2) return this
val cardSingleTokenWalletData = walletsDataModel.firstOrNull {
it.currency.isToken() && it.currency.blockchain == blockchain && it.isCardSingleToken
} ?: return this
val blockchainWalletDataWithSingleToken = blockchainWalletData.copy(
currencyData = blockchainWalletData.currencyData.copy(
token = cardSingleTokenWalletData.toTokenData(appCurrencySymbol),
),
)
return updateWallets(listOf(blockchainWalletDataWithSingleToken))
}
private fun WalletDataModel.toTokenData(appCurrencySymbol: String): TokenData {
val amount = status.amount
val fiatAmount = fiatRate?.let { status.amount.toFiatValue(it) }
return TokenData(
amount = amount,
amountFormatted = amount.toFormattedCurrencyString(
decimals = currency.decimals,
currency = currency.currencySymbol,
),
fiatAmount = fiatAmount,
fiatAmountFormatted = fiatAmount
?.takeIf { !status.isErrorStatus }
?.toFormattedFiatValue(appCurrencySymbol),
tokenSymbol = currency.currencySymbol,
fiatRate = fiatRate,
fiatRateString = fiatRate?.toFiatRateString(appCurrencySymbol),
)
}

View file

@ -49,6 +49,7 @@ import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.WalletData
import com.tangem.tap.features.wallet.redux.WalletState
import com.tangem.tap.features.wallet.redux.WalletStore
import com.tangem.tap.features.wallet.redux.reducers.findSelectedCurrency
import com.tangem.tap.network.NetworkConnectivity
import com.tangem.tap.network.NetworkStateChanged
import com.tangem.tap.preferencesStorage
@ -153,7 +154,7 @@ class WalletMiddleware {
if (walletState.isMultiwalletAllowed) {
walletState.walletsDataFromStores.map { it.currency }
} else {
val derivationPath = walletState.primaryWallet?.currency?.derivationPath
val derivationPath = walletState.primaryWalletData?.currency?.derivationPath
val primaryBlockchain = walletState.primaryBlockchain
val primaryToken = walletState.primaryToken
listOfNotNull(
@ -310,15 +311,18 @@ class WalletMiddleware {
}
}
private fun updateWalletStores(wallStores: List<WalletStoreModel>, state: WalletState) {
private fun updateWalletStores(walletsStores: List<WalletStoreModel>, state: WalletState) {
scope.launch(Dispatchers.Default) {
val reduxWalletStores = walletsStores.mapToReduxModels()
if (!state.isMultiwalletAllowed) {
wallStores.firstOrNull()?.walletsData?.firstOrNull()?.let {
store.dispatchOnMain(WalletAction.MultiWallet.SetSingleWalletCurrency(it.currency))
findSelectedCurrency(
walletsStores = reduxWalletStores,
currentSelectedCurrency = null,
isMultiWalletAllowed = false,
)?.let {
store.dispatchOnMain(WalletAction.MultiWallet.SetSingleWalletCurrency(it))
}
}
val reduxWalletStores = wallStores.mapToReduxModels()
store.dispatchOnMain(
WalletAction.WalletStoresChanged.UpdateWalletStores(
reduxWalletStores = reduxWalletStores,
@ -439,11 +443,7 @@ class WalletMiddleware {
walletStore: WalletStore?,
): PrepareSendScreen {
val coinRate = state?.getWalletData(walletStore?.blockchainNetwork)?.fiatRate
val tokenRate = if (state?.isMultiwalletAllowed == true) {
selectedWalletData?.fiatRate
} else {
selectedWalletData?.currencyData?.token?.fiatRate
}
val tokenRate = selectedWalletData?.fiatRate
val coinAmount = walletStore?.walletManager?.wallet?.amounts?.get(AmountType.Coin)
return PrepareSendScreen(

View file

@ -10,7 +10,6 @@ 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
import com.tangem.tap.features.wallet.models.WalletRent
@ -26,7 +25,6 @@ import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT
import com.tangem.tap.features.wallet.redux.WalletStore
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
@ -43,17 +41,11 @@ class MultiWalletReducer {
it.wallet.publicKey.derivationPath?.rawPath == blockchain.derivationPath
}
val wallet = walletManager?.wallet
val cardToken = if (!state.isMultiwalletAllowed) {
wallet?.getFirstToken()?.symbol?.let { TokenData("", tokenSymbol = it) }
} else {
null
}
val walletData = WalletData(
currencyData = BalanceWidgetData(
status = BalanceStatus.Loading,
currency = blockchain.blockchain.fullName,
currencySymbol = blockchain.blockchain.currency,
token = cardToken,
),
walletAddresses = createAddressList(wallet),
mainButton = WalletMainButton.SendButton(false),
@ -71,14 +63,13 @@ class MultiWalletReducer {
)
}
val selectedCurrency = if (state.isMultiwalletAllowed) {
state.selectedCurrency
} else {
walletStores.firstOrNull()?.walletsData?.firstOrNull()?.currency
}
state.copy(
walletsStores = walletStores,
selectedCurrency = selectedCurrency,
selectedCurrency = findSelectedCurrency(
walletsStores = walletStores,
currentSelectedCurrency = state.selectedCurrency,
isMultiWalletAllowed = state.isMultiwalletAllowed,
),
)
}
is WalletAction.MultiWallet.AddBlockchain -> {
@ -183,8 +174,6 @@ 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.SaveCurrencies -> state
is WalletAction.MultiWallet.ShowWalletBackupWarning -> state.copy(showBackupWarning = action.show)
is WalletAction.MultiWallet.ScheduleCheckForMissingDerivation -> state.copy(
@ -192,7 +181,7 @@ class MultiWalletReducer {
)
is WalletAction.MultiWallet.AddMissingDerivations -> state.copy(
missingDerivations = action.blockchains,
derivationsCheckIsScheduled = false
derivationsCheckIsScheduled = false,
)
is WalletAction.MultiWallet.BackupWallet -> state
is WalletAction.MultiWallet.ScanToGetDerivations -> state.copy(state = ProgressState.Loading)
@ -214,7 +203,6 @@ class MultiWalletReducer {
}
fun Token.toWallet(state: WalletState, blockchain: BlockchainNetwork): WalletData? {
if (!state.isMultiwalletAllowed) return null
val currency = Currency.fromBlockchainNetwork(blockchain, this)
if (state.currencies.contains(currency)) return null

View file

@ -3,11 +3,9 @@ package com.tangem.tap.features.wallet.redux.reducers
import com.tangem.blockchain.common.AmountType
import com.tangem.blockchain.common.Wallet
import com.tangem.common.extensions.isZero
import com.tangem.tap.common.extensions.toFiatString
import com.tangem.tap.common.extensions.toFiatValue
import com.tangem.tap.common.extensions.toFormattedCurrencyString
import com.tangem.tap.common.extensions.toFormattedFiatValue
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.filterByToken
@ -20,9 +18,7 @@ import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT
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.features.wallet.ui.TokenData
import com.tangem.tap.store
import java.math.BigDecimal
class OnWalletLoadedReducer {
@ -116,32 +112,14 @@ class OnWalletLoadedReducer {
private fun onSingleWalletLoaded(wallet: Wallet, walletState: WalletState): WalletState {
if (wallet.blockchain != walletState.primaryBlockchain) return walletState
val fiatCurrencyName = store.state.globalState.appCurrency.code
val token = wallet.getFirstToken()
val tokenData = if (token != null) {
val tokenAmount = wallet.getTokenAmount(token)
if (tokenAmount != null) {
val tokenFiatRate = walletState.primaryWallet?.currencyData?.token?.fiatRate
val tokenFiatAmount = tokenFiatRate?.let { tokenAmount.value?.toFiatString(it, fiatCurrencyName) }
TokenData(
amount = tokenAmount.value ?: BigDecimal.ZERO,
tokenSymbol = tokenAmount.currencySymbol,
fiatAmountFormatted = tokenFiatAmount,
fiatAmount = tokenFiatRate?.let { tokenAmount.value?.toFiatValue(tokenFiatRate) },
amountFormatted = tokenAmount.value?.toFormattedCurrencyString(token.decimals, token.symbol) ?: "",
)
} else {
null
}
} else {
null
}
val amount = wallet.amounts[AmountType.Coin]?.value
val formattedAmount = amount?.toFormattedCurrencyString(
wallet.blockchain.decimals(),
wallet.blockchain.currency,
)
val fiatAmount = walletState.primaryWallet?.fiatRate?.let { amount?.toFiatValue(it) }
val fiatAmount = walletState.primaryWalletData?.fiatRate?.let { amount?.toFiatValue(it) }
val fiatAmountFormatted = fiatAmount?.toFormattedFiatValue(fiatCurrencyName) ?: UNKNOWN_AMOUNT_SIGN
val pendingTransactions = wallet.getPendingTransactions()
@ -151,11 +129,10 @@ class OnWalletLoadedReducer {
} else {
BalanceStatus.VerifiedOnline
}
val walletData = walletState.primaryWallet?.copy(
val walletData = walletState.primaryWalletData?.copy(
currencyData = BalanceWidgetData(
balanceStatus, wallet.blockchain.fullName,
currencySymbol = wallet.blockchain.currency,
token = tokenData,
blockchainAmount = amount,
amount = amount,
amountFormatted = formattedAmount,

View file

@ -9,14 +9,12 @@ import com.tangem.domain.common.TapWorkarounds.isTestCard
import com.tangem.domain.common.TwinCardNumber
import com.tangem.tap.common.entities.FiatCurrency
import com.tangem.tap.common.extensions.toFiatRateString
import com.tangem.tap.common.extensions.toFiatString
import com.tangem.tap.common.extensions.toFiatValue
import com.tangem.tap.common.extensions.toFormattedCurrencyString
import com.tangem.tap.common.extensions.toFormattedFiatValue
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.TapError
import com.tangem.tap.domain.extensions.getArtworkUrl
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.WalletRent
@ -35,7 +33,6 @@ import com.tangem.tap.features.wallet.ui.BalanceStatus
import com.tangem.tap.features.wallet.ui.BalanceWidgetData
import com.tangem.tap.proxy.AppStateHolder
import org.rekotlin.Action
import timber.log.Timber
import java.math.BigDecimal
object WalletReducer {
@ -283,8 +280,9 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS
newState = newState.copy(cardImage = cardImage)
}
is WalletAction.LoadFiatRate.Success ->
is WalletAction.LoadFiatRate.Success -> {
newState = setNewFiatRate(action.fiatRates, state.globalState.appCurrency, newState)
}
is WalletAction.LoadArtwork -> {
val artworkUrl = action.card.getArtworkUrl(action.artworkId)
?: when (state.twinCardsState.cardNumber) {
@ -359,18 +357,13 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS
)
}
is WalletAction.LoadData.Success -> {
val selectedCurrency = if (newState.isMultiwalletAllowed) {
newState.selectedCurrency
} else {
newState.walletsStores.firstOrNull()
?.walletsData
?.firstOrNull()
?.currency
}
newState = newState.copy(
state = ProgressState.Done,
selectedCurrency = selectedCurrency,
selectedCurrency = findSelectedCurrency(
walletsStores = newState.walletsStores,
currentSelectedCurrency = newState.selectedCurrency,
isMultiWalletAllowed = newState.isMultiwalletAllowed,
),
)
}
else -> Unit
@ -379,6 +372,19 @@ private fun internalReduce(action: Action, state: AppState, appStateHolder: AppS
return newState
}
fun findSelectedCurrency(
walletsStores: List<WalletStore>,
currentSelectedCurrency: Currency?,
isMultiWalletAllowed: Boolean,
): Currency? = if (isMultiWalletAllowed) {
currentSelectedCurrency
} else {
walletsStores.firstOrNull()
?.walletsData
?.firstOrNull()
?.currency
}
private fun CardDTO.findCardsCount(): Int? {
return (this.backupStatus as? CardDTO.BackupStatus.Active)?.cardCount?.inc()
}
@ -436,45 +442,18 @@ private fun setNewFiatRate(
state: WalletState,
): WalletState {
val rateFormatter: (BigDecimal) -> String = { rate: BigDecimal ->
rate.toFiatRateString(
fiatCurrencyName = appCurrency.symbol,
)
rate.toFiatRateString(fiatCurrencyName = appCurrency.symbol)
}
return if (state.isMultiwalletAllowed) {
setMultiWalletFiatRate(
fiatRates = fiatRates.mapNotNullValues { it.value },
rateFormatter = rateFormatter,
appCurrency = appCurrency,
state = state,
)
} else {
setSingleWalletFiatRates(
fiatRates = fiatRates.mapNotNullValues { it.value },
rateFormatter = rateFormatter,
appCurrency = appCurrency,
state = state,
)
}
}
private fun setMultiWalletFiatRate(
fiatRates: Map<Currency, BigDecimal>,
rateFormatter: (BigDecimal) -> String,
appCurrency: FiatCurrency,
state: WalletState,
): WalletState {
val newWalletsData = fiatRates.mapNotNull { (currency, rate) ->
val newWalletsData = fiatRates.mapNotNullValues { it.value }.mapNotNull { (currency, rate) ->
val walletStore = state.getWalletStore(currency) ?: return@mapNotNull null
val wallet = walletStore.walletManager?.wallet
val walletData = state.getWalletData(currency) ?: return@mapNotNull null
val currencyData = walletData.currencyData
var fiatAmount = when (currency) {
is Currency.Blockchain ->
wallet?.amounts?.get(AmountType.Coin)?.value?.toFiatValue(rate)
is Currency.Token ->
wallet?.getTokenAmount(currency.token)?.value?.toFiatValue(rate)
is Currency.Blockchain -> wallet?.amounts?.get(AmountType.Coin)?.value?.toFiatValue(rate)
is Currency.Token -> wallet?.getTokenAmount(currency.token)?.value?.toFiatValue(rate)
}
if (currencyData.status == BalanceStatus.NoAccount && fiatAmount == null) {
fiatAmount = BigDecimal.ZERO.setScale(2)
@ -491,96 +470,5 @@ private fun setMultiWalletFiatRate(
)
}
return state
.updateWalletsData(newWalletsData)
}
private fun setSingleWalletFiatRates(
fiatRates: Map<Currency, BigDecimal>,
appCurrency: FiatCurrency,
rateFormatter: (BigDecimal) -> String,
state: WalletState,
): WalletState {
val blockchainFiatRate = fiatRates.entries.firstOrNull { it.key.isBlockchain() }
val tokenFiatRate = fiatRates.entries.firstOrNull { it.key.isToken() }
Timber.e("Token Fiat Rate is ${tokenFiatRate ?: "NULL"}")
val updatedState = updateStateWithFiatRate(blockchainFiatRate?.toPair(), appCurrency, rateFormatter, state)
return updateStateWithFiatRate(tokenFiatRate?.toPair(), appCurrency, rateFormatter, updatedState)
}
private fun updateStateWithFiatRate(
fiatRate: Pair<Currency, BigDecimal>?,
appCurrency: FiatCurrency,
rateFormatter: (BigDecimal) -> String,
state: WalletState,
): WalletState {
return if (fiatRate != null) {
val currency = fiatRate.first
val rate = fiatRate.second
setSingleWalletFiatRate(
rate = rate,
rateFormatted = rateFormatter(rate),
currency = currency,
appCurrency = appCurrency,
state = state,
)
} else {
state
}
}
private fun setSingleWalletFiatRate(
rate: BigDecimal,
rateFormatted: String,
currency: Currency,
appCurrency: FiatCurrency,
state: WalletState,
): WalletState {
val wallet = state.primaryWalletManager?.wallet ?: return state
val token = wallet.getFirstToken()
Timber.e("Working with currency: ${currency.currencyName}")
if (currency == state.primaryWallet?.currency) {
val fiatAmount = wallet.amounts[AmountType.Coin]?.value
?.toFiatString(rate, appCurrency.code)
val walletData = state.primaryWallet.copy(
currencyData = state.primaryWallet.currencyData.copy(fiatAmountFormatted = fiatAmount),
fiatRate = rate,
fiatRateString = rateFormatted,
)
return state.updateWalletData(walletData)
} else if (currency is Currency.Token && currency.token == token) {
Timber.e("Working with token fiat rate")
val tokenFiatAmount = wallet.getTokenAmount(token)
?.value
val tokenAmountFormatted = tokenFiatAmount?.toFiatString(rate, appCurrency.code)
val tokenData = state.primaryWallet?.currencyData?.token?.copy(
fiatAmountFormatted = tokenAmountFormatted,
fiatAmount = tokenFiatAmount,
fiatRate = rate,
fiatRateString = rateFormatted,
)
// ?: TokenData(
// fiatAmountFormatted = tokenAmountFormatted,
// fiatAmount = tokenFiatAmount,
// fiatRate = rate,
// fiatRateString = rateFormatted,
// amount = "",
// tokenSymbol = currency.currencySymbol
// )
Timber.e("Token Data is ${tokenData ?: "NULL"}")
val walletData = state.primaryWallet?.copy(
currencyData = state.primaryWallet.currencyData.copy(
token = tokenData,
),
)
Timber.e("Wallet Data is ${walletData ?: "NULL"}")
return state.updateWalletData(walletData)
}
return state
return state.updateWalletsData(newWalletsData)
}

View file

@ -24,30 +24,20 @@ data class BalanceWidgetData(
val status: BalanceStatus? = null,
val currency: String? = null,
val currencySymbol: String? = null,
val blockchainAmount: BigDecimal? = BigDecimal.ZERO,
val amount: BigDecimal? = null,
val amountFormatted: String? = null,
val fiatAmount: BigDecimal? = null,
val fiatAmountFormatted: String? = null,
val token: TokenData? = null,
val blockchainAmount: BigDecimal? = BigDecimal.ZERO,
val amountToCreateAccount: String? = null,
val errorMessage: String? = null,
)
data class TokenData(
val amountFormatted: String?,
val amount: BigDecimal? = null,
val tokenSymbol: String,
val fiatAmountFormatted: String? = null,
val fiatAmount: BigDecimal? = null,
val fiatRateString: String? = null,
val fiatRate: BigDecimal? = null,
)
class BalanceWidget(
private val binding: CardBalanceBinding,
private val fragment: WalletFragment,
private val data: BalanceWidgetData,
private val token: BalanceWidgetData?,
private val isTwinCard: Boolean,
) {
@ -66,7 +56,7 @@ class BalanceWidget(
showStatus(R.id.tv_status_loading)
if (data.token != null) {
if (token != null) {
showBalanceWithToken(data, false)
} else {
showBalanceWithoutToken(data, false)
@ -85,7 +75,7 @@ class BalanceWidget(
showStatus(statusView)
tvStatusErrorMessage.hide()
if (data.token != null) {
if (token != null) {
showBalanceWithToken(data, true)
} else {
showBalanceWithoutToken(data, true)
@ -97,7 +87,7 @@ class BalanceWidget(
tvFiatAmount.hide()
groupBaseCurrency.hide()
val currency = if (data.token != null) data.token.tokenSymbol else data.currency
val currency = if (token != null) token.currencySymbol else data.currency
tvCurrency.text = currency
tvAmount.text = ""
@ -152,13 +142,13 @@ class BalanceWidget(
private fun showBalanceWithToken(data: BalanceWidgetData, showAmount: Boolean) = with(binding.lBalance) {
groupBaseCurrency.show()
tvCurrency.text = data.token?.tokenSymbol
tvCurrency.text = token?.currencySymbol
tvBaseCurrency.text = data.currency
tvAmount.text = if (showAmount) data.token?.amountFormatted else ""
tvAmount.text = if (showAmount) token?.amountFormatted else ""
tvBaseAmount.text = if (showAmount) data.amountFormatted else ""
if (showAmount) {
tvFiatAmount.show()
tvFiatAmount.text = data.token?.fiatAmountFormatted
tvFiatAmount.text = token?.fiatAmountFormatted
}
}

View file

@ -40,7 +40,7 @@ import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.WalletState
import com.tangem.tap.features.wallet.ui.adapters.WarningMessagesAdapter
import com.tangem.tap.features.wallet.ui.wallet.MultiWalletView
import com.tangem.tap.features.wallet.ui.wallet.SaltPaySingleWalletView
import com.tangem.tap.features.wallet.ui.wallet.SaltPayWalletView
import com.tangem.tap.features.wallet.ui.wallet.SingleWalletView
import com.tangem.tap.features.wallet.ui.wallet.WalletView
import com.tangem.tap.store
@ -158,11 +158,11 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
val isSaltPay = store.state.globalState.scanResponse?.card?.isSaltPay == true
when {
isSaltPay && walletView !is SaltPaySingleWalletView -> {
walletView = SaltPaySingleWalletView()
isSaltPay && walletView !is SaltPayWalletView -> {
walletView = SaltPayWalletView()
walletView.changeWalletView(this, binding)
}
state.isMultiwalletAllowed && state.primaryWallet?.currencyData?.status != BalanceStatus.EmptyCard &&
state.isMultiwalletAllowed && state.primaryWalletData?.currencyData?.status != BalanceStatus.EmptyCard &&
walletView !is MultiWalletView -> {
walletView = MultiWalletView()
walletView.changeWalletView(this, binding)

View file

@ -88,6 +88,7 @@ class MultiWalletView : WalletView() {
private fun showMultiWalletView(binding: FragmentWalletBinding) = with(binding) {
watcher.clear()
lSaltPayWallet.root.hide()
tvTwinCardNumber.hide()
rvPendingTransaction.hide()
lCardBalance.root.hide()
@ -220,7 +221,7 @@ class MultiWalletView : WalletView() {
binding: FragmentWalletBinding,
fragment: WalletFragment,
) {
when (state.primaryWallet?.currencyData?.status) {
when (state.primaryWalletData?.currencyData?.status) {
BalanceStatus.EmptyCard -> {
showErrorState(
binding,

View file

@ -1,63 +0,0 @@
package com.tangem.tap.features.wallet.ui.wallet
import com.tangem.domain.common.extensions.debounce
import com.tangem.tap.common.entities.FiatCurrency
import com.tangem.tap.common.extensions.animateVisibility
import com.tangem.tap.common.extensions.formatAmountAsSpannedString
import com.tangem.tap.features.wallet.redux.ProgressState
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.mainScope
import com.tangem.tap.store
import com.tangem.wallet.databinding.LayoutSingleWalletBalanceBinding
import org.rekotlin.Action
import java.math.BigDecimal
data class SaltPayBalanceWidgetData(
val state: ProgressState? = null,
val currencySymbol: String? = null,
val currency: String? = null,
val fiatAmount: BigDecimal? = null,
val fiatCurrency: FiatCurrency? = null,
)
class SaltPayBalanceWidget(
private val binding: LayoutSingleWalletBalanceBinding,
private val data: SaltPayBalanceWidgetData,
) {
fun setup() = with(binding) {
if (data.state == ProgressState.Loading) {
veilBalance.veil()
veilBalanceCrypto.veil()
} else {
// veilBalance.unVeil()
veilBalanceCrypto.unVeil()
}
tvProcessing.animateVisibility(
show = data.state == ProgressState.Error,
)
veilBalanceCrypto.animateVisibility(
show = data.state != ProgressState.Error,
)
if (data.fiatAmount == null) {
// TODO: SaltPay: A tricky solution to the problem with displaying rates
// If the rates are loaded after the walletManager.update() is completely updated,
// then this problem can be avoided
actionDebouncer(WalletAction.LoadFiatRate())
} else {
veilBalance.unVeil()
tvBalance.text = data.fiatAmount.formatAmountAsSpannedString(
currencySymbol = data.fiatCurrency?.symbol ?: "",
)
}
tvBalanceCrypto.text = data.currency
tvCurrencyName.text = data.fiatCurrency?.code
tvCurrencyName.setOnClickListener {
store.dispatch(WalletAction.AppCurrencyAction.ChooseAppCurrency)
}
}
}
private val actionDebouncer = debounce<Action>(500, mainScope) { store.dispatch(it) }

View file

@ -1,55 +0,0 @@
package com.tangem.tap.features.wallet.ui.wallet
import com.tangem.tap.common.extensions.hide
import com.tangem.tap.common.extensions.show
import com.tangem.tap.features.wallet.redux.WalletState
import com.tangem.tap.features.wallet.ui.TokenData
import com.tangem.tap.features.wallet.ui.WalletFragment
import com.tangem.tap.store
import com.tangem.wallet.databinding.FragmentWalletBinding
import timber.log.Timber
class SaltPaySingleWalletView : WalletView() {
override fun changeWalletView(fragment: WalletFragment, binding: FragmentWalletBinding) {
setFragment(fragment, binding)
onViewCreated()
showSingleWalletView(binding)
}
private fun showSingleWalletView(binding: FragmentWalletBinding) = with(binding) {
rvMultiwallet.hide()
btnAddToken.hide()
rowButtons.hide()
rvPendingTransaction.hide()
tvTwinCardNumber.hide()
pbLoadingUserTokens.hide()
lCardBalance.root.hide()
lAddress.root.hide()
lSingleWalletBalance.root.show()
}
override fun onViewCreated() {
}
override fun onNewState(state: WalletState) {
val binding = binding ?: return
val tokenData = state.primaryWallet?.currencyData?.token ?: return
setupBalance(state, tokenData, binding)
}
private fun setupBalance(state: WalletState, tokenData: TokenData, binding: FragmentWalletBinding) {
binding.lSingleWalletBalance.root.show()
Timber.e("Current address is ${state.primaryWalletManager?.wallet?.address}")
SaltPayBalanceWidget(
binding = binding.lSingleWalletBalance,
data = SaltPayBalanceWidgetData(
state = state.state,
currencySymbol = tokenData.tokenSymbol,
currency = tokenData.amountFormatted,
fiatAmount = tokenData.fiatAmount, // TODO: show fiatAmount
fiatCurrency = store.state.globalState.appCurrency,
),
).setup()
}
}

View file

@ -0,0 +1,88 @@
package com.tangem.tap.features.wallet.ui.wallet
import com.tangem.domain.common.extensions.debounce
import com.tangem.tap.common.extensions.animateVisibility
import com.tangem.tap.common.extensions.formatAmountAsSpannedString
import com.tangem.tap.common.extensions.hide
import com.tangem.tap.common.extensions.show
import com.tangem.tap.features.wallet.redux.ProgressState
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.WalletState
import com.tangem.tap.features.wallet.ui.WalletFragment
import com.tangem.tap.mainScope
import com.tangem.tap.store
import com.tangem.wallet.databinding.FragmentWalletBinding
import com.tangem.wallet.databinding.LayoutSaltPayWalletBinding
import org.rekotlin.Action
class SaltPayWalletView : WalletView() {
private lateinit var saltPayBinding: LayoutSaltPayWalletBinding
private val actionDebouncer = debounce<Action>(500, mainScope) { store.dispatch(it) }
override fun changeWalletView(fragment: WalletFragment, binding: FragmentWalletBinding) {
saltPayBinding = binding.lSaltPayWallet
setFragment(fragment, binding)
onViewCreated()
showSaltPayView(binding)
}
private fun showSaltPayView(binding: FragmentWalletBinding) = with(binding) {
rvWarningMessages.hide()
rvPendingTransaction.hide()
rvMultiwallet.hide()
tvTwinCardNumber.hide()
lCardBalance.root.hide()
lSingleWalletBalance.root.hide()
lAddress.root.hide()
rowButtons.hide()
btnAddToken.hide()
pbLoadingUserTokens.hide()
lSaltPayWallet.root.show()
}
override fun onViewCreated() {
}
override fun onNewState(state: WalletState) {
setupBalanceWidget(state)
}
private fun setupBalanceWidget(state: WalletState) = with(saltPayBinding.lSaltPayBalance) {
val tokenData = state.primaryTokenData ?: return@with
val appCurrency = store.state.globalState.appCurrency
val mainProgressState = state.state
if (mainProgressState == ProgressState.Loading) {
veilBalance.veil()
veilBalanceCrypto.veil()
} else {
veilBalanceCrypto.unVeil()
}
tvProcessing.animateVisibility(show = mainProgressState == ProgressState.Error)
veilBalanceCrypto.animateVisibility(show = mainProgressState != ProgressState.Error)
if (tokenData.currencyData.fiatAmount == null) {
actionDebouncer(WalletAction.LoadFiatRate())
} else {
veilBalance.unVeil()
tvBalance.text = tokenData.currencyData.fiatAmount.formatAmountAsSpannedString(
currencySymbol = appCurrency.symbol,
)
}
tvBalanceCrypto.text = tokenData.currencyData.amountFormatted
tvCurrencyName.text = appCurrency.code
tvCurrencyName.setOnClickListener {
store.dispatch(WalletAction.AppCurrencyAction.ChooseAppCurrency)
}
btnBuy.show(tokenData.isAvailableToBuy(store.state.globalState.exchangeManager))
btnBuy.setOnClickListener {
store.dispatch(WalletAction.TradeCryptoAction.Buy(false))
}
}
}

View file

@ -35,6 +35,7 @@ class SingleWalletView : WalletView() {
}
private fun showSingleWalletView(binding: FragmentWalletBinding) = with(binding) {
lSaltPayWallet.root.hide()
tvTwinCardNumber.hide()
rvMultiwallet.hide()
btnAddToken.hide()
@ -63,13 +64,13 @@ class SingleWalletView : WalletView() {
override fun onNewState(state: WalletState) {
val binding = binding ?: return
state.primaryWallet ?: return
val primaryWalletData = state.primaryWalletData ?: return
setupTwinCards(state.twinCardsState, binding)
setupButtons(state.primaryWallet, binding, state.isExchangeServiceFeatureOn)
setupButtons(primaryWalletData, binding, state.isExchangeServiceFeatureOn)
setupAddressCard(state, binding)
showPendingTransactionsIfPresent(state.primaryWallet.pendingTransactions)
setupBalance(state, state.primaryWallet)
showPendingTransactionsIfPresent(primaryWalletData.pendingTransactions)
setupBalance(state, primaryWalletData)
}
private fun showPendingTransactionsIfPresent(pendingTransactions: List<PendingTransaction>) {
@ -88,6 +89,7 @@ class SingleWalletView : WalletView() {
binding = this.lCardBalance,
fragment = fragment,
data = primaryWallet.currencyData,
token = state.primaryTokenData?.currencyData,
isTwinCard = state.isTangemTwins,
).setup()
}
@ -169,7 +171,7 @@ class SingleWalletView : WalletView() {
}
private fun setupAddressCard(state: WalletState, binding: FragmentWalletBinding) = with(binding.lAddress) {
val primaryWallet = state.primaryWallet
val primaryWallet = state.primaryWalletData
if (primaryWallet?.walletAddresses != null && primaryWallet.currency is Currency.Blockchain) {
binding.lAddress.root.show()
if (primaryWallet.shouldShowMultipleAddress()) {
@ -204,7 +206,7 @@ class SingleWalletView : WalletView() {
private fun setupCardInfo(state: WalletState) {
val textView = binding?.lAddress?.tvInfo
val blockchain = state.primaryWallet?.currency?.blockchain
val blockchain = state.primaryWalletData?.currency?.blockchain
if (textView != null && blockchain != null) {
textView.text = textView.getString(
id = R.string.address_qr_code_message_format,

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/button_disabled" android:state_enabled="false" />
<item android:color="@color/button_secondary" />
</selector>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#66FFFFFF" android:state_enabled="false" />
<item android:color="@color/text_primary_1" />
</selector>

View file

@ -52,7 +52,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="92dp"
android:text="@string/onboarding_supplement_button_kyc_waiting"
android:text="@string/chat_button_title"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/btn_container"
app:layout_constraintStart_toStartOf="@id/btn_container" />

View file

@ -177,6 +177,15 @@
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" />
<include
android:id="@+id/l_salt_pay_wallet"
layout="@layout/layout_salt_pay_wallet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:visibility="visible"
app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" />
<include
android:id="@+id/l_address"
layout="@layout/layout_address"

View file

@ -55,7 +55,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/btn_container"
app:layout_constraintStart_toStartOf="@id/btn_container"
tools:text="@string/onboarding_supplement_button_kyc_waiting" />
tools:text="@string/chat_button_title" />
<FrameLayout
android:id="@+id/btn_container"

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/card_balance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="12dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:clipToPadding="false"
android:paddingStart="16dp"
android:paddingTop="12dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="@string/onboarding_balance_title"
android:textColor="@color/text_tertiary"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/tv_currency_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.skydoves.androidveil.VeilLayout
android:id="@+id/veil_balance"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toTopOf="@id/tv_processing"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title"
app:veilLayout_baseColor="@color/lightGray0"
app:veilLayout_highlightColor="@color/lightGray1"
app:veilLayout_layout="@layout/card_total_balance_shimmer"
app:veilLayout_radius="4dp"
app:veilLayout_shimmerEnable="true"
app:veilLayout_veiled="true"
tools:veilLayout_veiled="false"
tools:visibility="visible">
<TextView
android:id="@+id/tv_balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:minWidth="152dp"
android:textColor="@color/text_primary_1"
android:textSize="24sp"
android:textStyle="bold"
tools:text="22 325.40 $" />
</com.skydoves.androidveil.VeilLayout>
<com.skydoves.androidveil.VeilLayout
android:id="@+id/veil_balance_crypto"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_marginTop="4dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/veil_balance"
app:veilLayout_baseColor="@color/lightGray0"
app:veilLayout_highlightColor="@color/lightGray1"
app:veilLayout_layout="@layout/card_total_balance_shimmer"
app:veilLayout_radius="4dp"
app:veilLayout_shimmerEnable="true"
app:veilLayout_veiled="true"
tools:veilLayout_veiled="false"
tools:visibility="visible">
<TextView
android:id="@+id/tv_balance_crypto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="2dp"
android:maxLines="1"
android:minWidth="152dp"
android:textColor="@color/text_tertiary"
android:textSize="12sp"
tools:text="5.13123123123 ETH"
tools:visibility="visible" />
</com.skydoves.androidveil.VeilLayout>
<TextView
android:id="@+id/tv_processing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="@string/wallet_balance_blockchain_unreachable"
android:textColor="@color/warning"
android:textSize="12sp"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/veil_balance" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_buy"
style="@style/BaseSaltPayButton"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginTop="12dp"
android:text="@string/wallet_button_buy"
android:visibility="gone"
app:icon="@drawable/ic_add"
app:iconGravity="textStart"
app:iconTint="@color/selector_saltpay_btn_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/veil_balance_crypto"
tools:visibility="visible" />
<TextView
android:id="@+id/tv_currency_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="@color/text_tertiary"
android:textSize="14sp"
android:textStyle="bold"
app:drawableEndCompat="@drawable/ic_arrow_angle_down"
app:drawableTint="@color/text_tertiary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="USD" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_salt_pay_wallet_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingStart="16dp"
android:paddingTop="6dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp">
<include
android:id="@+id/l_salt_pay_balance"
layout="@layout/layout_salt_pay_balance"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -3,6 +3,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_chat_support"
android:title="@string/onboarding_chat_button_title"
android:title="@string/chat_button_title"
app:showAsAction="always" />
</menu>

View file

@ -111,6 +111,19 @@
<item name="android:lineSpacingExtra">4sp</item>
</style>
<style name="BaseSaltPayButton">
<item name="android:minHeight">40dp</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:elevation">0dp</item>
<item name="android:textColor">@color/selector_saltpay_btn_text</item>
<item name="android:textAllCaps">false</item>
<item name="android:letterSpacing">0</item>
<item name="android:backgroundTint">@color/selector_saltpay_btn</item>
<item name="cornerRadius">@dimen/btn_corner_radius_medium</item>
<item name="android:stateListAnimator">@null</item>
</style>
<style name="heading">
<item name="android:textSize">24sp</item>
<item name="android:textColor">#060606</item>

View file

@ -24,12 +24,18 @@
<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_title">App Settings</string>
<string name="biometric_lockout_permanent_warning_description">Please scan the card</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>
<string name="card_settings_action_sheet_reset">Reset</string>
<string name="card_settings_action_sheet_title">Are you sure you want to do this?</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="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_title">Card Settings</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="chat_button_title">Support</string>
<string name="common_accept">Akzeptieren</string>
<string name="common_add">Add</string>
<string name="common_attention">Attention</string>
@ -134,13 +140,13 @@
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_tokens">Tokens</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets.</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets</string>
<string name="onboarding_access_code_feature_1_title">Protect</string>
<string name="onboarding_access_code_feature_2_description">You can set an individual access code on each card later.</string>
<string name="onboarding_access_code_feature_2_description">You can set up an individual access code on each card later</string>
<string name="onboarding_access_code_feature_2_title">Personalize</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place.</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place</string>
<string name="onboarding_access_code_feature_3_title">Restore</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code.</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code</string>
<string name="onboarding_access_code_intro_title">Create Access Code</string>
<string name="onboarding_access_code_repeat_code_title">Re-enter your Access Code</string>
<string name="onboarding_access_code_too_short">Access code must be at least 4 characters long</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">Scan primary card</string>
<string name="onboarding_button_skip_backup">Skip for later</string>
<string name="onboarding_button_what_does_it_mean">How does it work?</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_create_wallet_body">Let\'s generate all the keys on your card and create a secure wallet</string>
<string name="onboarding_create_wallet_button_create_wallet">Create wallet</string>
<string name="onboarding_create_wallet_header">Create a wallet</string>
@ -178,7 +183,7 @@
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_title_creating_backup">Creating a backup</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add the Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_saltpay_title_no_backup_card">No backup card</string>
@ -191,7 +196,7 @@
<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_subtitle_no_backup_cards">To start the backup process add up to two backup cards.</string>
<string name="onboarding_subtitle_one_backup_card">You can add one more card or finalize the backup process</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_subtitle_pin">Set up a 4-digit code.\nIt will be used for payments.</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_scan_backup_card_format">Prepare the backup card with number %s</string>
<string name="onboarding_subtitle_scan_origin_card">Prepare the primary card</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Your wallet card is configured and ready for use.</string>
<string name="onboarding_subtitle_two_backup_cards">Max number of cards added. Finalize the backup process.</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="onboarding_title">Activating card</string>
<string name="onboarding_title_backup_card_format">Backup card #%d</string>
<string name="onboarding_title_claim">Claim %s</string>
@ -219,7 +223,7 @@
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
<string name="onboarding_top_up_header">Top up your wallet</string>
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over</string>
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
@ -360,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">The %1$s token is the main currency on the %2$s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_item_no_rate">No rate</string>
<string name="transaction_history_empty_transactions">You don\'t have any transactions yet</string>
<string name="transaction_history_error_failed_to_load">Failed to load transactions</string>
<string name="transaction_history_title">Transactions</string>
<string name="transaction_history_tx_in_progress">In progress...</string>
<string name="twin_error_same_card">You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d</string>
<string name="twins_onboarding_description_format">This one that you are holding in your hands and the other one with number %s.\n\nBoth cards can be used to extract funds from this wallet.</string>
<string name="twins_onboarding_subtitle">One wallet. Two cards.</string>
@ -402,8 +410,11 @@
<string name="wallet_connect_create_tx_message">Request to create transaction for %1$s\n%2$s\n\nAmount: %3$s\nFee: %4$s\nTotal: %5$s\nBalance: %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">Can\'t send transaction. Not enough funds.</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="wallet_connect_error_missing_blockchains">Not all tokens were added to your list. Please add them first and try again. Missing tokens:\n</string>
<string name="wallet_connect_error_timeout">Failed to establish WalletConnect session: timeout error. Please, try again later.</string>
<string name="wallet_connect_error_unsupported_blockchains">Session request contains unsupported blockchains for WalletConnect connection. Unsupported blockchains:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="wallet_connect_generic_error_with_code">We\'ve encountered unknown error. Error code: %d. If the problem persists — feel free to contact our support</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="wallet_connect_no_sessions_message">No opened WalletConnect sessions</string>
<string name="wallet_connect_no_sessions_title">Ooops. No Sessions.</string>
@ -464,7 +475,4 @@
<string name="welcome_unlock_card">Scan card</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock_title">Welcome back!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -24,12 +24,18 @@
<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_title">App Settings</string>
<string name="biometric_lockout_permanent_warning_description">Please scan the card</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>
<string name="card_settings_action_sheet_reset">Reset</string>
<string name="card_settings_action_sheet_title">Are you sure you want to do this?</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="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_title">Card Settings</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="chat_button_title">Support</string>
<string name="common_accept">J\'accepte</string>
<string name="common_add">Add</string>
<string name="common_attention">Attention</string>
@ -134,13 +140,13 @@
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_tokens">Tokens</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets.</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets</string>
<string name="onboarding_access_code_feature_1_title">Protect</string>
<string name="onboarding_access_code_feature_2_description">You can set an individual access code on each card later.</string>
<string name="onboarding_access_code_feature_2_description">You can set up an individual access code on each card later</string>
<string name="onboarding_access_code_feature_2_title">Personalize</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place.</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place</string>
<string name="onboarding_access_code_feature_3_title">Restore</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code.</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code</string>
<string name="onboarding_access_code_intro_title">Create Access Code</string>
<string name="onboarding_access_code_repeat_code_title">Re-enter your Access Code</string>
<string name="onboarding_access_code_too_short">Access code must be at least 4 characters long</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">Scan primary card</string>
<string name="onboarding_button_skip_backup">Skip for later</string>
<string name="onboarding_button_what_does_it_mean">How does it work?</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_create_wallet_body">Let\'s generate all the keys on your card and create a secure wallet</string>
<string name="onboarding_create_wallet_button_create_wallet">Create wallet</string>
<string name="onboarding_create_wallet_header">Create a wallet</string>
@ -178,7 +183,7 @@
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_title_creating_backup">Creating a backup</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add the Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_saltpay_title_no_backup_card">No backup card</string>
@ -191,7 +196,7 @@
<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_subtitle_no_backup_cards">To start the backup process add up to two backup cards.</string>
<string name="onboarding_subtitle_one_backup_card">You can add one more card or finalize the backup process</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_subtitle_pin">Set up a 4-digit code.\nIt will be used for payments.</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_scan_backup_card_format">Prepare the backup card with number %s</string>
<string name="onboarding_subtitle_scan_origin_card">Prepare the primary card</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Your wallet card is configured and ready for use.</string>
<string name="onboarding_subtitle_two_backup_cards">Max number of cards added. Finalize the backup process.</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="onboarding_title">Activating card</string>
<string name="onboarding_title_backup_card_format">Backup card #%d</string>
<string name="onboarding_title_claim">Claim %s</string>
@ -219,7 +223,7 @@
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
<string name="onboarding_top_up_header">Top up your wallet</string>
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over</string>
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
@ -360,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">The %1$s token is the main currency on the %2$s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_item_no_rate">No rate</string>
<string name="transaction_history_empty_transactions">You don\'t have any transactions yet</string>
<string name="transaction_history_error_failed_to_load">Failed to load transactions</string>
<string name="transaction_history_title">Transactions</string>
<string name="transaction_history_tx_in_progress">In progress...</string>
<string name="twin_error_same_card">You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d</string>
<string name="twins_onboarding_description_format">This one that you are holding in your hands and the other one with number %s.\n\nBoth cards can be used to extract funds from this wallet.</string>
<string name="twins_onboarding_subtitle">One wallet. Two cards.</string>
@ -402,8 +410,11 @@
<string name="wallet_connect_create_tx_message">Request to create transaction for %1$s\n%2$s\n\nAmount: %3$s\nFee: %4$s\nTotal: %5$s\nBalance: %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">Can\'t send transaction. Not enough funds.</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="wallet_connect_error_missing_blockchains">Not all tokens were added to your list. Please add them first and try again. Missing tokens:\n</string>
<string name="wallet_connect_error_timeout">Failed to establish WalletConnect session: timeout error. Please, try again later.</string>
<string name="wallet_connect_error_unsupported_blockchains">Session request contains unsupported blockchains for WalletConnect connection. Unsupported blockchains:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="wallet_connect_generic_error_with_code">We\'ve encountered unknown error. Error code: %d. If the problem persists — feel free to contact our support</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="wallet_connect_no_sessions_message">No opened WalletConnect sessions</string>
<string name="wallet_connect_no_sessions_title">Ooops. No Sessions.</string>
@ -464,7 +475,4 @@
<string name="welcome_unlock_card">Scan card</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock_title">Welcome back!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -24,12 +24,18 @@
<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_title">App Settings</string>
<string name="biometric_lockout_permanent_warning_description">Please scan the card</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>
<string name="card_settings_action_sheet_reset">Reset</string>
<string name="card_settings_action_sheet_title">Are you sure you want to do this?</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="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_title">Card Settings</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="chat_button_title">Support</string>
<string name="common_accept">Accetta</string>
<string name="common_add">Add</string>
<string name="common_attention">Attention</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">Scan primary card</string>
<string name="onboarding_button_skip_backup">Skip for later</string>
<string name="onboarding_button_what_does_it_mean">How does it work?</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_create_wallet_body">Let\'s generate all the keys on your card and create a secure wallet</string>
<string name="onboarding_create_wallet_button_create_wallet">Create wallet</string>
<string name="onboarding_create_wallet_header">Create a wallet</string>
@ -191,7 +196,7 @@
<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_subtitle_no_backup_cards">To start the backup process add up to two backup cards.</string>
<string name="onboarding_subtitle_one_backup_card">You can add one more card or finalize the backup process</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_subtitle_pin">Set up a 4-digit code.\nIt will be used for payments.</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_scan_backup_card_format">Prepare the backup card with number %s</string>
<string name="onboarding_subtitle_scan_origin_card">Prepare the primary card</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Your wallet card is configured and ready for use.</string>
<string name="onboarding_subtitle_two_backup_cards">Max number of cards added. Finalize the backup process.</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="onboarding_title">Activating card</string>
<string name="onboarding_title_backup_card_format">Backup card #%d</string>
<string name="onboarding_title_claim">Claim %s</string>
@ -360,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">The %1$s token is the main currency on the %2$s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_item_no_rate">No rate</string>
<string name="transaction_history_empty_transactions">You don\'t have any transactions yet</string>
<string name="transaction_history_error_failed_to_load">Failed to load transactions</string>
<string name="transaction_history_title">Transactions</string>
<string name="transaction_history_tx_in_progress">In progress...</string>
<string name="twin_error_same_card">You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d</string>
<string name="twins_onboarding_description_format">This one that you are holding in your hands and the other one with number %s.\n\nBoth cards can be used to extract funds from this wallet.</string>
<string name="twins_onboarding_subtitle">One wallet. Two cards.</string>
@ -402,8 +410,11 @@
<string name="wallet_connect_create_tx_message">Request to create transaction for %1$s\n%2$s\n\nAmount: %3$s\nFee: %4$s\nTotal: %5$s\nBalance: %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">Can\'t send transaction. Not enough funds.</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="wallet_connect_error_missing_blockchains">Not all tokens were added to your list. Please add them first and try again. Missing tokens:\n</string>
<string name="wallet_connect_error_timeout">Failed to establish WalletConnect session: timeout error. Please, try again later.</string>
<string name="wallet_connect_error_unsupported_blockchains">Session request contains unsupported blockchains for WalletConnect connection. Unsupported blockchains:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="wallet_connect_generic_error_with_code">We\'ve encountered unknown error. Error code: %d. If the problem persists — feel free to contact our support</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="wallet_connect_no_sessions_message">No opened WalletConnect sessions</string>
<string name="wallet_connect_no_sessions_title">Ooops. No Sessions.</string>
@ -464,7 +475,4 @@
<string name="welcome_unlock_card">Scan card</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock_title">Welcome back!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -24,12 +24,18 @@
<string name="app_settings_saved_wallet">Cохранение кошелька</string>
<string name="app_settings_saved_wallet_footer">Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту.</string>
<string name="app_settings_title">Настройки приложения</string>
<string name="biometric_lockout_permanent_warning_description">Пожалуйста, отсканируйте карту</string>
<string name="biometric_lockout_warning_description">Пожалуйста, попробуйте снова через 30 секунд или отсканируйте карту</string>
<string name="biometric_lockout_warning_title">Слишком много попыток</string>
<string name="card_settings_action_sheet_reset">Сбросить</string>
<string name="card_settings_action_sheet_title">Вы уверены, что хотите это сделать?</string>
<string name="card_settings_change_access_code">Смена кода доступа</string>
<string name="card_settings_change_access_code_footer">Код доступа будет изменен только на данной карте</string>
<string name="card_settings_reset_card_to_factory">Сброс к заводским настройкам</string>
<string name="card_settings_security_mode">Тип безопасности</string>
<string name="card_settings_title">Настройки карты</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="chat_button_title">Чат</string>
<string name="common_accept">Принять</string>
<string name="common_add">Добавить</string>
<string name="common_attention">Внимание</string>
@ -134,13 +140,13 @@
<string name="main_scan_card_warning_view_subtitle">Чтобы получить доступ ко всем сетям, вам необходимо отсканировать карту</string>
<string name="main_scan_card_warning_view_title">Отсканируйте карту</string>
<string name="main_tokens">Токены</string>
<string name="onboarding_access_code_feature_1_description">Вам необходимо установить единый код доступа для защиты всех ваших карт.</string>
<string name="onboarding_access_code_feature_1_description">Вам необходимо установить единый код доступа для защиты всех ваших карт</string>
<string name="onboarding_access_code_feature_1_title">Защита</string>
<string name="onboarding_access_code_feature_2_description">Позже вы сможете установить индивидуальный код доступа для каждой карты.</string>
<string name="onboarding_access_code_feature_2_description">Позже вы сможете установить индивидуальный код доступа для каждой карты</string>
<string name="onboarding_access_code_feature_2_title">Персонализация</string>
<string name="onboarding_access_code_feature_3_description">Код доступа можно восстановить с помощью привязанной карты. Не храните все карты в одном месте.</string>
<string name="onboarding_access_code_feature_3_description">Код доступа можно восстановить с помощью привязанной карты. Не храните все карты в одном месте</string>
<string name="onboarding_access_code_feature_3_title">Восстановление</string>
<string name="onboarding_access_code_hint">Выберите любое слово, фразу или число в качестве кода доступа.</string>
<string name="onboarding_access_code_hint">Выберите любое слово, фразу или число в качестве кода доступа</string>
<string name="onboarding_access_code_intro_title">Создайте код доступа</string>
<string name="onboarding_access_code_repeat_code_title">Повторно введите код доступа</string>
<string name="onboarding_access_code_too_short">Код доступа должен состоять не менее чем из 4 символов.</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">Сканировать основную карту</string>
<string name="onboarding_button_skip_backup">Пропустить</string>
<string name="onboarding_button_what_does_it_mean">Как это работает?</string>
<string name="onboarding_chat_button_title">Чат</string>
<string name="onboarding_create_wallet_body">Давайте сгенерируем все ключи на вашей карте и создадим безопасный кошелек</string>
<string name="onboarding_create_wallet_button_create_wallet">Создать кошелек</string>
<string name="onboarding_create_wallet_header">Создать кошелек</string>
@ -184,14 +189,14 @@
<string name="onboarding_saltpay_title_no_backup_card">Бэкап карта не добавлена</string>
<string name="onboarding_saltpay_title_one_backup_card">Бэкап карта создана</string>
<string name="onboarding_saltpay_title_prepare_origin">Приготовьте SaltPay карту</string>
<string name="onboarding_subtitle_claim">Для начала работы просто запросите начисление wxDai на свой кошелек</string>
<string name="onboarding_subtitle_claim">Для начала работы просто запросите начисление wxDAI на свой кошелек</string>
<string name="onboarding_subtitle_claim_progress">Это займет несколько секунд</string>
<string name="onboarding_subtitle_kyc_retry">Более подробная информация отправлена на ваш адрес электронной почты.</string>
<string name="onboarding_subtitle_kyc_start">Для начала работы с картой вам необходимо завершить процесс подтверждения личности</string>
<string name="onboarding_subtitle_kyc_waiting">Пожалуйста дождитесь завершения процесса подтверждения личности. Вы будете уведомлены через e-mail. Обычно это занимает не более часа. Вы можете закрыть приложение и вернуться позже.</string>
<string name="onboarding_subtitle_no_backup_cards">Чтобы начать процесс резервного копирования, добавьте одну или две резервные карты.</string>
<string name="onboarding_subtitle_one_backup_card">Вы можете добавить еще одну карту или завершить процесс резервного копирования</string>
<string name="onboarding_subtitle_pin">Установите Код доступа для вашей SaltPay карты</string>
<string name="onboarding_subtitle_pin">Установите 4-х значный код.\nОн будет использован для платежей.</string>
<string name="onboarding_subtitle_register_wallet">Подключите вашу карту к децентрализованной платежной системе</string>
<string name="onboarding_subtitle_scan_backup_card_format">Подготовьте резервную карту с номером %s</string>
<string name="onboarding_subtitle_scan_origin_card">Подготовьте основную карту</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">Поздравляем! Ваша платежная крипто карта теперь активирована!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Ваша карта настроена и готова к использованию.</string>
<string name="onboarding_subtitle_two_backup_cards">Добавлено максимальное количество карт. Завершите процесс резервного копирования.</string>
<string name="onboarding_supplement_button_kyc_waiting">Чат поддержки</string>
<string name="onboarding_title">Активация карты</string>
<string name="onboarding_title_backup_card_format">Резервная карта #%d</string>
<string name="onboarding_title_claim">Запросить %s</string>
@ -219,7 +223,7 @@
<string name="onboarding_top_up_button_show_wallet_address">Показать адрес кошелька</string>
<string name="onboarding_top_up_header">Пополните свой кошелек</string>
<string name="onboarding_twin_exit_warning">Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_twins_interrupt_warning">Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала.</string>
<string name="onboarding_twins_interrupt_warning">Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала</string>
<string name="onboarding_wallet_info_subtitle_first">Вы можете сделать резервную копию своих ключей на одной или двух других пустых картах Wallet.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Код доступа можно восстановить с помощью одной из резервных карт.</string>
<string name="onboarding_wallet_info_subtitle_second">Все резервные карты являются полнофункциональными и содержат одинаковые ключи.</string>
@ -360,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">Токен %1$s является основной валютой в сети %2$s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети.</string>
<string name="token_details_unable_hide_alert_title">Невозможно скрыть %s</string>
<string name="token_item_no_rate">Нет цены</string>
<string name="transaction_history_empty_transactions">У вас еще нет транзакций</string>
<string name="transaction_history_error_failed_to_load">Не удалось загрузить транзакции</string>
<string name="transaction_history_title">Транзакции</string>
<string name="transaction_history_tx_in_progress">В процессе…</string>
<string name="twin_error_same_card">Вы отсканировали ту же карту. Для создания twin-кошелька вам необходимо отсканировать карту с номером %d</string>
<string name="twins_onboarding_description_format">Это карта, которую вы держите в руках. У парной карты номер %s.\n\nОбе карты можно использовать для вывода средств из этого кошелька.</string>
<string name="twins_onboarding_subtitle">Один кошелек. Две карты.</string>
@ -402,8 +410,11 @@
<string name="wallet_connect_create_tx_message">Запрос на создание транзакции для %1$s\n%2$s\n\nСумма: %3$s\nКомиссия: %4$s\nВсего: %5$s\nБаланс: %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">Невозможно отправить транзакцию. Недостаточно средств.</string>
<string name="wallet_connect_error_failed_to_connect">Не удалось установить сессию WalletConnect. Пожалуйста, повторите попытку позже.</string>
<string name="wallet_connect_error_missing_blockchains">Не все токены добавлены в ваш список. Пожалуйста, добавьте их в начале, а потом попробуйте снова. Недостающие токены: \n</string>
<string name="wallet_connect_error_timeout">Не удалось установить сессию WalletConnect за отведённое время. Пожалуйста, повторите попытку позже.</string>
<string name="wallet_connect_error_unsupported_blockchains">Запрос на подключение через WalletConnect содержит неподдерживаемые блокчеины. Неподдерживаемые блокчеины:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Cоединение с этим Dapp сервисом не может быть установлено из-за его технической реализации.</string>
<string name="wallet_connect_generic_error_with_code">Произошла непредвиденная ошибка. Код ошибки: %d Попробуйте, пожалуйста, позже. Если проблема будет продолжать возникать - обратитесь в службу поддержки.</string>
<string name="wallet_connect_network_not_found_format">Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново.</string>
<string name="wallet_connect_no_sessions_message">Нет открытых сессий WalletConnect</string>
<string name="wallet_connect_no_sessions_title">Упс. Нет сессий.</string>
@ -464,7 +475,4 @@
<string name="welcome_unlock_card">Сканировать карту</string>
<string name="welcome_unlock_description">Используйте %s или код доступа для входа в приложение</string>
<string name="welcome_unlock_title">C возвращением!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -24,12 +24,18 @@
<string name="app_settings_saved_wallet">將錢包保存在應用程序中</string>
<string name="app_settings_saved_wallet_footer">啟用以將所有錢包鏈接到 Tangem 應用程序。解鎖應用程序需要生物識別身份驗證。交易簽名需要輕觸您的 Tangem 卡片</string>
<string name="app_settings_title">APP設置</string>
<string name="biometric_lockout_permanent_warning_description">請掃描卡片</string>
<string name="biometric_lockout_warning_description">請30秒後重試或刷卡</string>
<string name="biometric_lockout_warning_title">嘗試次數過多</string>
<string name="card_settings_action_sheet_reset">重置</string>
<string name="card_settings_action_sheet_title">您確定要這麼做嗎?</string>
<string name="card_settings_change_access_code">更改訪問密碼</string>
<string name="card_settings_change_access_code_footer">訪問密碼將僅在此卡上更改</string>
<string name="card_settings_reset_card_to_factory">回復至原廠設置</string>
<string name="card_settings_security_mode">安全模式</string>
<string name="card_settings_title">卡片設置</string>
<string name="chat_bot_name">Tangem 機器人</string>
<string name="chat_button_title">支援</string>
<string name="common_accept">接受</string>
<string name="common_add">添加</string>
<string name="common_attention">注意</string>
@ -134,13 +140,13 @@
<string name="main_scan_card_warning_view_subtitle">要訪問所有的網路您需要掃描卡片</string>
<string name="main_scan_card_warning_view_title">掃描卡片</string>
<string name="main_tokens">代幣</string>
<string name="onboarding_access_code_feature_1_description">您必須設置一個單一的訪問代碼來保護您的所有錢包</string>
<string name="onboarding_access_code_feature_1_description">您必須設置一個單一的訪問代碼來保護您的所有錢包</string>
<string name="onboarding_access_code_feature_1_title">保護</string>
<string name="onboarding_access_code_feature_2_description">您可以稍後在每張卡上設置單獨的訪問密碼</string>
<string name="onboarding_access_code_feature_2_title">個人化</string>
<string name="onboarding_access_code_feature_3_description">門禁密碼可以用聯動卡恢復,不要把所有卡都放在一個地方</string>
<string name="onboarding_access_code_feature_3_description">門禁密碼可以用聯動卡恢復,不要把所有卡都放在一個地方</string>
<string name="onboarding_access_code_feature_3_title">恢復</string>
<string name="onboarding_access_code_hint">選擇您想要的任何單詞、短語或數字作為您的訪問代碼</string>
<string name="onboarding_access_code_hint">選擇您想要的任何單詞、短語或數字作為您的訪問代碼</string>
<string name="onboarding_access_code_intro_title">建立訪問密碼</string>
<string name="onboarding_access_code_repeat_code_title">重新輸入訪問密碼</string>
<string name="onboarding_access_code_too_short">訪問代碼的長度必須至少為 4 個字符</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">掃描主卡</string>
<string name="onboarding_button_skip_backup">暫時略過</string>
<string name="onboarding_button_what_does_it_mean">它是如何運作的?</string>
<string name="onboarding_chat_button_title">支援</string>
<string name="onboarding_create_wallet_body">讓我們生成您卡上的所有密鑰並創建一個安全的錢包</string>
<string name="onboarding_create_wallet_button_create_wallet">創建錢包</string>
<string name="onboarding_create_wallet_header">創造錢包</string>
@ -191,7 +196,7 @@
<string name="onboarding_subtitle_kyc_waiting">請等待驗證完成,您將收到電子郵件通知。通常最多需要 1 小時。您可以關閉該應用程序,稍後再回來</string>
<string name="onboarding_subtitle_no_backup_cards">要開始備份過程,最多可添加兩張備份卡。</string>
<string name="onboarding_subtitle_one_backup_card">您可以再添加一張卡或完成備份過程</string>
<string name="onboarding_subtitle_pin">為您的 SaltPay 卡設置 PIN 碼</string>
<string name="onboarding_subtitle_pin">設置一個 4 位密碼。 \n它將用在付款時使用。</string>
<string name="onboarding_subtitle_register_wallet">將您的卡片連接到去中心化支付系統</string>
<string name="onboarding_subtitle_scan_backup_card_format">準備編號為 %s 的備份卡</string>
<string name="onboarding_subtitle_scan_origin_card">準備主卡</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">恭喜! 您的第一張支付加密卡已啟用!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">您的錢包卡已配置完畢,可以使用了</string>
<string name="onboarding_subtitle_two_backup_cards">已添加至最大數量。完成備份過程</string>
<string name="onboarding_supplement_button_kyc_waiting">聯繫客服</string>
<string name="onboarding_title">啟用卡片</string>
<string name="onboarding_title_backup_card_format">備份卡 #%d</string>
<string name="onboarding_title_claim">獲取%s</string>
@ -303,7 +307,7 @@
<string name="shop_buy_now">現在購買</string>
<string name="shop_free">免費</string>
<string name="shop_i_have_a_promo_code">輸入折扣碼</string>
<string name="shop_one_wallet">Tangem 冷錢包</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_other_payment_methods">其他付款方式</string>
<string name="shop_shipping">運送</string>
<string name="shop_total">總計</string>
@ -328,6 +332,7 @@
<string name="story_meet_title">認識Tangem</string>
<string name="story_web3_description">交易、購買NFT、自由穿梭於100+去中心化服務</string>
<string name="story_web3_title">兼容DeFi</string>
<string name="swapping_error_wrapper">錯誤: %s</string>
<string name="swapping_generic_error">有錯誤。請再試一遍</string>
<string name="swapping_give_permission">賦予權限</string>
<string name="swapping_insufficient_funds">餘額不足</string>
@ -359,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">%1$s 代幣是 %2$s 網絡上的主要貨幣,只要列表中還有該網絡上的其他代幣,它就無法被隱藏。</string>
<string name="token_details_unable_hide_alert_title">無法隱藏 %s</string>
<string name="token_item_no_rate">無費用</string>
<string name="transaction_history_empty_transactions">您還沒有任何交易</string>
<string name="transaction_history_error_failed_to_load">無法加載交易</string>
<string name="transaction_history_title">交易</string>
<string name="transaction_history_tx_in_progress">進行中...</string>
<string name="twin_error_same_card">您掃描了同一張卡片。要創建雙錢包,您需要掃描編號為 %d 的卡</string>
<string name="twins_onboarding_description_format">這一個是你手裡拿著的,另一個是編號為 %s 的,這兩張卡都可以用來從這個錢包中提取資金</string>
<string name="twins_onboarding_subtitle">一個錢包,兩張卡片</string>
@ -366,9 +375,10 @@
<string name="twins_recreate_title_creating_wallet">創建錢包</string>
<string name="twins_recreate_title_format">掃描 #%s 雙胞胎卡</string>
<string name="twins_recreate_title_preparing">準備卡片</string>
<string name="twins_recreate_toolbar">Tangem雙胞胎卡</string>
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="twins_recreate_warning">這個動作是不可逆的。您將無法訪問舊錢包</string>
<string name="user_wallet_list_add_button">添加新錢包</string>
<string name="user_wallet_list_delete_prompt">您確定要刪除此錢包?</string>
<string name="user_wallet_list_editing_count">已選擇 %d</string>
<string name="user_wallet_list_error_wallet_already_saved">此錢包已保存,您可以再添加一個</string>
<string name="user_wallet_list_multi_header">多幣種</string>
@ -400,8 +410,11 @@
<string name="wallet_connect_create_tx_message">請求為 %1$s 創建交易\n%2$s\n\n數量 %3$s\n費用 %4$s\n全部的 %5$s\n餘額 %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">無法交易,無足夠資金</string>
<string name="wallet_connect_error_failed_to_connect">未能建立 WalletConnect 連接。請稍後再試</string>
<string name="wallet_connect_error_missing_blockchains">並非所有代幣都已添加到您的列表中。請先添加它們,然後重試。缺少標記:\n</string>
<string name="wallet_connect_error_timeout">無法建立 WalletConnect 連接:超時錯誤。請稍後再試</string>
<string name="wallet_connect_error_unsupported_blockchains">會話請求包含不支持 WalletConnect 連接的區塊鏈。不支持的區塊鏈:\n</string>
<string name="wallet_connect_error_unsupported_dapp">由於技術問題,無法與此 Dapp 建立連接</string>
<string name="wallet_connect_generic_error_with_code">我們遇到了未知錯誤。錯誤代碼:%d。如果問題仍然存在-請隨時聯繫我們的支持人員</string>
<string name="wallet_connect_network_not_found_format">沒有 %s 網路,請先加入後再試一次</string>
<string name="wallet_connect_no_sessions_message">沒有打開中的WalletConnect連接</string>
<string name="wallet_connect_no_sessions_title">Ooops, 沒有連接</string>
@ -462,7 +475,4 @@
<string name="welcome_unlock_card">掃描卡片</string>
<string name="welcome_unlock_description">使用 %s 或掃描卡片以訪問該應用程序</string>
<string name="welcome_unlock_title">歡迎回來!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -24,12 +24,18 @@
<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_title">App Settings</string>
<string name="biometric_lockout_permanent_warning_description">Please scan the card</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>
<string name="card_settings_action_sheet_reset">Reset</string>
<string name="card_settings_action_sheet_title">Are you sure you want to do this?</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="card_settings_reset_card_to_factory">Reset to Factory Settings</string>
<string name="card_settings_security_mode">Security Mode</string>
<string name="card_settings_title">Card Settings</string>
<string name="chat_bot_name">Tangem Bot</string>
<string name="chat_button_title">Support</string>
<string name="common_accept">Accept</string>
<string name="common_add">Add</string>
<string name="common_attention">Attention</string>
@ -134,13 +140,13 @@
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_tokens">Tokens</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets.</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your wallets</string>
<string name="onboarding_access_code_feature_1_title">Protect</string>
<string name="onboarding_access_code_feature_2_description">You can set an individual access code on each card later.</string>
<string name="onboarding_access_code_feature_2_description">You can set up an individual access code on each card later</string>
<string name="onboarding_access_code_feature_2_title">Personalize</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place.</string>
<string name="onboarding_access_code_feature_3_description">The access code can be restored with a linked card, don\'t keep all cards in one place</string>
<string name="onboarding_access_code_feature_3_title">Restore</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code.</string>
<string name="onboarding_access_code_hint">Choose any word, phrase, or number you want as your access code</string>
<string name="onboarding_access_code_intro_title">Create Access Code</string>
<string name="onboarding_access_code_repeat_code_title">Re-enter your Access Code</string>
<string name="onboarding_access_code_too_short">Access code must be at least 4 characters long</string>
@ -163,7 +169,6 @@
<string name="onboarding_button_scan_origin_card">Scan primary card</string>
<string name="onboarding_button_skip_backup">Skip for later</string>
<string name="onboarding_button_what_does_it_mean">How does it work?</string>
<string name="onboarding_chat_button_title">Support</string>
<string name="onboarding_create_wallet_body">Let\'s generate all the keys on your card and create a secure wallet</string>
<string name="onboarding_create_wallet_button_create_wallet">Create wallet</string>
<string name="onboarding_create_wallet_header">Create a wallet</string>
@ -178,7 +183,7 @@
<string name="onboarding_navbar_register_wallet">Connect</string>
<string name="onboarding_navbar_title_creating_backup">Creating a backup</string>
<string name="onboarding_saltpay_button_backup_origin">Tap the SaltPay card</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_no_backup_cards">To start the backup process you have to add the Tangem card as your backup</string>
<string name="onboarding_saltpay_subtitle_one_backup_card">Finalize the backup process by creating an access code</string>
<string name="onboarding_saltpay_title_backup_card">Tap the Tangem card</string>
<string name="onboarding_saltpay_title_no_backup_card">No backup card</string>
@ -191,7 +196,7 @@
<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_subtitle_no_backup_cards">To start the backup process add up to two backup cards.</string>
<string name="onboarding_subtitle_one_backup_card">You can add one more card or finalize the backup process</string>
<string name="onboarding_subtitle_pin">Set PIN code for your SaltPay card</string>
<string name="onboarding_subtitle_pin">Set up a 4-digit code.\nIt will be used for payments.</string>
<string name="onboarding_subtitle_register_wallet">Connect your card to the decentralized payment system</string>
<string name="onboarding_subtitle_scan_backup_card_format">Prepare the backup card with number %s</string>
<string name="onboarding_subtitle_scan_origin_card">Prepare the primary card</string>
@ -199,7 +204,6 @@
<string name="onboarding_subtitle_success_claim">Congratulations! Your first payment crypto card has been activated!</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Your wallet card is configured and ready for use.</string>
<string name="onboarding_subtitle_two_backup_cards">Max number of cards added. Finalize the backup process.</string>
<string name="onboarding_supplement_button_kyc_waiting">Chat with support</string>
<string name="onboarding_title">Activating card</string>
<string name="onboarding_title_backup_card_format">Backup card #%d</string>
<string name="onboarding_title_claim">Claim %s</string>
@ -219,7 +223,7 @@
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
<string name="onboarding_top_up_header">Top up your wallet</string>
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over</string>
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
@ -360,6 +364,10 @@
<string name="token_details_unable_hide_alert_message">The %1$s token is the main currency on the %2$s network and cannot be hidden as long as you have other tokens on this network in the list.</string>
<string name="token_details_unable_hide_alert_title">Unable to hide %s</string>
<string name="token_item_no_rate">No rate</string>
<string name="transaction_history_empty_transactions">You don\'t have any transactions yet</string>
<string name="transaction_history_error_failed_to_load">Failed to load transactions</string>
<string name="transaction_history_title">Transactions</string>
<string name="transaction_history_tx_in_progress">In progress...</string>
<string name="twin_error_same_card">You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d</string>
<string name="twins_onboarding_description_format">This one that you are holding in your hands and the other one with number %s.\n\nBoth cards can be used to extract funds from this wallet.</string>
<string name="twins_onboarding_subtitle">One wallet. Two cards.</string>
@ -402,8 +410,11 @@
<string name="wallet_connect_create_tx_message">Request to create transaction for %1$s\n%2$s\n\nAmount: %3$s\nFee: %4$s\nTotal: %5$s\nBalance: %6$s</string>
<string name="wallet_connect_create_tx_not_enough_funds">Can\'t send transaction. Not enough funds.</string>
<string name="wallet_connect_error_failed_to_connect">Failed to establish WalletConnect session. Please, try again later.</string>
<string name="wallet_connect_error_missing_blockchains">Not all tokens were added to your list. Please add them first and try again. Missing tokens:\n</string>
<string name="wallet_connect_error_timeout">Failed to establish WalletConnect session: timeout error. Please, try again later.</string>
<string name="wallet_connect_error_unsupported_blockchains">Session request contains unsupported blockchains for WalletConnect connection. Unsupported blockchains:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Connection with this Dapp cannot be established due to its technical implementation.</string>
<string name="wallet_connect_generic_error_with_code">We\'ve encountered unknown error. Error code: %d. If the problem persists — feel free to contact our support</string>
<string name="wallet_connect_network_not_found_format">%s network not found. Please, add it first and try again.</string>
<string name="wallet_connect_no_sessions_message">No opened WalletConnect sessions</string>
<string name="wallet_connect_no_sessions_title">Ooops. No Sessions.</string>
@ -464,7 +475,4 @@
<string name="welcome_unlock_card">Scan card</string>
<string name="welcome_unlock_description">Use %s or scan a card to access the app</string>
<string name="welcome_unlock_title">Welcome back!</string>
<!-- Special string -->
<string name="common_custom_string">%s</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="common_custom_string" translatable="false">%s</string>
</resources>