Updated on 2026-08-14
This commit is contained in:
commit
295ca225a9
74 changed files with 956 additions and 371 deletions
|
|
@ -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
|
||||
|
|
@ -113,6 +114,8 @@ interface ApplicationEntryPoint {
|
|||
|
||||
fun getTangemAppLogger(): TangemAppLoggerInitializer
|
||||
|
||||
fun getTransactionSignerFactory(): TransactionSignerFactory
|
||||
|
||||
fun getHomeFeatureToggles(): HomeFeatureToggles
|
||||
|
||||
fun getGetUserCountryCodeUseCase(): GetUserCountryUseCase
|
||||
|
|
|
|||
|
|
@ -8,9 +8,15 @@ import com.tangem.Log
|
|||
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
|
||||
|
|
@ -175,6 +181,9 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
|
|||
private val tangemAppLoggerInitializer: TangemAppLoggerInitializer
|
||||
get() = entryPoint.getTangemAppLogger()
|
||||
|
||||
private val transactionSignerFactory: TransactionSignerFactory
|
||||
get() = entryPoint.getTransactionSignerFactory()
|
||||
|
||||
private val homeFeatureToggles: HomeFeatureToggles
|
||||
get() = entryPoint.getHomeFeatureToggles()
|
||||
|
||||
|
|
@ -260,6 +269,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
|
|||
urlOpener = urlOpener,
|
||||
shareManager = shareManager,
|
||||
appRouter = appRouter,
|
||||
transactionSignerFactory = transactionSignerFactory,
|
||||
homeFeatureToggles = homeFeatureToggles,
|
||||
getUserCountryUseCase = getUserCountryUseCase,
|
||||
),
|
||||
|
|
@ -297,6 +307,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]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -72,6 +72,8 @@ sealed class GlobalAction : Action {
|
|||
val walletPublicKey: ByteArray,
|
||||
) : GlobalAction()
|
||||
|
||||
data class IsSignWithRing(val isSignWithRing: Boolean) : GlobalAction()
|
||||
|
||||
data class SetConfigManager(val environmentConfigStorage: EnvironmentConfigStorage) : GlobalAction()
|
||||
|
||||
object ExchangeManager : GlobalAction() {
|
||||
|
|
|
|||
|
|
@ -68,6 +68,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.ShowDialog -> {
|
||||
globalState.copy(dialog = action.stateDialog)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ data class GlobalState(
|
|||
@Deprecated("Use GetUserCountryCodeUseCase instead")
|
||||
val userCountryCode: String? = null,
|
||||
val appThemeMode: AppThemeMode = AppThemeMode.DEFAULT,
|
||||
val isLastSignWithRing: Boolean = false,
|
||||
) : StateType
|
||||
|
||||
typealias CryptoCurrencyName = String
|
||||
|
|
|
|||
|
|
@ -125,6 +125,14 @@ internal object SettingsDomainModule {
|
|||
return ShouldShowSwapPromoWalletUseCase(promoSettingsRepository)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideShouldShowRingPromoUseCase(
|
||||
promoSettingsRepository: PromoSettingsRepository,
|
||||
): ShouldShowRingPromoUseCase {
|
||||
return ShouldShowRingPromoUseCase(promoSettingsRepository)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideShouldShowTravalaPromoWalletUseCase(
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
)
|
||||
|
|
@ -137,5 +137,9 @@ interface TangemSdkManager {
|
|||
initialMessage: Message,
|
||||
): CompletionResult<CreateWalletResponse>
|
||||
|
||||
fun changeProductType(isRing: Boolean)
|
||||
|
||||
fun clearProductType()
|
||||
|
||||
// endregion
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -138,6 +137,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,
|
||||
|
|
@ -145,10 +152,15 @@ 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,
|
||||
preflightReadFilter = null,
|
||||
)
|
||||
.doOnResult { tangemSdk.config.setupForProduct(ProductType.ANY) }
|
||||
}
|
||||
|
||||
override suspend fun importWallet(
|
||||
|
|
@ -162,6 +174,15 @@ class DefaultTangemSdkManager(
|
|||
} catch (e: TangemSdkError.MnemonicException) {
|
||||
return CompletionResult.Failure(e)
|
||||
}
|
||||
|
||||
tangemSdk.config.setupForProduct(
|
||||
if (scanResponse.cardTypesResolver.isRing()) {
|
||||
ProductType.RING
|
||||
} else {
|
||||
ProductType.CARD
|
||||
},
|
||||
)
|
||||
|
||||
return runTaskAsync(
|
||||
runnable = CreateProductWalletTask(
|
||||
cardTypesResolver = scanResponse.cardTypesResolver,
|
||||
|
|
@ -171,9 +192,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))
|
||||
},
|
||||
preflightReadFilter = null,
|
||||
)
|
||||
.doOnResult { tangemSdk.config.setupForProduct(ProductType.ANY) }
|
||||
}
|
||||
|
||||
private fun sendScanResultsToAnalytics(result: CompletionResult<ScanResponse>) {
|
||||
|
|
@ -404,6 +430,16 @@ class DefaultTangemSdkManager(
|
|||
return runTaskAsync(runnable = task, cardId = null, initialMessage = initialMessage, preflightReadFilter = null)
|
||||
}
|
||||
|
||||
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,
|
||||
|
|
@ -422,18 +458,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"),
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -177,6 +177,10 @@ class MockTangemSdkManager(
|
|||
return MockProvider.createSecondTwinWallet()
|
||||
}
|
||||
|
||||
override fun changeProductType(isRing: Boolean) = Unit
|
||||
|
||||
override fun clearProductType() = Unit
|
||||
|
||||
override suspend fun finalizeTwin(
|
||||
secondCardPublicKey: ByteArray,
|
||||
issuerKeyPair: KeyPair,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.tangem.tap.features.onboarding.products.wallet.redux
|
|||
import android.net.Uri
|
||||
import com.tangem.common.CompletionResult
|
||||
import com.tangem.domain.wallets.models.UserWalletId
|
||||
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
|
||||
|
|
@ -62,6 +63,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
|
||||
|
|
@ -71,7 +73,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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,9 +15,12 @@ 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.legacy.UserWalletsListManager
|
||||
import com.tangem.domain.wallets.builder.UserWalletIdBuilder
|
||||
import com.tangem.domain.wallets.models.Artwork
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
import com.tangem.feature.onboarding.data.model.CreateWalletResponse
|
||||
|
|
@ -172,11 +175,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
|
||||
}
|
||||
|
|
@ -192,6 +198,14 @@ private fun handleWalletAction(action: Action) {
|
|||
private fun handleFinishBackup(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.saveWallet(
|
||||
scanResponse = updatedScanResponse,
|
||||
accessCode = backupState.accessCode,
|
||||
|
|
@ -445,7 +459,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()
|
||||
|
|
@ -499,11 +513,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 -> {
|
||||
|
|
@ -511,10 +526,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()
|
||||
|
|
@ -539,6 +563,8 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
tangemSdkManager.clearProductType()
|
||||
}
|
||||
}
|
||||
is BackupAction.DiscardBackup -> {
|
||||
|
|
@ -652,6 +678,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
|
||||
}
|
||||
|
||||
private suspend fun saveWallet(
|
||||
userWalletsListManager: UserWalletsListManager,
|
||||
userWallet: UserWallet,
|
||||
|
|
@ -724,7 +754,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()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package com.tangem.tap.features.onboarding.products.wallet.redux
|
||||
|
||||
import com.tangem.domain.common.util.cardTypesResolver
|
||||
import com.tangem.domain.redux.OnboardingManageTokensAction
|
||||
import com.tangem.tap.backupService
|
||||
import com.tangem.tap.common.redux.AppState
|
||||
|
|
@ -75,7 +74,6 @@ private object ReducerForGlobalAction {
|
|||
canSkipBackup = action.canSkipBackup,
|
||||
startedSource = action.source,
|
||||
),
|
||||
isRingOnboarding = action.scanResponse.cardTypesResolver.isRing(),
|
||||
)
|
||||
}
|
||||
is GlobalAction.Onboarding.StartForUnfinishedBackup -> {
|
||||
|
|
@ -104,7 +102,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(
|
||||
|
|
@ -113,9 +111,26 @@ private object BackupReducer {
|
|||
canSkipBackup = state.canSkipBackup,
|
||||
startedSource = state.startedSource,
|
||||
)
|
||||
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(
|
||||
|
|
@ -130,7 +145,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,
|
||||
)
|
||||
|
|
@ -140,7 +157,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),
|
||||
)
|
||||
|
|
@ -152,6 +171,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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 com.tangem.domain.wallets.models.UserWalletId
|
||||
import org.rekotlin.StateType
|
||||
|
|
@ -31,6 +32,7 @@ data class OnboardingWalletState(
|
|||
OnboardingWalletStep.CreateWallet, OnboardingWalletStep.None -> 1
|
||||
OnboardingWalletStep.Backup -> {
|
||||
when (backupState.backupStep) {
|
||||
null -> 2
|
||||
BackupStep.InitBackup -> 2
|
||||
BackupStep.ScanOriginCard -> 3
|
||||
BackupStep.AddBackupCards -> 4
|
||||
|
|
@ -67,19 +69,23 @@ 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 startedSource: BackupStartedSource = BackupStartedSource.Onboarding,
|
||||
val hasRing: Boolean = false,
|
||||
)
|
||||
|
||||
enum class BackupStartedSource {
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ import com.tangem.core.ui.windowsize.rememberWindowSize
|
|||
import com.tangem.datasource.utils.isNullOrEmpty
|
||||
import com.tangem.domain.common.util.cardTypesResolver
|
||||
import com.tangem.domain.feedback.models.FeedbackEmailType
|
||||
import com.tangem.domain.models.scan.isRing
|
||||
import com.tangem.domain.wallets.models.UserWalletId
|
||||
import com.tangem.feature.onboarding.data.model.CreateWalletResponse
|
||||
import com.tangem.feature.onboarding.presentation.wallet2.analytics.SeedPhraseSource
|
||||
|
|
@ -223,6 +224,9 @@ class OnboardingWalletFragment :
|
|||
when {
|
||||
state.wallet2State != null -> {
|
||||
seedPhraseStateHandler.newState(this, state, seedPhraseViewModel)
|
||||
seedPhraseViewModel.setCardArtworkUri(
|
||||
cardArtworkUri = state.walletImages.primaryCardImage.toString(),
|
||||
)
|
||||
updateWalletImagesState(state.walletImages)
|
||||
}
|
||||
else -> {
|
||||
|
|
@ -324,6 +328,7 @@ class OnboardingWalletFragment :
|
|||
|
||||
private fun setBackupState(state: BackupState) {
|
||||
when (state.backupStep) {
|
||||
null -> Unit
|
||||
BackupStep.InitBackup -> showBackupIntro(state)
|
||||
BackupStep.ScanOriginCard -> showScanOriginCard()
|
||||
BackupStep.AddBackupCards -> showAddBackupCards(state)
|
||||
|
|
@ -477,13 +482,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) }
|
||||
|
||||
|
|
@ -507,16 +525,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))
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ package com.tangem.tap.network.auth.di
|
|||
|
||||
import com.tangem.datasource.api.common.AuthProvider
|
||||
import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -83,6 +84,7 @@ data class DaggerGraphState(
|
|||
val shareManager: ShareManager? = null,
|
||||
val appRouter: AppRouter? = null,
|
||||
val pushNotificationsRouter: PushNotificationsRouter? = null,
|
||||
val transactionSignerFactory: TransactionSignerFactory? = null,
|
||||
val homeFeatureToggles: HomeFeatureToggles? = null,
|
||||
val getUserCountryUseCase: GetUserCountryUseCase? = null,
|
||||
) : StateType
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -67,6 +67,10 @@ sealed class Basic(
|
|||
enum class MemoType {
|
||||
Empty, Full, Null
|
||||
}
|
||||
|
||||
enum class WalletForm {
|
||||
Card, Ring
|
||||
}
|
||||
}
|
||||
|
||||
class ScanError(error: Throwable) : Basic(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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 STAKE_KIT_API_KEY = "stake_kit_api_key"
|
||||
|
||||
@JvmStatic
|
||||
|
|
@ -113,6 +115,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" },
|
||||
),
|
||||
|
|
|
|||
|
|
@ -12,19 +12,19 @@
|
|||
<string name="alert_failed_to_send_transaction_title">Transaktion kann nicht gesendet werden</string>
|
||||
<string name="alert_manage_tokens_unsupported_blockchain_by_card_message">Das gewählte unterstützt nicht das %1$s Netzwerk</string>
|
||||
<string name="alert_manage_tokens_unsupported_curve_message">Um die kryptografische Verschlüsselung der %1$s Blockchain zu aktivieren, musst Du die Wallet auf die Werkseinstellungen zurücksetzen. Bitte heb vorher dein Guthaben ab, um sicherzustellen, dass du nichts verlierst, und führe dann den Reset-Vorgang durch. Nach dem Zurücksetzen ist der Zugriff auf die aktuelle Wallet nicht mehr möglich.</string>
|
||||
<string name="alert_manage_tokens_unsupported_message">Tokens im %1$s -Netzwerk werden von dieser Karte aufgrund einer Firmware-Einschränkung nicht unterstützt.</string>
|
||||
<string name="alert_troubleshooting_scan_card_title">Hast du Probleme beim Scannen deiner Karte?</string>
|
||||
<string name="alert_unsupported_card">Diese Karte ist für die Zusammenarbeit mit Tangem nicht geeignet</string>
|
||||
<string name="alert_manage_tokens_unsupported_message">Tokens im %1$s -Netzwerk werden von dieser Karte oder Ring aufgrund einer Firmware-Einschränkung nicht unterstützt.</string>
|
||||
<string name="alert_troubleshooting_scan_card_title">Hast du Probleme beim Scannen deiner Karte oder Ring?</string>
|
||||
<string name="alert_unsupported_card">Diese Karte oder Ring ist für die Zusammenarbeit mit Tangem nicht geeignet</string>
|
||||
<string name="app_settings_default_fee">Standardgebühr</string>
|
||||
<string name="app_settings_default_fee_footer">Aktiviere die Option Standardgebühr, um die Transaktionsgebühren automatisch festzulegen und die Gebührenseite beim Senden von Geldern zu überspringen. Du kannst bei Bedarf jederzeit zu dieser Seite zurückkehren.</string>
|
||||
<string name="app_settings_enable_biometrics_description">Gehe zu den Einstellungen, um die biometrische Authentifizierung in der Tangem-App zu aktivieren</string>
|
||||
<string name="app_settings_enable_biometrics_title">Biometrische Authentifizierung aktivieren</string>
|
||||
<string name="app_settings_off_saved_access_code_alert_message">Dadurch werden alle gespeicherten Zugangscodes für die Wallet gelöscht. Jede weitere Operation mit der Wallet erfordert die Übermittlung des Zugangscodes.</string>
|
||||
<string name="app_settings_off_saved_wallet_alert_message">Durch das Entfernen der gespeicherten Karte werden alle gespeicherten Wallets und deren Zugangscodes aus der App gelöscht.</string>
|
||||
<string name="app_settings_off_saved_wallet_alert_message">Durch das Entfernen der gespeicherten Karte oder Ring werden alle gespeicherten Wallets und deren Zugangscodes aus der App gelöscht.</string>
|
||||
<string name="app_settings_saved_access_codes">Zugangscode speichern</string>
|
||||
<string name="app_settings_saved_access_codes_footer">Bei Interaktionen mit deiner Karte wird anstelle des Zugangscodes eine biometrische Authentifizierung abgefragt.</string>
|
||||
<string name="app_settings_saved_access_codes_footer">Bei Interaktionen mit deiner Karte oder Ring wird anstelle des Zugangscodes eine biometrische Authentifizierung abgefragt.</string>
|
||||
<string name="app_settings_saved_wallet">Behalte die Wallet in der App</string>
|
||||
<string name="app_settings_saved_wallet_footer">Aktiviere die Verknüpfung aller Wallets mit der Tangem-App. Die biometrische Authentifizierung ist zum Entsperren der App erforderlich. Das Signieren von Transaktionen erfordert das Antippen deiner Tangem-Karte.</string>
|
||||
<string name="app_settings_saved_wallet_footer">Aktiviere die Verknüpfung aller Wallets mit der Tangem-App. Die biometrische Authentifizierung ist zum Entsperren der App erforderlich. Das Signieren von Transaktionen erfordert das Antippen deiner Tangem-Karte oder Ring.</string>
|
||||
<string name="app_settings_theme_mode_dark">Dunkel</string>
|
||||
<string name="app_settings_theme_mode_light">Hell</string>
|
||||
<string name="app_settings_theme_mode_system">Systemstandard</string>
|
||||
|
|
@ -34,29 +34,29 @@
|
|||
<string name="balance_hidden_do_not_show_button">Nicht mehr anzeigen</string>
|
||||
<string name="balance_hidden_got_it_button">Verstanden</string>
|
||||
<string name="balance_hidden_title">Guthaben sind ausgeblendet</string>
|
||||
<string name="biometric_lockout_permanent_warning_description">Bitte Karte scannen</string>
|
||||
<string name="biometric_lockout_permanent_warning_description">Bitte Karte oder Ring scannen</string>
|
||||
<string name="biometric_lockout_warning_description">Bitte versuche es in 30 Sekunden erneut oder scanne die Karte</string>
|
||||
<string name="biometric_lockout_warning_title">Zu viele Versuche</string>
|
||||
<string name="biometric_unavailable_warning">Du hast die biometrische Authentifizierung auf deinem Telefon deaktiviert und kannst keine Wallets in der App speichern. Um Wallets zu speichern, aktiviere bitte die biometrische Authentifizierung in deinen Telefoneinstellungen.</string>
|
||||
<string name="button_start_backup_process">Backup-Prozess starten</string>
|
||||
<string name="buy_token_description">Verwende eine Bankkarte oder eine andere Zahlungsmethode</string>
|
||||
<plurals name="card_label_card_count">
|
||||
<item quantity="one">%d Karte</item>
|
||||
<item quantity="other">%d Karten</item>
|
||||
<item quantity="one">%d Karte oder Ring</item>
|
||||
<item quantity="other">%d Karten oder Ringe</item>
|
||||
</plurals>
|
||||
<string name="card_settings_access_code_recovery_disabled_description">Deaktiviere diese Option, wenn du nicht möchtest, dass diese Karte zum Zurücksetzen von Zugangscodes auf anderen Karten in dieser Wallets verwendet wird. Bitte beachte, dass du dann auch den Zugangscode auf dieser Karte nicht zurücksetzen kannst.</string>
|
||||
<string name="card_settings_access_code_recovery_enabled_description">Ermöglicht die Verwendung dieser Karte zum Zurücksetzen des Zugangscodes auf anderen Karten in dieser Brieftasche</string>
|
||||
<string name="card_settings_access_code_recovery_disabled_description">Deaktiviere diese Option, wenn du nicht möchtest, dass diese Karte oder Ring zum Zurücksetzen von Zugangscodes auf anderen Karten oder Ringe in dieser Wallets verwendet wird. Bitte beachte, dass du dann auch den Zugangscode auf dieser Karte oder Ring nicht zurücksetzen kannst.</string>
|
||||
<string name="card_settings_access_code_recovery_enabled_description">Ermöglicht die Verwendung dieser Karte oder Ring zum Zurücksetzen des Zugangscodes auf anderen Karten oder Ringe in dieser Brieftasche</string>
|
||||
<string name="card_settings_access_code_recovery_title">Zugangspin resetten</string>
|
||||
<string name="card_settings_action_sheet_reset">Zurücksetzen</string>
|
||||
<string name="card_settings_action_sheet_title">Möchtest du das wirklich tun?</string>
|
||||
<string name="card_settings_change_access_code">Zugangscode ändern</string>
|
||||
<string name="card_settings_change_access_code_footer">Der Zugangscode wird nur auf dieser Karte geändert</string>
|
||||
<string name="card_settings_completed_reset_alert_message">Alle Karten der ausgewählten Wallet wurden auf die Werkseinstellungen zurückgesetzt. Du kannst nun eine neue Wallet aufsetzen.</string>
|
||||
<string name="card_settings_change_access_code_footer">Der Zugangscode wird nur auf dieser Karte oder Ring geändert</string>
|
||||
<string name="card_settings_completed_reset_alert_message">Alle Karten oder Ringe der ausgewählten Wallet wurden auf die Werkseinstellungen zurückgesetzt. Du kannst nun eine neue Wallet aufsetzen.</string>
|
||||
<string name="card_settings_completed_reset_alert_title">Komplett zurücksetzen</string>
|
||||
<string name="card_settings_continue_reset_alert_message">Möchtest du die nächste Karte in dieser Wallet zurücksetzen?</string>
|
||||
<string name="card_settings_continue_reset_alert_title">Karte zurücksetzen</string>
|
||||
<string name="card_settings_interrupted_reset_alert_message">Wir empfehlen dir, den Zurücksetzungsprozess für alle Karten in dieser Wallet abzuschließen</string>
|
||||
<string name="card_settings_interrupted_reset_alert_title">Du hast nicht alle deine Karten zurückgesetzt</string>
|
||||
<string name="card_settings_continue_reset_alert_message">Möchtest du die nächste Karte oder Ring in dieser Wallet zurücksetzen?</string>
|
||||
<string name="card_settings_continue_reset_alert_title">Karte oder Ring zurücksetzen</string>
|
||||
<string name="card_settings_interrupted_reset_alert_message">Wir empfehlen dir, den Zurücksetzungsprozess für alle Karten oder Ringe in dieser Wallet abzuschließen</string>
|
||||
<string name="card_settings_interrupted_reset_alert_title">Du hast nicht alle deine Karten oder Ringe zurückgesetzt</string>
|
||||
<string name="card_settings_reset_card_to_factory">Auf Werkseinstellungen zurücksetzen</string>
|
||||
<string name="card_settings_security_mode">Sicherheitsmodus</string>
|
||||
<string name="card_settings_title">Karteneinstellungen</string>
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
<string name="common_no_address">Keine Adresse</string>
|
||||
<string name="common_now">Jetzt</string>
|
||||
<string name="common_ok">OK</string>
|
||||
<string name="common_origin_card">Hauptkarte</string>
|
||||
<string name="common_origin_card">Hauptkarte oder Ring</string>
|
||||
<string name="common_origin_ring">Primärring</string>
|
||||
<string name="common_passphrase">Passphrase</string>
|
||||
<string name="common_paste">Einfügen</string>
|
||||
|
|
@ -211,17 +211,17 @@
|
|||
<string name="details_buy_wallet">Kaufe eine Tangem Wallet</string>
|
||||
<string name="details_chat">Chat</string>
|
||||
<string name="details_manage_security_access_code">Zugangscode</string>
|
||||
<string name="details_manage_security_access_code_description">Du musst den richtigen Zugangscode eingeben, bevor du die Karte scannst.</string>
|
||||
<string name="details_manage_security_access_code_description">Du musst den richtigen Zugangscode eingeben, bevor du die Karte oder Ring scannst.</string>
|
||||
<string name="details_manage_security_long_tap">Langes Tippen</string>
|
||||
<string name="details_manage_security_long_tap_description">Dieser Mechanismus schützt vor Annäherungsangriffen auf eine Karte. Es wird eine Verzögerung zwischen dem Empfang und der Ausführung eines Befehls erzwungen. Nach der ersten signierten Transaktion wird dieses Telefon mit der Karte verknüpft und die Transaktionen werden sofort signiert</string>
|
||||
<string name="details_manage_security_long_tap_description">Dieser Mechanismus schützt vor Annäherungsangriffen auf eine Karte oder Ring. Es wird eine Verzögerung zwischen dem Empfang und der Ausführung eines Befehls erzwungen. Nach der ersten signierten Transaktion wird dieses Telefon mit der Karte oder Ring verknüpft und die Transaktionen werden sofort signiert</string>
|
||||
<string name="details_manage_security_passcode">Passcode</string>
|
||||
<string name="details_manage_security_passcode_description">Bevor du einen Befehl ausführst, der eine Änderung des Kartenstatus zur Folge hat, musst du den Passcode eingeben.</string>
|
||||
<string name="details_referral_title">Empfehlungsprogramm</string>
|
||||
<string name="details_row_description_flip_to_hide">Flippe den Bildschirm deines Geräts nach unten, um Salden schnell ein- und auszublenden</string>
|
||||
<string name="details_row_subtitle_signed_hashes_format">%s Hasch</string>
|
||||
<string name="details_row_title_cid">KartenID</string>
|
||||
<string name="details_row_title_cid">Karten- oder Ring-ID</string>
|
||||
<string name="details_row_title_contact_to_support">Kontakt zum Support</string>
|
||||
<string name="details_row_title_create_backup">Weitere Karten verknüpfen</string>
|
||||
<string name="details_row_title_create_backup">Weitere Karten oder Ringe verknüpfen</string>
|
||||
<string name="details_row_title_currency">App Währung</string>
|
||||
<string name="details_row_title_flip_to_hide">Flipp um Guthaben auszublenden</string>
|
||||
<string name="details_row_title_issuer">Aussteller</string>
|
||||
|
|
@ -230,7 +230,7 @@
|
|||
<string name="details_title">Details</string>
|
||||
<string name="disclaimer_error_loading">Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk</string>
|
||||
<string name="disclaimer_title">Nutzungsbedingungen</string>
|
||||
<string name="error_wrong_wallet_tapped">Du hast eine Karte aus einer anderen Wallet verwendet. Tippe auf die Karte, die dieser Wallet zugeordnet ist.</string>
|
||||
<string name="error_wrong_wallet_tapped">Du hast eine Karte oder Ring aus einer anderen Wallet verwendet. Tippe auf die Karte oder Ring, die dieser Wallet zugeordnet ist.</string>
|
||||
<string name="exchange_tokens_available_tokens_header">Meine Token</string>
|
||||
<string name="exchange_tokens_empty_tokens">Du hast noch keine Token hinzugefügt. Füge Token über den Markt zum Tausch hinzu</string>
|
||||
<string name="exchange_tokens_unavailable_tokens_header">Kann nicht gegen %s ausgetauscht werden</string>
|
||||
|
|
@ -287,11 +287,11 @@
|
|||
<string name="exсhange_token_description">Tauschen jeden Vermögenswert in Deinem Portfolio gegen diesen Token</string>
|
||||
<string name="feedback_data_collection_message">Die folgenden Angaben sind freiwillig. Du kannst diese löschen, wenn du sie nicht weitergeben möchtest.</string>
|
||||
<string name="feedback_preface_rate_negative">Teile uns mit, welche Funktionen du vermisst, und wir werden versuchen, dir zu helfen.</string>
|
||||
<string name="feedback_preface_scan_failed">Bitte sag uns, welche Karte du hast</string>
|
||||
<string name="feedback_preface_scan_failed">Bitte sag uns, welche Karte oder Ring du hast</string>
|
||||
<string name="feedback_preface_support">Hallo Support-Team,</string>
|
||||
<string name="feedback_preface_tx_failed">Bitte erzähle uns mehr über dein Problem. Jedes kleine Detail kann helfen.</string>
|
||||
<string name="feedback_subject_rate_negative">Meine Vorschläge</string>
|
||||
<string name="feedback_subject_scan_failed">Kann eine Karte nicht scannen</string>
|
||||
<string name="feedback_subject_scan_failed">Kann eine Karte oder Ring nicht scannen</string>
|
||||
<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>
|
||||
|
|
@ -305,18 +305,18 @@
|
|||
<string name="give_permission_swap_subtitle" formatted="false">Um fortzufahren, erteile %1s Smart Contracts die Berechtigung, dein zu %2s verwenden.</string>
|
||||
<string name="give_permission_title">Erlaubnis erteilen</string>
|
||||
<string name="give_permission_unlimited">Unbegrenzt</string>
|
||||
<string name="home_button_order">Karte bestellen</string>
|
||||
<string name="home_button_scan">Karte scannen</string>
|
||||
<string name="home_button_order">Karte oder Ring bestellen</string>
|
||||
<string name="home_button_scan">Karte oder Ring scannen</string>
|
||||
<string name="information_generated_with_ai">Diese Information ist KI generiert</string>
|
||||
<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_change_access_code_body">Um den Zugangscode zu ändern, halte die Karte oder Ring 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 oder Ring 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 oder Ring 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_reset_backup_card_header">Halte deine Karte oder Ring Nr. %s des Sets an dein Smartphone</string>
|
||||
<string name="initial_message_scan_header">Legen Sie die Karte oder Ring zum Scannen an</string>
|
||||
<string name="initial_message_sign_header">Tippen um zu signieren</string>
|
||||
<string name="initial_message_tap_header">Lege die Karte an</string>
|
||||
<string name="key_invalidated_warning_description">Du hast deine biometrischen Daten aktualisiert, scanne deine Karte, um einzutreten</string>
|
||||
<string name="initial_message_tap_header">Lege die Karte oder Ring an</string>
|
||||
<string name="key_invalidated_warning_description">Du hast deine biometrischen Daten aktualisiert, scanne deine Karte oder Ring, um einzutreten</string>
|
||||
<string name="koinos_insufficient_balance_to_send_koin_description">Dein Guthaben sollte höher sein als der Gebührenwert, um eine Überweisung zu tätigen</string>
|
||||
<string name="koinos_insufficient_balance_to_send_koin_title">Unzureichende Mittel</string>
|
||||
<string name="koinos_insufficient_mana_to_send_koin_description">Du hast nicht genug Mana für diese Transaktion. Bitte warte, bis das Mana wieder aufgefüllt ist. Dein Mana-Guthaben beträgt %1$s/%2$s</string>
|
||||
|
|
@ -327,8 +327,8 @@
|
|||
<string name="koinos_mana_level_title">Mana-Level</string>
|
||||
<string name="main_empty_tokens_list_message">Um mit der Verfolgung deiner Krypto-Assets und -Transaktionen zu beginnen, füge einen Token hinzu</string>
|
||||
<string name="main_manage_tokens">Token verwalten</string>
|
||||
<string name="main_scan_card_warning_view_subtitle">Um auf alle Netzwerke zugreifen zu können, musst du die Karte scannen</string>
|
||||
<string name="main_scan_card_warning_view_title">Scanne deine Karte</string>
|
||||
<string name="main_scan_card_warning_view_subtitle">Um auf alle Netzwerke zugreifen zu können, musst du die Karte oder Ring scannen</string>
|
||||
<string name="main_scan_card_warning_view_title">Scanne deine Karte oder Ring</string>
|
||||
<string name="main_swap_changelly_promotion_message">Genießen %1$s Servicegebühren auf Swaps über Changelly von Februar %2$s-%3$s</string>
|
||||
<string name="main_swap_changelly_promotion_title">Swap mit Changelly, %s Gebühren</string>
|
||||
<string name="main_tokens">Token</string>
|
||||
|
|
@ -362,7 +362,7 @@
|
|||
<string name="markets_available_networks">Verfügbare Netzwerke</string>
|
||||
<string name="markets_common_my_portfolio">Mein Portfolio</string>
|
||||
<string name="markets_common_title">Markt</string>
|
||||
<string name="markets_generate_addresses_notification">Um Adressen für ausgewählte Netzwerke zu generieren, musst du eine Tangem-Karte scannen</string>
|
||||
<string name="markets_generate_addresses_notification">Um Adressen für ausgewählte Netzwerke zu generieren, musst du eine Tangem-Karte oder Ring scannen</string>
|
||||
<string name="markets_hint">Um Token hinzuzufügen, rufe dies auf oder tippe auf die Suchleiste</string>
|
||||
<string name="markets_insights_info_description_message">Die Daten dieses Abschnitts stammen aus den folgenden Netzwerken: %s</string>
|
||||
<string name="markets_loading_error_title">Die Daten konnten nicht geladen werden...</string>
|
||||
|
|
@ -455,11 +455,11 @@
|
|||
<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>
|
||||
<string name="onboarding_access_code_feature_1_description">Du musst einen einzigen Zugangscode einrichten, um alle deine Karten zu schützen</string>
|
||||
<string name="onboarding_access_code_feature_1_description">Du musst einen einzigen Zugangscode einrichten, um alle deine Karten oder Ringe zu schützen</string>
|
||||
<string name="onboarding_access_code_feature_1_title">Schützen</string>
|
||||
<string name="onboarding_access_code_feature_2_description">Du kannst später auf jeder Karte einen individuellen Zugangscode einrichten</string>
|
||||
<string name="onboarding_access_code_feature_2_description">Du kannst später auf jeder Karte oder Ring einen individuellen Zugangscode einrichten</string>
|
||||
<string name="onboarding_access_code_feature_2_title">Personalisieren</string>
|
||||
<string name="onboarding_access_code_feature_3_description">Der Zugangscode kann mit einer verbundenen Karte wiederhergestellt werden. Bewahre nicht alle Karten an einem Ort auf.</string>
|
||||
<string name="onboarding_access_code_feature_3_description">Der Zugangscode kann mit einer verbundenen Karte oder Ring wiederhergestellt werden. Bewahre nicht alle Karten oder Ringe an einem Ort auf.</string>
|
||||
<string name="onboarding_access_code_feature_3_title">Wiederherstellen</string>
|
||||
<string name="onboarding_access_code_hint">Wähle ein beliebiges Wort, eine Phrase oder eine Zahl als Zugangscode</string>
|
||||
<string name="onboarding_access_code_intro_title">Zugangscode erstellen</string>
|
||||
|
|
@ -467,36 +467,36 @@
|
|||
<string name="onboarding_access_code_repeat_code_title">Gebe deinen Zugangscode erneut ein</string>
|
||||
<string name="onboarding_access_code_too_short">Der Zugangscode muss mindestens 4 Zeichen lang sein</string>
|
||||
<string name="onboarding_access_codes_doesnt_match">Der eingegebene Zugangscode stimmt nicht mit dem ursprünglichen Zugangscode überein</string>
|
||||
<string name="onboarding_activation_error_message">Bitte wiederhole den Vorgang. Die Karte wird auf Werkseinstellungen zurückgesetzt.</string>
|
||||
<string name="onboarding_activation_error_message">Bitte wiederhole den Vorgang. Die Karte oder Ring wird auf Werkseinstellungen zurückgesetzt.</string>
|
||||
<string name="onboarding_activation_error_title">Aktivierungsfehler</string>
|
||||
<string name="onboarding_add_tokens">Token hinzufügen</string>
|
||||
<string name="onboarding_alert_message_not_max_backup_cards_added">Du hast eine Backup-Karte hinzugefügt. Wenn der Backup-Prozess abgeschlossen ist, kannst du keine weiteren Backup-Karten hinzufügen. Wenn du noch eine Karte hast, füge diese zum Backup hinzu. Möchtest du den Backup-Prozess fortsetzen?</string>
|
||||
<string name="onboarding_alert_message_not_max_backup_cards_added">Du hast eine Backup-Karte oder Ring hinzugefügt. Wenn der Backup-Prozess abgeschlossen ist, kannst du keine weiteren Backup-Karten oder Ringe hinzufügen. Wenn du noch eine Karte oder Ring hast, füge diese zum Backup hinzu. Möchtest du den Backup-Prozess fortsetzen?</string>
|
||||
<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_add_backup_card">Hinzufügen einer Sicherungskarte oder Ring</string>
|
||||
<string name="onboarding_button_backup_card">Karte oder Ring scannen</string>
|
||||
<string name="onboarding_button_backup_card_format">Scanne die Karte oder Ring 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_origin">Scannen der Hauptkarte oder Ring</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>
|
||||
<string name="onboarding_button_scan_origin_card">Primärkarte scannen</string>
|
||||
<string name="onboarding_button_scan_origin_card">Primärkarte oder Ring scannen</string>
|
||||
<string name="onboarding_button_skip_backup">Für später überspringen</string>
|
||||
<string name="onboarding_button_what_does_it_mean">Wie funktioniert es?</string>
|
||||
<string name="onboarding_create_wallet_body">Lass uns alle Schlüssel auf deiner Karte generieren und eine sichere Wallet erstellen</string>
|
||||
<string name="onboarding_create_wallet_body">Lass uns alle Schlüssel auf deiner Karte oder Ring generieren und eine sichere Wallet erstellen</string>
|
||||
<string name="onboarding_create_wallet_button_create_wallet">Ein Wallet erstellen</string>
|
||||
<string name="onboarding_create_wallet_header">Erstelle eine Wallet</string>
|
||||
<string name="onboarding_create_wallet_options_button_options">Andere Optionen</string>
|
||||
<string name="onboarding_create_wallet_options_message">Deine Schlüssel(private-keys) werden sicher im Inneren der Karte generiert. Es gibt keine Seed-Phrase, d. h. niemand kann sie exportieren oder stehlen.</string>
|
||||
<string name="onboarding_create_wallet_options_message">Deine Schlüssel(private-keys) werden sicher im Inneren der Karte oder Ring generiert. Es gibt keine Seed-Phrase, d. h. niemand kann sie exportieren oder stehlen.</string>
|
||||
<string name="onboarding_create_wallet_options_title">Schlüssel anonym generieren</string>
|
||||
<string name="onboarding_done_body">Deine Karte ist aktiviert und einsatzbereit</string>
|
||||
<string name="onboarding_done_body">Deine Karte oder Ring ist aktiviert und einsatzbereit</string>
|
||||
<string name="onboarding_done_header">Erfolgreich!</string>
|
||||
<string name="onboarding_exit_alert_message">In diesem Fall musst du ganz von vorne anfangen.</string>
|
||||
<string name="onboarding_exit_alert_title">Möchtest du den Aktivierungsprozess abbrechen?</string>
|
||||
<string name="onboarding_getting_started">Erste Schritte</string>
|
||||
<string name="onboarding_linking_error_card_with_wallets">Für die Karte, die du hinzufügen möchtest, wurde bereits eine andere Wallets erstellt. Wenn du Guthaben auf dieser Wallets hast, hebe es bitte ab, setze diese Karte zurück und füge sie als Backup hinzu.</string>
|
||||
<string name="onboarding_linking_error_card_with_wallets">Für die Karte oder Ring, die du hinzufügen möchtest, wurde bereits eine andere Wallets erstellt. Wenn du Guthaben auf dieser Wallets hast, hebe es bitte ab, setze diese Karte oder Ring zurück und füge sie als Backup hinzu.</string>
|
||||
<string name="onboarding_navbar_title_creating_backup">Backups anlegen</string>
|
||||
<string name="onboarding_seed_button_read_more">Lese mehr über die Seed-Phrase</string>
|
||||
<plurals name="onboarding_seed_generate_message_words_count">
|
||||
|
|
@ -511,27 +511,30 @@
|
|||
<string name="onboarding_seed_import_message">Um deine Wallets zu importieren, gib bitte deine Seed-Phrase in das folgende Feld ein</string>
|
||||
<string name="onboarding_seed_intro_button_generate">Seed-Phrase generieren</string>
|
||||
<string name="onboarding_seed_intro_button_import">Wallet importieren</string>
|
||||
<string name="onboarding_seed_intro_message">Eine Seed-Phrase ist eine Reihe von Wörtern, mit denen du deine Wallet wiederherstellen kannst. Im Gegensatz zu den von der Karte generierten Schlüsseln sind Seed-Phrasen ungeschützt und können kopiert und gestohlen werden. Die Verwendung dieser Option erfolgt auf eigene Gefahr.</string>
|
||||
<string name="onboarding_seed_intro_message">Eine Seed-Phrase ist eine Reihe von Wörtern, mit denen du deine Wallet wiederherstellen kannst. Im Gegensatz zu den von der Karte oder Ring generierten Schlüsseln sind Seed-Phrasen ungeschützt und können kopiert und gestohlen werden. Die Verwendung dieser Option erfolgt auf eigene Gefahr.</string>
|
||||
<string name="onboarding_seed_intro_title">Seed-Phrase verwenden</string>
|
||||
<string name="onboarding_seed_mnemonic_invalid_checksum">Ungültige Seed-Phrase. Bitte überprüfe die Wortreihenfolge.</string>
|
||||
<string name="onboarding_seed_mnemonic_wrong_words">Ungültige Seed-Phrase. Bitte überprüfe die Rechtschreibung.</string>
|
||||
<string name="onboarding_seed_phrase_intro_legacy">Veralteter Standard</string>
|
||||
<string name="onboarding_seed_user_validation_message">Um zu überprüfen, ob du deine Seed-Phrase richtig aufgeschrieben hast, gib bitte das 2., 7. und 11 Wort ein.</string>
|
||||
<string name="onboarding_seed_user_validation_title">Eine letzte Prüfung!</string>
|
||||
<string name="onboarding_subtitle_no_backup_cards">Um den Sicherungsvorgang zu starten, füge bis zu zwei Sicherungskarten hinzu.</string>
|
||||
<string name="onboarding_subtitle_one_backup_card">Du kannst eine weitere Karte hinzufügen oder den Sicherungsvorgang abschließen</string>
|
||||
<string name="onboarding_subtitle_scan_backup_card_format">Bereite die Sicherungskarte mit der Nummer %s vor.</string>
|
||||
<string name="onboarding_subtitle_scan_primary">Scanne die primär-Karte, um den Sicherungsvorgang zu starten.</string>
|
||||
<string name="onboarding_subtitle_scan_primary_card_format">Bereite die primäre Karte mit der Nummer %s vor.</string>
|
||||
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Deine Tangem-Karte ist konfiguriert und einsatzbereit.</string>
|
||||
<string name="onboarding_subtitle_two_backup_cards">Maximale Anzahl an Karten hinzugefügt. Schließe den Sicherungsvorgang ab.</string>
|
||||
<string name="onboarding_title">Karte aktivieren</string>
|
||||
<string name="onboarding_title_backup_card_format">Sicherungskarte Nr. %d</string>
|
||||
<string name="onboarding_title_no_backup_cards">Keine Sicherungskarten</string>
|
||||
<string name="onboarding_subtitle_no_backup_cards">Um den Sicherungsvorgang zu starten, füge bis zu zwei Sicherungskarten oder Ring hinzu.</string>
|
||||
<string name="onboarding_subtitle_one_backup_card">Du kannst eine weitere Karte oder Ring hinzufügen oder den Sicherungsvorgang abschließen</string>
|
||||
<string name="onboarding_subtitle_scan_backup_card_format">Bereite die Sicherungskarte oder Ring mit der Nummer %s vor.</string>
|
||||
<string name="onboarding_subtitle_scan_primary">Scanne die primär-Karte oder Ring, um den Sicherungsvorgang zu starten.</string>
|
||||
<string name="onboarding_subtitle_scan_primary_card_format">Bereite die primäre Karte oder Ring mit der Nummer %s vor.</string>
|
||||
<string name="onboarding_subtitle_scan_ring">Bereite den Ring vor und drücke unten die Scan-Taste</string>
|
||||
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Deine Tangem-Karte oder Ring ist konfiguriert und einsatzbereit.</string>
|
||||
<string name="onboarding_subtitle_two_backup_cards">Maximale Anzahl an Karten oder Ringe hinzugefügt. Schließe den Sicherungsvorgang ab.</string>
|
||||
<string name="onboarding_title">Karte oder Ring aktivieren</string>
|
||||
<string name="onboarding_title_backup_card">Sicherungs-Karte oder Ring</string>
|
||||
<string name="onboarding_title_backup_card_format">Sicherungskarte oder Ring Nr. %d</string>
|
||||
<string name="onboarding_title_backup_ring">Sicherungs-Ring</string>
|
||||
<string name="onboarding_title_no_backup_cards">Keine Sicherungskarten oder Sicherungsring</string>
|
||||
<string name="onboarding_title_notifications">Benachrichtigungen</string>
|
||||
<string name="onboarding_title_one_backup_card">Eine Backup-Karte hinzugefügt</string>
|
||||
<string name="onboarding_title_scan_origin_card">Bereite deine Karte vor</string>
|
||||
<string name="onboarding_title_two_backup_cards">Zwei Backup-Karten hinzugefügt</string>
|
||||
<string name="onboarding_title_one_backup_card">Eine Backup-Karte oder Ring hinzugefügt</string>
|
||||
<string name="onboarding_title_scan_origin_card">Bereite deine Karte oder Ring vor</string>
|
||||
<string name="onboarding_title_two_backup_cards">Zwei Backup-Karten oder Ring hinzugefügt</string>
|
||||
<string name="onboarding_top_up_body">Um zu beginnen, lade einfach die wallet mit einem beliebigen Betrag auf</string>
|
||||
<string name="onboarding_top_up_body_no_account_error">Um zu beginnen, lade die Wallet einfach mit mehr als %1$s %2$s auf.</string>
|
||||
<string name="onboarding_top_up_button_but_crypto">Krypto kaufen</string>
|
||||
|
|
@ -539,13 +542,13 @@
|
|||
<string name="onboarding_topup_title">Aktivieren einer Wallet</string>
|
||||
<string name="onboarding_twin_exit_warning">Der Twinning-Prozess ist teilweise abgeschlossen. Du kannst ihn jetzt nicht mehr beenden.</string>
|
||||
<string name="onboarding_twins_interrupt_warning">Wenn der Prozess der Erstellung der Brieftasche in irgendeiner Weise unterbrochen wird, musst du diesen von vorne beginnen</string>
|
||||
<string name="onboarding_wallet_info_subtitle_first">Du kannst deine Schlüssel mit bis zu zwei weiteren leeren Tangem Wallet-Karten sichern.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_fourth">Der Zugangscode kann mit einer der Ersatzkarten wiederhergestellt werden.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_second">Alle Backup-Karten können als voll funktionsfähig mit den gleichen Schlüsseln verwendet werden.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_first">Du kannst deine Schlüssel mit bis zu zwei weiteren leeren Tangem Wallet-Karten oder Ringe sichern.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_fourth">Der Zugangscode kann mit einer der Ersatzkarten oder Ringe wiederhergestellt werden.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_second">Alle Backup-Karten oder Ringe können als voll funktionsfähig mit den gleichen Schlüsseln verwendet werden.</string>
|
||||
<string name="onboarding_wallet_info_subtitle_third">Du kannst einen Zugangscode zum Schutz deiner wallet festlegen.</string>
|
||||
<string name="onboarding_wallet_info_title_first">Wiederherstellungs-Wallet</string>
|
||||
<string name="onboarding_wallet_info_title_fourth">Zugangscode wiederherstellen</string>
|
||||
<string name="onboarding_wallet_info_title_second">Identische Karten</string>
|
||||
<string name="onboarding_wallet_info_title_second">Identische Karten oder Ring</string>
|
||||
<string name="onboarding_wallet_info_title_third">Zugangscode</string>
|
||||
<string name="organize_tokens_group">Gruppe erstellen</string>
|
||||
<string name="organize_tokens_sort_by_balance">Nach Guthaben</string>
|
||||
|
|
@ -587,16 +590,16 @@
|
|||
<item quantity="one">%d Wallet</item>
|
||||
<item quantity="other">%d Wallets</item>
|
||||
</plurals>
|
||||
<string name="reset_card_to_factory_button_title">Karte zurücksetzen</string>
|
||||
<string name="reset_card_to_factory_button_title">Karte oder Ring zurücksetzen</string>
|
||||
<string name="reset_card_to_factory_condition_1">Mir ist bewusst, dass ich nach der Durchführung dieser Aktion keinen Zugriff mehr auf die aktuelle Wallet habe.</string>
|
||||
<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="reset_card_to_factory_condition_2">Mir ist klar, dass ich diese Karte oder Ring nicht verwenden kann, um meinen Zugangscode auf den anderen Karten oder Ringe 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 oder Ring gelöscht. Du kannst die aktuelle Wallet nicht wiederherstellen oder die Karte oder Ring 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 oder Ring 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>
|
||||
<string name="save_user_wallet_agreement_access_description">Melde dich bei der App an und überprüfe dein Guthaben, ohne die Karte oder Ring zu scannen</string>
|
||||
<string name="save_user_wallet_agreement_access_title">Zugriff auf die App</string>
|
||||
<string name="save_user_wallet_agreement_allow_biometrics">Nutzung biometrischer Daten zulassen</string>
|
||||
<string name="save_user_wallet_agreement_code_description_biometrics">Bei Interaktionen mit deiner Wallet werden anstelle des Zugangscodes biometrische Daten abgefragt</string>
|
||||
|
|
@ -604,9 +607,9 @@
|
|||
<string name="save_user_wallet_agreement_enroll_biometrics_description">Es sieht so aus, als ob du die biometrische Authentifizierung deaktiviert hast. Diese ist notwendig, um Wallets zu speichern</string>
|
||||
<string name="save_user_wallet_agreement_enroll_biometrics_title">Biometrische Autorisierung aktivieren</string>
|
||||
<string name="save_user_wallet_agreement_header_biometrics">Möchtest du Biometrie nutzen?</string>
|
||||
<string name="save_user_wallet_agreement_notice">Beachte, dass für Transaktionen mit deinem Guthaben weiterhin deine Karte erforderlich ist</string>
|
||||
<string name="scan_card_settings_button">Karte scannen</string>
|
||||
<string name="scan_card_settings_message">Scanne die Karte, um ihre Einstellungen zu ändern. Die Änderungen wirken sich nur auf die von dir gescannte Karte aus und haben keine Auswirkungen auf andere mit deiner Wallet verknüpften Karten.</string>
|
||||
<string name="save_user_wallet_agreement_notice">Beachte, dass für Transaktionen mit deinem Guthaben weiterhin deine Karte oder Ring erforderlich ist</string>
|
||||
<string name="scan_card_settings_button">Karte oder Ring scannen</string>
|
||||
<string name="scan_card_settings_message">Scanne die Karte oder Ring, um ihre Einstellungen zu ändern. Die Änderungen wirken sich nur auf die von dir gescannte Karte oder Ring aus und haben keine Auswirkungen auf andere mit deiner Wallet verknüpften Karten oder Ringe.</string>
|
||||
<string name="scan_card_settings_title">Halte deine Karte bereit!</string>
|
||||
<string name="send_additional_field_already_included">Bereits in der eingegebenen Adresse enthalten</string>
|
||||
<string name="send_alert_fee_too_high_text">Der Provisionsbetrag ist %s mal der empfohlene Betrag. Stelle sicher, dass die benutzerdefinierten Einstellungen korrekt sind.</string>
|
||||
|
|
@ -683,7 +686,7 @@
|
|||
<string name="send_transaction_success">Die Transaktion wurde erfolgreich signiert und an den Blockchain-Knoten gesendet. Die Walletbilanz wird aktualisiert</string>
|
||||
<string name="send_tron_account_activation_error">%1$s ist ein Vermögenswert im Tron-Netzwerk. Um die Gebühr zu berechnen und eine Transaktion durchzuführen, musst du etwas Tron (TRX) auf deinem Konto einzahlen.</string>
|
||||
<string name="sent_transaction_sent_title">Transaktion gesendet</string>
|
||||
<string name="settings_card_settings_footer">Bereite das Scannen der Karte vor, die du einrichten möchtest.</string>
|
||||
<string name="settings_card_settings_footer">Bereite das Scannen der Karte oder Ring vor, die du einrichten möchtest.</string>
|
||||
<string name="settings_forget_wallet">Entferne diese Wallet</string>
|
||||
<string name="settings_forget_wallet_footer">Hiermit wird die Wallet aus der Anwendung entfernt. Die Wallet selbst kann wieder hinzugefügt werden.</string>
|
||||
<string name="settings_wallet_name_title">Name</string>
|
||||
|
|
@ -779,13 +782,13 @@
|
|||
<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>
|
||||
<string name="story_awe_description">Bewahre deine Krypto-Assets sicher auf, während die privaten Schlüssel auf deiner Karte oder Ring bleiben</string>
|
||||
<string name="story_awe_title">Revolutionäre Hardware-Wallet</string>
|
||||
<string name="story_backup_description">Bis zu 3 physische Karten pro Wallet</string>
|
||||
<string name="story_backup_description">Bis zu 3 physische Karten oder Ringe pro Wallet</string>
|
||||
<string name="story_backup_title">Ultrasicheres Backup</string>
|
||||
<string name="story_currencies_description">Eine Hardware-Wallet für deine Bitcoins, Ethereum und viele weitere Währungen gleichzeitig – alles auf einer Karte</string>
|
||||
<string name="story_currencies_description">Eine Hardware-Wallet für deine Bitcoins, Ethereum und viele weitere Währungen gleichzeitig – alles auf einer Karte oder Ring</string>
|
||||
<string name="story_currencies_title">Tausende von Währungen</string>
|
||||
<string name="story_finish_description">Verwende es unterwegs, überall und jederzeit. Keine Kabel oder Batterien. Tippe einfach mit der Karte auf dein Telefon, wenn du Kryptowährung benötigst.</string>
|
||||
<string name="story_finish_description">Verwende es unterwegs, überall und jederzeit. Keine Kabel oder Batterien. Tippe einfach mit der Karte oder Ring auf dein Telefon, wenn du Kryptowährung benötigst.</string>
|
||||
<string name="story_finish_title">Die Wallet für jeden</string>
|
||||
<string name="story_meet_title">Lerne Tangem kennen</string>
|
||||
<string name="story_web3_description">Tausche, kaufen Sie NFTs, vergebe Kredite und tätige Einlagen bei mehr als 100 verschiedenen dezentralen Diensten</string>
|
||||
|
|
@ -842,24 +845,24 @@
|
|||
<string name="transaction_history_transaction_to_address">zu: %s</string>
|
||||
<string name="transaction_history_transaction_validator">Validierer: %s</string>
|
||||
<string name="try_to_load_data_again_button_title">Versuche es erneut</string>
|
||||
<string name="twin_error_same_card">Du hast dieselbe Karte gescannt. Um ein Zwillings-Wallet zu erstellen, musst du die Karte mit der Nummer %d scannen.</string>
|
||||
<string name="twin_error_wrong_twin">Du hast die falsche Doppelkarte gescannt. Bitte versuche eine andere Karte</string>
|
||||
<string name="twins_onboarding_description_format">Die, die du in den Hand hältst, und die andere mit der Nummer %s.\n\nBeide Karten können verwendet werden, um Geld aus dieser Wallet zu versenden.</string>
|
||||
<string name="twins_onboarding_subtitle">Eine Wallet. Zwei Karten.</string>
|
||||
<string name="twins_recreate_button_format">Scanne die Karte Nr. %s</string>
|
||||
<string name="twin_error_same_card">Du hast dieselbe Karte oder Ring gescannt. Um ein Zwillings-Wallet zu erstellen, musst du die Karte oder Ring mit der Nummer %d scannen.</string>
|
||||
<string name="twin_error_wrong_twin">Du hast die falsche Doppelkarte oder Ring gescannt. Bitte versuche eine andere Karte oder Ring</string>
|
||||
<string name="twins_onboarding_description_format">Die, die du in den Hand hältst, und die andere mit der Nummer %s.\n\nBeide Karten oder Ringe können verwendet werden, um Geld aus dieser Wallet zu versenden.</string>
|
||||
<string name="twins_onboarding_subtitle">Eine Wallet. Zwei Karten oder Ringe.</string>
|
||||
<string name="twins_recreate_button_format">Scanne die Karte oder Ring Nr. %s</string>
|
||||
<string name="twins_recreate_title_creating_wallet">Wallet erstellen</string>
|
||||
<string name="twins_recreate_title_format">Scanne die Nr. %s Zwillingskarte</string>
|
||||
<string name="twins_recreate_title_preparing">Karte vorbereiten</string>
|
||||
<string name="twins_recreate_title_format">Scanne die Nr. %s Zwillingskarte oder Ring</string>
|
||||
<string name="twins_recreate_title_preparing">Karte oder Ring vorbereiten</string>
|
||||
<string name="twins_recreate_toolbar">Tangem Twin</string>
|
||||
<string name="twins_recreate_warning">Diese Aktion ist unumkehrbar. Du hast keinen Zugriff mehr auf die alte Wallet.</string>
|
||||
<string name="twins_scan_twin_with_number">Tippe auf die Doppelkarte mit der Nummer %s und entferne sie erst am Ende des Vorgangs.</string>
|
||||
<string name="unlock_wallet_description_full">Verwende %s oder scanne eine Karte, um Zugriff auf deine Wallet zu erhalten.</string>
|
||||
<string name="twins_scan_twin_with_number">Tippe auf die Doppelkarte oder Ring mit der Nummer %s und entferne sie erst am Ende des Vorgangs.</string>
|
||||
<string name="unlock_wallet_description_full">Verwende %s oder scanne eine Karte oder Ring, um Zugriff auf deine Wallet zu erhalten.</string>
|
||||
<string name="user_push_notification_agreement_argument_one">Bleib auf dem Laufenden mit den neuesten Funktionen und Neuigkeiten</string>
|
||||
<string name="user_push_notification_agreement_argument_two">Sei der Erste, der von neuen Aktionen erfährt</string>
|
||||
<string name="user_push_notification_agreement_header">Möchtest du Push-Benachrichtigungen verwenden?</string>
|
||||
<string name="user_wallet_list_add_button">Neues Wallet hinzufügen</string>
|
||||
<string name="user_wallet_list_delete_prompt">Möchtest du diese Wallet wirklich löschen?</string>
|
||||
<string name="user_wallet_list_error_unable_to_unlock">Es ist ein Fehler aufgetreten, bitte scanne deine Karte, um sich anzumelden</string>
|
||||
<string name="user_wallet_list_error_unable_to_unlock">Es ist ein Fehler aufgetreten, bitte scanne deine Karte oder Ring, um sich anzumelden</string>
|
||||
<string name="user_wallet_list_error_wallet_already_saved">Dieses Wallet wurde bereits gespeichert, du kannst ein weiteres hinzufügen</string>
|
||||
<string name="user_wallet_list_rename_popup_error_already_exists">Die Wallet mit dem Namen %s existiert bereits</string>
|
||||
<string name="user_wallet_list_rename_popup_placeholder">Wallet-Name</string>
|
||||
|
|
@ -867,7 +870,7 @@
|
|||
<string name="user_wallet_list_unlock_all">Alle freischalten</string>
|
||||
<string name="user_wallet_list_unlock_all_with">Alle mit %s freischalten</string>
|
||||
<string name="wallet_balance_blockchain_unreachable_try_later">Blockchain ist nicht erreichbar. Versuche es später nochmal</string>
|
||||
<string name="wallet_balance_missing_derivation">Karte scannen</string>
|
||||
<string name="wallet_balance_missing_derivation">Karte oder Ring scannen</string>
|
||||
<string name="wallet_connect_alert_sign_message">Aufforderung zum Signieren einer Nachricht. \n\n %s</string>
|
||||
<string name="wallet_connect_bnb_sign_message">Dapp %1$s, mit der Bitte um\nBNB-Transaktion zu unterzeichnen.\n\n%2$s</string>
|
||||
<string name="wallet_connect_bnb_trade_order_message">Handelsauftrag für %1$s\n Preis: %2$s\n Zu erhaltender Betrag: %3$s\n Zu zahlender Betrag: %4$s</string>
|
||||
|
|
@ -881,7 +884,7 @@
|
|||
<string name="wallet_connect_error_unsupported_blockchains">Sitzungsanfrage enthält nicht unterstützte Blockchains für WalletConnect-Verbindung. Nicht unterstützte Blockchains:\n</string>
|
||||
<string name="wallet_connect_error_unsupported_dapp">Aufgrund der technischen Implementierung kann keine Verbindung zu dieser Dapp hergestellt werden.</string>
|
||||
<string name="wallet_connect_error_with_framework_message">Es ist ein unbekannter Fehler aufgetreten. Fehlermeldung: %s. Wenn das Problem weiterhin besteht, wende dich bitte an unseren Support</string>
|
||||
<string name="wallet_connect_error_wrong_card_selected">Falsche Karte in der Tangem App ausgewählt</string>
|
||||
<string name="wallet_connect_error_wrong_card_selected">Falsche Karte oder Ring in der Tangem App ausgewählt</string>
|
||||
<string name="wallet_connect_failed_to_build_tx">Transaktion aus Dapp-Daten konnte nicht erstellt werden. Code: %s</string>
|
||||
<string name="wallet_connect_generic_error_with_code">Es ist ein unbekannter Fehler aufgetreten. Fehlercode: %d. Wenn das Problem weiterhin besteht, wende dich bitte an unseren Support</string>
|
||||
<string name="wallet_connect_no_sessions_message">Keine geöffneten WalletConnect-Sitzungen</string>
|
||||
|
|
@ -892,7 +895,7 @@
|
|||
<string name="wallet_connect_request_session_start">Anfrage zum Starten einer Sitzung für\n %1$s\n\n NETZWERK: %2$s \n\n URL: %3$s</string>
|
||||
<string name="wallet_connect_same_wcuri">Der Vorgang konnte nicht abgeschlossen werden. \n\nDu hast bereits eine WalletConnect-Sitzung mit diesen Parametern hergestellt.</string>
|
||||
<string name="wallet_connect_scan_new_code">Neuen Code scannen</string>
|
||||
<string name="wallet_connect_scanner_error_not_valid_card">Mit dieser Karte kann keine WalletConnect-Sitzung hergestellt werden</string>
|
||||
<string name="wallet_connect_scanner_error_not_valid_card">Mit dieser Karte oder Ring kann keine WalletConnect-Sitzung hergestellt werden</string>
|
||||
<string name="wallet_connect_scanner_error_unsupported_network">Dieses Netzwerk wird nicht unterstützt. Bitte wähle ein anderes Netzwerk.</string>
|
||||
<string name="wallet_connect_select_network">Netzwerk auswählen</string>
|
||||
<string name="wallet_connect_sessions_title">WalletConnect-Sitzungen</string>
|
||||
|
|
@ -906,10 +909,10 @@
|
|||
<string name="wallet_notification_no_internet">Keine Internetverbindung</string>
|
||||
<string name="wallet_settings_title">Wallet-Einstellungen</string>
|
||||
<string name="wallet_title">Tangem</string>
|
||||
<string name="warning_access_denied_message">Verwende %s oder scanne eine Karte, um den Zugriff auf deine Wallet freizuschalten.</string>
|
||||
<string name="warning_access_denied_message">Verwende %s oder scanne eine Karte oder Ring, um den Zugriff auf deine Wallet freizuschalten.</string>
|
||||
<string name="warning_approval_in_progress_message">Das Genehmigungsverfahren ist derzeit im Gange und wird in Kürze abgeschlossen sein</string>
|
||||
<string name="warning_approval_in_progress_title">Genehmigung läuft</string>
|
||||
<string name="warning_backup_errors_message">Es scheint, dass die Aktivierung der Karte nicht korrekt abgeschlossen wurde. Dies kann an einem Problem mit dem NFC-Modul deines Gerätes oder an einem falschen Tippen der Karte auf dein Gerät liegen. Bitte wende dich an unser Support-Team, um Unterstützung zu erhalten.</string>
|
||||
<string name="warning_backup_errors_message">Es scheint, dass die Aktivierung der Karte oder des Rings nicht korrekt abgeschlossen wurde. Dies kann an einem Problem mit dem NFC-Modul deines Gerätes oder an einem falschen Tippen der Karte oder Ring auf dein Gerät liegen. Bitte wende dich an unser Support-Team, um Unterstützung zu erhalten.</string>
|
||||
<string name="warning_backup_errors_title">Aktivierungsfehler</string>
|
||||
<string name="warning_beacon_chain_retirement_content">Laut den Entwicklern des BNB-Netzes wird die Unterstützung für den BEP-2-Standard im Juni 2024 enden. Um den Verlust von Vermögenswerten mit diesem Standard zu vermeiden, konvertiere bitte in den BEP-20 Standard. Nutze gerne unseren Swap-Service, um sie auf das BNB Smart Chain Netzwerk zu übertragen.</string>
|
||||
<string name="warning_beacon_chain_retirement_title">BNB Beacon Chain wird abgeschaltet</string>
|
||||
|
|
@ -922,7 +925,7 @@
|
|||
<string name="warning_button_refresh">Aktualisieren</string>
|
||||
<string name="warning_demo_mode_message">Du befindest sich derzeit im Demo-Modus</string>
|
||||
<string name="warning_demo_mode_title">Demo-Modus aktiv</string>
|
||||
<string name="warning_developer_card_message">Die Karte, die du gescannt hast, ist eine Entwicklerkarte. Verwenden diese nicht zur Erstellung Ihrer Wallet.</string>
|
||||
<string name="warning_developer_card_message">Die Karte oder Ring, die du gescannt hast, ist eine Entwicklerkarte. Verwenden diese nicht zur Erstellung Ihrer Wallet.</string>
|
||||
<string name="warning_developer_card_title">Nicht für Benutzer!</string>
|
||||
<string name="warning_existential_deposit_message">%1$s Netzwerk erfordert eine Mindesteinlage. Wenn dein Konto unter %2$s fällt, wird es deaktiviert und alle verbleibenden Guthaben werden vernichtet.</string>
|
||||
<string name="warning_existential_deposit_title">Netzwerk erfordert eine Mindesteinzahlung</string>
|
||||
|
|
@ -942,21 +945,21 @@
|
|||
<string name="warning_express_too_maximum_amount_title">Die Menge der zu tauschenden Token darf folgende Werte nicht überschreiten %s</string>
|
||||
<string name="warning_express_too_minimal_amount_title">Der zu tauschende Betrag muss mindestens %s betragen</string>
|
||||
<string name="warning_express_wrong_amount_description">Bitte änder den zu tauschenden Betrag</string>
|
||||
<string name="warning_failed_to_verify_card_message">Bei dieser Karte kann es sich um ein Produktionsmuster oder eine Fälschung handeln</string>
|
||||
<string name="warning_failed_to_verify_card_message">Bei dieser Karte oder Ring kann es sich um ein Produktionsmuster oder eine Fälschung handeln</string>
|
||||
<string name="warning_failed_to_verify_card_title">Echtheitsprüfung fehlgeschlagen</string>
|
||||
<string name="warning_hedera_missing_token_association_button_title">zuordnen</string>
|
||||
<string name="warning_hedera_missing_token_association_message">Dieser Token muss mit Ihrem Hedera-Konto verbunden sein, bevor du diesen erhalten kannst. Zuordnungsgebühr ~%1$s %2$s</string>
|
||||
<string name="warning_hedera_missing_token_association_message_brief">Dieses Token muss mit deinem Hedera-Konto verknüpft sein, bevor du ihn erhalten kannst.</string>
|
||||
<string name="warning_hedera_missing_token_association_title">Verknüpfe deinen Token</string>
|
||||
<string name="warning_hedera_token_association_not_enough_hbar_message">Nicht genug %s. Lade dein Hedera-Konto auf, um dieses Token zuzuordnen</string>
|
||||
<string name="warning_low_signatures_message">Auf dieser Karte sind nur noch %s Unterschriften übrig. Du musst dein gesamtes Guthaben abheben.</string>
|
||||
<string name="warning_low_signatures_message">Auf dieser Karte oder Ring oder Ring sind nur noch %s Unterschriften übrig. Du musst dein gesamtes Guthaben abheben.</string>
|
||||
<string name="warning_low_signatures_title">Geringe Anzahl von Unterschriften</string>
|
||||
<string name="warning_manage_tokens_legacy_derivation_message">Token in verschiedenen Netzwerken können unterschiedliche Adressen haben. Überprüfe bei der Überweisung noch einmal, ob deine Adresse mit der des Netzwerks übereinstimmt.</string>
|
||||
<string name="warning_matic_migration_message">MATIC wird auf POL migriert. Es gibt jedoch keine Frist, und MATIC wird noch nicht abgeschafft. Du kannst MATIC-Token weiterhin verwenden oder sie über eien Exchange gegen POL tauschen.</string>
|
||||
<string name="warning_matic_migration_title">Migration von MATIC zu POL</string>
|
||||
<plurals name="warning_missing_derivation_message">
|
||||
<item quantity="one">Verwende deine Karte, um eine Adresse für das %d-Netz zu erhalten</item>
|
||||
<item quantity="other">Verwende deine Karte, um mehrere Adressen für die %d-Netzwerke zu erhalten</item>
|
||||
<item quantity="one">Verwende deine Karte oder Ring, um eine Adresse für das %d-Netz zu erhalten</item>
|
||||
<item quantity="other">Verwende deine Karte oder Ring, um mehrere Adressen für die %d-Netzwerke zu erhalten</item>
|
||||
</plurals>
|
||||
<string name="warning_missing_derivation_title">Einige Adressen fehlen</string>
|
||||
<string name="warning_network_unreachable_message">Das Netzwerk ist derzeit nicht erreichbar. Bitte versuchen Sie es später erneut.</string>
|
||||
|
|
@ -964,8 +967,8 @@
|
|||
<string name="warning_no_account_title">Lade dein Guthaben auf</string>
|
||||
<string name="warning_no_backup_message">Deine Wallet wurde nicht gesichert. Führe diesen Vorgang durch, um dein Vermögen jetzt zu schützen.</string>
|
||||
<string name="warning_no_backup_title">Fehlende Sicherung</string>
|
||||
<string name="warning_number_of_signed_hashes_incorrect_message">Diese Karte wurde bereits für Transaktionen verwendet. Wenn die Karte aus einer nicht vertrauenswürdigen Quelle stammt, solltest du den gesamten Betrag abheben. Wenn es sich um deine Karte handelt, sind keine Maßnahmen erforderlich.</string>
|
||||
<string name="warning_number_of_signed_hashes_incorrect_title">Karte hat bereits Transaktionen unterzeichnet</string>
|
||||
<string name="warning_number_of_signed_hashes_incorrect_message">Diese Karte oder Ring wurde bereits für Transaktionen verwendet. Wenn die Karte oder Ring aus einer nicht vertrauenswürdigen Quelle stammt, solltest du den gesamten Betrag abheben. Wenn es sich um deine Karte oder Ring handelt, sind keine Maßnahmen erforderlich.</string>
|
||||
<string name="warning_number_of_signed_hashes_incorrect_title">Karte oder Ring hat bereits Transaktionen unterzeichnet</string>
|
||||
<string name="warning_rate_app_message">Deine Bewertung motiviert uns, die Tangem Wallet noch besser zu machen.</string>
|
||||
<string name="warning_rate_app_title">Gefällt dir Tangem?</string>
|
||||
<string name="warning_receive_blocked_hedera_token_association_required_message">Du musst deinen Token zuordnen, bevor du Token erhalten kannst</string>
|
||||
|
|
@ -977,17 +980,17 @@
|
|||
<string name="warning_solana_rent_fee_message">Das Solana-Netzwerk erhebt alle 2 Tage eine Miete von %1$s. Konten, die sich die Miete nicht leisten können, werden aus dem Netzwerk gelöscht. Hinterlege deinem Konto mit mehr als %2$s, um es kostenlos zu nutzen.</string>
|
||||
<string name="warning_some_networks_unreachable_message">Einige Netzwerke sind derzeit nicht erreichbar. Bitte versuche es später erneut.</string>
|
||||
<string name="warning_some_networks_unreachable_title">Einige Netzwerke sind nicht erreichbar</string>
|
||||
<string name="warning_testnet_card_message">Dies ist eine Testnet-Karte. Sie kann keine Transaktionen verarbeiten und sollte nur zu Test- und Entwicklungszwecken verwendet werden.</string>
|
||||
<string name="warning_testnet_card_message">Dies ist eine Testnet-Karte oder Ring. Sie kann keine Transaktionen verarbeiten und sollte nur zu Test- und Entwicklungszwecken verwendet werden.</string>
|
||||
<string name="warning_testnet_card_title">Nur für Testzwecke</string>
|
||||
<string name="welcome_interrupted_backup_alert_discard">Verwerfen</string>
|
||||
<string name="welcome_interrupted_backup_alert_message">Du hast eine unterbrochene Sicherung. Möchtest du diese fortsetzen?</string>
|
||||
<string name="welcome_interrupted_backup_alert_resume">Ja, fortsetzen</string>
|
||||
<string name="welcome_interrupted_backup_discard_discard">Verwerfen</string>
|
||||
<string name="welcome_interrupted_backup_discard_message">Wenn du das Backup jetzt abbrichst, musst du die Karten auf die Werkseinstellungen zurücksetzen, um von vorne zu beginnen</string>
|
||||
<string name="welcome_interrupted_backup_discard_message">Wenn du das Backup jetzt abbrichst, musst du die Karten oder Ringe auf die Werkseinstellungen zurücksetzen, um von vorne zu beginnen</string>
|
||||
<string name="welcome_interrupted_backup_discard_resume">Sicherung fortsetzen</string>
|
||||
<string name="welcome_interrupted_backup_discard_title">Dies ist eine unwiderrufliche Aktion</string>
|
||||
<string name="welcome_unlock">Anmelden mit %s</string>
|
||||
<string name="welcome_unlock_card">Karte scannen</string>
|
||||
<string name="welcome_unlock_description">Verwenden %s oder scanne eine Karte, um auf die App zuzugreifen</string>
|
||||
<string name="welcome_unlock_card">Karte oder Ring scannen</string>
|
||||
<string name="welcome_unlock_description">Verwenden %s oder scanne eine Karte oder Ring, um auf die App zuzugreifen</string>
|
||||
<string name="welcome_unlock_title">Willkommen zurück!</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@
|
|||
<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 portafolio</string>
|
||||
<string name="markets_add_to_my_portfolio_unavailable_description">Este activo no está disponible</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>
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@
|
|||
<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 acheter, échanger ou recevoir cet actif, ajoutez-le à votre portefeuille</string>
|
||||
<string name="markets_add_to_my_portfolio_unavailable_description">Cet actif n\'est pas disponible</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,8 +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 bénéficient de 3 échanges sans commission sur Changelly jusqu\'au 15/11 !</string>
|
||||
<string name="ring_promo_title">Échangez avec 0 %% de frais maintenant!</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 !</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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -132,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>
|
||||
|
|
@ -209,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>
|
||||
|
|
@ -226,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>
|
||||
|
|
@ -283,11 +284,11 @@
|
|||
<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>
|
||||
|
|
@ -301,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>
|
||||
|
|
@ -323,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>
|
||||
|
|
@ -356,7 +358,7 @@
|
|||
<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>
|
||||
|
|
@ -446,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>
|
||||
|
|
@ -461,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>
|
||||
|
|
@ -498,27 +502,30 @@
|
|||
<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_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">バックアップカードが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>
|
||||
|
|
@ -526,7 +533,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>
|
||||
|
|
@ -575,13 +582,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>
|
||||
|
|
@ -589,10 +596,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>
|
||||
|
|
@ -668,7 +675,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>
|
||||
|
|
@ -692,7 +699,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>
|
||||
|
|
@ -744,7 +751,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>
|
||||
|
|
@ -764,13 +771,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>
|
||||
|
|
@ -838,13 +845,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>
|
||||
|
|
@ -852,7 +859,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>
|
||||
|
|
@ -866,7 +873,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>
|
||||
|
|
@ -891,10 +898,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>
|
||||
|
|
@ -940,7 +947,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>
|
||||
|
|
@ -967,11 +974,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>
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
<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_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>
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
<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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -222,7 +223,7 @@
|
|||
<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>
|
||||
|
|
@ -496,7 +497,7 @@
|
|||
<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>
|
||||
|
|
@ -534,11 +535,14 @@
|
|||
<string name="onboarding_subtitle_scan_backup_card_format">Подготовьте резервную карту с номером %s</string>
|
||||
<string name="onboarding_subtitle_scan_primary">Отсканируйте основную карту или кольцо, чтобы начать процесс резервного копирования.</string>
|
||||
<string name="onboarding_subtitle_scan_primary_card_format">Подготовьте основную карту с номером %s</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_scan_origin_card">Подготовьте свою карту</string>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
<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_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 device in this wallet?</string>
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
<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>
|
||||
|
|
@ -219,7 +219,7 @@
|
|||
<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>
|
||||
|
|
@ -488,7 +488,7 @@
|
|||
<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 or ring. 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>
|
||||
|
|
@ -522,11 +522,14 @@
|
|||
<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 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_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 or rings</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 device added</string>
|
||||
<string name="onboarding_title_scan_origin_card">Prepare your card</string>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
BIN
core/ui/src/main/res/drawable/img_card_with_ring.webp
Normal file
BIN
core/ui/src/main/res/drawable/img_card_with_ring.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
BIN
core/ui/src/main/res/drawable/img_ring_promo_background.webp
Normal file
BIN
core/ui/src/main/res/drawable/img_ring_promo_background.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -47,11 +51,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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -17,6 +17,7 @@ dependencies {
|
|||
|
||||
implementation(projects.domain.balanceHiding.models)
|
||||
implementation(projects.domain.settings)
|
||||
implementation(projects.domain.wallets.models)
|
||||
|
||||
implementation(deps.androidx.datastore)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
@ -25,7 +25,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?
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ interface WalletManagersFacade {
|
|||
suspend fun associateAsset(
|
||||
userWalletId: UserWalletId,
|
||||
currency: CryptoCurrency,
|
||||
signer: CommonSigner,
|
||||
signer: TransactionSigner,
|
||||
): SimpleResult
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -323,5 +323,6 @@ data class CardDTO(
|
|||
|
||||
companion object {
|
||||
val RING_BATCH_IDS = listOf("AC17", "BA01")
|
||||
const val RING_BATCH_PREFIX = "BA"
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -7,4 +7,5 @@ dependencies {
|
|||
implementation(deps.kotlin.coroutines)
|
||||
implementation(deps.arrow.core)
|
||||
implementation(projects.domain.balanceHiding.models)
|
||||
implementation(projects.domain.wallets.models)
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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,21 +61,37 @@ 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(),
|
||||
token = pendingTransaction.token,
|
||||
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(),
|
||||
token = pendingTransaction.token,
|
||||
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?,
|
||||
)
|
||||
}
|
||||
|
|
@ -39,5 +39,6 @@ sealed class TokenSwapPromoAnalyticsEvent(
|
|||
enum class ProgramName {
|
||||
Travala,
|
||||
OKX,
|
||||
Ring,
|
||||
}
|
||||
}
|
||||
|
|
@ -9,4 +9,6 @@ interface PromoRepository {
|
|||
suspend fun getTravalaPromoBanner(): PromoBanner?
|
||||
|
||||
suspend fun getOkxPromoBanner(): PromoBanner?
|
||||
|
||||
suspend fun getRingPromoBanner(): PromoBanner?
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -37,11 +37,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,
|
||||
|
|
@ -186,6 +185,7 @@ internal class DefaultSwapRepository @Inject constructor(
|
|||
}
|
||||
|
||||
override suspend fun findBestQuote(
|
||||
userWalletId: UserWalletId,
|
||||
fromContractAddress: String,
|
||||
fromNetwork: String,
|
||||
toContractAddress: String,
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ interface SwapRepository {
|
|||
|
||||
@Suppress("LongParameterList")
|
||||
suspend fun findBestQuote(
|
||||
userWalletId: UserWalletId,
|
||||
fromContractAddress: String,
|
||||
fromNetwork: String,
|
||||
toContractAddress: String,
|
||||
|
|
|
|||
|
|
@ -308,6 +308,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(),
|
||||
|
|
@ -1178,14 +1179,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,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -11,10 +11,7 @@ import com.tangem.domain.feedback.SendFeedbackEmailUseCase
|
|||
import com.tangem.domain.feedback.models.FeedbackEmailType
|
||||
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
|
||||
|
|
@ -62,6 +59,8 @@ internal interface WalletWarningsClickIntents {
|
|||
|
||||
fun onCloseSwapPromoClick()
|
||||
|
||||
fun onCloseRingPromoClick()
|
||||
|
||||
fun onTravalaPromoClick(link: String?)
|
||||
|
||||
fun onCloseTravalaPromoClick()
|
||||
|
|
@ -86,6 +85,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,
|
||||
private val getCardInfoUseCase: GetCardInfoUseCase,
|
||||
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
|
||||
|
|
@ -242,6 +242,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(
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ markdownComposeView = "0.5.4"
|
|||
# region Tangem
|
||||
tangemBlockchainSdk = "develop-817"
|
||||
#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds
|
||||
tangemCardSdk = "develop-387"
|
||||
tangemCardSdk = "develop-391"
|
||||
#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 ^
|
||||
|
|
|
|||
|
|
@ -5,4 +5,6 @@ interface ExpressAuthProvider {
|
|||
fun getUserId(): String
|
||||
|
||||
fun getSessionId(): String
|
||||
|
||||
fun getRefCode(): String
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue