Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-09 15:54:04 +04:00
commit da452caaf1
75 changed files with 1083 additions and 421 deletions

View file

@ -2,6 +2,7 @@ package com.tangem.tap
import com.tangem.TangemSdkLogger
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.common.routing.AppRouter
import com.tangem.core.analytics.filter.OneTimeEventFilter
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
@ -119,4 +120,6 @@ interface ApplicationEntryPoint {
fun getPushNotificationsFeatureToggles(): PushNotificationsFeatureToggles
fun getTangemAppLogger(): TangemAppLoggerInitializer
fun getTransactionSignerFactory(): TransactionSignerFactory
}

View file

@ -11,9 +11,15 @@ import com.tangem.LogFormat
import com.tangem.TangemSdkLogger
import com.tangem.blockchain.network.BlockchainSdkRetrofitBuilder
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.common.routing.AppRouter
import com.tangem.core.analytics.Analytics
import com.tangem.core.analytics.api.ParamsInterceptor
import com.tangem.core.analytics.filter.OneTimeEventFilter
import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.analytics.models.Basic
import com.tangem.core.analytics.models.Basic.TransactionSent.WalletForm
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
import com.tangem.datasource.api.common.MoshiConverter
import com.tangem.datasource.api.common.createNetworkLoggingInterceptor
@ -191,6 +197,9 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
private val tangemAppLoggerInitializer: TangemAppLoggerInitializer
get() = entryPoint.getTangemAppLogger()
private val transactionSignerFactory: TransactionSignerFactory
get() = entryPoint.getTransactionSignerFactory()
// endregion
override fun onCreate() {
@ -273,6 +282,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
shareManager = shareManager,
appRouter = appRouter,
pushNotificationsFeatureToggles = pushNotificationsFeatureToggles,
transactionSignerFactory = transactionSignerFactory,
),
),
)
@ -315,6 +325,25 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
logConfig = LogConfig.analyticsHandlers,
jsonConverter = MoshiConverter.sdkMoshiConverter,
)
Analytics.addParamsInterceptor(
interceptor = object : ParamsInterceptor {
override fun id(): String = "SendTransactionSignerInfoInterceptor"
override fun canBeAppliedTo(event: AnalyticsEvent): Boolean = event is Basic.TransactionSent
override fun intercept(params: MutableMap<String, String>) {
val isLastSignWithRing = store.state.globalState.isLastSignWithRing
params[AnalyticsParam.WALLET_FORM] = if (isLastSignWithRing) {
WalletForm.Ring.name
} else {
WalletForm.Card.name
}
}
},
)
factory.build(Analytics, buildData)
// ExceptionHandler.append(blockchainExceptionHandler) TODO: [REDACTED_JIRA]
}

View file

@ -10,7 +10,11 @@ import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter
import com.tangem.tap.common.analytics.events.AnalyticsParam
import com.tangem.tap.common.analytics.events.IntroductionProcess
import com.tangem.tap.common.analytics.events.MainScreen
import com.tangem.tap.common.extensions.inject
import com.tangem.tap.features.demo.DemoHelper
import com.tangem.tap.proxy.redux.DaggerGraphState
import com.tangem.tap.store
import kotlinx.coroutines.runBlocking
/**
[REDACTED_AUTHOR]
@ -19,6 +23,8 @@ class CardContextInterceptor(
private val scanResponse: ScanResponse,
) : ParamsInterceptor {
private val walletsRepository = store.inject(DaggerGraphState::walletsRepository)
private val userWalletId = UserWalletIdBuilder.scanResponse(scanResponse).build()
override fun id(): String = CardContextInterceptor.id()
@ -33,7 +39,7 @@ class CardContextInterceptor(
override fun intercept(params: MutableMap<String, String>) {
val card = scanResponse.card
params[AnalyticsParam.BATCH] = card.batchId
params[AnalyticsParam.PRODUCT_TYPE] = getProductType(scanResponse)
params[AnalyticsParam.PRODUCT_TYPE] = getProductType()
params[AnalyticsParam.FIRMWARE] = card.firmwareVersion.stringValue
if (userWalletId != null) {
params[AnalyticsParam.USER_WALLET_ID] = userWalletId.stringValue
@ -44,7 +50,13 @@ class CardContextInterceptor(
}
}
private fun getProductType(scanResponse: ScanResponse): String {
private fun getProductType(): String {
if (scanResponse.productType != ProductType.Ring && userWalletId != null) {
val isWalletWithRing = runBlocking { walletsRepository.isWalletWithRing(userWalletId) }
if (isWalletWithRing) return "Ring"
}
return when (scanResponse.productType) {
ProductType.Note -> "Note"
ProductType.Twins -> "Twin"
@ -53,18 +65,18 @@ class CardContextInterceptor(
ProductType.Ring -> "Ring"
ProductType.Start2Coin -> "Start2Coin"
ProductType.Visa -> "VISA"
else -> if (DemoHelper.isDemoCard(scanResponse)) {
if (DemoHelper.isTestDemoCard(scanResponse)) {
"Demo Test"
} else {
when (scanResponse.card.cardId.substring(0..1)) {
"AC" -> "Demo Wallet"
"AB" -> "Demo Note"
else -> "Demo Other"
}
}
} else {
"Other"
else -> if (DemoHelper.isDemoCard(scanResponse)) getDemoCardProductType() else "Other"
}
}
private fun getDemoCardProductType(): String {
return if (DemoHelper.isTestDemoCard(scanResponse)) {
"Demo Test"
} else {
when (scanResponse.card.cardId.substring(0..1)) {
"AC" -> "Demo Wallet"
"AB" -> "Demo Note"
else -> "Demo Other"
}
}
}

View file

@ -0,0 +1,22 @@
package com.tangem.tap.common.libs.blockchainsdk
import com.tangem.Message
import com.tangem.TangemSdk
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.domain.TangemSigner
import com.tangem.tap.store
internal class DefaultTransactionSignerFactory : TransactionSignerFactory {
override fun createTransactionSigner(cardId: String?, sdk: TangemSdk): TransactionSigner {
return TangemSigner(
cardId = cardId,
tangemSdk = sdk,
initialMessage = Message(),
) { signResponse ->
store.dispatch(action = GlobalAction.IsSignWithRing(signResponse.isRing))
}
}
}

View file

@ -69,6 +69,8 @@ sealed class GlobalAction : Action {
val walletPublicKey: ByteArray,
) : GlobalAction()
data class IsSignWithRing(val isSignWithRing: Boolean) : GlobalAction()
data class SetConfigManager(val configManager: ConfigManager) : GlobalAction()
data class SetFeedbackManager(val feedbackManager: LegacyFeedbackManager) : GlobalAction()

View file

@ -71,6 +71,7 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde
)
globalState.copy(scanResponse = globalState.scanResponse.copy(card = newCardInstance))
}
is GlobalAction.IsSignWithRing -> globalState.copy(isLastSignWithRing = action.isSignWithRing)
is GlobalAction.SetFeedbackManager -> {
globalState.copy(feedbackManager = action.feedbackManager)
}

View file

@ -25,6 +25,7 @@ data class GlobalState(
val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(),
val userCountryCode: String? = null,
val appThemeMode: AppThemeMode = AppThemeMode.DEFAULT,
val isLastSignWithRing: Boolean = false,
) : StateType
typealias CryptoCurrencyName = String

View file

@ -123,6 +123,14 @@ internal object SettingsDomainModule {
return ShouldShowSwapPromoWalletUseCase(promoSettingsRepository)
}
@Provides
@Singleton
fun provideShouldShowRingPromoUseCase(
promoSettingsRepository: PromoSettingsRepository,
): ShouldShowRingPromoUseCase {
return ShouldShowRingPromoUseCase(promoSettingsRepository)
}
@Provides
@Singleton
fun provideShouldShowTravalaPromoWalletUseCase(

View file

@ -0,0 +1,23 @@
package com.tangem.tap.di.libs.blockchainsdk
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.tap.common.libs.blockchainsdk.DefaultTransactionSignerFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
/**
[REDACTED_AUTHOR]
*/
@Module
@InstallIn(SingletonComponent::class)
internal class TransactionSignerFactoryModule {
@Provides
@Singleton
fun provideTransactionSignerFactory(): TransactionSignerFactory {
return DefaultTransactionSignerFactory()
}
}

View file

@ -5,17 +5,15 @@ import com.tangem.TangemSdk
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.blockchain.common.Wallet
import com.tangem.common.CompletionResult
import com.tangem.domain.common.TapWorkarounds.isTangemTwins
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.isRing
import com.tangem.tap.domain.tasks.SignHashesTask
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
class TangemSigner(
private val card: CardDTO,
private val cardId: String?,
private val tangemSdk: TangemSdk,
private val initialMessage: Message,
private val accessCode: String? = null,
private val signerCallback: (TangemSignerResponse) -> Unit,
) : TransactionSigner {
@ -24,21 +22,20 @@ class TangemSigner(
publicKey: Wallet.PublicKey,
): CompletionResult<List<ByteArray>> {
return suspendCancellableCoroutine { continuation ->
val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins
val task = SignHashesTask(hashes, publicKey)
tangemSdk.startSessionWithRunnable(
runnable = task,
cardId = card.cardId.takeIf { isCardNotBackedUp },
cardId = cardId,
initialMessage = initialMessage,
accessCode = accessCode,
) { result ->
when (result) {
is CompletionResult.Success -> {
signerCallback(
TangemSignerResponse(
result.data.totalSignedHashes,
result.data.remainingSignatures,
totalSignedHashes = result.data.totalSignedHashes,
remainingSignatures = result.data.remainingSignatures,
isRing = result.data.batchId?.let(::isRing) ?: false,
),
)
if (continuation.isActive) {
@ -70,4 +67,5 @@ class TangemSigner(
data class TangemSignerResponse(
val totalSignedHashes: Int?,
val remainingSignatures: Int?,
val isRing: Boolean,
)

View file

@ -134,5 +134,9 @@ interface TangemSdkManager {
initialMessage: Message,
): CompletionResult<CreateWalletResponse>
fun changeProductType(isRing: Boolean)
fun clearProductType()
// endregion
}

View file

@ -9,7 +9,6 @@ import com.tangem.TangemSdk
import com.tangem.common.*
import com.tangem.common.authentication.AuthenticationManager
import com.tangem.common.authentication.keystore.KeystoreManager
import com.tangem.common.card.FirmwareVersion
import com.tangem.common.core.*
import com.tangem.common.extensions.ByteArrayKey
import com.tangem.common.services.secure.SecureStorage
@ -137,6 +136,14 @@ class DefaultTangemSdkManager(
scanResponse: ScanResponse,
shouldReset: Boolean,
): CompletionResult<CreateProductWalletTaskResponse> {
tangemSdk.config.setupForProduct(
if (scanResponse.cardTypesResolver.isRing()) {
ProductType.RING
} else {
ProductType.CARD
},
)
return runTaskAsync(
runnable = CreateProductWalletTask(
cardTypesResolver = scanResponse.cardTypesResolver,
@ -144,9 +151,14 @@ class DefaultTangemSdkManager(
shouldReset = shouldReset,
),
cardId = scanResponse.card.cardId,
initialMessage = Message(resources.getString(R.string.initial_message_create_wallet_body)),
initialMessage = if (scanResponse.cardTypesResolver.isRing()) {
Message(resources.getString(R.string.initial_message_create_wallet_body_ring))
} else {
Message(resources.getString(R.string.initial_message_create_wallet_body))
},
iconScanRes = if (scanResponse.cardTypesResolver.isRing()) R.drawable.img_hand_scan_ring else null,
)
.doOnResult { tangemSdk.config.setupForProduct(ProductType.ANY) }
}
override suspend fun importWallet(
@ -160,17 +172,31 @@ class DefaultTangemSdkManager(
} catch (e: TangemSdkError.MnemonicException) {
return CompletionResult.Failure(e)
}
tangemSdk.config.setupForProduct(
if (scanResponse.cardTypesResolver.isRing()) {
ProductType.RING
} else {
ProductType.CARD
},
)
return runTaskAsync(
CreateProductWalletTask(
runnable = CreateProductWalletTask(
cardTypesResolver = scanResponse.cardTypesResolver,
derivationStyleProvider = scanResponse.derivationStyleProvider,
mnemonic = defaultMnemonic,
passphrase = passphrase,
shouldReset = shouldReset,
),
scanResponse.card.cardId,
Message(resources.getString(R.string.initial_message_create_wallet_body)),
cardId = scanResponse.card.cardId,
initialMessage = if (scanResponse.cardTypesResolver.isRing()) {
Message(resources.getString(R.string.initial_message_create_wallet_body_ring))
} else {
Message(resources.getString(R.string.initial_message_create_wallet_body))
},
)
.doOnResult { tangemSdk.config.setupForProduct(ProductType.ANY) }
}
private fun sendScanResultsToAnalytics(result: CompletionResult<ScanResponse>) {
@ -381,6 +407,16 @@ class DefaultTangemSdkManager(
return runTaskAsync(task, null, initialMessage)
}
override fun changeProductType(isRing: Boolean) {
tangemSdk.config.setupForProduct(
type = if (isRing) ProductType.RING else ProductType.CARD,
)
}
override fun clearProductType() {
tangemSdk.config.setupForProduct(type = ProductType.ANY)
}
override suspend fun finalizeTwin(
secondCardPublicKey: ByteArray,
issuerKeyPair: KeyPair,
@ -398,18 +434,5 @@ class DefaultTangemSdkManager(
companion object {
private const val MAX_INITIALIZE_ATTEMPTS = 10
@Deprecated("Use [DefaultCardSdkProvider] instead")
val config = Config(
linkedTerminal = true,
allowUntrustedCards = true,
filter = CardFilter(
allowedCardTypes = FirmwareVersion.FirmwareType.values().toList(),
maxFirmwareVersion = FirmwareVersion(major = 6, minor = 33),
batchIdFilter = CardFilter.Companion.ItemFilter.Deny(
items = setOf("0027", "0030", "0031", "0035"),
),
),
)
}
}

View file

@ -174,6 +174,10 @@ class MockTangemSdkManager(
return MockProvider.createSecondTwinWallet()
}
override fun changeProductType(isRing: Boolean) = Unit
override fun clearProductType() = Unit
override suspend fun finalizeTwin(
secondCardPublicKey: ByteArray,
issuerKeyPair: KeyPair,

View file

@ -12,6 +12,7 @@ class TangemSignHashesResponse(
val signatures: List<ByteArray>,
val totalSignedHashes: Int?,
val remainingSignatures: Int?,
val batchId: String?,
) : CommandResponse
class SignHashesTask(
@ -22,12 +23,14 @@ class SignHashesTask(
SignHashesCommand(hashes.toTypedArray(), publicKey.seedKey, publicKey.derivationPath).run(session) { response ->
when (response) {
is CompletionResult.Success -> {
val card = session.environment.card
callback(
CompletionResult.Success(
TangemSignHashesResponse(
response.data.signatures,
response.data.totalSignedHashes,
session.environment.card?.wallet(publicKey.seedKey)?.remainingSignatures,
signatures = response.data.signatures,
totalSignedHashes = response.data.totalSignedHashes,
remainingSignatures = card?.wallet(publicKey.seedKey)?.remainingSignatures,
batchId = card?.batchId,
),
),
)

View file

@ -24,6 +24,7 @@ import com.tangem.domain.common.configs.CardConfig
import com.tangem.domain.common.util.derivationStyleProvider
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_IDS
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_PREFIX
import com.tangem.domain.models.scan.ProductType
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.operations.ScanTask
@ -248,7 +249,7 @@ private class ScanWalletProcessor(
}
private fun getWalletProductType(card: CardDTO): ProductType {
if (RING_BATCH_IDS.contains(card.batchId)) {
if (RING_BATCH_IDS.contains(card.batchId) || card.batchId.startsWith(RING_BATCH_PREFIX)) {
return ProductType.Ring
}
return if (card.firmwareVersion >= FirmwareVersion.Ed25519Slip0010Available &&

View file

@ -211,11 +211,13 @@ class WalletConnectSdkHelper {
}
private suspend fun sendTransaction(data: WcTransactionData, cardId: String?): String? {
val sdk = store.inject(DaggerGraphState::cardSdkConfigRepository).sdk
val result = (data.walletManager as TransactionSender).send(
transactionData = data.transaction,
signer = CommonSigner(
tangemSdk = store.inject(DaggerGraphState::cardSdkConfigRepository).sdk,
signer = store.inject(DaggerGraphState::transactionSignerFactory).createTransactionSigner(
cardId = cardId,
sdk = sdk,
),
)
return when (result) {

View file

@ -2,6 +2,7 @@ package com.tangem.tap.features.onboarding.products.wallet.redux
import android.net.Uri
import com.tangem.common.CompletionResult
import com.tangem.common.card.Card
import com.tangem.feature.onboarding.data.model.CreateWalletResponse
import com.tangem.feature.onboarding.presentation.wallet2.analytics.SeedPhraseSource
import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse
@ -59,6 +60,7 @@ sealed class BackupAction : Action {
data object ErrorInBackupCard : BackupAction()
data object StartAddingPrimaryCard : BackupAction()
data object ScanPrimaryCard : BackupAction()
data class SetHasRing(val hasRing: Boolean) : BackupAction()
/**
* Check for unfinished backup of standard Wallets
@ -68,7 +70,7 @@ sealed class BackupAction : Action {
data object StartAddingBackupCards : BackupAction()
data object AddBackupCard : BackupAction() {
data object Success : BackupAction()
data class Success(val card: Card) : BackupAction()
data class ChangeButtonLoading(val isLoading: Boolean) : BackupAction()
}

View file

@ -16,8 +16,11 @@ import com.tangem.domain.common.extensions.withIOContext
import com.tangem.domain.common.extensions.withMainContext
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_IDS
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_PREFIX
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.wallets.builder.UserWalletBuilder
import com.tangem.domain.wallets.builder.UserWalletIdBuilder
import com.tangem.domain.wallets.models.Artwork
import com.tangem.feature.onboarding.data.model.CreateWalletResponse
import com.tangem.feature.onboarding.presentation.wallet2.analytics.SeedPhraseSource
@ -180,11 +183,14 @@ private fun handleWalletAction(action: Action) {
BackupService.State.FinalizingPrimaryCard -> BackupAction.PrepareToWritePrimaryCard
is BackupService.State.FinalizingBackupCard -> BackupAction.PrepareToWriteBackupCard(backupState.index)
else -> {
if (onboardingWalletState.backupState.backupStep == BackupStep.InitBackup ||
if (onboardingWalletState.backupState.backupStep == null ||
onboardingWalletState.backupState.backupStep == BackupStep.InitBackup ||
onboardingWalletState.backupState.backupStep == BackupStep.Finished
) {
Analytics.send(Onboarding.Backup.ScreenOpened())
BackupAction.IntroduceBackup
val isWallet2 = scanResponse?.cardTypesResolver?.isWallet2() ?: false
if (isWallet2) BackupAction.StartBackup else BackupAction.IntroduceBackup
} else {
null
}
@ -200,6 +206,14 @@ private fun handleWalletAction(action: Action) {
private fun handleFinishOnboardind(scanResponse: ScanResponse) {
val backupState = store.state.onboardingWalletState.backupState
val updatedScanResponse = updateScanResponseAfterBackup(scanResponse, backupState)
val userWalletId = UserWalletIdBuilder.scanResponse(scanResponse).build()
if (backupState.hasRing && userWalletId != null) {
scope.launch {
store.inject(DaggerGraphState::walletsRepository).setHasWalletsWithRing(userWalletId = userWalletId)
}
}
OnboardingHelper.trySaveWalletAndNavigateToWalletScreen(
scanResponse = updatedScanResponse,
accessCode = backupState.accessCode,
@ -442,7 +456,7 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
when (result) {
is CompletionResult.Success -> {
updateArtworks(backupService.addedBackupCardsCount, result.data)
store.dispatchOnMain(BackupAction.AddBackupCard.Success)
store.dispatchOnMain(BackupAction.AddBackupCard.Success(result.data))
}
is CompletionResult.Failure -> {
val crashlytics = FirebaseCrashlytics.getInstance()
@ -496,11 +510,12 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
}
}
is BackupAction.WritePrimaryCard -> {
val iconScanRes = if (scanResponse?.cardTypesResolver?.isRing() == true) {
R.drawable.img_hand_scan_ring
} else {
null
}
val isRing = scanResponse?.cardTypesResolver?.isRing() == true
val iconScanRes = if (isRing) R.drawable.img_hand_scan_ring else null
store.dispatchOnMain(BackupAction.SetHasRing(hasRing = isRing))
tangemSdkManager.changeProductType(isRing)
backupService.proceedBackup(iconScanRes = iconScanRes) { result ->
when (result) {
is CompletionResult.Success -> {
@ -508,10 +523,19 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
}
is CompletionResult.Failure -> Unit
}
tangemSdkManager.clearProductType()
}
}
is BackupAction.WriteBackupCard -> {
backupService.proceedBackup { result ->
val cardIndex = if (action.cardNumber > 0) action.cardNumber - 1 else action.cardNumber
val backupCard = backupState.backupCards.getOrNull(cardIndex)
val isRing = backupCard.isRing()
val iconScanRes = if (isRing) R.drawable.img_hand_scan_ring else null
store.dispatchOnMain(BackupAction.SetHasRing(hasRing = isRing))
tangemSdkManager.changeProductType(isRing)
backupService.proceedBackup(iconScanRes = iconScanRes) { result ->
when (result) {
is CompletionResult.Success -> {
val backupValidator = BackupValidator()
@ -536,6 +560,8 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
}
}
}
tangemSdkManager.clearProductType()
}
}
is BackupAction.DiscardBackup -> {
@ -629,6 +655,10 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
}
}
private fun Card?.isRing(): Boolean {
return this?.let { RING_BATCH_IDS.contains(batchId) || batchId.startsWith(RING_BATCH_PREFIX) } ?: false
}
fun updateArtworks(addedBackupCardsCount: Int, card: Card) {
mainScope.launch {
withIOContext {
@ -653,7 +683,7 @@ internal fun gatherCardIds(backupState: BackupState, card: CardDTO?): List<Strin
private fun handleOnBackPressed(state: OnboardingWalletState) {
when (state.backupState.backupStep) {
BackupStep.InitBackup, BackupStep.ScanOriginCard, BackupStep.AddBackupCards, BackupStep.EnterAccessCode,
null, BackupStep.InitBackup, BackupStep.ScanOriginCard, BackupStep.AddBackupCards, BackupStep.EnterAccessCode,
BackupStep.ReenterAccessCode, BackupStep.SetAccessCode, BackupStep.WritePrimaryCard,
-> {
showInterruptOnboardingDialog()

View file

@ -1,6 +1,5 @@
package com.tangem.tap.features.onboarding.products.wallet.redux
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.tap.backupService
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.common.redux.global.GlobalAction
@ -53,7 +52,6 @@ private object ReducerForGlobalAction {
maxBackupCards = MAX_BACKUP_CARDS,
canSkipBackup = action.canSkipBackup,
),
isRingOnboarding = action.scanResponse.cardTypesResolver.isRing(),
)
}
is GlobalAction.Onboarding.StartForUnfinishedBackup -> {
@ -82,7 +80,7 @@ private object OnboardingWallet2Reducer {
}
private object BackupReducer {
@Suppress("ComplexMethod")
@Suppress("ComplexMethod", "LongMethod")
fun reduce(action: BackupAction, state: BackupState): BackupState {
return when (action) {
is BackupAction.IntroduceBackup -> BackupState(
@ -90,9 +88,26 @@ private object BackupReducer {
maxBackupCards = 2,
canSkipBackup = state.canSkipBackup,
)
BackupAction.StartAddingPrimaryCard -> state.copy(backupStep = BackupStep.ScanOriginCard)
BackupAction.StartAddingBackupCards -> state.copy(backupStep = BackupStep.AddBackupCards)
BackupAction.AddBackupCard.Success -> state.copy(backupCardsNumber = state.backupCardsNumber + 1)
BackupAction.StartAddingPrimaryCard -> {
state.copy(
backupStep = BackupStep.ScanOriginCard,
maxBackupCards = 2,
canSkipBackup = state.canSkipBackup,
)
}
BackupAction.StartAddingBackupCards -> {
state.copy(
backupStep = BackupStep.AddBackupCards,
maxBackupCards = 2,
canSkipBackup = state.canSkipBackup,
)
}
is BackupAction.AddBackupCard.Success -> {
state.copy(
backupCards = state.backupCards + action.card,
backupCardsNumber = state.backupCardsNumber + 1,
)
}
is BackupAction.AddBackupCard.ChangeButtonLoading -> state.copy(showBtnLoading = action.isLoading)
BackupAction.ShowAccessCodeInfoScreen -> state.copy(backupStep = BackupStep.SetAccessCode)
BackupAction.ShowEnterAccessCodeScreen -> state.copy(
@ -107,7 +122,9 @@ private object BackupReducer {
is BackupAction.PrepareToWritePrimaryCard -> if (state.primaryCardId == null) {
state.copy(
primaryCardId = backupService.primaryCardId,
primaryCardBatchId = backupService.primaryCardBatchId,
backupCardIds = backupService.backupCardIds,
backupCardBatchIds = backupService.backupCardsBatchIds,
backupCardsNumber = backupService.backupCardIds.size,
backupStep = BackupStep.WritePrimaryCard,
)
@ -117,7 +134,9 @@ private object BackupReducer {
is BackupAction.PrepareToWriteBackupCard -> if (state.primaryCardId == null) {
state.copy(
primaryCardId = backupService.primaryCardId,
primaryCardBatchId = backupService.primaryCardBatchId,
backupCardIds = backupService.backupCardIds,
backupCardBatchIds = backupService.backupCardsBatchIds,
backupCardsNumber = backupService.backupCardIds.size,
backupStep = BackupStep.WriteBackupCard(action.cardNumber),
)
@ -129,6 +148,14 @@ private object BackupReducer {
is BackupAction.FinishBackup -> state.copy(backupStep = BackupStep.Finished)
BackupAction.OnAccessCodeDialogClosed -> state.copy(backupStep = BackupStep.AddBackupCards)
BackupAction.DiscardBackup -> BackupState()
is BackupAction.SetHasRing -> {
// Don't update if state.has ring is already true
if (state.hasRing) {
state
} else {
state.copy(hasRing = action.hasRing)
}
}
else -> state
}
}

View file

@ -2,6 +2,7 @@ package com.tangem.tap.features.onboarding.products.wallet.redux
import android.graphics.Bitmap
import android.net.Uri
import com.tangem.common.card.Card
import com.tangem.domain.redux.StateDialog
import org.rekotlin.StateType
@ -14,7 +15,6 @@ data class OnboardingWalletState(
val backupState: BackupState = BackupState(),
val walletImages: WalletImages = WalletImages(),
val showConfetti: Boolean = false,
val isRingOnboarding: Boolean = false,
) : StateType {
@Suppress("MagicNumber")
@ -29,6 +29,7 @@ data class OnboardingWalletState(
OnboardingWalletStep.CreateWallet -> 1
OnboardingWalletStep.Backup -> {
when (backupState.backupStep) {
null -> 2
BackupStep.InitBackup -> 2
BackupStep.ScanOriginCard -> 3
BackupStep.AddBackupCards -> 4
@ -65,18 +66,22 @@ enum class OnboardingWalletStep {
data class BackupState(
val primaryCardId: String? = null,
val primaryCardBatchId: String? = null,
val backupCardsNumber: Int = 0,
val backupCards: List<Card> = emptyList(),
val backupCardIds: List<CardId> = emptyList(),
val backupCardBatchIds: List<CardId> = emptyList(),
@Transient
val backupCardsArtworks: Map<CardId, Bitmap> = emptyMap(),
val accessCode: String = "",
val accessCodeError: AccessCodeError? = null,
val backupStep: BackupStep = BackupStep.InitBackup,
val backupStep: BackupStep? = null,
val maxBackupCards: Int = 2,
val canSkipBackup: Boolean = true,
val isInterruptedBackup: Boolean = false,
val showBtnLoading: Boolean = false,
val hasBackupError: Boolean = false,
val hasRing: Boolean = false,
)
enum class AccessCodeError {

View file

@ -28,6 +28,7 @@ import com.tangem.core.analytics.models.Basic
import com.tangem.core.ui.extensions.setStatusBarColor
import com.tangem.datasource.utils.isNullOrEmpty
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.models.scan.isRing
import com.tangem.feature.onboarding.data.model.CreateWalletResponse
import com.tangem.feature.onboarding.presentation.wallet2.analytics.SeedPhraseSource
import com.tangem.feature.onboarding.presentation.wallet2.viewmodel.SeedPhraseMediator
@ -187,6 +188,7 @@ class OnboardingWalletFragment :
when {
state.wallet2State != null -> {
seedPhraseStateHandler.newState(this, state, seedPhraseViewModel)
seedPhraseViewModel.setCardArtworkUri(cardArtworkUri = state.walletImages.primaryCardImage.toString())
updateWalletImagesState(state.walletImages)
}
else -> {
@ -247,6 +249,7 @@ class OnboardingWalletFragment :
private fun setBackupState(state: BackupState) {
when (state.backupStep) {
null -> Unit
BackupStep.InitBackup -> showBackupIntro(state)
BackupStep.ScanOriginCard -> showScanOriginCard()
BackupStep.AddBackupCards -> showAddBackupCards(state)
@ -397,13 +400,26 @@ class OnboardingWalletFragment :
reInitCardsWidgetIfNeeded(state.backupCardsNumber)
prepareViewForFinalizeStep()
val cardIdFormatter = CardIdFormatter(CardIdDisplayFormat.LastMasked(4))
tvHeader.text = getText(R.string.common_origin_card)
tvBody.text = getString(
R.string.onboarding_subtitle_scan_primary_card_format,
state.primaryCardId?.let { cardIdFormatter.getFormattedCardId(it) },
val isRing = state.primaryCardBatchId != null && isRing(batchId = state.primaryCardBatchId)
tvHeader.text = getText(
if (isRing) R.string.common_origin_ring else R.string.common_origin_card,
)
layoutButtonsCommon.btnWalletMainAction.text = getText(R.string.onboarding_button_backup_origin)
tvBody.text = if (isRing) {
getString(R.string.onboarding_subtitle_scan_ring)
} else {
val cardIdFormatter = CardIdFormatter(CardIdDisplayFormat.LastMasked(4))
getString(
R.string.onboarding_subtitle_scan_primary_card_format,
state.primaryCardId?.let { cardIdFormatter.getFormattedCardId(it) },
)
}
layoutButtonsCommon.btnWalletMainAction.text = getText(
if (isRing) R.string.onboarding_button_backup_ring else R.string.onboarding_button_backup_origin,
)
layoutButtonsCommon.btnWalletMainAction.setIconResource(R.drawable.ic_tangem_24)
layoutButtonsCommon.btnWalletMainAction.setOnClickListener { store.dispatch(BackupAction.WritePrimaryCard) }
@ -427,16 +443,26 @@ class OnboardingWalletFragment :
prepareViewForFinalizeStep()
val cardNumber = (state.backupStep as? BackupStep.WriteBackupCard)?.cardNumber ?: 1
val cardIdFormatter = CardIdFormatter(CardIdDisplayFormat.LastMasked(4))
tvHeader.text = getString(R.string.onboarding_title_backup_card_format, cardNumber)
tvBody.text = getString(
R.string.onboarding_subtitle_scan_backup_card_format,
cardIdFormatter.getFormattedCardId(state.backupCardIds[cardNumber - 1]),
val isRing = isRing(batchId = state.backupCardBatchIds[cardNumber - 1])
tvHeader.text = getString(
if (isRing) R.string.onboarding_title_backup_ring else R.string.onboarding_title_backup_card,
)
tvBody.text = if (isRing) {
getString(R.string.onboarding_subtitle_scan_ring)
} else {
val cardIdFormatter = CardIdFormatter(CardIdDisplayFormat.LastMasked(4))
getString(
R.string.onboarding_subtitle_scan_backup_card_format,
state.primaryCardId?.let { cardIdFormatter.getFormattedCardId(it) },
)
}
layoutButtonsCommon.btnWalletMainAction.text = getString(
R.string.onboarding_button_backup_card_format,
cardNumber,
if (isRing) R.string.onboarding_button_backup_ring else R.string.onboarding_button_backup_origin,
)
layoutButtonsCommon.btnWalletMainAction.setIconResource(R.drawable.ic_tangem_24)
layoutButtonsCommon.btnWalletMainAction.setOnClickListener {
store.dispatch(BackupAction.WriteBackupCard(cardNumber))

View file

@ -1,12 +1,17 @@
package com.tangem.tap.network.auth
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.lib.auth.ExpressAuthProvider
import kotlinx.coroutines.runBlocking
import java.util.UUID
import java.util.concurrent.atomic.AtomicReference
internal class DefaultExpressAuthProvider(
private val userWalletsStore: UserWalletsStore,
private val appPreferencesStore: AppPreferencesStore,
) : ExpressAuthProvider {
private var uuid = AtomicReference(UUID.randomUUID())
@ -18,4 +23,18 @@ internal class DefaultExpressAuthProvider(
override fun getSessionId(): String {
return uuid.get().toString()
}
override fun getRefCode(): String {
val addedWalletsWithRings = runBlocking {
appPreferencesStore.getSyncOrDefault(
key = PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY,
default = emptySet(),
)
}
val userWalletId = userWalletsStore.selectedUserWalletOrNull?.walletId?.stringValue
?: error("No user id provided")
return if (addedWalletsWithRings.contains(userWalletId)) "ring" else ""
}
}

View file

@ -2,6 +2,7 @@ package com.tangem.tap.network.auth.di
import com.tangem.datasource.api.common.AuthProvider
import com.tangem.datasource.config.ConfigManager
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.lib.auth.ExpressAuthProvider
import com.tangem.lib.auth.StakeKitAuthProvider
@ -29,8 +30,14 @@ class AuthModule {
@Provides
@Singleton
fun provideExpressAuthProvider(userWalletsStore: UserWalletsStore): ExpressAuthProvider {
return DefaultExpressAuthProvider(userWalletsStore = userWalletsStore)
fun provideExpressAuthProvider(
userWalletsStore: UserWalletsStore,
appPreferencesStore: AppPreferencesStore,
): ExpressAuthProvider {
return DefaultExpressAuthProvider(
userWalletsStore = userWalletsStore,
appPreferencesStore = appPreferencesStore,
)
}
@Provides

View file

@ -7,6 +7,7 @@ import com.tangem.blockchain.common.AmountType
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.transaction.TransactionFee
import com.tangem.blockchain.extensions.Result
import com.tangem.domain.common.TapWorkarounds.isTangemTwins
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.tokens.model.CryptoCurrency
@ -105,8 +106,9 @@ suspend fun buyErc20TestnetTokens(card: CardDTO, walletManager: EthereumWalletMa
val coinValue = walletManager.wallet.amounts[AmountType.Coin]?.value ?: BigDecimal.ZERO
if (coinValue < fee.amount.value) return
val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins
val signer = TangemSigner(
card = card,
cardId = card.cardId.takeIf { isCardNotBackedUp },
tangemSdk = store.inject(DaggerGraphState::cardSdkConfigRepository).sdk,
initialMessage = Message(),
) { signResponse ->
@ -117,6 +119,8 @@ suspend fun buyErc20TestnetTokens(card: CardDTO, walletManager: EthereumWalletMa
remainingSignatures = signResponse.remainingSignatures,
),
)
store.dispatch(action = GlobalAction.IsSignWithRing(signResponse.isRing))
}
walletManager.send(

View file

@ -2,6 +2,7 @@ package com.tangem.tap.proxy.redux
import com.tangem.TangemSdkLogger
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.common.routing.AppRouter
import com.tangem.core.navigation.email.EmailSender
import com.tangem.core.navigation.share.ShareManager
@ -87,4 +88,5 @@ data class DaggerGraphState(
val appRouter: AppRouter? = null,
val pushNotificationsFeatureToggles: PushNotificationsFeatureToggles? = null,
val pushNotificationsRouter: PushNotificationsRouter? = null,
val transactionSignerFactory: TransactionSignerFactory? = null,
) : StateType

View file

@ -170,6 +170,7 @@ sealed class AnalyticsParam {
const val BATCH = "Batch"
const val TYPE = "Type"
const val FEE_TYPE = "Fee Type"
const val WALLET_FORM = "WalletForm"
const val PERMISSION_TYPE = "Permission Type"
const val PRODUCT_TYPE = "Product Type"
const val FIRMWARE = "Firmware"

View file

@ -67,6 +67,10 @@ sealed class Basic(
enum class MemoType {
Empty, Full, Null
}
enum class WalletForm {
Card, Ring
}
}
class ScanError(error: Throwable) : Basic(

View file

@ -46,7 +46,9 @@ internal class SwitchEnvironmentInterceptor(
private fun Request.Builder.addHeaders(headers: Map<String, Provider<String>>): Request.Builder {
headers.forEach { (name, valueProvider) ->
addHeader(name = name, value = valueProvider())
val value = valueProvider()
if (value.isNotBlank()) addHeader(name = name, value = value)
}
return this

View file

@ -51,6 +51,7 @@ internal class Express(
put(key = "user-id", value = Provider(expressAuthProvider::getUserId))
put(key = "session-id", value = Provider(expressAuthProvider::getSessionId))
putAll(from = RequestHeader.AppVersionPlatformHeaders(appVersionProvider).values)
put(key = "refcode", value = Provider(expressAuthProvider::getRefCode))
}
private fun getApiKey(isProd: Boolean): String {

View file

@ -99,18 +99,15 @@ object PreferencesKeys {
val apiConfigsEnvironmentKey by lazy { stringPreferencesKey(name = "apiConfigsEnvironment") }
val ADDED_WALLETS_WITH_RING_KEY by lazy { stringSetPreferencesKey(name = "addedWalletsWithRing") }
val SHOULD_SHOW_RING_PROMO_KEY by lazy { booleanPreferencesKey(name = "shouldShowRingPromo") }
// region Permission
fun getShouldShowPermission(permission: String) = booleanPreferencesKey("shouldShowPushPermission_$permission")
fun getShouldShowInitialPermissionScreen(permission: String) =
booleanPreferencesKey("shouldShowInitialPushPermissionScreen_$permission")
fun getIsFirstTimeAskingPermission(permission: String) =
booleanPreferencesKey("shouldAskInitialPushPermission_$permission")
fun getPermissionLaunchCount(permission: String) = intPreferencesKey("pushPermissionLaunchCount_$permission")
fun getPermissionDaysCount(permission: String) = longPreferencesKey("pushPermissionDaysCount_$permission")
// endregion
fun getUserTokensKey(userWalletId: String) = stringPreferencesKey(name = "user_tokens_$userWalletId")

View file

@ -44,6 +44,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) {
every { appVersionProvider.versionName } returns VERSION_NAME
every { expressAuthProvider.getUserId() } returns EXPRESS_USER_ID
every { expressAuthProvider.getSessionId() } returns EXPRESS_SESSION_ID
every { expressAuthProvider.getRefCode() } returns EXPRESS_REF_CODE
every { stakeKitAuthProvider.getApiKey() } returns STAKE_KIT_API_KEY
}
@ -65,6 +66,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) {
const val VERSION_NAME = "debug"
const val EXPRESS_USER_ID = "express_user_id"
const val EXPRESS_SESSION_ID = "express_session_id"
const val EXPRESS_REF_CODE = "express_ref_code"
const val EXPRESS_API_KEY = "express_api_key"
const val EXPRESS_DEV_API_KEY = "express_dev_api_key"
const val STAKE_KIT_API_KEY = "stake_kit_api_key"
@ -111,6 +113,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) {
},
"user-id" to Provider { EXPRESS_USER_ID },
"session-id" to Provider { EXPRESS_SESSION_ID },
"refcode" to Provider { EXPRESS_REF_CODE },
"version" to Provider { VERSION_NAME },
"platform" to Provider { "android" },
),

View file

@ -97,6 +97,10 @@
<item quantity="one">%d tag</item>
<item quantity="other">%d tage</item>
</plurals>
<plurals name="common_days_no_param">
<item quantity="one">Tag</item>
<item quantity="other">Tage</item>
</plurals>
<string name="common_delete">Entfernen</string>
<string name="common_disabled">Deaktiviert</string>
<string name="common_done">Erledigt</string>
@ -115,12 +119,14 @@
<string name="common_generate_addresses">Adressen abrufen</string>
<string name="common_go_to_provider">Zum Anbieter gehen</string>
<string name="common_go_to_token">Zum Token</string>
<string name="common_hour">Stunde</string>
<string name="common_import">Importieren</string>
<string name="common_in_progress">In Arbeit</string>
<string name="common_later">Später</string>
<string name="common_left">%1$s übrig</string>
<string name="common_locked">Gesperrt</string>
<string name="common_main_network">Hauptnetz</string>
<string name="common_month">Monat</string>
<string name="common_network_fee_title">Netzgebühr</string>
<string name="common_network_fee_warning_content">Der überwiesene Betrag wird um %1$s (%2$s) gekürzt, um die gewählte Gebührenhöhe zu decken.</string>
<string name="common_next">Weiter</string>
@ -129,6 +135,7 @@
<string name="common_now">Jetzt</string>
<string name="common_ok">OK</string>
<string name="common_origin_card">Hauptkarte</string>
<string name="common_origin_ring">Primärring</string>
<string name="common_passphrase">Passphrase</string>
<string name="common_paste">Einfügen</string>
<string name="common_privacy_policy">Datenschutzbestimmungen</string>
@ -143,6 +150,7 @@
<string name="common_save_changes">Änderungen speichern</string>
<string name="common_search">Suchen</string>
<string name="common_search_tokens">Token suchen</string>
<string name="common_second_no_param">sek.</string>
<string name="common_seed_phrase">Seed phrase</string>
<string name="common_select_action">Aktion auswählen</string>
<string name="common_sell">Verkaufen</string>
@ -168,6 +176,7 @@
<string name="common_unknown_error">Es ist ein Fehler aufgetreten. Bitte versuche es erneut.</string>
<string name="common_unreachable">Nicht erreichbar</string>
<string name="common_unstake">staking beenden</string>
<string name="common_week">Woche</string>
<string name="common_yes">Ja</string>
<string name="contract_address_copied_message">Vertragsadresse kopiert!</string>
<string name="currency_subtitle_expanded">Verfügbare Netzwerke</string>
@ -286,6 +295,7 @@
<string name="feedback_subject_support">Rückmeldung</string>
<string name="feedback_subject_support_tangem">Feedback zu Tangem</string>
<string name="feedback_subject_tx_failed">Eine Transaktion kann nicht gesendet werden</string>
<string name="feedback_token_description_error">Fehler in der Coinbeschreibung</string>
<string name="give_permission_current_transaction">Nur diese</string>
<string name="give_permission_fee_footer">Das Netzwerk erhebt eine Token-Genehmigungsgebühr, um zu überprüfen, ob Sie die Verwendung Ihres Tokens für den Swap genehmigen.</string>
<string name="give_permission_policy_type_footer">Gib das Genehmigungslimit für das ausgewählte Token an</string>
@ -301,6 +311,7 @@
<string name="initial_message_change_access_code_body">Um den Zugangscode zu ändern, halte die Karte wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs.</string>
<string name="initial_message_change_passcode_body">Um den Passcode zu ändern, halte die Karte wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs.</string>
<string name="initial_message_create_wallet_body">Um die Wallet zu erstellen, halte die Karte wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs.</string>
<string name="initial_message_create_wallet_body_ring">Um die Wallet zu erstellen, tippe auf den Ring wie oben gezeigt und entferne ihn erst am Ende des Vorgangs</string>
<string name="initial_message_reset_backup_card_header">Halte deine Karte Nr. %s des Sets an dein Smartphone</string>
<string name="initial_message_scan_header">Legen Sie die Karte zum Scannen an</string>
<string name="initial_message_sign_header">Tippen um zu signieren</string>
@ -343,8 +354,8 @@
<string name="manage_tokens_unavailable_vote">Hochstimmen</string>
<string name="manage_tokens_wallet_selector_title">Wallet auswählen</string>
<string name="manage_tokens_wallet_support_only_one_network_title">Das Wallet unterstützt nicht mehr als ein Netzwerk</string>
<string name="markets_add_to_my_portfolio_description">Um mit dem Kauf, Tausch oder Erhalt dieses Vermögenswerts zu beginnen, füge diesen Token zu mindestens 1 Netzwerk hinzu</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Dieses Asset ist nicht verfügbar</string>
<string name="markets_add_to_my_portfolio_description">Um dieses Asset zu kaufen, zu tauschen oder zu erhalten, füge diesen Deinem Portfolio hinzu</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Dieses Asset wird derzeit in der Wallet nicht unterstützt.</string>
<string name="markets_add_to_my_portfolio_unavailable_for_wallet_description">Dieses Asset ist für dieses Wallet nicht verfügbar</string>
<string name="markets_add_to_portfolio_button">Zum Portfolio hinzufügen</string>
<string name="markets_add_token">Hinzufügen</string>
@ -378,6 +389,10 @@
<string name="markets_sort_by_top_losers_title">Top-Verlierer</string>
<string name="markets_sort_by_trending_title">Beliebt</string>
<string name="markets_token_details_about_token_title">Über %s</string>
<plurals name="markets_token_details_amount_exchanges">
<item quantity="one">%d Börse</item>
<item quantity="other">%d Börsen</item>
</plurals>
<plurals name="markets_token_details_based_on_ratings">
<item quantity="one">Bewertung, basierend auf %d</item>
<item quantity="other">Bewertungen, basierend auf %d</item>
@ -389,6 +404,12 @@
<string name="markets_token_details_circulating_supply">Umlaufmenge</string>
<string name="markets_token_details_circulating_supply_description">Die Gesamtzahl der Coins, die für den Handel verfügbar sind und auf dem Markt zirkulieren</string>
<string name="markets_token_details_circulating_supply_full">Umlaufmenge</string>
<string name="markets_token_details_empty_exchanges">Keine Börsen gefunden</string>
<string name="markets_token_details_exchange">Umtausch</string>
<string name="markets_token_details_exchange_trust_score_caution">Vorsicht</string>
<string name="markets_token_details_exchange_trust_score_risky">Riskant</string>
<string name="markets_token_details_exchange_trust_score_trusted">Vertrauenswürdig</string>
<string name="markets_token_details_exchanges_title">Börsen</string>
<string name="markets_token_details_experienced_buyers">Erfahrene Käufer</string>
<string name="markets_token_details_experienced_buyers_description">Nettokäufer mit der zusätzlichen Anforderung, mindestens 100 ausgehende Transaktionen zu haben</string>
<string name="markets_token_details_experienced_buyers_full">Erfahrene Käufer</string>
@ -407,6 +428,7 @@
<string name="markets_token_details_liquidity_full">Liquidität</string>
<string name="markets_token_details_liquidity_index">Liquiditätsindex</string>
<string name="markets_token_details_liquidity_index_description">Leer</string>
<string name="markets_token_details_listed_on">Gelistet auf</string>
<string name="markets_token_details_low">Niedrig</string>
<string name="markets_token_details_market_capitalization">MarketCap</string>
<string name="markets_token_details_market_capitalization_description">Der Gesamtmarktwert einer Kryptowährung, berechnet sich durch Multiplikation des aktuellen Preises des Coins mit der Gesamtzahl der im Umlauf befindlichen Coins</string>
@ -429,6 +451,7 @@
<string name="markets_token_details_trading_volume">Handelsvolumen (24h)</string>
<string name="markets_token_details_trading_volume_24h_description">Der Gesamtbetrag einer Kryptowährung, der innerhalb der letzten 24 Stunden gehandelt wurde, wobei das Aktivitäts- und Liquiditätsniveau auf dem Markt angegeben wird</string>
<string name="markets_token_details_trading_volume_full">Handelsvolumen (24h)</string>
<string name="markets_token_details_volume">Volumen</string>
<string name="markets_tooltip_message">Rufe dies auf oder tippe auf die Suchleiste, um Token direkt vom Markt hinzuzufügen</string>
<string name="markets_tooltip_title">Token hinzufügen</string>
<string name="nfc_error_unavailable">NFC ist auf deinem Gerät nicht verfügbar</string>
@ -451,9 +474,11 @@
<string name="onboarding_backup_exit_warning">Der Sicherungsvorgang ist teilweise abgeschlossen. Du kannst ihn jetzt nicht beenden.</string>
<string name="onboarding_bottom_sheet_passphrase_description">Die Passphrase ist eine fortschrittliche Sicherheitsfunktion, die von Krypto-Wallets verwendet wird. Sie fügt ein zusätzliches Wort oder eine Phrase deiner Wahl zu der bereits bestehenden Wiederherstellungsphrase hinzu, um einen brandneuen Satz von Adressen zu erzeugen.</string>
<string name="onboarding_button_add_backup_card">Hinzufügen einer Sicherungskarte</string>
<string name="onboarding_button_backup_card">Karte scannen</string>
<string name="onboarding_button_backup_card_format">Scanne die Karte Nr. %d</string>
<string name="onboarding_button_backup_now">Jetzt sichern</string>
<string name="onboarding_button_backup_origin">Scannen der Hauptkarte</string>
<string name="onboarding_button_backup_ring">Ring scannen</string>
<string name="onboarding_button_continue_wallet">Weiter zu meiner Wallet</string>
<string name="onboarding_button_finalize_backup">Backup abschließen</string>
<string name="onboarding_button_receive_crypto">Krypto empfangen</string>
@ -567,6 +592,8 @@
<string name="reset_card_to_factory_condition_2">Mir ist klar, dass ich diese Karte nicht verwenden kann, um meinen Zugangscode auf den anderen Karten der aktuellen Wallet wiederherzustellen</string>
<string name="reset_card_with_backup_to_factory_message">Durch das Zurücksetzen auf Werkseinstellungen wird die Wallet vollständig von der ausgewählten Karte gelöscht. Du kannst die aktuelle Wallet nicht wiederherstellen oder die Karte verwenden, um den Zugangscode wiederherzustellen.</string>
<string name="reset_card_without_backup_to_factory_message">Beim Zurücksetzen auf die Werkseinstellungen wird die Wallet der ausgewählten Karte vollständig gelöscht und aus der App entfernt. Es ist nicht möglich, die aktuelle Wallet wiederherzustellen.</string>
<string name="ring_promo_text">Ringbesitzer erhalten bis zum 15.11. 3 provisionsfreie Swaps auf Changelly!</string>
<string name="ring_promo_title">Jetzt mit 0 %% Gebühren tauschen!</string>
<string name="russian_bank_card_warning_subtitle">Besitzt du eine Bankkarte aus einem anderen Land und eine Aufenthaltserlaubnis oder Registrierung außerhalb der Russischen Föderation?</string>
<string name="russian_bank_card_warning_title">Russische Bankkarten werden derzeit nicht akzeptiert</string>
<string name="save_user_wallet_agreement_access_description">Melde dich bei der App an und überprüfe dein Guthaben, ohne die Karte zu scannen</string>
@ -691,6 +718,7 @@
<string name="staking_locked">Gesperrt</string>
<string name="staking_migrate">Migrieren</string>
<string name="staking_native">Natives Staking</string>
<string name="staking_no_validators_error_message">Derzeit sind keine aktiven Validatoren für das Staking verfügbar. Bitte versuchen Sie es später erneut.</string>
<string name="staking_notification_claim_rewards_text">Verdiente Belohnungen werden an Deine Wallet gesendet und stehen Dir sofort zur Verfügung</string>
<string name="staking_notification_earn_rewards_text">Stake sicher und verdienen Belohnungen</string>
<string name="staking_notification_earn_rewards_text_daily">Sicher staken und tägliche Belohnungen verdienen.</string>
@ -721,8 +749,8 @@
<string name="staking_reward_claiming_manual">Händisch</string>
<string name="staking_reward_schedule_block">Pro Block</string>
<string name="staking_reward_schedule_day">Täglich</string>
<string name="staking_reward_schedule_each">Alle %s</string>
<string name="staking_reward_schedule_each_day">Täglich</string>
<string name="staking_reward_schedule_each_sec">Alle %1$s Sek.</string>
<string name="staking_reward_schedule_epoch">Pro Epoche</string>
<string name="staking_reward_schedule_era">Pro Ära</string>
<string name="staking_reward_schedule_hour">Stündlich</string>
@ -733,6 +761,7 @@
<string name="staking_stake_more">Mehr staken</string>
<string name="staking_summary_description_text">Du setzt %1$s ein und erhältst jährlich %2$s</string>
<string name="staking_tap_to_unlock">Zum Entsperren antippen</string>
<string name="staking_tap_to_unlock_or_vote">Tippe zum Entsperren oder Abstimmen</string>
<string name="staking_tap_to_withdraw">Zum abheben antippen</string>
<string name="staking_title_stake">Stake %s</string>
<string name="staking_title_unstake">Staking beenden%s</string>
@ -747,7 +776,7 @@
<string name="staking_validators">Validatoren</string>
<string name="staking_validators_label">Strategischer Partner</string>
<string name="staking_vote">Abstimmung</string>
<string name="staking_vote_locked">Abstimmung gesperrt</string>
<string name="staking_vote_locked">Abstimmung</string>
<string name="staking_withdraw">Zurückziehen</string>
<string name="staking_your_stakes">Deine Einsätze</string>
<string name="story_awe_description">Bewahre deine Krypto-Assets sicher auf, während die privaten Schlüssel auf deiner Karte bleiben</string>

View file

@ -343,8 +343,8 @@
<string name="manage_tokens_unavailable_vote">Votar a favor</string>
<string name="manage_tokens_wallet_selector_title">Elegir wallet</string>
<string name="manage_tokens_wallet_support_only_one_network_title">La billetera no admite más de una red</string>
<string name="markets_add_to_my_portfolio_description">Para comprar, intercambiar o recibir este activo, agréguelo a su cartera</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Este activo no está disponible</string>
<string name="markets_add_to_my_portfolio_description">Para comprar, intercambiar o recibir este activo, agréguelo a su portafolio</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Este activo no está disponible en la billetera</string>
<string name="markets_add_to_portfolio_button">Añadir al portafolio</string>
<string name="markets_add_token">Agregue un token</string>
<string name="markets_available_networks">Redes disponibles</string>
@ -565,6 +565,8 @@
<string name="reset_card_to_factory_condition_2">Entiendo que no puedo usar esta tarjeta para recuperar mi código de acceso en las otras tarjetas de la wallet actual</string>
<string name="reset_card_with_backup_to_factory_message">El restablecimiento de fábrica eliminará completamente la billetera de la tarjeta seleccionada. No podrá restaurar la billetera actual ni usar la tarjeta para recuperar el código de acceso.</string>
<string name="reset_card_without_backup_to_factory_message">El restablecimiento de fábrica eliminará completamente la billetera de la tarjeta seleccionada y lo eliminará de la app. No podrá restaurar la billetera actual.</string>
<string name="ring_promo_text">Si tienes un Anillo Tangem, ¡3 swaps sin comisión en Changelly hasta el 15/11!</string>
<string name="ring_promo_title">¡Intercambia con 0%% de comisión!</string>
<string name="russian_bank_card_warning_subtitle">¿Tiene una tarjeta bancaria de otro país y un permiso de residencia o registro fuera de la Federación Rusa?</string>
<string name="russian_bank_card_warning_title">Las tarjetas bancarias rusas no se aceptan actualmente</string>
<string name="save_user_wallet_agreement_access_description">Inicie sesión en la app y comprueba su saldo sin escanear la tarjeta</string>
@ -689,6 +691,7 @@
<string name="staking_locked">Bloqueado</string>
<string name="staking_migrate">Migrar</string>
<string name="staking_native">Native staking</string>
<string name="staking_no_validators_error_message">No hay validadores activos disponibles para hacer staking en este momento. Por favor, inténtalo de nuevo más tarde.</string>
<string name="staking_notification_claim_rewards_text">Recomp. won se le enviará y estará disponible para su uso inmediato</string>
<string name="staking_notification_earn_rewards_text">Haga staking de forma segura y comience a ganar recompensas</string>
<string name="staking_notification_earn_rewards_text_daily">Haga de forma segura y comience a ganar recompensas diarias</string>
@ -720,7 +723,6 @@
<string name="staking_reward_schedule_block">Bloquear</string>
<string name="staking_reward_schedule_day">Día</string>
<string name="staking_reward_schedule_each_day">Cada día</string>
<string name="staking_reward_schedule_each_sec">Cada %1$s segundo(s)</string>
<string name="staking_reward_schedule_epoch">Época</string>
<string name="staking_reward_schedule_era">Era</string>
<string name="staking_reward_schedule_hour">Hora</string>
@ -771,7 +773,7 @@
<string name="swapping_high_price_impact_description">Hacer swap de esta cantidad de tokens seleccionados causará un impacto significativo en el precio y reducirá su resultado.</string>
<string name="swapping_insufficient_funds">Fondos insuficientes</string>
<string name="swapping_permission_header">Dar autorización</string>
<string name="swapping_swap_action">Intercambie</string>
<string name="swapping_swap_action">Intercambiar</string>
<string name="swapping_to_title">Usted recibe</string>
<string name="swapping_token_list_title">Elige token</string>
<string name="swapping_token_not_available">no disponible</string>

View file

@ -343,8 +343,8 @@
<string name="manage_tokens_unavailable_vote">Vote positif</string>
<string name="manage_tokens_wallet_selector_title">Choisissez un portefeuille</string>
<string name="manage_tokens_wallet_support_only_one_network_title">Le portefeuille ne prend pas en charge plus d\'un réseau</string>
<string name="markets_add_to_my_portfolio_description">Pour commencer à acheter, échanger ou recevoir cet actif, ajoutez ce jeton à au moins 1 réseau</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Cet actif n\'est pas disponible</string>
<string name="markets_add_to_my_portfolio_description">Pour acheter, échanger ou recevoir cet actif, ajoutez-le à votre portefeuille</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Cet actif n\'est plus pris en charge dans le portefeuille</string>
<string name="markets_add_to_portfolio_button">Ajouter au portfolio</string>
<string name="markets_add_token">Ajoutez un jeton</string>
<string name="markets_available_networks">Réseaux disponibles</string>
@ -565,6 +565,8 @@
<string name="reset_card_to_factory_condition_2">Je comprends que je ne peux pas utiliser cette carte pour récupérer mon code d\'accès sur les autres cartes du portefeuille actuel</string>
<string name="reset_card_with_backup_to_factory_message">La réinitialisation aux paramètres d\'usine supprimera complètement le portefeuille de la carte sélectionnée. Vous ne pourrez pas restaurer le portefeuille actuel ni utiliser la carte pour récupérer le code d\'accès.</string>
<string name="reset_card_without_backup_to_factory_message">La réinitialisation aux paramètres d\'usine supprimera complètement le portefeuille de la carte sélectionnée et le supprimera de l\'application. Vous ne pourrez pas restaurer le portefeuille actuel.</string>
<string name="ring_promo_text">Les propriétaires du Tangem Ring ont droit à 3 swap gratis sur Changelly jusqu\'au 15/11 !</string>
<string name="ring_promo_title">Échangez avec 0 %% de frais maintenant!</string>
<string name="russian_bank_card_warning_subtitle">Avez-vous une carte bancaire d\'un autre pays et un permis de séjour ou une inscription en dehors de la Fédération de Russie ?</string>
<string name="russian_bank_card_warning_title">Les cartes bancaires russes ne sont actuellement pas acceptées</string>
<string name="save_user_wallet_agreement_access_description">Connectez-vous à l\'application et vérifiez votre solde sans scanner la carte</string>
@ -689,6 +691,7 @@
<string name="staking_locked">Bloqué</string>
<string name="staking_migrate">Migrer</string>
<string name="staking_native">Native staking</string>
<string name="staking_no_validators_error_message">Aucun validateur actif n\'est disponible pour le staking pour le moment. Veuillez réessayer plus tard.</string>
<string name="staking_notification_claim_rewards_text">Récomp. gagnées vous seront envoyées et dispo pour utilisation immédiate</string>
<string name="staking_notification_earn_rewards_text">Stakez et commencez à gagner vos récompenses</string>
<string name="staking_notification_earn_rewards_text_daily">Stakez en toute sécurité et commencez à gagner des récompenses quotidiennes</string>
@ -720,7 +723,6 @@
<string name="staking_reward_schedule_block">Bloquer</string>
<string name="staking_reward_schedule_day">Jour</string>
<string name="staking_reward_schedule_each_day">Chaque jour</string>
<string name="staking_reward_schedule_each_sec">Toute(s) les %1$s seconde(s)</string>
<string name="staking_reward_schedule_epoch">Époque</string>
<string name="staking_reward_schedule_era">Ère</string>
<string name="staking_reward_schedule_hour">Heure</string>

View file

@ -12,19 +12,19 @@
<string name="alert_failed_to_send_transaction_title">取引を送信できません</string>
<string name="alert_manage_tokens_unsupported_blockchain_by_card_message">選択したものは%1$sネットワークをサポートしていません。</string>
<string name="alert_manage_tokens_unsupported_curve_message">%1$sブロックチェーンの暗号化を有効にするには、ウォレットを工場出荷時の設定にリセットする必要があります。リセットする前に出金して、資金が失われないようにしてから、リセット処理を完了してください。リセット後は、現在のウォレットにアクセスできなくなります。</string>
<string name="alert_manage_tokens_unsupported_message">%1$s ネットワークのトークンは、ファームウェアの制限により、このカードではサポートされていません。</string>
<string name="alert_troubleshooting_scan_card_title">カードのスキャンに問題がありますか?</string>
<string name="alert_manage_tokens_unsupported_message">%1$s ネットワークのトークンは、ファームウェアの制限により、このカードまたはリングではサポートされていません。</string>
<string name="alert_troubleshooting_scan_card_title">カードまたはリングのスキャンに問題がありますか?</string>
<string name="alert_unsupported_card">このカードはこのアプリでは使用できません。</string>
<string name="app_settings_default_fee">デフォルト手数料</string>
<string name="app_settings_default_fee_footer">デフォルト手数料を有効にすると、取引手数料が自動的に設定され、送金時に手数料ページを表示する必要がなくなります。必要に応じて、いつでもこのページに戻ることができます。</string>
<string name="app_settings_enable_biometrics_description">設定に移動して、Tangemアプリで生体認証を有効にします。</string>
<string name="app_settings_enable_biometrics_title">生体認証を有効にする</string>
<string name="app_settings_off_saved_access_code_alert_message">これにより、保存されているウォレットアクセスコードがすべて削除されます。ウォレットでの今後の操作には、アクセスコードの送信が必要になります。</string>
<string name="app_settings_off_saved_wallet_alert_message">保存したカードを削除すると、保存されているすべてのウォレットとそのアクセスコードがアプリから削除されます。</string>
<string name="app_settings_off_saved_wallet_alert_message">保存したデバイスを削除すると、保存されているすべてのウォレットとそのアクセスコードがアプリから削除されます。</string>
<string name="app_settings_saved_access_codes">アクセスコードを保存</string>
<string name="app_settings_saved_access_codes_footer">カードとのやり取りには、アクセスコードの代わりに生体認証が要求されます。</string>
<string name="app_settings_saved_access_codes_footer">カードまたはリングとのやり取りには、アクセスコードの代わりに生体認証が要求されます。</string>
<string name="app_settings_saved_wallet">ウォレットをアプリに保存する</string>
<string name="app_settings_saved_wallet_footer">すべてのウォレットをTangemアプリにリンクできるようにします。アプリのロックを解除するには、生体認証が必要になります。取引の署名には、Tangemカードをタップする必要があります。</string>
<string name="app_settings_saved_wallet_footer">すべてのウォレットをTangemアプリにリンクできるようにします。アプリのロックを解除するには、生体認証が必要になります。取引の署名には、Tangemカードまたはリングをタップする必要があります。</string>
<string name="app_settings_theme_mode_dark">ダーク</string>
<string name="app_settings_theme_mode_light">ライト</string>
<string name="app_settings_theme_mode_system">システムのデフォルト</string>
@ -34,28 +34,28 @@
<string name="balance_hidden_do_not_show_button">今後表示しない</string>
<string name="balance_hidden_got_it_button">わかりました</string>
<string name="balance_hidden_title">残高は非表示</string>
<string name="biometric_lockout_permanent_warning_description">カードをスキャンしてください</string>
<string name="biometric_lockout_warning_description">30秒後に再試行するか、カードをスキャンしてください</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="biometric_unavailable_warning">お使いの携帯電話で生体認証が無効になっているため、アプリにウォレットを保存できません。ウォレットを保存するには、携帯電話の設定で生体認証機能を有効にしてください。</string>
<string name="button_start_backup_process">バックアップ処理を開始する</string>
<string name="buy_token_description">銀行カードまたはその他の支払い方法を使用する</string>
<plurals name="card_label_card_count">
<item quantity="other">%d カード</item>
<item quantity="other">%d デバイス</item>
</plurals>
<string name="card_settings_access_code_recovery_disabled_description">このカードを使用して、このウォレット内の他のカードのアクセスコードをリセットしたくない場合は、このオプションを無効にしてください。これにより、このカードのアクセスコードもリセットできなくなりますのでご注意ください。</string>
<string name="card_settings_access_code_recovery_disabled_description">このカードを使用して、このウォレット内の他のカードまたはリングのアクセスコードをリセットしたくない場合は、このオプションを無効にしてください。これにより、このカードのアクセスコードもリセットできなくなりますのでご注意ください。</string>
<string name="card_settings_access_code_recovery_enabled_description">このカードを使用して、このウォレット内の他のカードのアクセスコードをリセットできます。</string>
<string name="card_settings_access_code_recovery_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_completed_reset_alert_message">選択したウォレットのすべてのカードが、工場出荷時の設定にリセットされました。これで、新しいウォレットを作成できます。</string>
<string name="card_settings_completed_reset_alert_message">選択したウォレットのすべてのTangemデバイスが、工場出荷時の設定にリセットされました。これで、新しいウォレットを作成できます。</string>
<string name="card_settings_completed_reset_alert_title">リセット完了</string>
<string name="card_settings_continue_reset_alert_message">このウォレットの次のカードをリセットしますか?</string>
<string name="card_settings_continue_reset_alert_title">カードのリセット</string>
<string name="card_settings_interrupted_reset_alert_message">このウォレットのすべてのカードをリセットすることをお勧めします。</string>
<string name="card_settings_interrupted_reset_alert_title">すべてのカードのリセットが完了していません。</string>
<string name="card_settings_continue_reset_alert_message">このウォレットの次のデバイスをリセットしますか?</string>
<string name="card_settings_continue_reset_alert_title">ウォレットのリセット</string>
<string name="card_settings_interrupted_reset_alert_message">このウォレットのすべてのTangemデバイスをリセットすることをお勧めします</string>
<string name="card_settings_interrupted_reset_alert_title">すべてのTangemデバイスのリセットが完了していません</string>
<string name="card_settings_reset_card_to_factory">工場出荷時の設定にリセット</string>
<string name="card_settings_security_mode">セキュリティ・モード</string>
<string name="card_settings_title">カード設定</string>
@ -116,12 +116,14 @@
<string name="common_generate_addresses">アドレスを取得する</string>
<string name="common_go_to_provider">プロバイダーへ移動</string>
<string name="common_go_to_token">トークンへ移動</string>
<string name="common_hour">時間</string>
<string name="common_import">インポート</string>
<string name="common_in_progress">進行中</string>
<string name="common_later">後で</string>
<string name="common_left">残り%1$s</string>
<string name="common_locked">ロックされています</string>
<string name="common_main_network">メインネットワーク</string>
<string name="common_month"></string>
<string name="common_network_fee_title">ネットワーク手数料</string>
<string name="common_network_fee_warning_content">送金額は、選択された手数料レベルをカバーするため、%1$s (%2$s) 減額されます。</string>
<string name="common_next"></string>
@ -130,6 +132,7 @@
<string name="common_now"></string>
<string name="common_ok">わかりました</string>
<string name="common_origin_card">プライマリーカード</string>
<string name="common_origin_ring">プライマリーリング</string>
<string name="common_passphrase">パスフレーズ</string>
<string name="common_paste">ペースト</string>
<string name="common_privacy_policy">プライバシーポリシー</string>
@ -144,6 +147,7 @@
<string name="common_save_changes">変更内容を保存</string>
<string name="common_search">検索</string>
<string name="common_search_tokens">トークンを検索</string>
<string name="common_second_no_param"></string>
<string name="common_seed_phrase">シードフレーズ</string>
<string name="common_select_action">アクションを選択</string>
<string name="common_sell">売る</string>
@ -169,6 +173,7 @@
<string name="common_unknown_error">エラーが発生しました。もう一度お試しください。</string>
<string name="common_unreachable">アクセスできません</string>
<string name="common_unstake">ステーキング解除</string>
<string name="common_week"></string>
<string name="common_yes">はい</string>
<string name="contract_address_copied_message">コントラクトアドレスをコピーしました!</string>
<string name="currency_subtitle_expanded">利用可能なネットワーク</string>
@ -205,7 +210,7 @@
<string name="details_manage_security_access_code">アクセスコード</string>
<string name="details_manage_security_access_code_description">カードをスキャンする前に、正しいアクセスコードを送信する必要があります。</string>
<string name="details_manage_security_long_tap">長くタップ</string>
<string name="details_manage_security_long_tap_description">このメカニズムは、カードに対する近接攻撃から保護します。コマンドの受信と実行の間に遅延を強制します。 </string>
<string name="details_manage_security_long_tap_description">このメカニズムは、カードまたはリングに対する近接攻撃から保護します。コマンドの受信と実行の間に遅延を強制します。 </string>
<string name="details_manage_security_passcode">パスコード</string>
<string name="details_manage_security_passcode_description">カードの状態の変更を伴うコマンドを実行する前に、パスコードを入力する必要があります。</string>
<string name="details_referral_title">紹介プログラム</string>
@ -222,7 +227,7 @@
<string name="details_title">詳細</string>
<string name="disclaimer_error_loading">インターネット接続を確認するか、別のネットワークに切り替えてください。</string>
<string name="disclaimer_title">利用規約</string>
<string name="error_wrong_wallet_tapped">別のウォレットのカードを使用しました。このウォレットに関連付けられているカードをタップしてください。</string>
<string name="error_wrong_wallet_tapped">別のウォレットのカードまたはリングを使用しました。このウォレットにリンクしているカードまたはリングをタップしてください。</string>
<string name="exchange_tokens_available_tokens_header">マイトークン</string>
<string name="exchange_tokens_empty_tokens">まだトークンを追加していません。マーケットからトークンを追加して交換してください。</string>
<string name="exchange_tokens_unavailable_tokens_header">%sとの交換はできません</string>
@ -279,14 +284,15 @@
<string name="exсhange_token_description">ポートフォリオ内のアセットをこのトークンと交換する</string>
<string name="feedback_data_collection_message">以下の情報はオプションです。共有したくない場合は消去できます。</string>
<string name="feedback_preface_rate_negative">どのような機能が不足しているかを教えください。解決できるよう尽力致します。</string>
<string name="feedback_preface_scan_failed">お持ちのカードについて教えてください</string>
<string name="feedback_preface_scan_failed">お持ちのカードまたはリングについて教えてください</string>
<string name="feedback_preface_support">サポートチームの皆さん、こんにちは。</string>
<string name="feedback_preface_tx_failed">問題について詳しく教えてください。どんな些細なことでも役に立ちます。</string>
<string name="feedback_subject_rate_negative">私の提案</string>
<string name="feedback_subject_scan_failed">カードをスキャンできません</string>
<string name="feedback_subject_scan_failed">カード / リングをスキャンできません</string>
<string name="feedback_subject_support">フィードバック</string>
<string name="feedback_subject_support_tangem">Tangemへのフィードバック</string>
<string name="feedback_subject_tx_failed">取引を送信できません</string>
<string name="feedback_token_description_error">コインの説明エラー</string>
<string name="give_permission_current_transaction">取引</string>
<string name="give_permission_fee_footer">ネットワークは、あなたがトークンのスワップを承認していることを確認するために、トークン承認手数料を請求します。</string>
<string name="give_permission_policy_type_footer">選択したトークンの承認制限を指定します</string>
@ -296,17 +302,18 @@
<string name="give_permission_swap_subtitle" formatted="false">続行するには、%1sスマートコントラクトに%2sを使用する権限を付与してください</string>
<string name="give_permission_title">許可を与える</string>
<string name="give_permission_unlimited">無制限</string>
<string name="home_button_order">カードを注文</string>
<string name="home_button_scan">スキャン</string>
<string name="home_button_order">Tangemを注文</string>
<string name="home_button_scan">Tangemをスキャン</string>
<string name="information_generated_with_ai">この情報はAIによって生成されました</string>
<string name="initial_message_change_access_code_body">アクセスコードを変更するには、上図のようにカードをタップし、操作が終了するまで取り外さないでください。</string>
<string name="initial_message_change_access_code_body">アクセスコードを変更するには、上図のようにカードまたはリングをタップし、操作が終了するまで取り外さないでください。</string>
<string name="initial_message_change_passcode_body">パスコードを変更するには、上記のようにカードをタップし、操作が終了するまで取り外さないでください。</string>
<string name="initial_message_create_wallet_body">ウォレットを作成するには、上記のようにカードをタップし、操作が終了するまで取り外さないでください。</string>
<string name="initial_message_create_wallet_body_ring">ウォレットを作成するには、上図のようにリングをタップし、操作が終了するまで取り外さないでください。</string>
<string name="initial_message_reset_backup_card_header">ウォレットの%s番目のカードをタップします</string>
<string name="initial_message_scan_header">タップしてスキャン</string>
<string name="initial_message_sign_header">タップして署名</string>
<string name="initial_message_tap_header">カードをタップ</string>
<string name="key_invalidated_warning_description">生体認証を更新しました。カードをスキャンして入ってください。</string>
<string name="initial_message_tap_header">カードまたはリングをタップ</string>
<string name="key_invalidated_warning_description">生体認証を更新しました。カードまたはリングをスキャンして入ってください。</string>
<string name="koinos_insufficient_balance_to_send_koin_description">送金するには、残高が手数料額より高くなければなりません。</string>
<string name="koinos_insufficient_balance_to_send_koin_title">残高不足</string>
<string name="koinos_insufficient_mana_to_send_koin_description">この取引に必要なManaが不足しています。Manaが補充されるまでお待ちください。あなたのMana残高は%1$s/%2$sです。</string>
@ -318,7 +325,7 @@
<string name="main_empty_tokens_list_message">暗号資産および取引の追跡を開始するには、トークンを追加してください</string>
<string name="main_manage_tokens">トークンの管理</string>
<string name="main_scan_card_warning_view_subtitle">すべてのネットワークにアクセスするには、カードをスキャンする必要があります。</string>
<string name="main_scan_card_warning_view_title">カードをスキャンする</string>
<string name="main_scan_card_warning_view_title">カードまたはリングをスキャンする</string>
<string name="main_swap_changelly_promotion_message">2月%2$s - %3$sの期間、Changelly経由のスワップは%1$sのサービス手数料となります。</string>
<string name="main_swap_changelly_promotion_title">Changellyでスワップ、手数料%s</string>
<string name="main_tokens">トークン</string>
@ -344,14 +351,14 @@
<string name="manage_tokens_wallet_selector_title">ウォレットを選択</string>
<string name="manage_tokens_wallet_support_only_one_network_title">ウォレットは複数のネットワークをサポートしていません。</string>
<string name="markets_add_to_my_portfolio_description">このアセットを購入・交換・受け取るには、ポートフォリオに追加してください。</string>
<string name="markets_add_to_my_portfolio_unavailable_description">このアセットは利用できません</string>
<string name="markets_add_to_my_portfolio_unavailable_description">このアセットは現在ウォレットで利用できません</string>
<string name="markets_add_to_my_portfolio_unavailable_for_wallet_description">このアセットはこのウォレットでは使用できません。</string>
<string name="markets_add_to_portfolio_button">ポートフォリオに追加</string>
<string name="markets_add_token">追加</string>
<string name="markets_available_networks">利用可能なネットワーク</string>
<string name="markets_common_my_portfolio">私のポートフォリオ</string>
<string name="markets_common_title">マーケット</string>
<string name="markets_generate_addresses_notification">選択したネットワークのアドレスを生成するには、Tangemカードをスキャンする必要があります。</string>
<string name="markets_generate_addresses_notification">選択したネットワークのアドレスを生成するには、Tangemウォレットカードまたはリングをスキャンする必要があります。</string>
<string name="markets_hint">トークンを追加するには、これをスワイプするか、検索バーをタップしてください。</string>
<string name="markets_insights_info_description_message">このセクションのデータは、次のネットワークから取得されています: %s</string>
<string name="markets_loading_error_title">データを読み込めません…</string>
@ -441,11 +448,11 @@
<string name="markets_tooltip_message">これをドラッグするか、検索窓をタップして、マーケットから直接トークンを追加します</string>
<string name="markets_tooltip_title">トークンを追加</string>
<string name="nfc_error_unavailable">お使いのデバイスではNFCが使用できません</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">アクセスコードはリンクされたカード1枚で復元できます。すべてのカードを1か所に保管しないでください。</string>
<string name="onboarding_access_code_feature_3_description">アクセスコードはリンクされたカードおよびリング1つで復元できます。すべてのデバイスを1か所に保管しないでください。</string>
<string name="onboarding_access_code_feature_3_title">復元する</string>
<string name="onboarding_access_code_hint">アクセスコードとして任意の単語、フレーズ、または数字を選択してください</string>
<string name="onboarding_access_code_intro_title">アクセスコードの作成</string>
@ -456,24 +463,26 @@
<string name="onboarding_activation_error_message">操作を繰り返してください。カードは工場出荷時の設定にリセットされます。</string>
<string name="onboarding_activation_error_title">アクティベーションに失敗しました</string>
<string name="onboarding_add_tokens">トークンを追加する</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">バックアップカードを1枚追加しました。バックアップ処理が終了すると、これ以上バックアップカードを追加することはできません。もう一枚カードがあれば、バックアップに追加してください。バックアップ処理を続けますか?</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">バックアップカードまたはリングを1つ追加しました。バックアップ処理が終了すると、これ以上バックアップデバイスを追加することはできません。もう一つカードまたはリングがある場合、バックアップに追加してください。バックアップ処理を続けますか?</string>
<string name="onboarding_backup_exit_warning">バックアップ手続きは部分的に完了しています。現在終了することはできません。</string>
<string name="onboarding_bottom_sheet_passphrase_description">パスフレーズは、暗号資産ウォレットが使用する高度なセキュリティ機能です。既存のリカバリフレーズに、自分で選択した単語またはフレーズを追加することで、まったく新しいアドレスのロック解除が可能になります。</string>
<string name="onboarding_button_add_backup_card">バックアップカードを追加する</string>
<string name="onboarding_button_add_backup_card">バックアップ用のカードまたはリングを追加</string>
<string name="onboarding_button_backup_card">カードをスキャン</string>
<string name="onboarding_button_backup_card_format">カード #%d をスキャン</string>
<string name="onboarding_button_backup_now">今すぐバックアップ</string>
<string name="onboarding_button_backup_origin">プライマリカードをスキャン</string>
<string name="onboarding_button_backup_origin">カードをスキャン</string>
<string name="onboarding_button_backup_ring">リングをスキャン</string>
<string name="onboarding_button_continue_wallet">ウォレットへ進む</string>
<string name="onboarding_button_finalize_backup">バックアップを完了する</string>
<string name="onboarding_button_receive_crypto">暗号資産を受け取る</string>
<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_create_wallet_body">すべての秘密鍵をカード内で生成し、安全なウォレットを作成しましょう</string>
<string name="onboarding_create_wallet_body">すべての秘密鍵をカードまたはリング内で生成し、安全なウォレットを作成しましょう</string>
<string name="onboarding_create_wallet_button_create_wallet">ウォレットを作成する</string>
<string name="onboarding_create_wallet_header">ウォレットを作成する</string>
<string name="onboarding_create_wallet_options_button_options">その他のオプション</string>
<string name="onboarding_create_wallet_options_message">秘密鍵はカード内で安全に生成されます。シードフレーズは存在しないので、誰もエクスポートしたり盗んだりすることはできません。</string>
<string name="onboarding_create_wallet_options_message">秘密鍵はカードまたはリング内で安全に生成されます。シードフレーズは存在しないので、誰もエクスポートしたり盗んだりすることはできません。</string>
<string name="onboarding_create_wallet_options_title">秘密鍵を非公開で生成する</string>
<string name="onboarding_done_body">カードは有効化され、使用可能になりました</string>
<string name="onboarding_done_header">成功!</string>
@ -493,27 +502,27 @@
<string name="onboarding_seed_import_message">ウォレットをインポートするには、下のフィールドにシードフレーズを入力してください。</string>
<string name="onboarding_seed_intro_button_generate">シードフレーズを生成する</string>
<string name="onboarding_seed_intro_button_import">ウォレットをインポート</string>
<string name="onboarding_seed_intro_message">シードフレーズは、ウォレットを復元できる一連の単語です。カードによって生成される秘密鍵とは異なり、シードフレーズは保護されていないため、コピーされて盗まれる可能性があります。このオプションは自己責任で使用してください。</string>
<string name="onboarding_seed_intro_message">シードフレーズは、ウォレットを復元できる一連の単語です。カードやリングによって生成される秘密鍵とは異なり、シードフレーズは保護されていないため、コピーされて盗まれる可能性があります。このオプションは自己責任で使用してください。</string>
<string name="onboarding_seed_intro_title">シードフレーズを使用する</string>
<string name="onboarding_seed_mnemonic_invalid_checksum">無効なシードフレーズです。語順を確認してください。</string>
<string name="onboarding_seed_mnemonic_wrong_words">無効なシードフレーズです。スペルを確認してください。</string>
<string name="onboarding_seed_phrase_intro_legacy">レガシー</string>
<string name="onboarding_seed_user_validation_message">シードフレーズを正しく書き込んだかどうかを確認するために、2番目、7番目、11番目の単語を入力してください。</string>
<string name="onboarding_seed_user_validation_title">では、確認してみましょう</string>
<string name="onboarding_subtitle_no_backup_cards">バックアップ処理を開始するには、最大2枚のバックアップカードを追加します。</string>
<string name="onboarding_subtitle_one_backup_card">カードをもう1枚追加するか、バックアップ処理を完了します</string>
<string name="onboarding_subtitle_no_backup_cards">バックアップ処理を開始するには、最大2つのバックアップカードまたはリングを追加します。</string>
<string name="onboarding_subtitle_one_backup_card">カードまたはリングをもう1つ追加するか、バックアップ処理を完了します</string>
<string name="onboarding_subtitle_scan_backup_card_format">番号%sのバックアップカードを準備してください</string>
<string name="onboarding_subtitle_scan_primary">プライマリカードをスキャンして、バックアップ処理を開始します。</string>
<string name="onboarding_subtitle_scan_primary">プライマリカードまたはリングをスキャンして、バックアップ処理を開始します。</string>
<string name="onboarding_subtitle_scan_primary_card_format">番号%sのプライマリカードを準備してください</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">ウォレットカードが設定され、使用できるようになりました。</string>
<string name="onboarding_subtitle_two_backup_cards">最大枚数のカードが追加されました。バックアップ処理を完了します。</string>
<string name="onboarding_title">カードの有効化</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">ウォレットが設定され、使用できるようになりました。</string>
<string name="onboarding_subtitle_two_backup_cards">最大数のデバイスが追加されました。バックアップ処理を完了します。</string>
<string name="onboarding_title">ウォレットの有効化</string>
<string name="onboarding_title_backup_card_format">バックアップカード # %d</string>
<string name="onboarding_title_no_backup_cards">バックアップカードなし</string>
<string name="onboarding_title_no_backup_cards">バックアップカードまたはリングなし</string>
<string name="onboarding_title_notifications">通知</string>
<string name="onboarding_title_one_backup_card">バックアップカードが1枚追加されました</string>
<string name="onboarding_title_one_backup_card">バックアップデバイスが1つ追加されました</string>
<string name="onboarding_title_scan_origin_card">カードを準備してください</string>
<string name="onboarding_title_two_backup_cards">バックアップカード2枚が追加されました</string>
<string name="onboarding_title_two_backup_cards">バックアップデバイス2つが追加されました</string>
<string name="onboarding_top_up_body">始めるには、ウォレットに任意の金額を入金するだけです</string>
<string name="onboarding_top_up_body_no_account_error">始めるには、ウォレットに%1$s %2$s以上入金するだけです</string>
<string name="onboarding_top_up_button_but_crypto">暗号資産を購入する</string>
@ -521,7 +530,7 @@
<string name="onboarding_topup_title">ウォレットを有効化する</string>
<string name="onboarding_twin_exit_warning">ツイン化プロセスは部分的に完了しています。現在終了することはできません。</string>
<string name="onboarding_twins_interrupt_warning">ウォレットの作成プロセスが何らかの理由で中断された場合は、最初からやり直す必要があります。</string>
<string name="onboarding_wallet_info_subtitle_first">秘密鍵のバックアップは、未使用のTangemウォレットカード2枚まで可能です。</string>
<string name="onboarding_wallet_info_subtitle_first">秘密鍵のバックアップは、未使用のTangemウォレットカードまたはリング2つまで可能です。</string>
<string name="onboarding_wallet_info_subtitle_fourth">アクセスコードは、バックアップカード1枚を使用して復元できます。</string>
<string name="onboarding_wallet_info_subtitle_second">すべてのバックアップカードは同一の秘密鍵を使用しており、すべての機能を使用できます。</string>
<string name="onboarding_wallet_info_subtitle_third">ウォレットを保護するためにアクセスコードを設定できます。</string>
@ -570,11 +579,13 @@
<string name="reset_card_to_factory_button_title">カードをリセットする</string>
<string name="reset_card_to_factory_condition_1">この操作を実行すると、現在のウォレットにアクセスできなくなることを理解しています。</string>
<string name="reset_card_to_factory_condition_2">このカードを使用して、現在のウォレットの他のカードのアクセスコードを回復させられないことを認識しています。</string>
<string name="reset_card_with_backup_to_factory_message">工場出荷時設定にリセットすると、選択したカードからウォレットが完全に削除されます。現在のウォレットを復元したり、カードを使用してアクセスコードを回復したりすることはできません。</string>
<string name="reset_card_without_backup_to_factory_message">工場出荷時の状態にリセットすると、選択したカードからウォレットが完全に削除され、アプリから削除されます。現在のウォレットを復元することはできません。</string>
<string name="reset_card_with_backup_to_factory_message">工場出荷時設定にリセットすると、選択したカードやリングからウォレットが完全に削除されます。現在のウォレットを復元したり、カードやリングを使用してアクセスコードを復元することはできません。</string>
<string name="reset_card_without_backup_to_factory_message">工場出荷時の状態にリセットすると、選択したカードやリングからウォレットが完全に削除され、アプリから削除されます。現在のウォレットを復元することはできません。</string>
<string name="ring_promo_text">Tangem Ringユーザーは、11/15日までChangelly経由でスワップを3回手数料ゼロで行えます</string>
<string name="ring_promo_title">今すぐ手数料0%でスワップしましょう!</string>
<string name="russian_bank_card_warning_subtitle">他の国の銀行カードと、ロシア連邦外での居住許可証または登録をお持ちですか?</string>
<string name="russian_bank_card_warning_title">ロシアの銀行カードは現在ご利用いただけません</string>
<string name="save_user_wallet_agreement_access_description">アプリにログインして、カードをスキャンせずに残高を確認できます</string>
<string name="save_user_wallet_agreement_access_description">アプリにログインして、カードまたはリングをスキャンせずに残高を確認できます</string>
<string name="save_user_wallet_agreement_access_title">アプリにアクセスする</string>
<string name="save_user_wallet_agreement_allow_biometrics">生体認証の使用を許可する</string>
<string name="save_user_wallet_agreement_code_description_biometrics">ウォレットの操作には、アクセスコードの代わりに生体認証が要求されます。</string>
@ -582,10 +593,10 @@
<string name="save_user_wallet_agreement_enroll_biometrics_description">生体認証が無効になっているようです。ウォレットを保存する必要があります。</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">生体認証を有効にする</string>
<string name="save_user_wallet_agreement_header_biometrics">生体認証を使用しますか?</string>
<string name="save_user_wallet_agreement_notice">資金を使って取引を行うには、カードが必要になりますのでご注意ください</string>
<string name="scan_card_settings_button">カードをスキャン</string>
<string name="scan_card_settings_message">カードをスキャンして設定を変更します。変更はスキャンしたカードにのみ影響し、ウォレットに関連付けられている他のカードには影響しません。</string>
<string name="scan_card_settings_title">カードを準備してください!</string>
<string name="save_user_wallet_agreement_notice">資金を使って取引を行うには、カードまたはリングが必要になりますのでご注意ください</string>
<string name="scan_card_settings_button">カードまたはリングをスキャン</string>
<string name="scan_card_settings_message">カードまたはリングをスキャンして設定を変更します。変更はスキャンしたカードまたはリングにのみ影響し、ウォレットに関連付けられている他のデバイスには影響しません。</string>
<string name="scan_card_settings_title">Tangemを準備してください</string>
<string name="send_additional_field_already_included">入力したアドレスにすでに含まれています</string>
<string name="send_alert_fee_too_high_text">手数料額が推奨額の%s倍となっています。設定を再度確認し、調整してください。</string>
<string name="send_alert_fee_too_low_text">推奨手数料を下回る手数料が指定されたため、取引に遅れが生じる可能性があります。続行しますか?</string>
@ -661,7 +672,7 @@
<string name="send_transaction_success">取引は正常に署名され、ブロックチェーンノードに送信されました。ウォレットの残高はしばらくして更新されます。</string>
<string name="send_tron_account_activation_error">%1$sはTronネットワークのアセットです。手数料を計算して取引を行うには、アカウントにTronTRXを入金する必要があります。</string>
<string name="sent_transaction_sent_title">取引が送信されました</string>
<string name="settings_card_settings_footer">セットアップしたいカードをスキャンするために準備してください。</string>
<string name="settings_card_settings_footer">設定したいカードまたはリングをスキャンするために準備してください。</string>
<string name="settings_forget_wallet">ウォレット削除</string>
<string name="settings_forget_wallet_footer">これにより、ウォレットがアプリから削除されます。ウォレットは再度追加できます。</string>
<string name="settings_wallet_name_title">名前</string>
@ -685,7 +696,7 @@
<string name="staking_details_reward_claiming">請求中の報酬</string>
<string name="staking_details_reward_claiming_info">ステーキング報酬の受け取り方法。\n自動であなたのアドレスに報酬が入金される方法と、手動で取引を生成して報酬を引き出す方法があります。</string>
<string name="staking_details_reward_schedule">報酬スケジュール</string>
<string name="staking_details_reward_schedule_info">これは、ステーキングの参加者がいつ報酬を受け取るかを決定するスケジュールです。</string>
<string name="staking_details_reward_schedule_info">これは、ステーキングの参加者が報酬を受け取る時期を決定するスケジュールです。報酬の配布時間は、バリデーターとネットワークの負荷に応じて若干異なる場合があります。</string>
<string name="staking_details_rewards_to_claim">報酬: %s</string>
<string name="staking_details_title">ステーキング%s</string>
<string name="staking_details_unbonding_period">解約完了までの期間</string>
@ -696,6 +707,7 @@
<string name="staking_locked">ロック中</string>
<string name="staking_migrate">移行</string>
<string name="staking_native">ネイティブステーキング</string>
<string name="staking_no_validators_error_message">現在、ステーキングに使用できるアクティブなバリデータは見つかりません。しばらくしてからもう一度お試しください。</string>
<string name="staking_notification_claim_rewards_text">獲得した報酬はあなたのアドレスに直接送られ、すぐ使用可能です。</string>
<string name="staking_notification_earn_rewards_text">安全にステーキングして報酬を獲得しましょう</string>
<string name="staking_notification_earn_rewards_text_daily">安全にステーキングして、報酬を毎日獲得しましょう</string>
@ -728,8 +740,6 @@
<string name="staking_reward_schedule_day">毎日</string>
<string name="staking_reward_schedule_each">%sごと</string>
<string name="staking_reward_schedule_each_day">毎日</string>
<string name="staking_reward_schedule_each_days">%1$s日ごとに</string>
<string name="staking_reward_schedule_each_sec">%1$s秒毎</string>
<string name="staking_reward_schedule_epoch">エポック毎</string>
<string name="staking_reward_schedule_era">時代毎</string>
<string name="staking_reward_schedule_hour">毎時間</string>
@ -738,7 +748,7 @@
<string name="staking_rewards">報酬</string>
<string name="staking_stake_locked">ステーキングはロックされています</string>
<string name="staking_stake_more">もっとステーキングする</string>
<string name="staking_summary_description_text">%1$sをステーキングし、年間 %2$sを受け取ります</string>
<string name="staking_summary_description_text">%1$sをステーキングし、毎%2$s報酬を受け取ります</string>
<string name="staking_tap_to_unlock">タップしてロック解除</string>
<string name="staking_tap_to_unlock_or_vote">タップしてロック解除もしくは投票</string>
<string name="staking_tap_to_withdraw">タップして引き出す</string>
@ -758,13 +768,13 @@
<string name="staking_vote_locked">投票する</string>
<string name="staking_withdraw">引き出す</string>
<string name="staking_your_stakes">あなたのステーキング</string>
<string name="story_awe_description">カード内に秘密鍵を保管しながら暗号資産を安全に保管します</string>
<string name="story_awe_description">カードまたはリング内に秘密鍵を保管しながら暗号資産を安全に保管します</string>
<string name="story_awe_title">革新的なハードウェアウォレット</string>
<string name="story_backup_description">1つのウォレットに最大3枚のカード</string>
<string name="story_backup_description">1つのウォレットに最大3枚のカードまたは3本のリング</string>
<string name="story_backup_title">安全なバックアップ</string>
<string name="story_currencies_description">ビットコイン、イーサリアム、その他多くの暗号資産を同時に管理できるハードウェアウォレット オールインワンカード</string>
<string name="story_currencies_description">ビットコイン、イーサリアム、その他多くの暗号資産を同時に管理できるハードウェアウォレット オールインワンカード / リング</string>
<string name="story_currencies_title">数千の通貨</string>
<string name="story_finish_description">外出先でも、いつでもどこでも使用できます。コードや電池は不要です。暗号資産が必要なときに、カードをスマートフォンにタップするだけです。</string>
<string name="story_finish_description">外出先でも、いつでもどこでも使用できます。コードや電池は不要です。暗号資産が必要なときに、カードまたはリングをスマートフォンにタップするだけです。</string>
<string name="story_finish_title">すべての人のためのウォレット</string>
<string name="story_meet_title">Tangemのご紹介</string>
<string name="story_web3_description">100種類以上の分散型サービスで、NFTの交換・購入や、借入・預金を行うことができます。</string>
@ -832,13 +842,13 @@
<string name="twins_recreate_toolbar">Tangemツイン</string>
<string name="twins_recreate_warning">この操作は元に戻せません。古いウォレットにはアクセスできなくなります。</string>
<string name="twins_scan_twin_with_number">番号%sのツインカードをタップし、操作が終了するまで取り外さないでください。</string>
<string name="unlock_wallet_description_full">%sを使用するか、カードをスキャンしてウォレットにアクセスしてください</string>
<string name="unlock_wallet_description_full">%sを使用するか、カード / リングをスキャンしてウォレットにアクセスしてください</string>
<string name="user_push_notification_agreement_argument_one">最新の機能とニュースをお届けします</string>
<string name="user_push_notification_agreement_argument_two">新しいプロモーション情報をいち早く入手しましょう</string>
<string name="user_push_notification_agreement_header">プッシュ通知を使用しますか?</string>
<string name="user_wallet_list_add_button">新しいウォレットを追加</string>
<string name="user_wallet_list_delete_prompt">本当にこのウォレットを削除してもよろしいですか?</string>
<string name="user_wallet_list_error_unable_to_unlock">エラーが発生しました。カードをスキャンしてログインしてください。</string>
<string name="user_wallet_list_error_unable_to_unlock">エラーが発生しました。カードまたはリングをスキャンしてログインしてください。</string>
<string name="user_wallet_list_error_wallet_already_saved">このウォレットはすでに保存されています。別のウォレットを追加できます。</string>
<string name="user_wallet_list_rename_popup_error_already_exists">%sという名前のウォレットはすでに存在します。</string>
<string name="user_wallet_list_rename_popup_placeholder">ウォレット名</string>
@ -846,7 +856,7 @@
<string name="user_wallet_list_unlock_all">すべてのロックを解除</string>
<string name="user_wallet_list_unlock_all_with">%sですべてをロック解除</string>
<string name="wallet_balance_blockchain_unreachable_try_later">ブロックチェーンにアクセスできません。後でもう一度お試しください。</string>
<string name="wallet_balance_missing_derivation">カードをスキャン</string>
<string name="wallet_balance_missing_derivation">カードまたはリングをスキャン</string>
<string name="wallet_connect_alert_sign_message">メッセージに署名することを要求しています。 \n\n %s</string>
<string name="wallet_connect_bnb_sign_message">Dapp%1$s 、BNB取引の署名を要求しています\n\n%2$s</string>
<string name="wallet_connect_bnb_trade_order_message">%1$sの取引注文\n価格: %2$s\n受取金額: %3$s\n支払金額: %4$s</string>
@ -860,7 +870,7 @@
<string name="wallet_connect_error_unsupported_blockchains">セッションリクエストには、WalletConnect接続でサポートされていないブロックチェーンが含まれています。サポートされていないブロックチェーン: \n</string>
<string name="wallet_connect_error_unsupported_dapp">技術的な実装のため、このDappとの接続は確立できません。</string>
<string name="wallet_connect_error_with_framework_message">不明なエラーが発生しました。エラーメッセージ: %s 。問題が解決しない場合は、お気軽にサポートにお問い合わせください。</string>
<string name="wallet_connect_error_wrong_card_selected">Tangemアプリで間違ったカードが選択されました</string>
<string name="wallet_connect_error_wrong_card_selected">Tangemアプリで誤ったカードまたはリングが選択されました</string>
<string name="wallet_connect_failed_to_build_tx">Dappデータから取引を作成できませんでした。コード: %s</string>
<string name="wallet_connect_generic_error_with_code">不明なエラーが発生しました。エラーコード: %d 。問題が解決しない場合は、お気軽にサポートにお問い合わせください。</string>
<string name="wallet_connect_no_sessions_message">WalletConnectセッションが開かれていません</string>
@ -885,10 +895,10 @@
<string name="wallet_notification_no_internet">インターネット接続がありません</string>
<string name="wallet_settings_title">ウォレット設定</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">%sを使用するか、カードをスキャンしてウォレットにアクセスしてください</string>
<string name="warning_access_denied_message">%sを使用するか、カード / リングをスキャンしてウォレットにアクセスしてください</string>
<string name="warning_approval_in_progress_message">許可付与のプロセスは現在進行中であり、まもなく完了する予定です。</string>
<string name="warning_approval_in_progress_title">承認中</string>
<string name="warning_backup_errors_message">カードのアクティベーションが正しく完了しませんでした。デバイスの NFCモジュールに問題があるか、カードをデバイスに正しくタップしていないことが原因かもしれません。サポートチームにお問い合わせください。</string>
<string name="warning_backup_errors_message">カードまたはリングのアクティベーションが正しく完了しませんでした。デバイスのNFCモジュールに問題があるか、カードまたはリングをデバイスに正しくタップしていないことが原因かもしれません。サポートチームにお問い合わせください。</string>
<string name="warning_backup_errors_title">アクティベーションに失敗しました</string>
<string name="warning_beacon_chain_retirement_content">BNBネットワーク開発者によると、BEP-2規格のサポートは2024年6月に終了します。この規格の資産を失わないために、BEP-20規格に変換してください。BNBスマートチェーンネットワークへ移行するには、Tangemのスワップサービスをご利用ください。</string>
<string name="warning_beacon_chain_retirement_title">BNBビーコンチェーンは閉鎖されます。</string>
@ -934,7 +944,7 @@
<string name="warning_matic_migration_message">MATICはPOLに移行中です。ただし、期限は設定されておらず、MATICはまだ廃止されていません。MATICトークンを引き続き安全に使用することも、取引所でPOLに交換することもできます。</string>
<string name="warning_matic_migration_title">MATICからPOLへの移行</string>
<plurals name="warning_missing_derivation_message">
<item quantity="other">%d ネットワークのアドレスを取得するために、カードを利用してください</item>
<item quantity="other">%d ネットワークのアドレスを取得するために、カードまたはリングを利用してください</item>
</plurals>
<string name="warning_missing_derivation_title">一部のアドレスが見つかりません</string>
<string name="warning_network_unreachable_message">現在、ネットワークにアクセスできません。しばらくしてからもう一度お試しください。</string>
@ -961,11 +971,11 @@
<string name="welcome_interrupted_backup_alert_message">バックアップが中断されました。再開しますか?</string>
<string name="welcome_interrupted_backup_alert_resume">はい、再開します</string>
<string name="welcome_interrupted_backup_discard_discard">破棄</string>
<string name="welcome_interrupted_backup_discard_message">バックアップを破棄する場合は、カードを工場出荷時の設定にリセットしてやり直す必要があります。</string>
<string name="welcome_interrupted_backup_discard_message">バックアップを破棄する場合は、デバイスを工場出荷時の設定にリセットしてやり直す必要があります。</string>
<string name="welcome_interrupted_backup_discard_resume">バックアップを再開する</string>
<string name="welcome_interrupted_backup_discard_title">これはやり直しができないアクションです</string>
<string name="welcome_unlock">%sでログイン</string>
<string name="welcome_unlock_card">カードをスキャン</string>
<string name="welcome_unlock_description">アプリにアクセスするには、 %sを使用するか、カードをスキャンしてください</string>
<string name="welcome_unlock_card">カードまたはリングをスキャン</string>
<string name="welcome_unlock_description">アプリにアクセスするには、 %sを使用するか、カードまたはリングをスキャンします</string>
<string name="welcome_unlock_title">お帰りなさい!</string>
</resources>

View file

@ -12,8 +12,8 @@
<string name="alert_failed_to_send_transaction_title">Не могу отправить транзакцию</string>
<string name="alert_manage_tokens_unsupported_blockchain_by_card_message">Выбранный кошелёк не поддерживает сеть %1$s</string>
<string name="alert_manage_tokens_unsupported_curve_message">Для активации криптографии сети %1$s необходимо сбросить кошелек до заводских настроек. Пожалуйста, выведите свои средства, чтобы не потерять их, после сброса доступ к текущему кошельку будет невозможен.</string>
<string name="alert_manage_tokens_unsupported_message">Токены в сети %1$s не поддерживаются этой картой из-за ограничений прошивки.</string>
<string name="alert_troubleshooting_scan_card_title">У вас возникли трудности со сканированием карты?</string>
<string name="alert_manage_tokens_unsupported_message">Токены в сети %1$s не поддерживаются этой картой или кольцом из-за ограничений прошивки.</string>
<string name="alert_troubleshooting_scan_card_title">У вас возникли трудности со сканированием карты или кольца?</string>
<string name="alert_unsupported_card">Эта карта не предназначена для работы с этим приложением</string>
<string name="app_settings_default_fee">Комиссия по-умолчанию</string>
<string name="app_settings_default_fee_footer">Подключите функцию комиссии по умолчанию и при формировании транзакции на отправку средств комиссия будет выставлена автоматически, а экран комиссии пропущен. Вы всегда сможете на него вернуться.</string>
@ -22,9 +22,9 @@
<string name="app_settings_off_saved_access_code_alert_message">Все сохраненные коды доступа будут удалены. Вам потребуется вводить код доступа при работе с кошельком.</string>
<string name="app_settings_off_saved_wallet_alert_message">При отключении функции сохранения кошелька все ранее сохраненные кошельки будут удалены из приложения.</string>
<string name="app_settings_saved_access_codes">Сохранение кода доступа</string>
<string name="app_settings_saved_access_codes_footer">Подключите функцию хранения кодов доступа от карт на телефоне в зашифрованном виде, и при работе с картой вместо кода доступа будет запрашиваться биометрическая аутентификация.</string>
<string name="app_settings_saved_access_codes_footer">Подключите функцию хранения кодов доступа от карт на телефоне в зашифрованном виде, и при работе с картой или кольцом вместо кода доступа будет запрашиваться биометрическая аутентификация.</string>
<string name="app_settings_saved_wallet">Cохранение кошелька</string>
<string name="app_settings_saved_wallet_footer">Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту.</string>
<string name="app_settings_saved_wallet_footer">Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту или кольцо.</string>
<string name="app_settings_theme_mode_dark">Тёмная</string>
<string name="app_settings_theme_mode_light">Светлая</string>
<string name="app_settings_theme_mode_system">Как в системе</string>
@ -34,17 +34,17 @@
<string name="balance_hidden_do_not_show_button">Больше не показывать</string>
<string name="balance_hidden_got_it_button">Понятно</string>
<string name="balance_hidden_title">Балансы скрыты</string>
<string name="biometric_lockout_permanent_warning_description">Пожалуйста, отсканируйте карту</string>
<string name="biometric_lockout_warning_description">Пожалуйста, попробуйте снова через 30 секунд или отсканируйте карту</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="biometric_unavailable_warning">Вы отключили биометрическую аутентификацию на вашем телефоне и не сможете сохранять кошельки в приложении. Для сохранения кошельков, пожалуйста, включите функцию биометрической аутентификации в настройках телефона.</string>
<string name="button_start_backup_process">Начать резервное копирование</string>
<string name="buy_token_description">Используйте банковскую карту или другие методы оплаты</string>
<plurals name="card_label_card_count">
<item quantity="one">%d карта</item>
<item quantity="few">%d карты</item>
<item quantity="many">%d карт</item>
<item quantity="other">%d карт</item>
<item quantity="one">%d устройство</item>
<item quantity="few">%d устройства</item>
<item quantity="many">%d устройств</item>
<item quantity="other">%d устройств</item>
</plurals>
<string name="card_settings_access_code_recovery_disabled_description">Отключите эту опцию, если не хотите, чтобы эта карта использовалась для сброса кодов доступа на другие карты этого кошелька. Обратите внимание, сброс кода также не будет доступен на этой карте.</string>
<string name="card_settings_access_code_recovery_enabled_description">Использовать эту карту для сброса кода доступа на других картах в этом кошельке</string>
@ -52,16 +52,16 @@
<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_completed_reset_alert_message">Все карты выбранного кошелька сброшены до заводских настроек, вы можете создать новый кошелек</string>
<string name="card_settings_change_access_code_footer">Код доступа будет изменен только на данной карте или кольце</string>
<string name="card_settings_completed_reset_alert_message">Все устройства Tangem выбранного кошелька сброшены до заводских настроек, вы можете создать новый кошелек</string>
<string name="card_settings_completed_reset_alert_title">Сброс завершён</string>
<string name="card_settings_continue_reset_alert_message">Хотите сбросить следующую карту от этого кошелька?</string>
<string name="card_settings_continue_reset_alert_title">Сброс карты</string>
<string name="card_settings_interrupted_reset_alert_message">Рекомендуем завершить процесс сброса всех карт кошелька</string>
<string name="card_settings_interrupted_reset_alert_title">Вы сбросили не все карты</string>
<string name="card_settings_continue_reset_alert_message">Хотите сбросить следующее устройство от этого кошелька?</string>
<string name="card_settings_continue_reset_alert_title">Сброс кошелька</string>
<string name="card_settings_interrupted_reset_alert_message">Рекомендуем завершить процесс сброса всех устройств Tangem кошелька</string>
<string name="card_settings_interrupted_reset_alert_title">Вы сбросили не все Tangem устройства</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="card_settings_title">Настройки устройства</string>
<string name="cardano_coin_will_be_send_with_token_description">Помимо сетевой комиссий, сеть Cardano взимает %1$s ADA при транзакции с токеном %2$s</string>
<string name="cardano_coin_will_be_send_with_token_title">Требования к транзакции Cardano</string>
<string name="cardano_insufficient_balance_to_send_token_description">Чтобы совершить транзакцию %1$s, внесите некоторую сумму ADA для покрытия сетевой комиссии и минимального значения ADA (рекомендуется 5 ADA)</string>
@ -122,7 +122,7 @@
<string name="common_fee_selector_option_market">По рынку</string>
<string name="common_fee_selector_option_slow">Медленно</string>
<string name="common_fee_selector_title">Скорость и комиссия</string>
<string name="common_generate_addresses">Получить адреса</string>
<string name="common_generate_addresses">Получить ваши адреса</string>
<string name="common_go_to_provider">К провайдеру</string>
<string name="common_go_to_token">Перейти в токен</string>
<string name="common_import">Импортировать</string>
@ -131,6 +131,7 @@
<string name="common_left">Осталось %1$s</string>
<string name="common_locked">Заблокирован</string>
<string name="common_main_network">Основная сеть</string>
<string name="common_month">месяц</string>
<string name="common_network_fee_title">Сетевая комиссия</string>
<string name="common_network_fee_warning_content">Сумма отправки будет уменьшена на %1$s (%2$s) для покрытия выбранного уровня комиссии</string>
<string name="common_next">Далее</string>
@ -139,6 +140,7 @@
<string name="common_now">Сейчас</string>
<string name="common_ok">OK</string>
<string name="common_origin_card">Основная карта</string>
<string name="common_origin_ring">Основное кольцо</string>
<string name="common_passphrase">Парольная фраза</string>
<string name="common_paste">Вставить</string>
<string name="common_privacy_policy">Политикой конфиденциальности</string>
@ -153,6 +155,7 @@
<string name="common_save_changes">Сохранить изменения</string>
<string name="common_search">Поиск</string>
<string name="common_search_tokens">Поиск токенов</string>
<string name="common_second_no_param">сек</string>
<string name="common_seed_phrase">Seed-фраза</string>
<string name="common_select_action">Выберите действие</string>
<string name="common_sell">Продать</string>
@ -214,13 +217,13 @@
<string name="details_manage_security_access_code">Код доступа</string>
<string name="details_manage_security_access_code_description">Перед сканированием карты вам нужно будет ввести правильный код доступа.</string>
<string name="details_manage_security_long_tap">Задержка сканирования</string>
<string name="details_manage_security_long_tap_description">Этот механизм защищает карту от бесконтактных атак. Между сканированием карты и выполнением команды будет добавлена задержка.</string>
<string name="details_manage_security_long_tap_description">Этот механизм защищает карту или кольцо от бесконтактных атак. Между сканированием и выполнением команды будет добавлена задержка.</string>
<string name="details_manage_security_passcode">Пароль</string>
<string name="details_manage_security_passcode_description">Перед выполнением любой команды, влекущей за собой изменение состояния карты, вам необходимо будет ввести пароль.</string>
<string name="details_referral_title">Реферальная программа</string>
<string name="details_row_description_flip_to_hide">Переверните экран вашего устройства вниз, чтобы быстро скрыть и отобразить балансы</string>
<string name="details_row_subtitle_signed_hashes_format">%s хэшей</string>
<string name="details_row_title_cid">Номер карты</string>
<string name="details_row_title_cid">Номер устройства</string>
<string name="details_row_title_contact_to_support">Обратиться в поддержку</string>
<string name="details_row_title_create_backup">Добавить еще карты</string>
<string name="details_row_title_currency">Валюта приложения</string>
@ -231,7 +234,7 @@
<string name="details_title">Подробности</string>
<string name="disclaimer_error_loading">Проверьте подключение с интернетом или переключитесь на другую сеть</string>
<string name="disclaimer_title">Условия использования</string>
<string name="error_wrong_wallet_tapped">Вы использовали карту от другого кошелька. Приложите карту, связанную с этим кошельком.</string>
<string name="error_wrong_wallet_tapped">Вы использовали карту или кольцо от другого кошелька. Приложите карту или кольцо, связанную с этим кошельком.</string>
<string name="exchange_tokens_available_tokens_header">Мои токены</string>
<string name="exchange_tokens_empty_tokens">У вас нет добавленных токенов. Добавьте токены для обмена</string>
<string name="exchange_tokens_unavailable_tokens_header">Недоступен для обмена с %s</string>
@ -288,14 +291,15 @@
<string name="exсhange_token_description">Обменяйте любой актив в вашем портфеле на этот токен</string>
<string name="feedback_data_collection_message">Информация ниже не является обязательной. Вы можете стереть её, если хотите.</string>
<string name="feedback_preface_rate_negative">Расскажите, каких функций вам не хватает, и мы постараемся вам помочь.</string>
<string name="feedback_preface_scan_failed">Скажите, пожалуйста, какая у вас карта?</string>
<string name="feedback_preface_scan_failed">Скажите, пожалуйста, какая у вас карта или кольцо?</string>
<string name="feedback_preface_support">Привет, команда поддержки,</string>
<string name="feedback_preface_tx_failed">Пожалуйста, расскажите нам больше о вашей проблеме. Каждая маленькая деталь может помочь.</string>
<string name="feedback_subject_rate_negative">Мои предложения</string>
<string name="feedback_subject_scan_failed">Не могу отсканировать карту</string>
<string name="feedback_subject_scan_failed">Не могу отсканировать карту/кольцо</string>
<string name="feedback_subject_support">Обращение в поддержку</string>
<string name="feedback_subject_support_tangem">Обращение в поддержку Tangem</string>
<string name="feedback_subject_tx_failed">Не могу отправить транзакцию</string>
<string name="feedback_token_description_error">Ошибка в описании монеты</string>
<string name="give_permission_current_transaction">Транзакция</string>
<string name="give_permission_fee_footer">Комиссия сети за одобрение токена будет взиматься за подтверждение того, что именно вы разрешаете использовать ваш токен для обмена.</string>
<string name="give_permission_policy_type_footer">Укажите лимит доступа к выбранному токену</string>
@ -308,14 +312,15 @@
<string name="home_button_order">Купить</string>
<string name="home_button_scan">Сканировать</string>
<string name="information_generated_with_ai">Информация сгенерирована ИИ</string>
<string name="initial_message_change_access_code_body">Чтобы изменить код доступа, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_change_access_code_body">Чтобы изменить код доступа, приложите карту или кольцо как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_change_passcode_body">Чтобы изменить пароль, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_create_wallet_body">Чтобы создать кошелек, приложите карту как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_create_wallet_body_ring">Чтобы создать кошелек, приложите кольцо как показано выше и не убирайте до окончания операции</string>
<string name="initial_message_reset_backup_card_header">Приложите карту #%s для сброса</string>
<string name="initial_message_scan_header">Приложите, чтобы отсканировать</string>
<string name="initial_message_sign_header">Приложите, чтобы подписать</string>
<string name="initial_message_tap_header">Приложите карту</string>
<string name="key_invalidated_warning_description">Вы обновили данные биометрии, отсканируйте свою карту для входа</string>
<string name="initial_message_tap_header">Приложите карту или кольцо</string>
<string name="key_invalidated_warning_description">Вы обновили данные биометрии, отсканируйте свою карту или кольцо для входа</string>
<string name="koinos_insufficient_balance_to_send_koin_description">Ваш баланс должен быть выше суммы комиссии для осуществления перевода</string>
<string name="koinos_insufficient_balance_to_send_koin_title">Недостаточно средств</string>
<string name="koinos_insufficient_mana_to_send_koin_description">У вас недостаточно Маны для этой транзакции. Пожалуйста, подождите, пока Мана восполнится. Ваш баланс маны равен %1$s/%2$s</string>
@ -327,13 +332,14 @@
<string name="main_empty_tokens_list_message">Чтобы начать отслеживать свои криптоактивы и транзакции, добавьте токены</string>
<string name="main_manage_tokens">Управление токенами</string>
<string name="main_scan_card_warning_view_subtitle">Чтобы получить доступ ко всем сетям, вам необходимо отсканировать карту</string>
<string name="main_scan_card_warning_view_title">Отсканируйте карту</string>
<string name="main_scan_card_warning_view_title">Отсканируйте карту или кольцо</string>
<string name="main_swap_changelly_promotion_message">Обменивайте свои токены с %1$s комиссии провайдера через Changelly с %2$s по %3$s февраля.</string>
<string name="main_swap_changelly_promotion_title">Обмен с Changelly, %s комиссии</string>
<string name="main_tokens">Токены</string>
<string name="manage_tokens_add">Добавить</string>
<string name="manage_tokens_edit">Изменить</string>
<string name="manage_tokens_list_header_title">Рыночная капитализация</string>
<string name="manage_tokens_network_selector_native_subtitle">Блокчейн, в котором криптовалюта изначально была создана</string>
<string name="manage_tokens_network_selector_native_title">Основная сеть</string>
<string name="manage_tokens_network_selector_non_native_subtitle">Не основной или основной блокчейн, на котором размещен токен</string>
<string name="manage_tokens_network_selector_non_native_title">Не основные сети</string>
@ -354,14 +360,14 @@
<string name="manage_tokens_wallet_selector_title">Выберите кошелек</string>
<string name="manage_tokens_wallet_support_only_one_network_title">Кошелёк не поддерживает более одной сети</string>
<string name="markets_add_to_my_portfolio_description">Чтобы купить, обменять или получить данный токен, вам нужно добавить его к себе в портфель</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Этот актив недоступен</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Этот актив в настоящее время не поддерживается в кошельке</string>
<string name="markets_add_to_my_portfolio_unavailable_for_wallet_description">Этот токен не доступен для данного кошелька</string>
<string name="markets_add_to_portfolio_button">Добавить в портфель</string>
<string name="markets_add_token">Добавить</string>
<string name="markets_available_networks">Доступные сети</string>
<string name="markets_common_my_portfolio">Мой портфель</string>
<string name="markets_common_title">Рынок</string>
<string name="markets_generate_addresses_notification">Чтобы создать адреса для выбранных сетей, отсканируйте вашу карту Tangem кошелька</string>
<string name="markets_generate_addresses_notification">Чтобы создать адреса для выбранных сетей, отсканируйте вашу карту или кольцо Tangem кошелька</string>
<string name="markets_hint">Потяните вверх или коснитесь поисковой строки, чтобы добавить токен</string>
<string name="markets_insights_info_description_message">Данные раздела получены из следующих сетей: %s</string>
<string name="markets_loading_error_title">Невозможно загрузить данные</string>
@ -457,11 +463,11 @@
<string name="markets_tooltip_message">Потяните вверх или коснитесь поисковой строки, чтобы добавить токены напрямую из рынка</string>
<string name="markets_tooltip_title">Добавить токены</string>
<string name="nfc_error_unavailable">Функция NFC недоступна на вашем устройстве</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_intro_title">Создайте код доступа</string>
@ -472,24 +478,26 @@
<string name="onboarding_activation_error_message">Необходимо повторить операцию, при этом карта будет сброшена к заводским настройкам</string>
<string name="onboarding_activation_error_title">Ошибка активации</string>
<string name="onboarding_add_tokens">Добавление токенов</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">Вы добавили одну резервную карту. После того, как процесс будет завершен, Вы больше не сможете добавить карт. Если у Вас есть еще одна карта, добавьте ее в резервную копию. Хотите продолжить?</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">Вы добавили одну резервную карту или кольцо. После того, как процесс будет завершен, Вы больше не сможете добавить еще. Если у Вас есть еще одна карта или кольцо, добавьте ее в резервную копию. Хотите продолжить?</string>
<string name="onboarding_backup_exit_warning">Процесс резервного копирования почти завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_bottom_sheet_passphrase_description">Парольная фраза — это расширенная функция безопасности, которую используют криптокошельки. Она добавляет дополнительное слово или фразу по вашему выбору к уже существующей seed - фразе, чтобы разблокировать совершенно новый набор адресов.</string>
<string name="onboarding_button_add_backup_card">Добавить резервную карту</string>
<string name="onboarding_button_add_backup_card">Добавить карту или кольцо</string>
<string name="onboarding_button_backup_card">Сканировать карту</string>
<string name="onboarding_button_backup_card_format">Сканировать карту #%d</string>
<string name="onboarding_button_backup_now">Создать резервную копию</string>
<string name="onboarding_button_backup_origin">Сканировать основную карту</string>
<string name="onboarding_button_backup_origin">Сканировать карту</string>
<string name="onboarding_button_backup_ring">Сканировать кольцо</string>
<string name="onboarding_button_continue_wallet">Перейти к моему кошельку</string>
<string name="onboarding_button_finalize_backup">Завершение бэкапа</string>
<string name="onboarding_button_receive_crypto">Получить криптовалюту</string>
<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_create_wallet_body">Давайте сгенерируем все ключи на вашей карте и создадим безопасный кошелек</string>
<string name="onboarding_create_wallet_body">Давайте сгенерируем все ключи на вашей карте или кольце и создадим безопасный кошелек</string>
<string name="onboarding_create_wallet_button_create_wallet">Создать кошелек</string>
<string name="onboarding_create_wallet_header">Создать кошелек</string>
<string name="onboarding_create_wallet_options_button_options">Другие опции</string>
<string name="onboarding_create_wallet_options_message">Ваши ключи будут надежно сгенерированы внутри карты. Никакой seed-фразы, а это значит, что никто не может экспортировать или украсть ее.</string>
<string name="onboarding_create_wallet_options_message">Ваши ключи будут надежно сгенерированы внутри чипа. Никакой seed-фразы, а это значит, что никто не может экспортировать или украсть ее.</string>
<string name="onboarding_create_wallet_options_title">Cоздавайте ключи приватно</string>
<string name="onboarding_done_body">Ваша карта активирована и готова к использованию</string>
<string name="onboarding_done_header">Успешно!</string>
@ -515,27 +523,30 @@
<string name="onboarding_seed_import_message">Чтобы импортировать кошелек, введите seed-фразу в поле ниже</string>
<string name="onboarding_seed_intro_button_generate">Создать seed-фразу</string>
<string name="onboarding_seed_intro_button_import">Импорт кошелька</string>
<string name="onboarding_seed_intro_message">Seed-фраза — это набор слов, который дает возможность восстановить кошелек. В отличие от ключей, сгенерированных картой, seed-фраза не защищена и может быть скопирована и украдена. Используйте этот вариант на свой страх и риск.</string>
<string name="onboarding_seed_intro_message">Seed-фраза — это набор слов, который дает возможность восстановить кошелек. В отличие от ключей, сгенерированных картой или кольцом, seed-фраза не защищена и может быть скопирована и украдена. Используйте этот вариант на свой страх и риск.</string>
<string name="onboarding_seed_intro_title">Использовать seed-фразу</string>
<string name="onboarding_seed_mnemonic_invalid_checksum">Неверная seed-фраза. Пожалуйста, проверьте порядок слов.</string>
<string name="onboarding_seed_mnemonic_wrong_words">Неверная seed-фраза. Пожалуйста, проверьте орфографию.</string>
<string name="onboarding_seed_phrase_intro_legacy">Устаревший</string>
<string name="onboarding_seed_user_validation_message">Чтобы проверить, правильно ли вы записали seed-фразу, введите 2-е, 7-е и 11-е слова</string>
<string name="onboarding_seed_user_validation_title">Итак, проверим</string>
<string name="onboarding_subtitle_no_backup_cards">Чтобы начать процесс резервного копирования, добавьте одну или две резервные карты.</string>
<string name="onboarding_subtitle_one_backup_card">Вы можете добавить еще одну карту или завершить процесс резервного копирования</string>
<string name="onboarding_subtitle_no_backup_cards">Чтобы начать процесс резервного копирования, добавьте одну или две резервные карты или кольца.</string>
<string name="onboarding_subtitle_one_backup_card">Вы можете добавить еще одну карту или кольцо или завершить процесс резервного копирования</string>
<string name="onboarding_subtitle_scan_backup_card_format">Подготовьте резервную карту с номером %s</string>
<string name="onboarding_subtitle_scan_primary">Отсканируйте основную карту, чтобы начать процесс резервного копирования.</string>
<string name="onboarding_subtitle_scan_primary">Отсканируйте основную карту или кольцо, чтобы начать процесс резервного копирования.</string>
<string name="onboarding_subtitle_scan_primary_card_format">Подготовьте основную карту с номером %s</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Ваша карта настроена и готова к использованию.</string>
<string name="onboarding_subtitle_two_backup_cards">Добавлено максимальное количество карт. Завершите процесс резервного копирования.</string>
<string name="onboarding_subtitle_scan_ring">Приготовьте кольцо и нажмите кнопку сканирования кольца внизу</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Ваш кошелек настроен и готов к использованию.</string>
<string name="onboarding_subtitle_two_backup_cards">Добавлено максимальное количество устройств. Завершите процесс резервного копирования.</string>
<string name="onboarding_title">Активация кошелька</string>
<string name="onboarding_title_backup_card">Резервная карта</string>
<string name="onboarding_title_backup_card_format">Резервная карта #%d</string>
<string name="onboarding_title_no_backup_cards">Нет резервных карт</string>
<string name="onboarding_title_backup_ring">Резервное кольцо</string>
<string name="onboarding_title_no_backup_cards">Нет резервных устройств</string>
<string name="onboarding_title_notifications">Уведомления</string>
<string name="onboarding_title_one_backup_card">Добавлена ​​одна резервная карта</string>
<string name="onboarding_title_one_backup_card">Добавлено одно резервное устройство</string>
<string name="onboarding_title_scan_origin_card">Подготовьте свою карту</string>
<string name="onboarding_title_two_backup_cards">Добавлены две резервные карты</string>
<string name="onboarding_title_two_backup_cards">Добавлены два резервных девайса</string>
<string name="onboarding_top_up_body">Пополните кошелек на любую сумму, чтобы начать пользоваться картой</string>
<string name="onboarding_top_up_body_no_account_error">Пополните кошелек более чем на %1$s %2$s, чтобы начать пользоваться картой</string>
<string name="onboarding_top_up_button_but_crypto">Купить криптовалюту</string>
@ -543,7 +554,7 @@
<string name="onboarding_topup_title">Активация кошелька</string>
<string name="onboarding_twin_exit_warning">Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_twins_interrupt_warning">Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала</string>
<string name="onboarding_wallet_info_subtitle_first">Вы можете сделать резервную копию своих ключей на одной или двух других пустых картах Wallet.</string>
<string name="onboarding_wallet_info_subtitle_first">Вы можете сделать резервную копию своих ключей на одной или двух других пустых картах или кольцах Tangem Wallet.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Код доступа можно восстановить с помощью одной из резервных карт.</string>
<string name="onboarding_wallet_info_subtitle_second">Все резервные карты являются полнофункциональными и содержат одинаковые ключи.</string>
<string name="onboarding_wallet_info_subtitle_third">Вы сможете установить код доступа для защиты своих кошельков.</string>
@ -598,11 +609,13 @@
<string name="reset_card_to_factory_button_title">Сбросить карту</string>
<string name="reset_card_to_factory_condition_1">Я понимаю, что после выполнения этого действия у меня больше не будет доступа к текущему кошельку</string>
<string name="reset_card_to_factory_condition_2">Я понимаю, что не смогу этой картой восстановить пароль на остальных картах этого кошелька, если я его забуду</string>
<string name="reset_card_with_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты. Вы не сможете восстановить текущий кошелек или использовать данную карту для восстановления кода доступа.</string>
<string name="reset_card_without_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты. Вы не сможете восстановить текущий кошелек.</string>
<string name="reset_card_with_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты или кольца. Вы не сможете восстановить текущий кошелек или использовать данную карту или кольцо для восстановления кода доступа.</string>
<string name="reset_card_without_backup_to_factory_message">Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты или кольца. Вы не сможете восстановить текущий кошелек.</string>
<string name="ring_promo_text">Владельцам колец — 3 обмена без комиссии на Changelly до 15.11!</string>
<string name="ring_promo_title">Обмен с 0%% комиссией!</string>
<string name="russian_bank_card_warning_subtitle">У вас есть карта банка другой страны, а также вид на жительство или регистрация вне РФ?</string>
<string name="russian_bank_card_warning_title">Карты банков РФ в данный момент не принимаются</string>
<string name="save_user_wallet_agreement_access_description">Войдите в приложение и следите за своим балансом без сканирования карты</string>
<string name="save_user_wallet_agreement_access_description">Войдите в приложение и следите за своим балансом без сканирования карты или кольца</string>
<string name="save_user_wallet_agreement_access_title">Доступ в приложение</string>
<string name="save_user_wallet_agreement_allow_biometrics">Использовать биометрию</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Для операций с вашим кошельком будет запрашиваться биометрия вместо кода доступа карты</string>
@ -610,10 +623,10 @@
<string name="save_user_wallet_agreement_enroll_biometrics_description">Похоже, что у вас отключена биометрическая аутентификация, она необходима для сохранения кошельков</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Включите биометрическую аутентификацию</string>
<string name="save_user_wallet_agreement_header_biometrics">Вы хотите использовать биометрию?</string>
<string name="save_user_wallet_agreement_notice">Обратите внимание, что для совершения транзакции с вашими средствами по-прежнему потребуется ваша карта</string>
<string name="save_user_wallet_agreement_notice">Обратите внимание, что для совершения транзакции с вашими средствами по-прежнему потребуется ваша карта или кольцо</string>
<string name="scan_card_settings_button">Сканировать</string>
<string name="scan_card_settings_message">Отсканируйте карту, чтобы изменить ее настройки. Изменения затронут только ту карту, которую вы отсканировали, и не повлияют на другие карты, привязанные к вашему кошельку.</string>
<string name="scan_card_settings_title">Приготовьте свою карту</string>
<string name="scan_card_settings_message">Отсканируйте карту или кольцо, чтобы изменить ее настройки. Изменения затронут только ту карту или кольцо, которые вы отсканировали, и не повлияют на другие устройства, привязанные к вашему кошельку.</string>
<string name="scan_card_settings_title">Приготовьте свой Tangem</string>
<string name="send_additional_field_already_included">Уже содержится во введенном адресе</string>
<string name="send_alert_fee_too_high_text">Сумма комиссии в %s раз превышает рекомендованную. Убедитесь, что указанная комиссия верна.</string>
<string name="send_alert_fee_too_low_text">Вы указали комиссию ниже рекомендуемой, это может привести к задержке исполнения вашей транзакции. Продолжить?</string>
@ -689,7 +702,7 @@
<string name="send_transaction_success">Транзакция успешно подписана и отправлена в блокчейн. Баланс будет обновлен через некоторое время</string>
<string name="send_tron_account_activation_error">%1$s — это монета в сети Tron. Чтобы рассчитать комиссию и совершить транзакцию, вам необходимо внести немного Tron (TRX) на свой адрес.</string>
<string name="sent_transaction_sent_title">Транзакция отправлена</string>
<string name="settings_card_settings_footer">Подготовьтесь к сканированию карты, которую вы хотите настроить.</string>
<string name="settings_card_settings_footer">Подготовьтесь к сканированию кольцо или карту, которую вы хотите настроить.</string>
<string name="settings_forget_wallet">Забыть кошелек</string>
<string name="settings_forget_wallet_footer">Это приведет к удалению кошелька из приложения. Сам кошелек можно добавить снова.</string>
<string name="settings_wallet_name_title">Имя</string>
@ -724,6 +737,7 @@
<string name="staking_locked">Заблокировано</string>
<string name="staking_migrate">Переместить</string>
<string name="staking_native">Нативный стейкинг</string>
<string name="staking_no_validators_error_message">В данный момент нет доступных активных валидаторов для стейкинга. Пожалуйста, попробуйте позже.</string>
<string name="staking_notification_claim_rewards_text">Полученная награда отправится на ваш кошелек и сразу станет доступна для использования</string>
<string name="staking_notification_earn_rewards_text">Стейкайте безопасно и начинайте получать ваши награды.</string>
<string name="staking_notification_earn_rewards_text_daily">Стейкайте безопасно и начинайте получать ежедневные награды.</string>
@ -754,8 +768,6 @@
<string name="staking_reward_schedule_block">За блок</string>
<string name="staking_reward_schedule_day">Ежедневно</string>
<string name="staking_reward_schedule_each_day">Каждый день</string>
<string name="staking_reward_schedule_each_days">Каждые %1$s дня</string>
<string name="staking_reward_schedule_each_sec">Каждые %1$s сек</string>
<string name="staking_reward_schedule_epoch">За эпоху</string>
<string name="staking_reward_schedule_era">За эру</string>
<string name="staking_reward_schedule_hour">Ежечасно</string>
@ -784,20 +796,20 @@
<string name="staking_vote_locked">Проголосовать</string>
<string name="staking_withdraw">Вывод</string>
<string name="staking_your_stakes">Застейканные средства</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности. Приватные ключи надежно хранятся на карте.</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности. Приватные ключи надежно хранятся на карте или кольце.</string>
<string name="story_awe_title">Революционный аппаратный кошелек</string>
<string name="story_backup_description">До трех карт с одним кошельком</string>
<string name="story_backup_description">До трех карт или колец с одним кошельком</string>
<string name="story_backup_title">Все ключи в безопасности</string>
<string name="story_currencies_description">Аппаратный кошелек для ваших биткоинов, эфира и многих других валют одновременно — все в одной карте</string>
<string name="story_currencies_description">Аппаратный кошелек для ваших биткоинов, эфира и многих других валют одновременно — все в одной карте или кольце</string>
<string name="story_currencies_title">Тысячи криптовалют</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и батареек. Как только понадобится крипта, просто приложите карту к телефону.</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и батареек. Как только понадобится крипта, просто приложите карту или кольцо к телефону.</string>
<string name="story_finish_title">Кошелек для каждого</string>
<string name="story_meet_title">Встречайте Tangem</string>
<string name="story_web3_description">Обменивайте, покупайте NFT, получайте займы и делайте вклады в более чем 100 различных децентрализованных сервисах</string>
<string name="story_web3_title">Поддержка Web 3.0</string>
<string name="swap_promo_text">Обменивайте больше токенов по лучшим курсам прямо в вашем кошельке.</string>
<string name="swap_promo_title">Новый провайдер обмена!</string>
<string name="swapping_alert_cex_description">В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %s от биржи обратно на адрес пользователя</string>
<string name="swapping_alert_cex_description">В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %s от биржи обратно на адрес пользователя.</string>
<string name="swapping_alert_dex_description">В сумму включена комиссия провайдера сервиса.</string>
<string name="swapping_alert_title">Комиссии</string>
<string name="swapping_approve_information_text">Подтверждения считаются отраслевым стандартом для всех децентрализованных бирж и защищают ваш кошелек от доступа со стороны смарт-контракта без вашего разрешения. По замыслу смарт-контракты не могут получить доступ к вашим токенам, если вы не одобрите доступ со своей стороны. «Разблокируя» свои токены, вы даете смарт-контракту 1inch разрешение тратить ваши активы. Майнеры сети получают компенсацию за газ (оплачиваемый вами) за запись этого действия в блокчейне. Как только разрешение будет предоставлено, вы сможете обменять свой токен.</string>
@ -858,13 +870,13 @@
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="twins_recreate_warning">Это действие необратимо. У вас не будет доступа к старому кошельку.</string>
<string name="twins_scan_twin_with_number">Приложите twin-карту с номером %s и не убирайте до окончания операции</string>
<string name="unlock_wallet_description_full">Используйте %s или отсканируйте карту, чтобы получить доступ к своему кошельку</string>
<string name="unlock_wallet_description_full">Используйте %s или отсканируйте карту/кольцо, чтобы получить доступ к своему кошельку</string>
<string name="user_push_notification_agreement_argument_one">Будьте в курсе новых функций и новостей</string>
<string name="user_push_notification_agreement_argument_two">Узнавайте первым о новых акциях</string>
<string name="user_push_notification_agreement_header">Хотите использовать Push-уведомления?</string>
<string name="user_wallet_list_add_button">Добавить новый кошелек</string>
<string name="user_wallet_list_delete_prompt">Вы уверены, что хотите удалить этот кошелек?</string>
<string name="user_wallet_list_error_unable_to_unlock">Произошла ошибка, пожалуйста, отсканируйте свою карту для входа</string>
<string name="user_wallet_list_error_unable_to_unlock">Произошла ошибка, пожалуйста, отсканируйте свою карту или кольцо для входа</string>
<string name="user_wallet_list_error_wallet_already_saved">Этот кошелек уже был сохранен, вы можете добавить другой</string>
<string name="user_wallet_list_rename_popup_error_already_exists">Кошелек с именем %s уже существует</string>
<string name="user_wallet_list_rename_popup_placeholder">Имя кошелька</string>
@ -872,7 +884,7 @@
<string name="user_wallet_list_unlock_all">Разблокировать все</string>
<string name="user_wallet_list_unlock_all_with">Разблокировать все с %s</string>
<string name="wallet_balance_blockchain_unreachable_try_later">Блокчейн недоступен. Попробуйте позже.</string>
<string name="wallet_balance_missing_derivation">Отсканируйте карту</string>
<string name="wallet_balance_missing_derivation">Отсканируйте карту или кольцо</string>
<string name="wallet_connect_alert_sign_message">Запрос на подпись сообщения.\n\n%s</string>
<string name="wallet_connect_bnb_sign_message">Dapp %1$s, запрос на\nподпись транзакции с BNB.\n\n%2$s</string>
<string name="wallet_connect_bnb_trade_order_message">Торговый ордер на %1$s\nЦена: %2$s\nСумма к получению: %3$s\nСумма к оплате: %4$s</string>
@ -887,7 +899,7 @@
<string name="wallet_connect_error_unsupported_blockchains">Запрос на подключение через WalletConnect содержит неподдерживаемые блокчеины. Неподдерживаемые блокчеины:\n</string>
<string name="wallet_connect_error_unsupported_dapp">Cоединение с этим Dapp сервисом не может быть установлено из-за его технической реализации.</string>
<string name="wallet_connect_error_with_framework_message">Произошла непредвиденная ошибка. Сообщение ошибки: %s Попробуйте, пожалуйста, позже. Если проблема будет продолжать возникать - обратитесь в службу поддержки.</string>
<string name="wallet_connect_error_wrong_card_selected">Неверная карта выбрана в приложении Tangem</string>
<string name="wallet_connect_error_wrong_card_selected">Неверная карта или кольцо выбрана в приложении Tangem</string>
<string name="wallet_connect_failed_to_build_tx">Не удалось создать транзакцию из данных Dapp. Код: %s</string>
<string name="wallet_connect_generic_error_with_code">Произошла непредвиденная ошибка. Код ошибки: %d. Попробуйте, пожалуйста, позже. Если проблема будет продолжать возникать - обратитесь в службу поддержки.</string>
<string name="wallet_connect_no_sessions_message">Нет открытых сессий WalletConnect</string>
@ -912,10 +924,10 @@
<string name="wallet_notification_no_internet">Нет соединения с интернетом</string>
<string name="wallet_settings_title">Настройки кошелька</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">Используйте %s или отсканируйте карту, чтобы разблокировать доступ к вашему кошельку</string>
<string name="warning_access_denied_message">Используйте %s или отсканируйте карту/кольцо, чтобы разблокировать доступ к вашему кошельку</string>
<string name="warning_approval_in_progress_message">Процесс выдачи разрешения уже в работе и скоро будет завершен</string>
<string name="warning_approval_in_progress_title">Выдача разрешения</string>
<string name="warning_backup_errors_message">Похоже, что процесс активации карт не был завершен корректно. Это могло быть вызвано проблемой взаимодействия с модулем NFC либо некорректным прикладыванием карты к телефону. Пожалуйста, обратитесь в нашу службу поддержки для уточнения деталей.</string>
<string name="warning_backup_errors_message">Похоже, что процесс активации карт или кольца не был завершен корректно. Это могло быть вызвано проблемой взаимодействия с модулем NFC либо некорректным прикладыванием карты или кольца к телефону. Пожалуйста, обратитесь в нашу службу поддержки для уточнения деталей.</string>
<string name="warning_backup_errors_title">Ошибка активации</string>
<string name="warning_beacon_chain_retirement_content">По решению разработчиков сети BNB стандарт BEP-2 перестанет поддерживаться в июне 2024 года. Чтобы не потерять активы, их необходимо преобразовать в стандарт BEP-20. Используйте функцию обмена в приложении или сторонние сервисы, чтобы перевести средства в cеть BNB Smart Chain.</string>
<string name="warning_beacon_chain_retirement_title">Отключение сети BNB Beacon Chain</string>
@ -961,10 +973,10 @@
<string name="warning_matic_migration_message">Токен MATIC мигрирует на POL. Однако крайний срок не установлен, и MATIC пока не устарел. Вы можете спокойно продолжать использовать токен MATIC или воспользоваться биржами, чтобы обменять его на POL.</string>
<string name="warning_matic_migration_title">Миграция MATIC в POL</string>
<plurals name="warning_missing_derivation_message">
<item quantity="one">Используйте вашу карту, чтобы получить адрес для %d сети</item>
<item quantity="few">Используйте вашу карту, чтобы получить адреса для %d сетей</item>
<item quantity="many">Используйте вашу карту, чтобы получить адреса для %d сетей</item>
<item quantity="other">Используйте вашу карту, чтобы получить адреса для %d сетей</item>
<item quantity="one">Используйте вашу карту или кольцо, чтобы получить адрес для %d сети</item>
<item quantity="few">Используйте вашу карту или кольцо, чтобы получить адреса для %d сетей</item>
<item quantity="many">Используйте вашу карту или кольцо, чтобы получить адреса для %d сетей</item>
<item quantity="other">Используйте вашу карту или кольцо, чтобы получить адреса для %d сетей</item>
</plurals>
<string name="warning_missing_derivation_title">Некоторые адреса отсутствуют</string>
<string name="warning_network_unreachable_message">В данный момент сеть недоступна. Пожалуйста, попробуйте позже.</string>
@ -991,11 +1003,11 @@
<string name="welcome_interrupted_backup_alert_message">Вы не закончили резервное копирование. Хотите продолжить?</string>
<string name="welcome_interrupted_backup_alert_resume">Да, возобновить</string>
<string name="welcome_interrupted_backup_discard_discard">Отказаться</string>
<string name="welcome_interrupted_backup_discard_message">Если сейчас отказаться, то придётся сбрасывать карты до заводских настроек, чтобы начать заново</string>
<string name="welcome_interrupted_backup_discard_message">Если сейчас отказаться, то придётся сбрасывать устройства до заводских настроек, чтобы начать заново</string>
<string name="welcome_interrupted_backup_discard_resume">Возобновить резервное копирование</string>
<string name="welcome_interrupted_backup_discard_title">Это необратимое действие</string>
<string name="welcome_unlock">Войти с %s</string>
<string name="welcome_unlock_card">Сканировать карту</string>
<string name="welcome_unlock_description">Используйте %s или отсканируйте карту для входа в приложение</string>
<string name="welcome_unlock_card">Сканировать карту или кольцо</string>
<string name="welcome_unlock_description">Используйте %s или отсканируйте карту либо кольцо для входа в приложение</string>
<string name="welcome_unlock_title">C возвращением!</string>
</resources>

View file

@ -101,6 +101,12 @@
<item quantity="many">%d днів</item>
<item quantity="other">%d днів</item>
</plurals>
<plurals name="common_days_no_param">
<item quantity="one">день</item>
<item quantity="few">дні</item>
<item quantity="many">днів</item>
<item quantity="other">днів</item>
</plurals>
<string name="common_delete">Видалити</string>
<string name="common_disabled">Вимкнуто</string>
<string name="common_done">Готово</string>
@ -119,12 +125,14 @@
<string name="common_generate_addresses">Отримати адреси</string>
<string name="common_go_to_provider">Перейти до провайдера</string>
<string name="common_go_to_token">Перейти до токену</string>
<string name="common_hour">година</string>
<string name="common_import">Імпортувати</string>
<string name="common_in_progress">В процесі</string>
<string name="common_later">Пізніше</string>
<string name="common_left">Залишилося %1$s</string>
<string name="common_locked">Заблокований</string>
<string name="common_main_network">Основна мережа</string>
<string name="common_month">місяць</string>
<string name="common_network_fee_title">Комісія мережі</string>
<string name="common_network_fee_warning_content">Сума відправлення буде зменшена на %1$s (%2$s) для покриття обраного рівня комісії</string>
<string name="common_next">Далі</string>
@ -147,6 +155,7 @@
<string name="common_save_changes">Зберегти зміни</string>
<string name="common_search">Пошук</string>
<string name="common_search_tokens">Пошук токенів</string>
<string name="common_second_no_param">сек</string>
<string name="common_seed_phrase">Seed-фраза</string>
<string name="common_select_action">Оберіть дію</string>
<string name="common_sell">Продати</string>
@ -172,6 +181,7 @@
<string name="common_unknown_error">Виникла помилка. Будь ласка, спробуйте ще раз.</string>
<string name="common_unreachable">Недоступно</string>
<string name="common_unstake">Скасувати стейкінг</string>
<string name="common_week">тиждень</string>
<string name="common_yes">Так</string>
<string name="contract_address_copied_message">Адреса контракту скопійована!</string>
<string name="currency_subtitle_expanded">Доступні мережі</string>
@ -290,6 +300,7 @@
<string name="feedback_subject_support">Звернення в підтримку</string>
<string name="feedback_subject_support_tangem">Звернення в підтримку Tangem</string>
<string name="feedback_subject_tx_failed">Не вдається відправити транзакцію</string>
<string name="feedback_token_description_error">Помилка в описі монети</string>
<string name="give_permission_current_transaction">Транзакція</string>
<string name="give_permission_fee_footer">Мережа стягує комісію за схвалення токену за підтвердження, що саме ви дозволяєте використовувати ваш токен для обміну.</string>
<string name="give_permission_policy_type_footer">Вкажіть ліміт доступу для обраного токена</string>
@ -349,8 +360,8 @@
<string name="manage_tokens_unavailable_vote">Проголосувати</string>
<string name="manage_tokens_wallet_selector_title">Оберіть гаманець</string>
<string name="manage_tokens_wallet_support_only_one_network_title">Гаманець не підтримує більше однієї мережі</string>
<string name="markets_add_to_my_portfolio_description">Щоб почати купувати, обмінювати або отримувати цей актив, додайте цей токен принаймні в 1 мережу</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Цей актив недоступний</string>
<string name="markets_add_to_my_portfolio_description">Щоб купити, обміняти або отримати цей актив, додайте його до свого портфоліо</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Цей актив наразі не підтримується в гаманці</string>
<string name="markets_add_to_my_portfolio_unavailable_for_wallet_description">Цей токен недоступний для цього гаманця</string>
<string name="markets_add_to_portfolio_button">Додати в портфоліо</string>
<string name="markets_add_token">Додати</string>
@ -384,6 +395,12 @@
<string name="markets_sort_by_top_losers_title">Лідери падіння</string>
<string name="markets_sort_by_trending_title">В тренді</string>
<string name="markets_token_details_about_token_title">Про %s</string>
<plurals name="markets_token_details_amount_exchanges">
<item quantity="one">біржа</item>
<item quantity="few">біржі</item>
<item quantity="many">бірж</item>
<item quantity="other">бірж</item>
</plurals>
<plurals name="markets_token_details_based_on_ratings">
<item quantity="one">На основі %d оцінки</item>
<item quantity="few">На основі %d оцінок</item>
@ -397,6 +414,12 @@
<string name="markets_token_details_circulating_supply">Циркуляційний запас</string>
<string name="markets_token_details_circulating_supply_description">Загальна кількість монет, які доступні для торгівлі та перебувають в обігу на ринку</string>
<string name="markets_token_details_circulating_supply_full">Циркуляційний запас</string>
<string name="markets_token_details_empty_exchanges">Бірж не знайдено</string>
<string name="markets_token_details_exchange">Біржа</string>
<string name="markets_token_details_exchange_trust_score_caution">Обережно</string>
<string name="markets_token_details_exchange_trust_score_risky">Ризиковано</string>
<string name="markets_token_details_exchange_trust_score_trusted">Надійно</string>
<string name="markets_token_details_exchanges_title">Біржі</string>
<string name="markets_token_details_experienced_buyers">Досвідчені покупці</string>
<string name="markets_token_details_experienced_buyers_description">Мережеві покупці з додатковою вимогою мати не менше 100 вихідних транзакцій</string>
<string name="markets_token_details_experienced_buyers_full">Досвідчені покупці</string>
@ -414,6 +437,7 @@
<string name="markets_token_details_liquidity_description">Зміна того, скільки ліквідності доступно для токена протягом зазначеного періоду часу</string>
<string name="markets_token_details_liquidity_full">Ліквідність</string>
<string name="markets_token_details_liquidity_index">Індекс ліквідності</string>
<string name="markets_token_details_listed_on">Лістинг на</string>
<string name="markets_token_details_low">Низький</string>
<string name="markets_token_details_market_capitalization">Рин. кап.</string>
<string name="markets_token_details_market_capitalization_description">Загальна ринкова вартість криптовалюти, що розраховується шляхом множення поточної ціни монети на загальну кількість монет в обігу</string>
@ -436,6 +460,7 @@
<string name="markets_token_details_trading_volume">Обсяг торгів (24г)</string>
<string name="markets_token_details_trading_volume_24h_description">Загальна сума криптовалюти, якою торгували протягом останніх 24 годин, що вказує на рівень активності та ліквідності на ринку</string>
<string name="markets_token_details_trading_volume_full">Обсяг торгів (24г)</string>
<string name="markets_token_details_volume">Обсяг</string>
<string name="markets_tooltip_message">Потягніть вгору або торкніться панелі пошуку, щоб додати токени безпосередньо з маркету</string>
<string name="markets_tooltip_title">Додати токени</string>
<string name="nfc_error_unavailable">Функція NFC недоступна на вашому пристрої</string>
@ -582,6 +607,8 @@
<string name="reset_card_to_factory_condition_2">Я розумію, що не можу використати цю картку для відновлення свого коду доступу на інших картках поточного гаманця</string>
<string name="reset_card_with_backup_to_factory_message">Скидання до заводських налаштувань призведе до повного видалення гаманця з обраної картки. Ви не зможете відновити поточний гаманець або використати картку для відновлення коду доступу.</string>
<string name="reset_card_without_backup_to_factory_message">Скидання до заводських налаштувань призведе до повного видалення гаманця з обраної картки. Ви не зможете відновити поточний гаманець.</string>
<string name="ring_promo_text">Власникам кілець - 3 обміни без комісії на Changelly до 15.11!</string>
<string name="ring_promo_title">Обмін з 0%% комісією!</string>
<string name="russian_bank_card_warning_subtitle">У вас є банківська картка іншої країни та посвідка на проживання або реєстрація за межами Російської Федерації?</string>
<string name="russian_bank_card_warning_title">Російські банківські картки наразі не приймаються</string>
<string name="save_user_wallet_agreement_access_description">Увійдіть у додаток та слідкуйте за своїм балансом без сканування картки</string>
@ -706,6 +733,7 @@
<string name="staking_locked">Заблоковано</string>
<string name="staking_migrate">Перемістити</string>
<string name="staking_native">Нативний стейкінг</string>
<string name="staking_no_validators_error_message">На даний момент немає доступних активних валідаторів для стейкінгу. Будь ласка, спробуйте пізніше.</string>
<string name="staking_notification_claim_rewards_text">Зароблені винагороди будуть надіслані на ваш гаманець і доступні для використання відразу</string>
<string name="staking_notification_earn_rewards_text">Стейкайте безпечно та почніть отримувати ваші винагороди</string>
<string name="staking_notification_earn_rewards_text_daily">Стейкайте безпечно та почніть отримувати винагороди щоденно</string>
@ -736,8 +764,8 @@
<string name="staking_reward_claiming_manual">Вручну</string>
<string name="staking_reward_schedule_block">Блок</string>
<string name="staking_reward_schedule_day">День</string>
<string name="staking_reward_schedule_each">Кожен %s</string>
<string name="staking_reward_schedule_each_day">Щодня</string>
<string name="staking_reward_schedule_each_sec">Кожні %1$s сек</string>
<string name="staking_reward_schedule_epoch">Епоха</string>
<string name="staking_reward_schedule_era">Ера</string>
<string name="staking_reward_schedule_hour">Година</string>
@ -748,6 +776,7 @@
<string name="staking_stake_more">Застейкати більше</string>
<string name="staking_summary_description_text">Ви стейкаєте %1$s і будете отримувати %2$s щороку</string>
<string name="staking_tap_to_unlock">Натисніть, щоб розблокувати</string>
<string name="staking_tap_to_unlock_or_vote">Натисніть, щоб розблокувати або проголосувати</string>
<string name="staking_tap_to_withdraw">Натисніть, щоб вивести кошти</string>
<string name="staking_title_stake">Застейкати %s</string>
<string name="staking_title_unstake">Зняти зі стейкінгу %s</string>
@ -762,7 +791,7 @@
<string name="staking_validators">Валідатори</string>
<string name="staking_validators_label">Стратегічний партнер</string>
<string name="staking_vote">Проголосувати</string>
<string name="staking_vote_locked">Голос заблоковано</string>
<string name="staking_vote_locked">Проголосувати</string>
<string name="staking_withdraw">Зняти</string>
<string name="staking_your_stakes">Ваші стейкінги</string>
<string name="story_awe_description">Тримайте свою криптовалюту в безпеці. Приватні ключі надійно зберігаються на картці.</string>

View file

@ -12,19 +12,19 @@
<string name="alert_failed_to_send_transaction_title">Can\'t send a transaction</string>
<string name="alert_manage_tokens_unsupported_blockchain_by_card_message">The selected does not support the %1$s network</string>
<string name="alert_manage_tokens_unsupported_curve_message">To activate the %1$s blockchain\'s cryptographic encryption, you\'ll need to reset the wallet to factory settings. Please withdraw your funds before doing so to ensure that you don\'t lose them, and then complete the reset process. Access to the current wallet will not be possible after the reset.</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in %1$s network are not supported by this card due to firmware limitation.</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card?</string>
<string name="alert_manage_tokens_unsupported_message">Tokens in %1$s network are not supported by this card or ring due to firmware limitation.</string>
<string name="alert_troubleshooting_scan_card_title">Are you having difficulty scanning your card or ring?</string>
<string name="alert_unsupported_card">This card is not designed to work with this app</string>
<string name="app_settings_default_fee">Default Fee</string>
<string name="app_settings_default_fee_footer">Enable Default Fee to set transaction fees automatically and skip the Fee page when sending funds. You can always go back to this page if necessary.</string>
<string name="app_settings_enable_biometrics_description">Go to settings to enable biometric authentication in the Tangem App</string>
<string name="app_settings_enable_biometrics_title">Enable biometric authentication</string>
<string name="app_settings_off_saved_access_code_alert_message">This will delete all the saved wallet access codes. Any further operation with the wallet will require submitting the access code.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved card deletes all the saved wallets and their access codes from the app.</string>
<string name="app_settings_off_saved_wallet_alert_message">Removing the saved devices deletes all the saved wallets and their access codes from the app.</string>
<string name="app_settings_saved_access_codes">Save Access Code</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card.</string>
<string name="app_settings_saved_access_codes_footer">Biometric authentication will be requested instead of the access code for interactions with your card or ring.</string>
<string name="app_settings_saved_wallet">Keep the wallet in the app</string>
<string name="app_settings_saved_wallet_footer">Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card.</string>
<string name="app_settings_saved_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 or ring.</string>
<string name="app_settings_theme_mode_dark">Dark</string>
<string name="app_settings_theme_mode_light">Light</string>
<string name="app_settings_theme_mode_system">System default</string>
@ -34,32 +34,32 @@
<string name="balance_hidden_do_not_show_button">Don\'t show again</string>
<string name="balance_hidden_got_it_button">Got it</string>
<string name="balance_hidden_title">Balances are hidden</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_permanent_warning_description">Please scan the card or ring</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card or ring</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>
<string name="biometric_unavailable_warning">You have disabled biometric authentication on your phone and will not be able to save wallets in the app. To save wallets, please enable the biometric authentication function in your phone settings.</string>
<string name="button_start_backup_process">Start backup process</string>
<string name="buy_token_description">Use a bank card or other payment methods</string>
<plurals name="card_label_card_count">
<item quantity="one">%d card</item>
<item quantity="other">%d cards</item>
<item quantity="one">%d device</item>
<item quantity="other">%d devices</item>
</plurals>
<string name="card_settings_access_code_recovery_disabled_description">Disable this option if you don\'t want this card to be used to reset access codes on other cards in this wallet. Please note that this will also prevent you from resetting the access code on this card.</string>
<string name="card_settings_access_code_recovery_disabled_description">Disable this option if you don\'t want this card to be used to reset access codes on other cards or rings in this wallet. Please note that this will also prevent you from resetting the access code on this card.</string>
<string name="card_settings_access_code_recovery_enabled_description">Allows you to use this card to reset access code on other cards in this wallet</string>
<string name="card_settings_access_code_recovery_title">Access code recovery</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_completed_reset_alert_message">All cards in the selected wallet have been reset to factory settings. You can now create a new wallet.</string>
<string name="card_settings_change_access_code_footer">Access code will be changed on this card or ring only</string>
<string name="card_settings_completed_reset_alert_message">All Tangem devices in the selected wallet have been reset to factory settings. You can now create a new wallet.</string>
<string name="card_settings_completed_reset_alert_title">Reset complete</string>
<string name="card_settings_continue_reset_alert_message">Do you want to reset the next card in this wallet?</string>
<string name="card_settings_continue_reset_alert_title">Card reset</string>
<string name="card_settings_interrupted_reset_alert_message">We recommend completing the reset process for all cards in this wallet</string>
<string name="card_settings_interrupted_reset_alert_title">You haven\'t reset all your cards</string>
<string name="card_settings_continue_reset_alert_message">Do you want to reset the next device in this wallet?</string>
<string name="card_settings_continue_reset_alert_title">Wallet reset</string>
<string name="card_settings_interrupted_reset_alert_message">We recommend completing the reset process for all Tangem devices in this wallet</string>
<string name="card_settings_interrupted_reset_alert_title">You haven\'t reset all your Tangem devices</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="card_settings_title">Device settings</string>
<string name="cardano_coin_will_be_send_with_token_description">In addition to network fee, the Cardano network charges %1$s ADA when transacting with the %2$s token</string>
<string name="cardano_coin_will_be_send_with_token_title">Cardano transaction requirements</string>
<string name="cardano_insufficient_balance_to_send_token_description">To make a %1$s transaction, you must deposit some ADA to cover the network fee and minimum ADA value (5 ADA recommended)</string>
@ -116,15 +116,17 @@
<string name="common_fee_selector_option_market">Market</string>
<string name="common_fee_selector_option_slow">Slow</string>
<string name="common_fee_selector_title">Speed and fee</string>
<string name="common_generate_addresses">Get addresses</string>
<string name="common_generate_addresses">Get your addresses</string>
<string name="common_go_to_provider">Go to provider</string>
<string name="common_go_to_token">Go to token</string>
<string name="common_hour">hour</string>
<string name="common_import">Import</string>
<string name="common_in_progress">In progress</string>
<string name="common_later">Later</string>
<string name="common_left">%1$s left</string>
<string name="common_locked">Locked</string>
<string name="common_main_network">Main network</string>
<string name="common_month">month</string>
<string name="common_network_fee_title">Network fee</string>
<string name="common_network_fee_warning_content">Amount sent will be reduced by %1$s (%2$s) to cover the selected fee level</string>
<string name="common_next">Next</string>
@ -133,6 +135,7 @@
<string name="common_now">Now</string>
<string name="common_ok">OK</string>
<string name="common_origin_card">Primary card</string>
<string name="common_origin_ring">Primary ring</string>
<string name="common_passphrase">Passphrase</string>
<string name="common_paste">Paste</string>
<string name="common_privacy_policy">Privacy Policy</string>
@ -147,6 +150,7 @@
<string name="common_save_changes">Save changes</string>
<string name="common_search">Search</string>
<string name="common_search_tokens">Search tokens</string>
<string name="common_second_no_param">sec</string>
<string name="common_seed_phrase">Seed phrase</string>
<string name="common_select_action">Select action</string>
<string name="common_sell">Sell</string>
@ -172,6 +176,7 @@
<string name="common_unknown_error">There was an error. Please try again.</string>
<string name="common_unreachable">Unreachable</string>
<string name="common_unstake">Unstake</string>
<string name="common_week">week</string>
<string name="common_yes">Yes</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="currency_subtitle_expanded">Available networks</string>
@ -208,13 +213,13 @@
<string name="details_manage_security_access_code">Access code</string>
<string name="details_manage_security_access_code_description">You will have to submit the correct access code before scanning the card</string>
<string name="details_manage_security_long_tap">Long Tap</string>
<string name="details_manage_security_long_tap_description">This mechanism protects against proximity attacks on a card. It will enforce a delay between reception and execution of a command. </string>
<string name="details_manage_security_long_tap_description">This mechanism protects against proximity attacks on a card or ring. It will enforce a delay between reception and execution of a command. </string>
<string name="details_manage_security_passcode">Passcode</string>
<string name="details_manage_security_passcode_description">Before executing any command entailing a change of the card state, you will have to enter the passcode.</string>
<string name="details_referral_title">Referral program</string>
<string name="details_row_description_flip_to_hide">Flip your device screen down to quickly hide and show balances</string>
<string name="details_row_subtitle_signed_hashes_format">%s hashes</string>
<string name="details_row_title_cid">Card ID</string>
<string name="details_row_title_cid">Device ID</string>
<string name="details_row_title_contact_to_support">Contact support</string>
<string name="details_row_title_create_backup">Link More Cards</string>
<string name="details_row_title_currency">App Currency</string>
@ -225,7 +230,7 @@
<string name="details_title">Details</string>
<string name="disclaimer_error_loading">Check your internet connection or switch to a different network</string>
<string name="disclaimer_title">Terms of service</string>
<string name="error_wrong_wallet_tapped">You have used a card from another wallet. Tap the card associated with this wallet</string>
<string name="error_wrong_wallet_tapped">You have used a card or ring from another wallet. Tap the card or ring associated with this wallet</string>
<string name="exchange_tokens_available_tokens_header">My tokens</string>
<string name="exchange_tokens_empty_tokens">You haven\'t added any tokens yet. Add tokens via Market to swap</string>
<string name="exchange_tokens_unavailable_tokens_header">Cannot be swapped for %s</string>
@ -282,14 +287,15 @@
<string name="exсhange_token_description">Swap any asset in your portfolio for this token</string>
<string name="feedback_data_collection_message">The following information is optional. You can erase it if you don\'t want to share it.</string>
<string name="feedback_preface_rate_negative">Tell us what functions you are missing, and we will try to help you.</string>
<string name="feedback_preface_scan_failed">Please tell us what card do you have</string>
<string name="feedback_preface_scan_failed">Please tell us what card or ring do you have</string>
<string name="feedback_preface_support">Hi support team,</string>
<string name="feedback_preface_tx_failed">Please tell us more about your issue. Every small detail can help.</string>
<string name="feedback_subject_rate_negative">My suggestions</string>
<string name="feedback_subject_scan_failed">Can\'t scan a card</string>
<string name="feedback_subject_scan_failed">Can\'t scan a card/ring</string>
<string name="feedback_subject_support">Feedback</string>
<string name="feedback_subject_support_tangem">Tangem feedback</string>
<string name="feedback_subject_tx_failed">Can\'t send a transaction</string>
<string name="feedback_token_description_error">Coin description error</string>
<string name="give_permission_current_transaction">Transaction</string>
<string name="give_permission_fee_footer">The network will charge a token approval fee to verify that you are authorizing the use of your token for the swap.</string>
<string name="give_permission_policy_type_footer">Specify the approve limit for the selected token</string>
@ -299,17 +305,18 @@
<string name="give_permission_swap_subtitle" formatted="false">To continue, grant %1s smart contracts permission to use your %2s</string>
<string name="give_permission_title">Give Permission</string>
<string name="give_permission_unlimited">Unlimited</string>
<string name="home_button_order">Order card</string>
<string name="home_button_scan">Scan card</string>
<string name="home_button_order">Order Tangem</string>
<string name="home_button_scan">Scan Tangem</string>
<string name="information_generated_with_ai">This information was generated with AI</string>
<string name="initial_message_change_access_code_body">To change the access code tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_access_code_body">To change the access code tap the card or ring as shown above and do not remove until the end of the operation</string>
<string name="initial_message_change_passcode_body">To change the passcode tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_create_wallet_body">To create the wallet tap the card as shown above and do not remove until the end of the operation</string>
<string name="initial_message_create_wallet_body_ring">To create the wallet tap the ring as shown above and do not remove until the end of the operation</string>
<string name="initial_message_reset_backup_card_header">Tap the card #%s of the wallet</string>
<string name="initial_message_scan_header">Tap to scan</string>
<string name="initial_message_sign_header">Tap to sign</string>
<string name="initial_message_tap_header">Tap the card</string>
<string name="key_invalidated_warning_description">You have updated biometrics, scan your card to enter</string>
<string name="initial_message_tap_header">Tap the card or ring</string>
<string name="key_invalidated_warning_description">You have updated biometrics, scan your card or ring to enter</string>
<string name="koinos_insufficient_balance_to_send_koin_description">Your balance should be higher than the fee value to make a transfer</string>
<string name="koinos_insufficient_balance_to_send_koin_title">Not enough balance</string>
<string name="koinos_insufficient_mana_to_send_koin_description">You don\'t have enough Mana for this transaction. Please wait until the Mana is refilled. Your Mana balance is %1$s/%2$s</string>
@ -321,7 +328,7 @@
<string name="main_empty_tokens_list_message">To begin tracking your crypto assets and transactions, add tokens</string>
<string name="main_manage_tokens">Manage tokens</string>
<string name="main_scan_card_warning_view_subtitle">To access all the networks you need to scan the card</string>
<string name="main_scan_card_warning_view_title">Scan your card</string>
<string name="main_scan_card_warning_view_title">Scan your card or ring</string>
<string name="main_swap_changelly_promotion_message">Enjoy %1$s service fees on swaps via Changelly from February %2$s-%3$s</string>
<string name="main_swap_changelly_promotion_title">Swap with Changelly, %s fees</string>
<string name="main_tokens">Tokens</string>
@ -348,14 +355,14 @@
<string name="manage_tokens_wallet_selector_title">Choose wallet</string>
<string name="manage_tokens_wallet_support_only_one_network_title">The wallet doesn\'t support more than one network</string>
<string name="markets_add_to_my_portfolio_description">To buy, exchange, or receive this asset, add it to your portfolio</string>
<string name="markets_add_to_my_portfolio_unavailable_description">This asset is not available</string>
<string name="markets_add_to_my_portfolio_unavailable_description">This asset is currently not supported in the wallet</string>
<string name="markets_add_to_my_portfolio_unavailable_for_wallet_description">This asset is not available for this wallet</string>
<string name="markets_add_to_portfolio_button">Add to portfolio</string>
<string name="markets_add_token">Add</string>
<string name="markets_available_networks">Available networks</string>
<string name="markets_common_my_portfolio">My portfolio</string>
<string name="markets_common_title">Market</string>
<string name="markets_generate_addresses_notification">To generate addresses for selected networks, you must scan your Tangem Wallet card</string>
<string name="markets_generate_addresses_notification">To generate addresses for selected networks, you must scan your Tangem Wallet card or ring</string>
<string name="markets_hint">To add tokens pull this up or tap the search bar</string>
<string name="markets_insights_info_description_message">This sections data is sourced from the following networks: %s</string>
<string name="markets_loading_error_title">Unable to load the data…</string>
@ -447,11 +454,11 @@
<string name="markets_tooltip_message">Pull this up or tap the search bar to add tokens directly from the market</string>
<string name="markets_tooltip_title">Add tokens</string>
<string name="nfc_error_unavailable">NFC is not available on your device</string>
<string name="onboarding_access_code_feature_1_description">You have to set up a single access code to protect all your cards</string>
<string name="onboarding_access_code_feature_1_description">Set up a single access code to protect all your devices.</string>
<string name="onboarding_access_code_feature_1_title">Protect</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_description">Set an individual access code for each card or ring 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. Dont keep all cards at one place.</string>
<string name="onboarding_access_code_feature_3_description">Restore the access code with a linked card or ring. Don`t keep all your devices 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_intro_title">Create Access Code</string>
@ -462,24 +469,26 @@
<string name="onboarding_activation_error_message">Please repeat the operation. The card will be reset to factory settings.</string>
<string name="onboarding_activation_error_title">Activation error</string>
<string name="onboarding_add_tokens">Add tokens</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">You\'ve added one backup card. When backup process is finished you can\'t add more backup cards. If you have one more card, add it to backup. Do you like to continue the backup process?</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">You\'ve added one backup card or ring. When backup process is finished you can\'t add more backup devices. If you have one more card or ring, add it to backup. Do you like to continue the backup process?</string>
<string name="onboarding_backup_exit_warning">The backup process is partly complete. You can\'t exit it now.</string>
<string name="onboarding_bottom_sheet_passphrase_description">The passphrase is an advanced security feature that crypto wallets use. It adds an extra word or phrase of your own choosing to your already existing recovery phrase to unlock a brand-new set of addresses.</string>
<string name="onboarding_button_add_backup_card">Add a backup card</string>
<string name="onboarding_button_backup_card_format">Scan the card #%d</string>
<string name="onboarding_button_add_backup_card">Add a card or ring</string>
<string name="onboarding_button_backup_card">Scan card</string>
<string name="onboarding_button_backup_card_format">Scan card #%d</string>
<string name="onboarding_button_backup_now">Backup now</string>
<string name="onboarding_button_backup_origin">Scan the primary card</string>
<string name="onboarding_button_backup_origin">Scan card</string>
<string name="onboarding_button_backup_ring">Scan ring</string>
<string name="onboarding_button_continue_wallet">Continue to my wallet</string>
<string name="onboarding_button_finalize_backup">Finalize the backup</string>
<string name="onboarding_button_finalize_backup">Finalize backup</string>
<string name="onboarding_button_receive_crypto">Receive crypto</string>
<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_create_wallet_body">Let\'s generate all the keys on your card and create a secure wallet</string>
<string name="onboarding_create_wallet_body">Let\'s generate all the keys on your card or ring 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>
<string name="onboarding_create_wallet_options_button_options">Other options</string>
<string name="onboarding_create_wallet_options_message">Your keys will be securely generated inside the card. There is no seed phrase, which means nobody can export or steal it.</string>
<string name="onboarding_create_wallet_options_message">Your keys will be securely generated inside the chip. There is no seed phrase, which means nobody can export or steal it.</string>
<string name="onboarding_create_wallet_options_title">Generate keys privately</string>
<string name="onboarding_done_body">Your card is activated and ready to be used</string>
<string name="onboarding_done_header">Success!</string>
@ -501,27 +510,30 @@
<string name="onboarding_seed_import_message">To import your wallet, enter your seed phrase in the field below</string>
<string name="onboarding_seed_intro_button_generate">Generate seed phrase</string>
<string name="onboarding_seed_intro_button_import">Import wallet</string>
<string name="onboarding_seed_intro_message">A seed phrase is a series of words that allows you to recover your wallet. Unlike the keys generated by the card, seed phrases are unprotected and can be copied and stolen. Use this option at your own risk.</string>
<string name="onboarding_seed_intro_message">A seed phrase is a series of words that allows you to recover your wallet. Unlike the keys generated by the card or ring, seed phrases are unprotected and can be copied and stolen. Use this option at your own risk.</string>
<string name="onboarding_seed_intro_title">Use seed phrase</string>
<string name="onboarding_seed_mnemonic_invalid_checksum">Invalid seed phrase. Please check the word order.</string>
<string name="onboarding_seed_mnemonic_wrong_words">Invalid seed phrase. Please check your spelling.</string>
<string name="onboarding_seed_phrase_intro_legacy">Legacy</string>
<string name="onboarding_seed_user_validation_message">To check whether youve written down your seed phrase correctly, please enter the 2nd, 7th and 11th words</string>
<string name="onboarding_seed_user_validation_title">So, lets check</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_no_backup_cards">To start the backup process add up to two backup cards or rings.</string>
<string name="onboarding_subtitle_one_backup_card">You can add one more card or ring or finalize the backup process</string>
<string name="onboarding_subtitle_scan_backup_card_format">Prepare the backup card with number %s</string>
<string name="onboarding_subtitle_scan_primary">Scan the primary card to start the backup process.</string>
<string name="onboarding_subtitle_scan_primary">Scan the primary card or ring to start the backup process.</string>
<string name="onboarding_subtitle_scan_primary_card_format">Prepare the primary card with number %s</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_subtitle_scan_ring">Prepare the ring and press the scan button below</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Your wallet is configured and ready for use.</string>
<string name="onboarding_subtitle_two_backup_cards">Max number of devices added. Finalize the backup process.</string>
<string name="onboarding_title">Activating wallet</string>
<string name="onboarding_title_backup_card">Backup card</string>
<string name="onboarding_title_backup_card_format">Backup card #%d</string>
<string name="onboarding_title_no_backup_cards">No backup cards</string>
<string name="onboarding_title_backup_ring">Backup ring</string>
<string name="onboarding_title_no_backup_cards">No backup devices</string>
<string name="onboarding_title_notifications">Notifications</string>
<string name="onboarding_title_one_backup_card">One backup card added</string>
<string name="onboarding_title_one_backup_card">One backup device added</string>
<string name="onboarding_title_scan_origin_card">Prepare your card</string>
<string name="onboarding_title_two_backup_cards">Two backup cards added</string>
<string name="onboarding_title_two_backup_cards">Two backup devices added</string>
<string name="onboarding_top_up_body">To get started, simply top up the wallet with any amount</string>
<string name="onboarding_top_up_body_no_account_error">To get started, simply top up the wallet with more than %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">Buy crypto</string>
@ -529,7 +541,7 @@
<string name="onboarding_topup_title">Activate a 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_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards.</string>
<string name="onboarding_wallet_info_subtitle_first">You can backup your keys up to two other blank Tangem Wallet cards or rings.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Access code can be restored with one of backup cards.</string>
<string name="onboarding_wallet_info_subtitle_second">All the backup cards can be used as full-functional with the identical keys.</string>
<string name="onboarding_wallet_info_subtitle_third">You will be able to set an access code to protect your wallets.</string>
@ -580,11 +592,13 @@
<string name="reset_card_to_factory_button_title">Reset the card</string>
<string name="reset_card_to_factory_condition_1">I understand that after performing this action, I will no longer have access to the current wallet</string>
<string name="reset_card_to_factory_condition_2">I realize that I can\'t use this card to recover my access code on the other cards of the current wallet</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code.</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="reset_card_with_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card or ring. You will not be able to restore the current wallet or use the card or ring to recover the access code.</string>
<string name="reset_card_without_backup_to_factory_message">Factory Reset will completely delete the wallet from the selected card or ring and remove it from the app. You will not be able to restore the current wallet.</string>
<string name="ring_promo_text">Ring owners get 3 commission-free swaps on Changelly until 15.11!</string>
<string name="ring_promo_title">Swap With 0%% Fees Now!</string>
<string name="russian_bank_card_warning_subtitle">Do you have a bank card from another country and a residence permit or registration outside the Russian Federation?</string>
<string name="russian_bank_card_warning_title">Russian bank cards are not currently accepted</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card</string>
<string name="save_user_wallet_agreement_access_description">Log into the app and check your balance without scanning the card or ring</string>
<string name="save_user_wallet_agreement_access_title">Access the app</string>
<string name="save_user_wallet_agreement_allow_biometrics">Allow to use biometrics</string>
<string name="save_user_wallet_agreement_code_description_biometrics">Biometrics will be requested instead of the access code for interactions with your wallet</string>
@ -592,10 +606,10 @@
<string name="save_user_wallet_agreement_enroll_biometrics_description">It looks like you have biometric authentication disabled, it is necessary to save wallets</string>
<string name="save_user_wallet_agreement_enroll_biometrics_title">Enable biometric authorization</string>
<string name="save_user_wallet_agreement_header_biometrics">Would you like to use biometrics?</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card</string>
<string name="scan_card_settings_button">Scan card</string>
<string name="scan_card_settings_message">Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.</string>
<string name="scan_card_settings_title">Get your card ready!</string>
<string name="save_user_wallet_agreement_notice">Note that making a transaction with your funds will still require your card or ring</string>
<string name="scan_card_settings_button">Scan card or ring</string>
<string name="scan_card_settings_message">Scan the card or ring to change its settings. The changes will impact only the card or ring you\'ve scanned and will not affect other devices tied to your wallet.</string>
<string name="scan_card_settings_title">Get your Tangem ready!</string>
<string name="send_additional_field_already_included">Already included in the entered address</string>
<string name="send_alert_fee_too_high_text">Your commission amount is %s times higher than the recommended amount. Please review and adjust your custom settings.</string>
<string name="send_alert_fee_too_low_text">You specified a commission below the recommended amount, which could cause a delay in your transaction. Continue?</string>
@ -671,7 +685,7 @@
<string name="send_transaction_success">Transaction has been successfully signed and sent to the blockchain node. Wallet balance will be updated in a while</string>
<string name="send_tron_account_activation_error">%1$s is an asset in the Tron network. To calculate the fee and make a transaction you need to deposit some Tron (TRX) in your account.</string>
<string name="sent_transaction_sent_title">Transaction sent</string>
<string name="settings_card_settings_footer">Prepare to scan card you want to setup.</string>
<string name="settings_card_settings_footer">Prepare to scan card or ring you want to set up.</string>
<string name="settings_forget_wallet">Forget wallet</string>
<string name="settings_forget_wallet_footer">This will remove the wallet from the application. The wallet itself can be added again.</string>
<string name="settings_wallet_name_title">Name</string>
@ -706,6 +720,7 @@
<string name="staking_locked">Locked</string>
<string name="staking_migrate">Migrate</string>
<string name="staking_native">Native staking</string>
<string name="staking_no_validators_error_message">No active validators available for staking at the moment. Please try again later.</string>
<string name="staking_notification_claim_rewards_text">Earned rewards will be sent to your wallet and available for use immediately</string>
<string name="staking_notification_earn_rewards_text">Stake securely and start earning your rewards</string>
<string name="staking_notification_earn_rewards_text_daily">Stake securely and start earning daily rewards</string>
@ -738,8 +753,6 @@
<string name="staking_reward_schedule_day">Daily</string>
<string name="staking_reward_schedule_each">Each %s</string>
<string name="staking_reward_schedule_each_day">Each day</string>
<string name="staking_reward_schedule_each_days">Each %1$s days</string>
<string name="staking_reward_schedule_each_sec">Each %1$s sec</string>
<string name="staking_reward_schedule_epoch">Per Epoch</string>
<string name="staking_reward_schedule_era">Per Era</string>
<string name="staking_reward_schedule_hour">Hourly</string>
@ -748,7 +761,7 @@
<string name="staking_rewards">Rewards</string>
<string name="staking_stake_locked">Stake locked</string>
<string name="staking_stake_more">Stake more</string>
<string name="staking_summary_description_text">You stake %1$s and will be receiving %2$s yearly</string>
<string name="staking_summary_description_text">You stake %1$s and will be receiving your reward each %2$s</string>
<string name="staking_tap_to_unlock">Tap to unlock</string>
<string name="staking_tap_to_unlock_or_vote">Tap to unlock or vote</string>
<string name="staking_tap_to_withdraw">Tap to withdraw</string>
@ -768,13 +781,13 @@
<string name="staking_vote_locked">Vote</string>
<string name="staking_withdraw">Withdraw</string>
<string name="staking_your_stakes">Your stakes</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card</string>
<string name="story_awe_description">Store your crypto assets secure while keeping private keys contained in your card or ring</string>
<string name="story_awe_title">Revolutionary Hardware Wallet</string>
<string name="story_backup_description">Up to 3 physical cards to one wallet</string>
<string name="story_backup_description">Up to 3 physical cards or rings to one wallet</string>
<string name="story_backup_title">Ultra Secure Backup</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card or ring</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card or ring to your phone when you need your crypto.</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_meet_title">Meet Tangem</string>
<string name="story_web3_description">Exchange, buy NFT\'s, make loans and deposits in more than 100 different decentralized services</string>
@ -835,20 +848,20 @@
<string name="twin_error_wrong_twin">You\'ve scanned wrong twin card. Please try another one</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>
<string name="twins_recreate_button_format">Scan the card #%s</string>
<string name="twins_recreate_button_format">Scan card #%s</string>
<string name="twins_recreate_title_creating_wallet">Creating wallet</string>
<string name="twins_recreate_title_format">Scan the #%s twin card</string>
<string name="twins_recreate_title_preparing">Preparing card</string>
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="twins_recreate_warning">This action is irreversible. You will not have access to the old wallet.</string>
<string name="twins_scan_twin_with_number">Tap the twin card with number %s and do not remove until the end of the operation</string>
<string name="unlock_wallet_description_full">Use %s or scan a card to have an access to your wallet</string>
<string name="unlock_wallet_description_full">Use %s or scan a card/ring to have access to your wallet</string>
<string name="user_push_notification_agreement_argument_one">Stay up to date with the latest features and news</string>
<string name="user_push_notification_agreement_argument_two">Be the first to know about new promotions</string>
<string name="user_push_notification_agreement_header">Would you like to use\nPush-notifications?</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_delete_prompt">Are you sure you want to delete this wallet?</string>
<string name="user_wallet_list_error_unable_to_unlock">An error has occurred, please scan your card to log in</string>
<string name="user_wallet_list_error_unable_to_unlock">An error has occurred, please scan your card or ring to log in</string>
<string name="user_wallet_list_error_wallet_already_saved">This wallet has already been saved, you can add another one</string>
<string name="user_wallet_list_rename_popup_error_already_exists">The wallet with name %s already exists</string>
<string name="user_wallet_list_rename_popup_placeholder">Wallet name</string>
@ -856,7 +869,7 @@
<string name="user_wallet_list_unlock_all">Unlock all</string>
<string name="user_wallet_list_unlock_all_with">Unlock all with %s</string>
<string name="wallet_balance_blockchain_unreachable_try_later">Blockchain is unreachable. Try later</string>
<string name="wallet_balance_missing_derivation">Scan the card</string>
<string name="wallet_balance_missing_derivation">Scan card or ring</string>
<string name="wallet_connect_alert_sign_message">Requesting to sign a message.\n\n%s</string>
<string name="wallet_connect_bnb_sign_message">Dapp %1$s, requesting to\nsign BNB transaction.\n\n%2$s</string>
<string name="wallet_connect_bnb_trade_order_message">Trade order for %1$s\nPrice: %2$s\nAmount to receive: %3$s\nAmount to pay: %4$s</string>
@ -871,7 +884,7 @@
<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_error_with_framework_message">We\'ve encountered unknown error. Error message: %s. If the problem persists — feel free to contact our support</string>
<string name="wallet_connect_error_wrong_card_selected">Wrong card selected in Tangem App</string>
<string name="wallet_connect_error_wrong_card_selected">Wrong card or ring selected in Tangem App</string>
<string name="wallet_connect_failed_to_build_tx">Failed to create transaction from Dapp data. Code: %s</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_no_sessions_message">No opened WalletConnect sessions</string>
@ -896,10 +909,10 @@
<string name="wallet_notification_no_internet">No internet connection</string>
<string name="wallet_settings_title">Wallet settings</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">Use %s or scan a card to unlock access to your wallet</string>
<string name="warning_access_denied_message">Use %s or scan a card/ring to unlock access to your wallet</string>
<string name="warning_approval_in_progress_message">The permission-granting process is currently underway and will be completed shortly</string>
<string name="warning_approval_in_progress_title">Approval in Progress</string>
<string name="warning_backup_errors_message">It seems that the card activation was not completed correctly. This could be due to an issue with your device\'s NFC module or incorrect tapping of the card to your device. Please contact our Support team for assistance.</string>
<string name="warning_backup_errors_message">It seems that the card or ring activation was not completed correctly. This could be due to an issue with your device\'s NFC module or incorrect tapping of the card or ring to your device. Please contact our Support team for assistance.</string>
<string name="warning_backup_errors_title">Activation error</string>
<string name="warning_beacon_chain_retirement_content">According to BNB network developers, support for the BEP-2 standard will end in June 2024. To avoid losing assets with this standard, please convert them to the BEP-20 standard. Use our swap service or third-party services to transfer funds to the BNB Smart Chain network.</string>
<string name="warning_beacon_chain_retirement_title">BNB Beacon Chain will shut down</string>
@ -945,8 +958,8 @@
<string name="warning_matic_migration_message">MATIC is being migrated to POL. However there is no deadline set and MATIC isn\'t being deprecated yet. You can safely continue using MATIC token or use exchanges to swap it for POL.</string>
<string name="warning_matic_migration_title">MATIC to POL Migration</string>
<plurals name="warning_missing_derivation_message">
<item quantity="one">Use your card to get an address for %d network</item>
<item quantity="other">Use your card to get an addresses for %d networks</item>
<item quantity="one">Use your card or ring to get an address for %d network</item>
<item quantity="other">Use your card or ring to get an addresses for %d networks</item>
</plurals>
<string name="warning_missing_derivation_title">Some addresses are missing</string>
<string name="warning_network_unreachable_message">The network is currently unreachable. Please try again later.</string>
@ -973,11 +986,11 @@
<string name="welcome_interrupted_backup_alert_message">You have an interrupted backup. Do you want to resume?</string>
<string name="welcome_interrupted_backup_alert_resume">Yes, resume</string>
<string name="welcome_interrupted_backup_discard_discard">Discard</string>
<string name="welcome_interrupted_backup_discard_message">If you will discard the backup now, then you will have to reset the cards to factory settings to start over again</string>
<string name="welcome_interrupted_backup_discard_message">If you discard the backup now, then you will have to reset the devices to factory settings to start over again</string>
<string name="welcome_interrupted_backup_discard_resume">Resume backup</string>
<string name="welcome_interrupted_backup_discard_title">This is an irreversible action</string>
<string name="welcome_unlock">Log in with %s</string>
<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_card">Scan card or ring</string>
<string name="welcome_unlock_description">Use %s or scan a card or ring to access the app</string>
<string name="welcome_unlock_title">Welcome back!</string>
</resources>

View file

@ -179,14 +179,20 @@ private fun Icon(@DrawableRes iconResId: Int, tint: Color?, modifier: Modifier =
}
@Composable
private fun TextsBlock(title: TextReference?, subtitle: TextReference, subtitleColor: Color) {
Column {
internal fun TextsBlock(
title: TextReference?,
subtitle: TextReference,
subtitleColor: Color,
modifier: Modifier = Modifier,
titleColor: Color = TangemTheme.colors.text.primary1,
) {
Column(modifier = modifier) {
val titleText = title?.resolveReference()
if (titleText != null) {
Text(
text = titleText,
color = TangemTheme.colors.text.primary1,
color = titleColor,
style = TangemTheme.typography.button,
)
@ -269,7 +275,12 @@ private fun PairButtons(config: NotificationButtonsState.PairButtonsConfig, isEn
}
@Composable
private fun CloseableIconButton(onClick: (() -> Unit)?, modifier: Modifier = Modifier, isEnabled: Boolean = true) {
internal fun CloseableIconButton(
onClick: (() -> Unit)?,
modifier: Modifier = Modifier,
isEnabled: Boolean = true,
iconTint: Color = TangemTheme.colors.icon.inactive,
) {
AnimatedVisibility(visible = onClick != null, modifier = modifier) {
onClick ?: return@AnimatedVisibility
@ -296,7 +307,7 @@ private fun CloseableIconButton(onClick: (() -> Unit)?, modifier: Modifier = Mod
modifier = Modifier
.size(size = TangemTheme.dimens.size16)
.align(alignment = Alignment.Center),
tint = TangemTheme.colors.icon.inactive,
tint = iconTint,
)
}
}

View file

@ -0,0 +1,131 @@
package com.tangem.core.ui.components.notifications
import android.content.res.Configuration
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.FixedScale
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemColorPalette
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
@Composable
fun RingPromoNotification(config: NotificationConfig, modifier: Modifier = Modifier) {
var textHeightDp by remember { mutableStateOf(0.dp) }
Box(
modifier = modifier
.fillMaxWidth()
.clip(shape = TangemTheme.shapes.roundedCornersXMedium)
.background(TangemColorPalette.Dark6),
) {
PromoImage(
backgroundRes = config.backgroundResId,
iconRes = config.iconResId,
modifier = Modifier.height(textHeightDp),
)
PromoText(
title = config.title,
subtitle = config.subtitle,
onSizeChange = { textHeightDp = it },
)
CloseableIconButton(
onClick = config.onCloseClick,
modifier = Modifier.align(alignment = Alignment.TopEnd),
iconTint = TangemTheme.colors.icon.informative,
)
}
}
@Composable
private fun PromoImage(@DrawableRes backgroundRes: Int?, @DrawableRes iconRes: Int, modifier: Modifier = Modifier) {
if (backgroundRes == null) return
ConstraintLayout(
modifier = modifier,
) {
val (background, image) = createRefs()
Image(
painter = painterResource(backgroundRes),
contentDescription = null,
contentScale = FixedScale(2f),
modifier = Modifier
.constrainAs(background) {
top.linkTo(parent.top)
start.linkTo(image.start)
end.linkTo(image.end)
},
)
Image(
painter = painterResource(id = iconRes),
contentDescription = null,
contentScale = ContentScale.FillWidth,
modifier = Modifier
.requiredWidth(width = 60.dp)
.wrapContentHeight(Alignment.Top, unbounded = true)
.constrainAs(image) {
top.linkTo(parent.top, 11.dp)
start.linkTo(parent.start, 9.dp)
},
)
}
}
@Composable
private fun PromoText(title: TextReference?, subtitle: TextReference, onSizeChange: (Dp) -> Unit) {
val density = LocalDensity.current
Box(
modifier = Modifier.onSizeChanged {
with(density) { onSizeChange(it.height.toDp()) }
},
) {
TextsBlock(
title = title,
subtitle = subtitle,
subtitleColor = TangemTheme.colors.text.tertiary,
titleColor = TangemTheme.colors.text.constantWhite,
modifier = Modifier
.wrapContentHeight()
.align(Alignment.CenterStart)
.padding(start = 80.dp, top = 12.dp, end = 12.dp, bottom = 12.dp),
)
}
}
// region Preview
@Preview(showBackground = true, widthDp = 360)
@Preview(showBackground = true, widthDp = 360, locale = "fr")
@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun RingPromoNotification_Preview() {
TangemThemePreview {
RingPromoNotification(
NotificationConfig(
title = resourceReference(id = R.string.ring_promo_title),
subtitle = resourceReference(id = R.string.ring_promo_text),
iconResId = R.drawable.img_card_with_ring,
backgroundResId = R.drawable.img_ring_promo_background,
onCloseClick = { },
),
)
}
}
// endregion

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View file

@ -26,6 +26,8 @@ dependencies {
implementation(projects.core.datasource)
implementation(projects.core.utils)
implementation(projects.libs.blockchainSdk)
implementation(projects.domain.card)
implementation(projects.domain.models)
}

View file

@ -1,7 +1,8 @@
package com.tangem.data.card
import com.tangem.TangemSdk
import com.tangem.blockchain.common.CommonSigner
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.common.UserCodeType
import com.tangem.common.core.CardIdDisplayFormat
import com.tangem.common.core.UserCodeRequestPolicy
@ -16,7 +17,10 @@ import com.tangem.domain.models.scan.ProductType
*
[REDACTED_AUTHOR]
*/
internal class DefaultCardSdkConfigRepository(private val cardSdkProvider: CardSdkProvider) : CardSdkConfigRepository {
internal class DefaultCardSdkConfigRepository(
private val cardSdkProvider: CardSdkProvider,
private val transactionSignerFactory: TransactionSignerFactory,
) : CardSdkConfigRepository {
@Deprecated("Use CardSdkConfigRepository's methods instead of this property")
override val sdk: TangemSdk
@ -53,11 +57,9 @@ internal class DefaultCardSdkConfigRepository(private val cardSdkProvider: CardS
}
}
override fun getCommonSigner(cardId: String?) = CommonSigner(
tangemSdk = sdk,
cardId = cardId,
initialMessage = null,
)
override fun getCommonSigner(cardId: String?): TransactionSigner {
return transactionSignerFactory.createTransactionSigner(cardId = cardId, sdk = sdk)
}
override fun isLinkedTerminal() = sdk.config.linkedTerminal

View file

@ -1,5 +1,6 @@
package com.tangem.data.card.di
import com.tangem.blockchainsdk.signer.TransactionSignerFactory
import com.tangem.data.card.DefaultCardRepository
import com.tangem.data.card.DefaultCardSdkConfigRepository
import com.tangem.data.card.sdk.CardSdkProvider
@ -18,8 +19,14 @@ internal object CardDataModule {
@Provides
@Singleton
fun provideCardSdkConfigRepository(cardSdkProvider: CardSdkProvider): CardSdkConfigRepository {
return DefaultCardSdkConfigRepository(cardSdkProvider = cardSdkProvider)
fun provideCardSdkConfigRepository(
cardSdkProvider: CardSdkProvider,
transactionSignerFactory: TransactionSignerFactory,
): CardSdkConfigRepository {
return DefaultCardSdkConfigRepository(
cardSdkProvider = cardSdkProvider,
transactionSignerFactory = transactionSignerFactory,
)
}
@Provides

View file

@ -41,9 +41,19 @@ internal class DefaultPromoRepository(
}.getOrNull()
}
override suspend fun getRingPromoBanner(): PromoBanner? {
return runCatching(dispatchers.io) {
promoResponseConverter.convert(
tangemApi.getPromotionInfo(RING)
.getOrThrow(),
)
}.getOrNull()
}
private companion object {
private const val CHANGELLY_NAME = "changelly"
private const val TRAVALA = "travala"
private const val OKX = "okx"
private const val RING = "ring"
}
}

View file

@ -17,6 +17,7 @@ dependencies {
implementation(projects.domain.balanceHiding.models)
implementation(projects.domain.settings)
implementation(projects.domain.wallets.models)
implementation(deps.androidx.datastore)

View file

@ -1,13 +1,18 @@
package com.tangem.data.settings
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_TRAVALA_PROMO_SHOWN_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_RING_PROMO_KEY
import com.tangem.datasource.local.preferences.utils.get
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
/**
* Repository for showing swap promo notification.
@ -47,4 +52,18 @@ class DefaultPromoSettingsRepository(
value = false,
)
}
override fun isReadyToShowRingPromo(userWalletId: UserWalletId): Flow<Boolean> {
return combine(
flow = appPreferencesStore
.get(key = ADDED_WALLETS_WITH_RING_KEY, default = emptySet())
.map { userWalletId.stringValue in it },
flow2 = appPreferencesStore.get(key = SHOULD_SHOW_RING_PROMO_KEY, default = true),
transform = { isRingAdded, shouldShowRingPromo -> isRingAdded && shouldShowRingPromo },
)
}
override suspend fun setNeverToShowRingPromo() {
appPreferencesStore.store(key = SHOULD_SHOW_RING_PROMO_KEY, value = false)
}
}

View file

@ -146,7 +146,7 @@ internal class DefaultTransactionRepository(
override suspend fun sendTransaction(
txData: TransactionData,
signer: CommonSigner,
signer: TransactionSigner,
userWalletId: UserWalletId,
network: Network,
) = withContext(coroutineDispatcherProvider.io) {
@ -161,7 +161,7 @@ internal class DefaultTransactionRepository(
override suspend fun sendMultipleTransactions(
txsData: List<TransactionData>,
signer: CommonSigner,
signer: TransactionSigner,
userWalletId: UserWalletId,
network: Network,
) = withContext(coroutineDispatcherProvider.io) {

View file

@ -5,6 +5,7 @@ import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.get
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.repository.WalletsRepository
import kotlinx.coroutines.flow.Flow
@ -23,4 +24,18 @@ internal class DefaultWalletsRepository(
override suspend fun saveShouldSaveUserWallets(item: Boolean) {
appPreferencesStore.store(key = PreferencesKeys.SAVE_USER_WALLETS_KEY, value = item)
}
override suspend fun isWalletWithRing(userWalletId: UserWalletId): Boolean {
return appPreferencesStore
.getSyncOrDefault(key = PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY, default = emptySet())
.contains(element = userWalletId.stringValue)
}
override suspend fun setHasWalletsWithRing(userWalletId: UserWalletId) {
appPreferencesStore.editData {
val added = it[PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY].orEmpty()
it[PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY] = added + userWalletId.stringValue
}
}
}

View file

@ -1,7 +1,7 @@
package com.tangem.domain.card.repository
import com.tangem.TangemSdk
import com.tangem.blockchain.common.CommonSigner
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.domain.models.scan.ProductType
/**
@ -28,7 +28,7 @@ interface CardSdkConfigRepository {
fun updateCardIdDisplayFormat(productType: ProductType)
/** Get common signer by [cardId] */
fun getCommonSigner(cardId: String?): CommonSigner
fun getCommonSigner(cardId: String?): TransactionSigner
/** Check if linked terminal is enabled */
fun isLinkedTerminal(): Boolean?

View file

@ -614,7 +614,7 @@ class DefaultWalletManagersFacade(
override suspend fun associateAsset(
userWalletId: UserWalletId,
currency: CryptoCurrency,
signer: CommonSigner,
signer: TransactionSigner,
): SimpleResult {
return withContext(dispatchers.io) {
val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = currency.network)

View file

@ -236,7 +236,7 @@ interface WalletManagersFacade {
suspend fun associateAsset(
userWalletId: UserWalletId,
currency: CryptoCurrency,
signer: CommonSigner,
signer: TransactionSigner,
): SimpleResult
/**

View file

@ -323,5 +323,6 @@ data class CardDTO(
companion object {
val RING_BATCH_IDS = listOf("AC17", "BA01")
const val RING_BATCH_PREFIX = "BA"
}
}

View file

@ -0,0 +1,8 @@
package com.tangem.domain.models.scan
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_IDS
import com.tangem.domain.models.scan.CardDTO.Companion.RING_BATCH_PREFIX
fun isRing(batchId: String): Boolean {
return RING_BATCH_IDS.contains(batchId) || batchId.startsWith(RING_BATCH_PREFIX)
}

View file

@ -7,4 +7,5 @@ dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.arrow.core)
implementation(projects.domain.balanceHiding.models)
implementation(projects.domain.wallets.models)
}

View file

@ -0,0 +1,14 @@
package com.tangem.domain.settings
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
class ShouldShowRingPromoUseCase(private val promoSettingsRepository: PromoSettingsRepository) {
operator fun invoke(userWalletId: UserWalletId): Flow<Boolean> {
return promoSettingsRepository.isReadyToShowRingPromo(userWalletId)
}
suspend fun neverToShow() = promoSettingsRepository.setNeverToShowRingPromo()
}

View file

@ -1,5 +1,6 @@
package com.tangem.domain.settings.repositories
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
interface PromoSettingsRepository {
@ -14,4 +15,8 @@ interface PromoSettingsRepository {
fun isReadyToShowWalletTravalaPromo(): Flow<Boolean>
suspend fun setNeverToShowWalletTravalaPromo()
fun isReadyToShowRingPromo(userWalletId: UserWalletId): Flow<Boolean>
suspend fun setNeverToShowRingPromo()
}

View file

@ -9,6 +9,7 @@ import com.tangem.domain.staking.repositories.StakingErrorResolver
import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository
import com.tangem.domain.wallets.models.UserWalletId
import org.joda.time.DateTime
import java.math.BigDecimal
import java.util.UUID
class InvalidatePendingTransactionsUseCase(
@ -41,12 +42,13 @@ class InvalidatePendingTransactionsUseCase(
newBalancesId: Int,
pendingData: List<Pair<PendingTransaction, BalanceItem>>,
): Pair<List<BalanceItem>, List<PendingTransaction>> {
val balances = realData.associateBy { Pair(it.groupId to it.type, it.amount to it.date) }.toMutableMap()
val balances = realData.associateBy { BalanceIdentity(it.groupId, it.type, it.amount, it.date) }
.toMutableMap()
val transactionsToRemove = mutableListOf<PendingTransaction>()
pendingData.forEach { (pendingTransaction, balanceItem) ->
val key = Pair(balanceItem.groupId to balanceItem.type, balanceItem.amount to balanceItem.date)
val key = BalanceIdentity(balanceItem.groupId, balanceItem.type, balanceItem.amount, balanceItem.date)
val oldBalancesId = pendingTransaction.balancesId
when {
@ -59,20 +61,36 @@ class InvalidatePendingTransactionsUseCase(
else -> {
val groupId = UUID.randomUUID().toString()
val now = DateTime.now()
balances[Pair(groupId to BalanceType.STAKED, pendingTransaction.amount to now)] = BalanceItem(
groupId = groupId,
type = pendingTransaction.type,
amount = pendingTransaction.amount,
rawCurrencyId = pendingTransaction.rawCurrencyId,
validatorAddress = pendingTransaction.validator?.address,
date = null,
pendingActions = emptyList(),
isPending = true,
)
balances[BalanceIdentity(groupId, BalanceType.STAKED, pendingTransaction.amount, now)] =
BalanceItem(
groupId = groupId,
type = pendingTransaction.type,
amount = pendingTransaction.amount,
rawCurrencyId = pendingTransaction.rawCurrencyId,
validatorAddress = pendingTransaction.validator?.address,
date = null,
pendingActions = emptyList(),
isPending = true,
)
balances.entries.find {
it.key.type == BalanceType.STAKED &&
it.key.amount == pendingTransaction.amount &&
!it.value.isPending
}
?.key
?.let { balances.remove(it) }
}
}
}
return balances.values.toList() to transactionsToRemove
}
private data class BalanceIdentity(
val groupId: String,
val type: BalanceType,
val amount: BigDecimal,
val date: DateTime?,
)
}

View file

@ -39,5 +39,6 @@ sealed class TokenSwapPromoAnalyticsEvent(
enum class ProgramName {
Travala,
OKX,
Ring,
}
}

View file

@ -9,4 +9,6 @@ interface PromoRepository {
suspend fun getTravalaPromoBanner(): PromoBanner?
suspend fun getOkxPromoBanner(): PromoBanner?
suspend fun getRingPromoBanner(): PromoBanner?
}

View file

@ -1,9 +1,9 @@
package com.tangem.domain.transaction
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.CommonSigner
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.TransactionExtras
import com.tangem.blockchain.common.TransactionSigner
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.blockchain.common.transaction.TransactionSendResult
import com.tangem.blockchain.common.transaction.TransactionsSendResult
@ -54,14 +54,14 @@ interface TransactionRepository {
suspend fun sendTransaction(
txData: TransactionData,
signer: CommonSigner,
signer: TransactionSigner,
userWalletId: UserWalletId,
network: Network,
): com.tangem.blockchain.extensions.Result<TransactionSendResult>
suspend fun sendMultipleTransactions(
txsData: List<TransactionData>,
signer: CommonSigner,
signer: TransactionSigner,
userWalletId: UserWalletId,
network: Network,
): com.tangem.blockchain.extensions.Result<TransactionsSendResult>

View file

@ -1,5 +1,6 @@
package com.tangem.domain.wallets.repository
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
interface WalletsRepository {
@ -9,4 +10,8 @@ interface WalletsRepository {
fun shouldSaveUserWallets(): Flow<Boolean>
suspend fun saveShouldSaveUserWallets(item: Boolean)
suspend fun isWalletWithRing(userWalletId: UserWalletId): Boolean
suspend fun setHasWalletsWithRing(userWalletId: UserWalletId)
}

View file

@ -38,11 +38,10 @@ import timber.log.Timber
import java.io.IOException
import java.math.BigDecimal
import java.util.UUID
import javax.inject.Inject
import com.tangem.datasource.api.express.models.request.LeastTokenInfo as NetworkLeastTokenInfo
@Suppress("LongParameterList", "LargeClass")
internal class DefaultSwapRepository @Inject constructor(
internal class DefaultSwapRepository(
private val tangemExpressApi: TangemExpressApi,
private val coroutineDispatcher: CoroutineDispatcherProvider,
private val walletManagersFacade: WalletManagersFacade,
@ -187,6 +186,7 @@ internal class DefaultSwapRepository @Inject constructor(
}
override suspend fun findBestQuote(
userWalletId: UserWalletId,
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,

View file

@ -18,6 +18,7 @@ interface SwapRepository {
@Suppress("LongParameterList")
suspend fun findBestQuote(
userWalletId: UserWalletId,
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,

View file

@ -318,6 +318,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
isBalanceWithoutFeeEnough: Boolean,
): Pair<SwapProvider, SwapState> {
val maybeQuotes = repository.findBestQuote(
userWalletId = userWalletId,
fromContractAddress = fromToken.currency.getContractAddress(),
fromNetwork = fromToken.currency.network.backendId,
toContractAddress = toToken.currency.getContractAddress(),
@ -1192,14 +1193,15 @@ internal class SwapInteractorImpl @AssistedInject constructor(
}
val quotes = repository.findBestQuote(
userWalletId = userWalletId,
fromContractAddress = fromToken.getContractAddress(),
fromNetwork = fromToken.network.backendId,
toContractAddress = toToken.getContractAddress(),
toNetwork = toToken.network.backendId,
fromAmount = amountToRequest.toStringWithRightOffset(),
fromDecimals = amount.decimals,
providerId = provider.providerId,
toDecimals = toToken.decimals,
providerId = provider.providerId,
rateType = RateType.FLOAT,
)

View file

@ -56,6 +56,10 @@ internal class WalletWarningsAnalyticsSender @Inject constructor(
is WalletNotification.Warning.SomeNetworksUnreachable,
is WalletNotification.Warning.NetworksUnreachable,
-> null
is WalletNotification.RingPromo -> TokenSwapPromoAnalyticsEvent.NoticePromotionBanner(
source = AnalyticsParam.ScreensSources.Main,
programName = TokenSwapPromoAnalyticsEvent.ProgramName.Ring,
)
}
}
}

View file

@ -6,7 +6,7 @@ import com.tangem.domain.core.lce.Lce
import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.promo.PromoBanner
import com.tangem.domain.settings.IsReadyToShowRateAppUseCase
import com.tangem.domain.settings.ShouldShowSwapPromoWalletUseCase
import com.tangem.domain.settings.ShouldShowRingPromoUseCase
import com.tangem.domain.tokens.GetTokenListUseCase
import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.CryptoCurrency
@ -33,7 +33,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
private val getTokenListUseCase: GetTokenListUseCase,
private val isDemoCardUseCase: IsDemoCardUseCase,
private val isReadyToShowRateAppUseCase: IsReadyToShowRateAppUseCase,
private val shouldShowSwapPromoWalletUseCase: ShouldShowSwapPromoWalletUseCase,
private val shouldShowRingPromoUseCase: ShouldShowRingPromoUseCase,
private val promoRepository: PromoRepository,
private val isNeedToBackupUseCase: IsNeedToBackupUseCase,
private val backupValidator: BackupValidator,
@ -42,16 +42,16 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
fun create(userWallet: UserWallet, clickIntents: WalletClickIntents): Flow<ImmutableList<WalletNotification>> {
val cardTypesResolver = userWallet.scanResponse.cardTypesResolver
val promoFlow = flow { emit(promoRepository.getOkxPromoBanner()) }
val promoFlow = flow { emit(promoRepository.getRingPromoBanner()) }
return combine(
flow = getTokenListUseCase.launch(userWallet.walletId),
flow2 = isReadyToShowRateAppUseCase(),
flow3 = isNeedToBackupUseCase(userWallet.walletId),
flow4 = shouldShowSwapPromoWalletUseCase(),
flow4 = shouldShowRingPromoUseCase(userWalletId = userWallet.walletId),
flow5 = promoFlow,
) { maybeTokenList, isReadyToShowRating, isNeedToBackup, shouldShowPromo, promoBanner ->
buildList {
addSwapPromoNotification(shouldShowPromo, promoBanner, clickIntents)
addRingPromoNotification(shouldShowPromo, promoBanner, clickIntents)
addCriticalNotifications(userWallet, clickIntents)
@ -70,17 +70,13 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
}
}
private fun MutableList<WalletNotification>.addSwapPromoNotification(
private fun MutableList<WalletNotification>.addRingPromoNotification(
shouldShowPromo: Boolean,
promoBanner: PromoBanner?,
clickIntents: WalletClickIntents,
) {
promoBanner ?: return
val promoNotification = WalletNotification.SwapPromo(
startDateTime = promoBanner.bannerState.timeline.start,
endDateTime = promoBanner.bannerState.timeline.end,
onCloseClick = clickIntents::onCloseSwapPromoClick,
)
val promoNotification = WalletNotification.RingPromo(onCloseClick = clickIntents::onCloseRingPromoClick)
addIf(
element = promoNotification,
condition = shouldShowPromo && promoBanner.isActive,

View file

@ -194,4 +194,14 @@ sealed class WalletNotification(val config: NotificationConfig) {
onCloseClick = onCloseClick,
),
)
data class RingPromo(val onCloseClick: () -> Unit) : WalletNotification(
config = NotificationConfig(
title = resourceReference(id = R.string.ring_promo_title),
subtitle = resourceReference(id = R.string.ring_promo_text),
iconResId = R.drawable.img_card_with_ring,
backgroundResId = R.drawable.img_ring_promo_background,
onCloseClick = onCloseClick,
),
)
}

View file

@ -1,11 +1,12 @@
package com.tangem.feature.wallet.presentation.wallet.ui.components.common
import android.content.res.Configuration
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.animation.*
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures
@ -25,11 +26,9 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@ -55,7 +54,7 @@ import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.common.WalletPreviewData
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletCardState
private const val HALF_OF_ITEM_WIDTH = 0.5
// private const val HALF_OF_ITEM_WIDTH = 0.5
/**
* Wallet card
@ -117,31 +116,33 @@ internal fun WalletCard(state: WalletCardState, isBalanceHidden: Boolean, modifi
bottom.linkTo(anchor = parent.bottom, margin = contentVerticalMargin)
if (additionalText != null) {
width = if (state.imageResId != null) {
end.linkTo(imageRef.start)
Dimension.fillToConstraints
} else {
Dimension.wrapContent
}
width = Dimension.wrapContent
// TODO: [REDACTED_JIRA]
// width = if (state.imageResId != null) {
// end.linkTo(imageRef.start)
// Dimension.fillToConstraints
// } else {
// Dimension.wrapContent
// }
}
},
)
// TODO: [REDACTED_JIRA]
// If balance has a large width then image must be hidden
val hasSpaceForImage by remember(key1 = balanceWidth, key2 = itemSize.width) {
mutableStateOf(value = balanceWidth < itemSize.width * HALF_OF_ITEM_WIDTH)
}
if (hasSpaceForImage) {
Image(
id = state.imageResId,
modifier = Modifier.constrainAs(imageRef) {
end.linkTo(parent.end)
bottom.linkTo(parent.bottom)
height = Dimension.fillToConstraints
},
)
}
// val hasSpaceForImage by remember(key1 = balanceWidth, key2 = itemSize.width) {
// mutableStateOf(value = balanceWidth < itemSize.width * HALF_OF_ITEM_WIDTH)
// }
// if (hasSpaceForImage) {
// Image(
// id = state.imageResId,
// modifier = Modifier.constrainAs(imageRef) {
// end.linkTo(parent.end)
// bottom.linkTo(parent.bottom)
// height = Dimension.fillToConstraints
// },
// )
// }
}
}
@ -370,19 +371,19 @@ private fun LockedContent(modifier: Modifier = Modifier) {
)
}
@Composable
private fun Image(@DrawableRes id: Int?, modifier: Modifier = Modifier) {
AnimatedVisibility(visible = id != null, modifier = modifier) {
val imageRes = id ?: return@AnimatedVisibility
Image(
painter = painterResource(id = imageRes),
contentDescription = null,
modifier = Modifier.width(width = TangemTheme.dimens.size120),
contentScale = ContentScale.FillWidth,
)
}
}
// @Composable
// private fun Image(@DrawableRes id: Int?, modifier: Modifier = Modifier) {
// AnimatedVisibility(visible = id != null, modifier = modifier) {
// val imageRes = id ?: return@AnimatedVisibility
//
// Image(
// painter = painterResource(id = imageRes),
// contentDescription = null,
// modifier = Modifier.width(width = TangemTheme.dimens.size120),
// contentScale = ContentScale.FillWidth,
// )
// }
// }
// region Preview

View file

@ -6,6 +6,7 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.ui.Modifier
import com.tangem.core.ui.components.notifications.Notification
import com.tangem.core.ui.components.notifications.OkxPromoNotification
import com.tangem.core.ui.components.notifications.RingPromoNotification
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification
import kotlinx.collections.immutable.ImmutableList
@ -33,6 +34,9 @@ internal fun LazyListScope.notifications(configs: ImmutableList<WalletNotificati
modifier = modifier.animateItemPlacement(),
)
}
is WalletNotification.RingPromo -> {
RingPromoNotification(config = it.config, modifier = modifier.animateItemPlacement())
}
else -> {
Notification(
config = it.config,

View file

@ -8,10 +8,7 @@ import com.tangem.domain.card.DerivePublicKeysUseCase
import com.tangem.domain.card.SetCardWasScannedUseCase
import com.tangem.domain.redux.LegacyAction
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.settings.NeverToSuggestRateAppUseCase
import com.tangem.domain.settings.RemindToRateAppLaterUseCase
import com.tangem.domain.settings.ShouldShowSwapPromoWalletUseCase
import com.tangem.domain.settings.ShouldShowTravalaPromoWalletUseCase
import com.tangem.domain.settings.*
import com.tangem.domain.tokens.FetchTokenListUseCase
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.analytics.TokenSwapPromoAnalyticsEvent
@ -59,6 +56,8 @@ internal interface WalletWarningsClickIntents {
fun onCloseSwapPromoClick()
fun onCloseRingPromoClick()
fun onTravalaPromoClick(link: String?)
fun onCloseTravalaPromoClick()
@ -83,6 +82,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
private val reduxStateHolder: ReduxStateHolder,
private val dispatchers: CoroutineDispatcherProvider,
private val shouldShowSwapPromoWalletUseCase: ShouldShowSwapPromoWalletUseCase,
private val shouldShowRingPromoUseCase: ShouldShowRingPromoUseCase,
private val shouldShowTravalaPromoWalletUseCase: ShouldShowTravalaPromoWalletUseCase,
) : BaseWalletClickIntents(), WalletWarningsClickIntents {
@ -239,6 +239,20 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
}
}
override fun onCloseRingPromoClick() {
analyticsEventHandler.send(
TokenSwapPromoAnalyticsEvent.PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Main,
programName = TokenSwapPromoAnalyticsEvent.ProgramName.Ring,
action = TokenSwapPromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed,
),
)
viewModelScope.launch {
shouldShowRingPromoUseCase.neverToShow()
}
}
override fun onTravalaPromoClick(link: String?) {
analyticsEventHandler.send(
TokenSwapPromoAnalyticsEvent.PromotionBannerClicked(

View file

@ -91,7 +91,7 @@ markdownComposeView = "0.5.4"
# region Tangem
tangemBlockchainSdk = "release-app_5.16-813"
#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds
tangemCardSdk = "release-app_5.16-386"
tangemCardSdk = "release-app_5.16-390"
#tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^
tangemVico = "2.0.0-alpha.25-tangem17"
#tangemVico = "0.0.1" # Keep it! - used for local builds ^

View file

@ -5,4 +5,6 @@ interface ExpressAuthProvider {
fun getUserId(): String
fun getSessionId(): String
fun getRefCode(): String
}

View file

@ -0,0 +1,12 @@
package com.tangem.blockchainsdk.signer
import com.tangem.TangemSdk
import com.tangem.blockchain.common.TransactionSigner
/**
[REDACTED_AUTHOR]
*/
interface TransactionSignerFactory {
fun createTransactionSigner(cardId: String?, sdk: TangemSdk): TransactionSigner
}