diff --git a/app/build.gradle b/app/build.gradle index d08be40ffd..10d64081b7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,9 +75,9 @@ dependencies { implementation 'com.google.android.play:core-ktx:1.8.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation 'com.tangem:blockchain:develop-43' - implementation 'com.tangem.tangem-sdk-kotlin:core:develop-92' - implementation 'com.tangem.tangem-sdk-kotlin:android:develop-92' + implementation 'com.tangem:blockchain:develop-44' + implementation 'com.tangem.tangem-sdk-kotlin:core:develop-94' + implementation 'com.tangem.tangem-sdk-kotlin:android:develop-94' // WebView implementation "androidx.browser:browser:1.3.0" diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index 33aa1e1b4d..cae1861582 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -80,6 +80,7 @@ class ConfigManager( moonPayApiKey = values.moonPayApiKey, moonPayApiSecretKey = values.moonPayApiSecretKey, blockchainSdkConfig = BlockchainSdkConfig( + blockchairApiKey = values.blockchairApiKey, blockchairAuthorizationToken = values.blockchairAuthorizationToken, blockcypherTokens = values.blockcypherTokens, infuraProjectId = values.infuraProjectId @@ -90,6 +91,7 @@ class ConfigManager( moonPayApiKey = values.moonPayApiKey, moonPayApiSecretKey = values.moonPayApiSecretKey, blockchainSdkConfig = BlockchainSdkConfig( + blockchairApiKey = values.blockchairApiKey, blockchairAuthorizationToken = values.blockchairAuthorizationToken, blockcypherTokens = values.blockcypherTokens, infuraProjectId = values.infuraProjectId diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index d0f99ccabc..c71a4a16dd 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -15,6 +15,7 @@ class ConfigValueModel( val coinMarketCapKey: String, val moonPayApiKey: String, val moonPayApiSecretKey: String, + val blockchairApiKey: String?, val blockchairAuthorizationToken: String?, val blockcypherTokens: Set?, val infuraProjectId: String?, diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index fa6a74564b..74dc69a99c 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -11,6 +11,8 @@ import com.tangem.common.card.WalletData import com.tangem.common.core.CardSession import com.tangem.common.core.CardSessionRunnable import com.tangem.common.core.TangemError +import com.tangem.common.core.TangemSdkError +import com.tangem.common.extensions.guard import com.tangem.common.extensions.toHexString import com.tangem.operations.CommandResponse import com.tangem.operations.PreflightReadMode @@ -63,26 +65,32 @@ class ScanProductTask(val card: Card? = null) : CardSessionRunnable) -> Unit, ) { - ScanTask().run(session) { result -> - when (result) { - is CompletionResult.Success -> { - val card = this.card ?: result.data + val card = this.card ?: session.environment.card.guard { + callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead())) + return + } - val error = getErrorIfExcludedCard(card) - if (error != null) { - callback(CompletionResult.Failure(error)) - return@run - } + val error = getErrorIfExcludedCard(card) + if (error != null) { + callback(CompletionResult.Failure(error)) + return + } - val commandProcessor = when { - TapWorkarounds.isTangemNote(card) -> ScanNoteProcessor() - card.isTangemTwins() -> ScanTwinProcessor() - TapWorkarounds.isTangemWallet(card) -> ScanWalletProcessor() - else -> ScanOtherCardsProcessor() + val commandProcessor = when { + TapWorkarounds.isTangemNote(card) -> ScanNoteProcessor() + card.isTangemTwins() -> ScanTwinProcessor() + TapWorkarounds.isTangemWallet(card) -> ScanWalletProcessor() + else -> ScanOtherCardsProcessor() + } + commandProcessor.proceed(card, session) { processorResult -> + when (processorResult) { + is CompletionResult.Success -> ScanTask().run(session) { scanTaskResult -> + when (scanTaskResult) { + is CompletionResult.Success -> callback(CompletionResult.Success(processorResult.data)) + is CompletionResult.Failure -> callback(CompletionResult.Failure(scanTaskResult.error)) } - commandProcessor.proceed(card, session, callback) } - is CompletionResult.Failure -> callback(CompletionResult.Failure(result.error)) + is CompletionResult.Failure -> callback(CompletionResult.Failure(processorResult.error)) } } } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt index 18ea01ebbc..3cdf911dab 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt @@ -120,7 +120,10 @@ class CurrenciesRepository(val context: Application) { return tokensAdapter.fromJson(ethereumTokensJson)!!.map { it.toToken() } + tokensAdapter.fromJson(bscTokensJson)!!.map { it.toToken() } + - tokensAdapter.fromJson(binanceTokensJson)!!.map { it.toToken() } + tokensAdapter.fromJson(binanceTokensJson)!!.mapNotNull { + // temporary exclude Binance BEP-8 tokens + if (it.type != null && it.type != BINANCE_TOKEN_TYPE_BEP8) it.toToken() else null + } } fun getBlockchains( @@ -144,6 +147,8 @@ class CurrenciesRepository(val context: Application) { private const val FILE_NAME_PREFIX_TOKENS = "tokens" private const val FILE_NAME_PREFIX_BLOCKCHAINS = "blockchains" + private const val BINANCE_TOKEN_TYPE_BEP8 = "bep8" + fun getFileNameForTokens(cardId: String): String = "${FILE_NAME_PREFIX_TOKENS}_$cardId" fun getFileNameForBlockchains(cardId: String): String = "${FILE_NAME_PREFIX_BLOCKCHAINS}_$cardId" @@ -157,7 +162,8 @@ data class TokenDao( val contractAddress: String, val decimalCount: Int, @Json(name = "blockchain") - val blockchainDao: BlockchainDao + val blockchainDao: BlockchainDao, + val type: String? = null ) { fun toToken(): Token { return Token( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 0c0892b176..50981fa8ef 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -135,7 +135,7 @@ data class WalletState( if (walletData == null) return wallets var changed = false val updatedWallets = wallets.map { - if (it.currencyData.currency == walletData.currencyData.currency) { + if (it.currency == walletData.currency) { changed = true walletData } else { @@ -149,7 +149,7 @@ data class WalletState( val remainingWallets: MutableList = newWallets.toMutableList() val updatedWallets = wallets.map { wallet -> val newWallet = newWallets - .firstOrNull { wallet.currencyData.currency == it.currencyData.currency } + .firstOrNull { wallet.currency == it.currency } if (newWallet == null) { wallet } else { @@ -242,7 +242,7 @@ data class WalletData( val fiatRateString: String? = null, val fiatRate: BigDecimal? = null, val mainButton: WalletMainButton = WalletMainButton.SendButton(false), - val currency: Currency? = null + val currency: Currency ) { fun shouldShowMultipleAddress(): Boolean { val listOfAddresses = walletAddresses?.list ?: return false diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index 8db9dcf9f8..e0f1fec69b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -105,7 +105,8 @@ class MultiWalletReducer { } ), pendingTransactions = pendingTransactions.removeUnknownTransactions(), - mainButton = WalletMainButton.SendButton(sendButtonEnabled) + mainButton = WalletMainButton.SendButton(sendButtonEnabled), + currency = Currency.Token(action.token) ) val wallets = state.replaceWalletInWallets(newTokenWalletData) state.copy(wallets = wallets) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt index 145bcbcbc2..017597cbb0 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt @@ -3,12 +3,15 @@ package com.tangem.tap.features.wallet.redux.reducers import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Wallet import com.tangem.common.extensions.isZero -import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.extensions.toFiatString +import com.tangem.tap.common.extensions.toFiatValue +import com.tangem.tap.common.extensions.toFormattedCurrencyString +import com.tangem.tap.common.extensions.toFormattedFiatValue import com.tangem.tap.domain.getFirstToken import com.tangem.tap.features.wallet.models.removeUnknownTransactions import com.tangem.tap.features.wallet.models.toPendingTransactions +import com.tangem.tap.features.wallet.redux.Currency import com.tangem.tap.features.wallet.redux.ProgressState -import com.tangem.tap.features.wallet.redux.WalletData import com.tangem.tap.features.wallet.redux.WalletMainButton import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.ui.BalanceStatus @@ -49,9 +52,9 @@ class OnWalletLoadedReducer { BalanceStatus.VerifiedOnline } val walletData = walletState.getWalletData(wallet.blockchain) - ?: WalletData() - val fiatAmount = walletData.fiatRate?.let { amount?.toFiatValue(it) } - val newWalletData = walletData.copy( + + val fiatAmount = walletData?.fiatRate?.let { amount?.toFiatValue(it) } + val newWalletData = walletData?.copy( currencyData = walletData.currencyData.copy( status = balanceStatus, currency = wallet.blockchain.fullName, currencySymbol = wallet.blockchain.currency, @@ -60,7 +63,8 @@ class OnWalletLoadedReducer { fiatAmountFormatted = fiatAmount?.toFormattedFiatValue(fiatCurrencySymbol) ), pendingTransactions = pendingTransactions.removeUnknownTransactions(), - mainButton = WalletMainButton.SendButton(sendButtonEnabled) + mainButton = WalletMainButton.SendButton(sendButtonEnabled), + currency = Currency.Blockchain(wallet.blockchain) ) val tokens = wallet.getTokens().mapNotNull { token -> @@ -87,7 +91,8 @@ class OnWalletLoadedReducer { mainButton = WalletMainButton.SendButton(sendButtonEnabled) ) } - val wallets = walletState.replaceSomeWallets((tokens + newWalletData)) + val newWallets = (tokens + newWalletData).mapNotNull { it } + val wallets = walletState.replaceSomeWallets((newWallets)) val state = if (wallets.any { it.currencyData.status == BalanceStatus.Loading }) { ProgressState.Loading diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index ff5f728052..7cd2259e47 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.wallet.redux.reducers import com.tangem.blockchain.common.AmountType +import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Wallet import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.AppState @@ -44,6 +45,7 @@ private fun internalReduce(action: Action, state: AppState): WalletState { WalletData( currencyData = BalanceWidgetData(BalanceStatus.EmptyCard), mainButton = WalletMainButton.CreateWalletButton(true), + currency = Currency.Blockchain(Blockchain.Unknown) ) ) ) @@ -71,6 +73,7 @@ private fun internalReduce(action: Action, state: AppState): WalletState { wallets = listOf( WalletData( currencyData = BalanceWidgetData(BalanceStatus.UnknownBlockchain), + currency = Currency.Blockchain(Blockchain.Unknown) ) ) )