From 089a606b7a656605cf6532da741b804b60f08c61 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 24 Jun 2022 19:04:44 +0400 Subject: [PATCH 01/33] Updated on 2026-08-14 --- .../tap/domain/walletconnect/EthSignHelper.kt | 35 +++++-- .../walletconnect/WalletConnectManager.kt | 76 +++++++++++---- .../walletconnect/WcWalletManagerFactory.kt | 95 +++++++++++++++++++ .../walletconnect/WalletConnectAction.kt | 11 +++ .../walletconnect/WalletConnectMiddleware.kt | 84 ++++++++-------- .../walletconnect/WalletConnectReducer.kt | 5 + .../tap/features/wallet/redux/WalletState.kt | 3 + 7 files changed, 248 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/domain/walletconnect/WcWalletManagerFactory.kt diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt index fe8a593787..b366229775 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/EthSignHelper.kt @@ -1,11 +1,13 @@ package com.tangem.tap.domain.walletconnect import com.github.salomonbrys.kotson.fromJson +import com.github.salomonbrys.kotson.toMap import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonArray import com.google.gson.JsonParser import com.google.gson.annotations.SerializedName +import com.tangem.blockchain.common.Blockchain import com.trustwallet.walletconnect.JSONRPC_VERSION import com.trustwallet.walletconnect.models.ethereum.WCEthereumSignMessage @@ -18,9 +20,11 @@ class EthSignHelper { .create() } - fun tryToParseEthTypedMessage(data: String): WCEthereumSignMessage? { - val request = - gson.fromJson(data) + fun parseCustomRequest(data: String): CustomJsonRpcRequest { + return gson.fromJson(data) + } + + fun tryToParseEthTypedMessage(request: CustomJsonRpcRequest): WCEthereumSignMessage? { return if (request.method == WCMethodExtended.ETH_SIGN_TYPE_DATA_V4) { WCEthereumSignMessage( listOf( @@ -53,12 +57,26 @@ class EthSignHelper { } } -data class CustomJsonRpcRequests( +data class CustomJsonRpcRequest( val id: Long, val jsonrpc: String = JSONRPC_VERSION, val method: WCMethodExtended?, val params: JsonArray -) +) { + + fun blockchainFromChainId(): Blockchain? { + return try { + val hex = params[0].asJsonObject.toMap()[CHAIN_ID_KEY]?.asString ?: "" + Blockchain.fromChainId(Integer.decode(hex)) + } catch (exception: Exception) { + null + } + } + + companion object { + const val CHAIN_ID_KEY = "chainId" + } +} enum class WCMethodExtended { @SerializedName("wc_sessionRequest") @@ -95,5 +113,10 @@ enum class WCMethodExtended { GET_ACCOUNTS, @SerializedName("trust_signTransaction") - SIGN_TRANSACTION; + SIGN_TRANSACTION, + + @SerializedName("wallet_switchEthereumChain") + SWITCH_CHAIN, + + ; } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt index dd94266b06..40ef0df234 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt @@ -11,14 +11,20 @@ import com.tangem.tap.store import com.tangem.tap.walletConnectRepository import com.trustwallet.walletconnect.WCClient import com.trustwallet.walletconnect.models.WCPeerMeta -import com.trustwallet.walletconnect.models.binance.* +import com.trustwallet.walletconnect.models.binance.WCBinanceCancelOrder +import com.trustwallet.walletconnect.models.binance.WCBinanceTradeOrder +import com.trustwallet.walletconnect.models.binance.WCBinanceTransferOrder +import com.trustwallet.walletconnect.models.binance.WCBinanceTxConfirmParam import com.trustwallet.walletconnect.models.ethereum.WCEthereumSignMessage import com.trustwallet.walletconnect.models.ethereum.WCEthereumTransaction import com.trustwallet.walletconnect.models.session.WCSession import com.trustwallet.walletconnect.models.session.WCSessionUpdate import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import okhttp3.* +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response import okhttp3.logging.HttpLoggingInterceptor import timber.log.Timber import java.util.* @@ -71,6 +77,22 @@ class WalletConnectManager { } } + fun updateBlockchain(session: WalletConnectSession) { + sessions[session.session]?.client?.updateSession( + accounts = listOfNotNull(session.getAddress()), + chainId = session.wallet.blockchain?.getChainId(), + approved = true + ) + + + val updatedSession = sessions[session.session]?.copy( + wallet = session.wallet + ) + if (updatedSession != null) { + sessions[session.session] = updatedSession + } + } + private fun setupConnectionTimeoutCheck(session: WCSession) { scope.launch { delay(20_000) @@ -409,23 +431,43 @@ class WalletConnectManager { Timber.d("Custom Request") Timber.d(data) - val message = EthSignHelper.tryToParseEthTypedMessage(data) - if (message != null) { - Timber.d("onEthSign_v4: $message") - store.state.globalState.analyticsHandlers?.logWcEvent( - Analytics.WcAnalyticsEvent.Action( - Analytics.WcAction.PersonalSign + val request = EthSignHelper.parseCustomRequest(data) + + when (request.method) { + WCMethodExtended.ETH_SIGN_TYPE_DATA_V4 -> handleTypedDataV4(request, client, id) + WCMethodExtended.SWITCH_CHAIN -> { + val blockchain = request.blockchainFromChainId() + Timber.d("WC switch chainID\nNew Blockchain: $blockchain") + val session = sessions[client.session]?.toWalletConnectSession() + if (session != null) { + store.dispatchOnMain(WalletConnectAction.SwitchBlockchain(blockchain, session)) + } + } + else -> { + + } + } + } + + } + + private fun handleTypedDataV4(request: CustomJsonRpcRequest, client: WCClient, id: Long) { + val message = EthSignHelper.tryToParseEthTypedMessage(request) + if (message != null) { + Timber.d("onEthSign_v4: $message") + store.state.globalState.analyticsHandlers?.logWcEvent( + Analytics.WcAnalyticsEvent.Action( + Analytics.WcAction.PersonalSign + ) + ) + sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> + store.dispatchOnMain( + WalletConnectAction.HandlePersonalSignRequest( + message, + sessionData, + id ) ) - sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> - store.dispatchOnMain( - WalletConnectAction.HandlePersonalSignRequest( - message, - sessionData, - id - ) - ) - } } } } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WcWalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WcWalletManagerFactory.kt new file mode 100644 index 0000000000..7c978b7b6f --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WcWalletManagerFactory.kt @@ -0,0 +1,95 @@ +package com.tangem.tap.domain.walletconnect + +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.WalletManagerFactory +import com.tangem.common.card.EllipticCurve +import com.tangem.domain.common.ScanResponse +import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.tap.domain.extensions.getPrimaryCurve +import com.tangem.tap.domain.extensions.makeWalletManagerForApp +import com.tangem.tap.domain.tokens.CurrenciesRepository +import com.tangem.tap.domain.tokens.models.BlockchainNetwork +import com.tangem.tap.features.details.redux.walletconnect.WalletForSession +import com.tangem.tap.features.wallet.redux.WalletState + +class WcWalletManagerFactory( + private val factory: WalletManagerFactory, + private val currenciesRepository: CurrenciesRepository, + ) { + + suspend fun getWalletManager( + wallet: WalletForSession, blockchain: Blockchain, walletState: WalletState + ): WalletManager? { + val blockchainToMake = if (blockchain == Blockchain.Ethereum && wallet.isTestNet) { + Blockchain.EthereumTestnet + } else { + blockchain + } + + val blockchainNetwork = BlockchainNetwork( + blockchain = blockchainToMake, + derivationPath = wallet.derivationPath?.rawPath, + tokens = emptyList() + ) + + return if (walletState.cardId == wallet.cardId) { + walletState.getWalletManager(blockchainNetwork) + } else { + val blockchainNetworkWithTokens = currenciesRepository + .loadSavedCurrencies( + cardId = wallet.cardId, + isHdWalletSupported = wallet.derivationPath != null + ).firstOrNull { it == blockchainNetwork } + + if (blockchainNetworkWithTokens != null) { + factory.makeWalletManager( + cardId = wallet.cardId, + blockchain = blockchainToMake, + publicKey = Wallet.PublicKey( + wallet.walletPublicKey!!, + wallet.derivedPublicKey, + wallet.derivationPath + ), + tokens = blockchainNetworkWithTokens.tokens, + curve = blockchainToMake.getPrimaryCurve() ?: EllipticCurve.Secp256k1 + ) + } else { + null + } + } + } + + suspend fun getWalletManager( + scanResponse: ScanResponse, blockchain: Blockchain, walletState: WalletState + ): WalletManager? { + val card = scanResponse.card + val blockchainToMake = if (blockchain == Blockchain.Ethereum && card.isTestCard) { + Blockchain.EthereumTestnet + } else { + blockchain + } + + val blockchainNetwork = BlockchainNetwork( + blockchain = blockchainToMake, + card = card + ) + + return if (walletState.cardId == card.cardId) { + walletState.getWalletManager(blockchainNetwork) + } else { + if (currenciesRepository + .loadSavedCurrencies(card.cardId, card.settings.isHDWalletAllowed) + .contains(blockchainNetwork) + ) { + factory.makeWalletManagerForApp( + scanResponse = scanResponse, + blockchainNetwork = blockchainNetwork + ) + } else { + null + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt index a180d20d4a..471ccaa44c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.details.redux.walletconnect import android.app.Activity +import com.tangem.blockchain.common.Blockchain import com.tangem.domain.common.ScanResponse import com.tangem.tap.common.redux.NotificationAction import com.tangem.wallet.R @@ -47,6 +48,16 @@ sealed class WalletConnectAction : Action { data class Success(val session: WalletConnectSession) : WalletConnectAction() } + data class SwitchBlockchain( + val blockchain: Blockchain?, + val session: WalletConnectSession + ) : WalletConnectAction() + + data class UpdateBlockchain( + val updatedSession: WalletConnectSession + ) : WalletConnectAction() + + data class FailureEstablishingSession(val session: WCSession?) : WalletConnectAction() data class SetSessionsRestored(val sessions: List) : diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index 25c5d373b4..40da1f4df2 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -1,10 +1,8 @@ package com.tangem.tap.features.details.redux.walletconnect import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.WalletManager import com.tangem.common.extensions.guard import com.tangem.domain.common.ScanResponse -import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.getFromClipboard @@ -14,11 +12,10 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.currenciesRepository import com.tangem.tap.domain.extensions.isMultiwalletAllowed -import com.tangem.tap.domain.extensions.makeWalletManagerForApp -import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.domain.walletconnect.BnbHelper import com.tangem.tap.domain.walletconnect.WalletConnectManager import com.tangem.tap.domain.walletconnect.WalletConnectNetworkUtils +import com.tangem.tap.domain.walletconnect.WcWalletManagerFactory import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.scope import com.tangem.tap.store @@ -159,6 +156,45 @@ class WalletConnectMiddleware { action.id, action.data, action.sessionData ) } + is WalletConnectAction.SwitchBlockchain -> { + val blockchain = action.blockchain.guard { + store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedCard)) // TODO: add relevant dialog + return + } + + val factory = WcWalletManagerFactory( + factory = store.state.globalState.tapWalletManager.walletManagerFactory, + currenciesRepository = currenciesRepository + ) + val walletState = store.state.walletState + scope.launch { + val walletManager = factory.getWalletManager( + wallet = action.session.wallet, + blockchain = blockchain, + walletState = walletState + ).guard { + store.dispatchOnMain( + GlobalAction.ShowDialog( + WalletConnectDialog.AddNetwork(blockchain.fullName) + ) + ) + return@launch + } + + val updatedWallet = action.session.wallet.copy( + walletPublicKey = walletManager.wallet.publicKey.seedKey, + derivedPublicKey = walletManager.wallet.publicKey.derivedKey, + derivationPath = walletManager.wallet.publicKey.derivationPath, + blockchain = action.blockchain + + ) + val updatedSession = action.session.copy(wallet = updatedWallet) + store.dispatchOnMain(WalletConnectAction.UpdateBlockchain(updatedSession)) + } + } + is WalletConnectAction.UpdateBlockchain -> { + walletConnectManager.updateBlockchain(action.updatedSession) + } } } @@ -189,8 +225,13 @@ class WalletConnectMiddleware { return } + val factory = WcWalletManagerFactory( + factory = store.state.globalState.tapWalletManager.walletManagerFactory, + currenciesRepository = currenciesRepository + ) + val walletState = store.state.walletState scope.launch { - val walletManager = getWalletManager(scanResponse, blockchain).guard { + val walletManager = factory.getWalletManager(scanResponse, blockchain, walletState).guard { store.dispatchOnMain(WalletConnectAction.FailureEstablishingSession(session.session)) store.dispatchOnMain( GlobalAction.ShowDialog( @@ -232,37 +273,4 @@ class WalletConnectMiddleware { } } - - private suspend fun getWalletManager( - scanResponse: ScanResponse, blockchain: Blockchain - ): WalletManager? { - val card = scanResponse.card - val factory = store.state.globalState.tapWalletManager.walletManagerFactory - val blockchainToMake = if (blockchain == Blockchain.Ethereum && card.isTestCard) { - Blockchain.EthereumTestnet - } else { - blockchain - } - - val blockchainNetwork = BlockchainNetwork( - blockchain = blockchainToMake, - card = card - ) - - return if (store.state.globalState.scanResponse?.card?.cardId == card.cardId) { - store.state.walletState.getWalletManager(blockchainNetwork) - } else { - if (currenciesRepository - .loadSavedCurrencies(card.cardId, card.settings.isHDWalletAllowed) - .contains(blockchainNetwork) - ) { - factory.makeWalletManagerForApp( - scanResponse = scanResponse, - blockchainNetwork = blockchainNetwork - ) - } else { - null - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt index 216367e9ee..191fa7b170 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt @@ -34,6 +34,11 @@ class WalletConnectReducer { is WalletConnectAction.RefuseOpeningSession -> state.copy(loading = false) is WalletConnectAction.OpeningSessionTimeout -> state.copy(loading = false) is WalletConnectAction.FailureEstablishingSession -> state.copy(loading = false) + is WalletConnectAction.UpdateBlockchain -> state.copy( + sessions = state.sessions + .filterNot { it.peerId == action.updatedSession.peerId } + + action.updatedSession + ) else -> state } 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 e75ef8cd06..8581a61e6a 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 @@ -73,6 +73,9 @@ data class WalletState( val walletManagers: List get() = wallets.mapNotNull { it.walletManager } + val cardId: String? + get() = wallets.firstOrNull()?.walletManager?.wallet?.cardId + fun getWalletManager(currency: Currency?): WalletManager? { if (currency?.blockchain == null) return null return getWalletStore(currency)?.walletManager From 44b4938461ee442bb4ce68774841bfc575f14c7e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Jul 2022 16:14:00 +0400 Subject: [PATCH 02/33] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/common/DialogManager.kt | 6 ++++++ .../details/redux/walletconnect/WalletConnectMiddleware.kt | 2 +- .../details/redux/walletconnect/WalletConnectState.kt | 1 + app/src/main/res/values-de/strings_final.xml | 1 + app/src/main/res/values-fr/strings_final.xml | 1 + app/src/main/res/values-it/strings_final.xml | 1 + app/src/main/res/values-ru/strings_final.xml | 2 ++ app/src/main/res/values/strings_final.xml | 1 + 8 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 342e29a83e..fda1f1a294 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -105,6 +105,12 @@ class DialogManager : StoreSubscriber { dAppName = state.dialog.dAppName, context = context ) + is WalletConnectDialog.UnsupportedNetwork -> + SimpleAlertDialog.create( + titleRes = R.string.wallet_connect, + messageRes = R.string.wallet_connect_unsupported_blockchain, + context = context + ) is BackupDialog.AddMoreBackupCards -> AddMoreBackupCardsDialog.create(context) is BackupDialog.BackupInProgress -> BackupInProgressDialog.create(context) is BackupDialog.UnfinishedBackupFound -> UnfinishedBackupFoundDialog.create(context) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index 40da1f4df2..7f7a88748a 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -158,7 +158,7 @@ class WalletConnectMiddleware { } is WalletConnectAction.SwitchBlockchain -> { val blockchain = action.blockchain.guard { - store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedCard)) // TODO: add relevant dialog + store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork)) return } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt index 4f5861c67b..fbd95c6393 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt @@ -82,6 +82,7 @@ data class WalletForSession( sealed class WalletConnectDialog : StateDialog { data class ClipboardOrScanQr(val clipboardUri: String) : WalletConnectDialog() object UnsupportedCard : WalletConnectDialog() + object UnsupportedNetwork : WalletConnectDialog() data class AddNetwork(val network: String) : WalletConnectDialog() object OpeningSessionRejected : WalletConnectDialog() object SessionTimeout : WalletConnectDialog() diff --git a/app/src/main/res/values-de/strings_final.xml b/app/src/main/res/values-de/strings_final.xml index 7dd40e2633..b944fee969 100644 --- a/app/src/main/res/values-de/strings_final.xml +++ b/app/src/main/res/values-de/strings_final.xml @@ -56,4 +56,5 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. + Blockchain is not supported. Please select another blockchain. \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings_final.xml b/app/src/main/res/values-fr/strings_final.xml index 7fb2245b89..571a03b91a 100644 --- a/app/src/main/res/values-fr/strings_final.xml +++ b/app/src/main/res/values-fr/strings_final.xml @@ -56,4 +56,5 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. + Blockchain is not supported. Please select another blockchain. \ No newline at end of file diff --git a/app/src/main/res/values-it/strings_final.xml b/app/src/main/res/values-it/strings_final.xml index d561bcdb56..f534f5caf5 100644 --- a/app/src/main/res/values-it/strings_final.xml +++ b/app/src/main/res/values-it/strings_final.xml @@ -56,5 +56,6 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. + Blockchain is not supported. Please select another blockchain. \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index 496f4f7815..4cb3e5fbbb 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -61,4 +61,6 @@ Токен %s является основной валютой в сети %s и не может быть скрыт, до тех пор пока у вас в списке есть другие токены этой сети. Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. + Сеть не поддерживается. Пожалуйста, выберите другую сеть. + diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index 75bcce3b9a..5fe04101e5 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -61,4 +61,5 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. + Blockchain is not supported. Please select another blockchain. From 04fd78e2a1170f7591c7ada8eabd8d2219520f11 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Jul 2022 16:19:11 +0400 Subject: [PATCH 03/33] Updated on 2026-08-14 --- .../com/tangem/tap/domain/walletconnect/WalletConnectManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt index 40ef0df234..7d36064f1e 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt @@ -444,7 +444,7 @@ class WalletConnectManager { } } else -> { - + Timber.d("WC: unrecognized custom request") } } } From a72ba0edea4600d842a3d33ea127b70915a83ba5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Jul 2022 11:50:34 +0300 Subject: [PATCH 04/33] Updated on 2026-08-14 --- .../tap/features/wallet/ui/WalletFragment.kt | 3 ++ app/src/main/res/layout/fragment_wallet.xml | 37 +++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index 176fa48a14..73f315e29b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.transition.TransitionInflater import by.kirich1409.viewbindingdelegate.viewBinding import coil.load +import coil.size.Scale import com.tangem.tap.MainActivity import com.tangem.tap.common.extensions.show import com.tangem.tap.common.recyclerView.SpaceItemDecoration @@ -166,6 +167,8 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber + android:id="@+id/cl_wallet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="74dp"> + android:id="@+id/iv_card" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="12dp" + android:scaleType="fitCenter" + android:adjustViewBounds="true" + android:elevation="3dp" + android:maxHeight="215dp" + android:contentDescription="@null" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/card_placeholder_black" /> Date: Fri, 15 Jul 2022 16:18:47 +0300 Subject: [PATCH 05/33] Updated on 2026-08-14 --- .../wallet/ui/adapters/WalletAdapter.kt | 3 ++ .../drawable/shape_badge_custom_currency.xml | 2 +- .../main/res/layout/item_currency_wallet.xml | 45 +++++++++++++------ 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt index 8514f1e384..b4f5f84a1f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.domain.common.TapWorkarounds.derivationStyle +import com.tangem.tap.common.extensions.getGreyedOutIconRes import com.tangem.tap.common.extensions.getString import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.show @@ -116,6 +117,8 @@ class WalletAdapter ?: root.getString(id = R.string.token_item_no_rate) badgeCustomBalance.isVisible = isCustomCurrency + ivBlockchain.isVisible = wallet.currency.isToken() + ivBlockchain.setImageResource(wallet.currency.blockchain.getGreyedOutIconRes()) cardWallet.setOnClickListener { store.dispatch(WalletAction.MultiWallet.SelectWallet(wallet)) diff --git a/app/src/main/res/drawable/shape_badge_custom_currency.xml b/app/src/main/res/drawable/shape_badge_custom_currency.xml index 2c3b7f7bd4..cfd740103d 100644 --- a/app/src/main/res/drawable/shape_badge_custom_currency.xml +++ b/app/src/main/res/drawable/shape_badge_custom_currency.xml @@ -7,7 +7,7 @@ android:height="12dp" /> diff --git a/app/src/main/res/layout/item_currency_wallet.xml b/app/src/main/res/layout/item_currency_wallet.xml index de692cfa83..7f145c3e1d 100644 --- a/app/src/main/res/layout/item_currency_wallet.xml +++ b/app/src/main/res/layout/item_currency_wallet.xml @@ -18,11 +18,12 @@ + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:animateLayoutChanges="true" + android:clipToPadding="false"> + tools:src="@drawable/shape_circle" + tools:tint="@color/iconGray" /> + + + android:id="@+id/badge_custom_balance" + android:layout_width="10dp" + android:layout_height="10dp" + android:background="@drawable/shape_badge_custom_currency" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@id/iv_currency" + app:layout_constraintEnd_toEndOf="@id/iv_currency" + tools:visibility="visible" /> Date: Fri, 15 Jul 2022 17:10:13 +0300 Subject: [PATCH 06/33] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 43 ++++++++++----------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index 55fe30d0a9..d9339cbb3a 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -43,10 +43,11 @@ android:overScrollMode="never"> + android:id="@+id/cl_wallet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="74dp" + android:clipToPadding="false"> + + - - - - - From f683452b864b2c32360b3486214a9a6be9895b90 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Jul 2022 16:42:17 +0300 Subject: [PATCH 07/33] Updated on 2026-08-14 --- app/src/main/res/values/zendesk_styles.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values/zendesk_styles.xml b/app/src/main/res/values/zendesk_styles.xml index ebb4fcab6b..0022b241b1 100644 --- a/app/src/main/res/values/zendesk_styles.xml +++ b/app/src/main/res/values/zendesk_styles.xml @@ -4,4 +4,15 @@ @color/darkGray6 @color/darkGray6 + + // Contact us FAB style + From 2c36329434af1de61638c152259095115e43ce79 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Jul 2022 09:31:33 +0300 Subject: [PATCH 08/33] Updated on 2026-08-14 --- app/src/main/res/values-ru/strings_final.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index d2028c922e..f7c9df689f 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -61,7 +61,7 @@ Скрыть Вы скрываете токен с главного экрана, но в любой момент сможете добавить его обратно. Невозможно скрыть %s - Токен %s является основной валютой в сети %s и не может быть скрыт, до тех пор пока у вас в списке есть другие токены этой сети. + Токен %s является основной валютой в сети %s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети. Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. Сеть %s From 5f22df243a2ea26325ff8a72c32bb558a13e6dc6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Jul 2022 09:41:27 +0300 Subject: [PATCH 09/33] Updated on 2026-08-14 --- .../wallet/redux/middlewares/WalletMiddleware.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 7a4ac13ea5..1f8060618a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -15,12 +15,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.attestation.Attestation import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.common.analytics.Analytics -import com.tangem.tap.common.extensions.copyToClipboard -import com.tangem.tap.common.extensions.dispatchDebugErrorNotification -import com.tangem.tap.common.extensions.dispatchOnMain -import com.tangem.tap.common.extensions.onCardScanned -import com.tangem.tap.common.extensions.shareText -import com.tangem.tap.common.extensions.stripZeroPlainString +import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen @@ -29,6 +24,7 @@ import com.tangem.tap.domain.failedRates import com.tangem.tap.domain.loadedRates import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.home.redux.HomeAction +import com.tangem.tap.features.home.redux.HomeMiddleware import com.tangem.tap.features.send.redux.PrepareSendScreen import com.tangem.tap.features.wallet.models.PendingTransactionType import com.tangem.tap.features.wallet.models.filterByCoin @@ -233,9 +229,7 @@ class WalletMiddleware { action.context.shareText(action.address) } is WalletAction.ExploreAddress -> { - val uri = Uri.parse(action.exploreUrl) - val intent = Intent(Intent.ACTION_VIEW, uri) - ContextCompat.startActivity(action.context, intent, null) + store.dispatchOpenUrl(action.exploreUrl) } is WalletAction.Send -> { val newAction = prepareSendAction(action.amount, store.state.walletState) From 42d15b8957a9b24092de003a8da281fc3325e05b Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Jul 2022 18:48:26 +0300 Subject: [PATCH 10/33] Updated on 2026-08-14 --- .gitignore | 4 +- .idea/codeStyles/Project.xml | 202 +++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/inspectionProfiles/Project_Default.xml | 92 +++++++++ 4 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml diff --git a/.gitignore b/.gitignore index 4cc00a7e1f..dd64e70b22 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ local.properties # User-specific configurations .idea +!.idea/codeStyles +!.idea/inspectionProfiles # LayoutInspector files /captures @@ -26,4 +28,4 @@ local.properties **/fastlane/report.xml **/fastlane/Preview.html **/fastlane/screenshots -**/fastlane/test_output \ No newline at end of file +**/fastlane/test_output diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000000..96ff0f5af3 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000000..79ee123c2b --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..ba5af7a4ce --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,92 @@ + + + + \ No newline at end of file From 36a9ea3e8a198722a9589d2126bbd56a5b9ded9a Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 22 Jul 2022 13:45:15 +0300 Subject: [PATCH 11/33] Updated on 2026-08-14 --- .idea/codeStyles/Project.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 96ff0f5af3..ad9c1261c4 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,5 +1,7 @@ + diff --git a/app/src/main/res/layout/view_currency_icon.xml b/app/src/main/res/layout/view_currency_icon.xml new file mode 100644 index 0000000000..6859d75600 --- /dev/null +++ b/app/src/main/res/layout/view_currency_icon.xml @@ -0,0 +1,21 @@ + + + + + + From 136db91d9de45e43e4caefc5964c3b6c1c36873e Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 23:06:35 +0400 Subject: [PATCH 22/33] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/common/DialogManager.kt | 2 +- app/src/main/res/values-de/strings_final.xml | 2 +- app/src/main/res/values-fr/strings_final.xml | 2 +- app/src/main/res/values-it/strings_final.xml | 2 +- app/src/main/res/values-ru/strings_final.xml | 2 +- app/src/main/res/values/strings_final.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 511c10d5dc..a5682e3b5c 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -108,7 +108,7 @@ class DialogManager : StoreSubscriber { is WalletConnectDialog.UnsupportedNetwork -> SimpleAlertDialog.create( titleRes = R.string.wallet_connect, - messageRes = R.string.wallet_connect_unsupported_blockchain, + messageRes = R.string.wallet_connect_scanner_error_unsupported_network, context = context ) is BackupDialog.AddMoreBackupCards -> AddMoreBackupCardsDialog.create(context) diff --git a/app/src/main/res/values-de/strings_final.xml b/app/src/main/res/values-de/strings_final.xml index 7f8c9a2625..e859d46e47 100644 --- a/app/src/main/res/values-de/strings_final.xml +++ b/app/src/main/res/values-de/strings_final.xml @@ -59,6 +59,6 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. - Blockchain is not supported. Please select another blockchain. + This network is not supported. Please select another network. %s network \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings_final.xml b/app/src/main/res/values-fr/strings_final.xml index 284dbb30b7..c4e1f946db 100644 --- a/app/src/main/res/values-fr/strings_final.xml +++ b/app/src/main/res/values-fr/strings_final.xml @@ -59,6 +59,6 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. - Blockchain is not supported. Please select another blockchain. + This network is not supported. Please select another network. %s network \ No newline at end of file diff --git a/app/src/main/res/values-it/strings_final.xml b/app/src/main/res/values-it/strings_final.xml index d58a04b1e3..bb1cf7be30 100644 --- a/app/src/main/res/values-it/strings_final.xml +++ b/app/src/main/res/values-it/strings_final.xml @@ -59,7 +59,7 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. - Blockchain is not supported. Please select another blockchain. + This network is not supported. Please select another network. %s network \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index 26126429ce..d4ddb9ad8c 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -65,7 +65,7 @@ Токен %s является основной валютой в сети %s и не может быть скрыт до тех пор, пока у вас в списке есть другие токены этой сети. Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. - Сеть не поддерживается. Пожалуйста, выберите другую сеть. + Сеть не поддерживается. Пожалуйста, выберите другую сеть. Сеть %s diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index f62ca8c1c6..4c7ec8e0bd 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -64,7 +64,7 @@ The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. %s network not found. Please, add it first and try again. - Blockchain is not supported. Please select another blockchain. + This network is not supported. Please select another network. %s network From a4e5c041a4f5f31e25a174170025324d21dcd22e Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 22:14:49 +0300 Subject: [PATCH 23/33] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 210 ++++++++++---------- 1 file changed, 105 insertions(+), 105 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index d9339cbb3a..ebec250282 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -18,14 +18,14 @@ app:liftOnScroll="true"> + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + app:menu="@menu/wallet" + app:navigationIcon="@drawable/ic_wallet_24" + app:navigationIconTint="@color/darkGray6" + app:title="@string/wallet_title" + app:titleCentered="true" /> @@ -43,11 +43,11 @@ android:overScrollMode="never"> + android:id="@+id/cl_wallet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipToPadding="false" + android:paddingBottom="74dp"> @@ -69,18 +69,18 @@ android:id="@+id/tv_twin_card_number" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:minHeight="30dp" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:paddingTop="4dp" - android:paddingBottom="4dp" + android:layout_marginStart="25dp" + android:background="@drawable/shape_chip" android:elevation="3dp" android:gravity="center" - android:layout_marginStart="25dp" + android:minHeight="30dp" + android:paddingStart="16dp" + android:paddingTop="4dp" + android:paddingEnd="16dp" + android:paddingBottom="4dp" android:textColor="@color/buttonGray" android:textSize="14sp" android:textStyle="bold" - android:background="@drawable/shape_chip" app:layout_constraintBottom_toBottomOf="@id/iv_card" app:layout_constraintStart_toStartOf="@id/iv_card" app:layout_constraintTop_toBottomOf="@id/iv_card" @@ -95,50 +95,50 @@ - - - - - - + app:layout_constraintTop_toBottomOf="@id/barrier" /> + + + + + + + android:id="@+id/rv_multiwallet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:nestedScrollingEnabled="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" /> + android:id="@+id/l_buttons_long" + layout="@layout/layout_wallet_long_buttons" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="30dp" + android:layout_marginEnd="16dp" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/l_address" + app:layout_constraintVertical_bias="1" /> + android:id="@+id/l_buttons_short" + layout="@layout/layout_wallet_short_buttons" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="30dp" + android:layout_marginEnd="16dp" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/l_address" + app:layout_constraintVertical_bias="1" /> + android:id="@+id/btn_add_token" + style="@style/BaseTapButton" + android:layout_width="match_parent" + android:layout_height="42dp" + android:layout_gravity="bottom" + android:layout_marginStart="16dp" + android:layout_marginTop="32dp" + android:layout_marginEnd="16dp" + android:elevation="4dp" + android:text="@string/main_manage_tokens" + android:textSize="16sp" + app:cornerRadius="8dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/rv_multiwallet" /> From fc5aa667dd992dbfa2c2eaec128b3caad2e2422c Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 22:37:12 +0300 Subject: [PATCH 24/33] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index ebec250282..102ae199f4 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -148,7 +148,6 @@ android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/rv_pending_transaction" /> - + app:layout_constraintTop_toBottomOf="@id/rv_multiwallet" + app:layout_constraintVertical_bias="0.0" + tools:layout_editor_absoluteX="16dp" /> From f32b0fa020b48b7a28142fd0c0b51975c04c2e53 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 22:51:23 +0300 Subject: [PATCH 25/33] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/common/extensions/Navigation.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index 7096920bb8..f538ff13a3 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -61,9 +61,9 @@ fun FragmentActivity.popBackTo(screen: AppScreen?, inclusive: Boolean = false) { } fun FragmentActivity.getPreviousScreen(): AppScreen? { - val indexOfLastFragment = if(this.supportFragmentManager.backStackEntryCount>0) { + val indexOfLastFragment = if (this.supportFragmentManager.backStackEntryCount > 0) { this.supportFragmentManager.backStackEntryCount - 1 - }else{ + } else { 0 } val tag = if (indexOfLastFragment < this.supportFragmentManager.backStackEntryCount) From 8a6e1e6fc934cf285501aea51316682487d02a94 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Jul 2022 09:28:37 +0300 Subject: [PATCH 26/33] Updated on 2026-08-14 --- .../tangem/tap/common/extensions/StringBuilder.kt | 4 ++++ .../tangem/tap/common/feedback/FeedbackData.kt | 15 ++++++++------- .../tap/common/feedback/FeedbackDataBuilder.kt | 14 ++++++-------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt b/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt index 3f8fa992ff..8182db6828 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt @@ -19,4 +19,8 @@ fun StringBuilder.appendIfNotNull(value: String?, prefix: String? = null, postfi fun String.appendIfNotNull(value: String?, prefix: String? = null, postfix: String? = null): String { return StringBuilder(this).apply { appendIfNotNull(value, prefix, postfix) }.toString() +} + +fun StringBuilder.breakLine(count: Int = 1): StringBuilder { + return append(List(count) { "\n" }.joinToString(separator = "")) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt index dc2a7d07d5..6578b97356 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackData.kt @@ -2,6 +2,7 @@ package com.tangem.tap.common.feedback import android.content.Context import com.tangem.domain.common.TapWorkarounds +import com.tangem.tap.common.extensions.breakLine import com.tangem.wallet.R interface FeedbackData { @@ -17,9 +18,9 @@ interface FeedbackData { fun joinTogether(context: Context, infoHolder: AdditionalFeedbackInfo): String { return StringBuilder().apply { append(context.getString(mainMessageResId)) - appendLine(3) + breakLine(3) append(context.getString(getDataCollectionMessageResId())) - appendLine() + breakLine() append(createOptionalMessage(infoHolder)) }.toString() } @@ -31,7 +32,7 @@ class RateCanBeBetterEmail : FeedbackData { override fun createOptionalMessage(infoHolder: AdditionalFeedbackInfo): String = FeedbackDataBuilder(infoHolder) .appendCardInfo() - .appendLine() + .breakLine() .appendPhoneInfo() .build() } @@ -43,7 +44,7 @@ class ScanFailsEmail : FeedbackData { override fun joinTogether(context: Context, infoHolder: AdditionalFeedbackInfo): String = StringBuilder().apply { append(context.getString(mainMessageResId)) - appendLine(4) + breakLine(4) append(createOptionalMessage(infoHolder)) }.toString() @@ -53,7 +54,7 @@ class ScanFailsEmail : FeedbackData { } class SendTransactionFailedEmail( - val error: String + val error: String, ) : FeedbackData { override val subjectResId: Int = R.string.feedback_subject_tx_failed @@ -63,7 +64,7 @@ class SendTransactionFailedEmail( .appendCardInfo() .appendDelimiter() .appendTxFailedBlockchainInfo(error) - .appendLine() + .breakLine() .appendPhoneInfo() .build() } @@ -89,7 +90,7 @@ class FeedbackEmail : FeedbackData { override fun createOptionalMessage(infoHolder: AdditionalFeedbackInfo): String = FeedbackDataBuilder(infoHolder) .appendCardInfo() .appendWalletsInfo() - .appendLine() + .breakLine() .appendPhoneInfo() .build() } diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt index 9e5378e9e5..a3a9ee5575 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackDataBuilder.kt @@ -1,5 +1,7 @@ package com.tangem.tap.common.feedback +import com.tangem.tap.common.extensions.breakLine + class FeedbackDataBuilder( private val infoHolder: AdditionalFeedbackInfo ) { @@ -10,8 +12,8 @@ class FeedbackDataBuilder( return this } - fun appendLine(count: Int = 1): FeedbackDataBuilder { - builder.appendLine(count) + fun breakLine(count: Int = 1): FeedbackDataBuilder { + builder.breakLine(count) return this } @@ -34,7 +36,7 @@ class FeedbackDataBuilder( infoHolder.tokens[it.blockchain]?.let { tokens -> builder.append("Tokens:") - appendLine() + breakLine() tokens.forEach { token -> builder.appendKeyValue("Name", token.name) builder.appendKeyValue("ID", token.id ?: "[custom token]") @@ -74,8 +76,4 @@ private fun StringBuilder.appendKeyValue(key: String, value: String): StringBuil return if (value.isNotBlank()) this.append("$key: $value\n") else this } -private fun StringBuilder.appendDelimiter(): StringBuilder = append("----------\n") - -private fun StringBuilder.appendLine(count: Int = 1): StringBuilder { - return append(List(count) { "\n" }.joinToString(separator = "")) -} \ No newline at end of file +private fun StringBuilder.appendDelimiter(): StringBuilder = append("----------\n") \ No newline at end of file From 5e4b6b2bcf1d801e8d476c776b00fa426b51fc4b Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 19 Jul 2022 17:50:15 +0300 Subject: [PATCH 27/33] Updated on 2026-08-14 --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 45200c5dcf..2f727ccaa3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,11 +2,11 @@ ext.versions = [ kotlin : '1.6.10', build_gradle : '7.1.3', tamgem_card_sdk : 'develop-154', - tamgem_blockchain_sdk: 'develop-93', + tamgem_blockchain_sdk: 'develop-96', ] ext.environmentConfig = [ environment : "ENVIRONMENT", testActionEnabled: "TEST_ACTION_ENABLED", logEnabled : "LOG_ENABLED", -] \ No newline at end of file +] From 58560600884c8e12181d0a6e978aef79bf94a004 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 19 Jul 2022 17:53:58 +0300 Subject: [PATCH 28/33] Updated on 2026-08-14 --- .../tap/common/extensions/WalletManager.kt | 7 +++-- .../com/tangem/tap/domain/TangemSigner.kt | 12 +++++--- .../domain/extensions/WalletManagerFactory.kt | 9 +++--- .../statePrinter/WalletStateConverter.kt | 1 - .../walletconnect/WalletConnectSdkHelper.kt | 28 +++++++++++++----- .../tangem/tap/features/demo/DemoHelper.kt | 7 +++-- .../tangem/tap/features/demo/Extentions.kt | 4 +-- .../redux/middlewares/RequestFeeMiddleware.kt | 5 ++-- .../send/redux/middlewares/SendMiddleware.kt | 29 ++++++++++++++----- 9 files changed, 68 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index 40acdd1b7d..39e0103066 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -8,7 +8,7 @@ import com.tangem.tap.common.TestActions import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.amountToCreateAccount import com.tangem.tap.domain.getFirstToken -import com.tangem.tap.features.demo.isDemoWallet +import com.tangem.tap.features.demo.isDemoCard import com.tangem.tap.features.wallet.redux.AddressData import com.tangem.tap.features.wallet.redux.reducers.createAddressesData import com.tangem.tap.network.NetworkConnectivity @@ -21,7 +21,10 @@ import timber.log.Timber [REDACTED_AUTHOR] */ suspend fun WalletManager.safeUpdate(): Result = try { - if (isDemoWallet() || TestActions.testAmountInjectionForWalletManagerEnabled) { + val scanResponse = store.state.globalState.scanResponse + ?: error("Scan response must not be null") + + if (scanResponse.isDemoCard() || TestActions.testAmountInjectionForWalletManagerEnabled) { delay(500) TestActions.testAmountInjectionForWalletManagerEnabled = false Result.Success(wallet) diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt b/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt index 20d1eda08c..9de7e68894 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt @@ -16,12 +16,14 @@ class TangemSigner( private val signerCallback: (TangemSignerResponse) -> Unit, ) : TransactionSigner { - override suspend fun sign(hash: ByteArray, cardId: String, publicKey: Wallet.PublicKey): CompletionResult { + override suspend fun sign( + hash: ByteArray, + publicKey: Wallet.PublicKey + ): CompletionResult { return suspendCoroutine { continuation -> val command = SignHashTask(hash, publicKey) tangemSdk.startSessionWithRunnable( runnable = command, - cardId = cardId, initialMessage = initialMessage, ) { result -> when (result) { @@ -41,12 +43,14 @@ class TangemSigner( } } - override suspend fun sign(hashes: List, cardId: String, publicKey: Wallet.PublicKey): CompletionResult> { + override suspend fun sign( + hashes: List, + publicKey: Wallet.PublicKey + ): CompletionResult> { return suspendCoroutine { continuation -> val task = SignHashesTask(hashes, publicKey) tangemSdk.startSessionWithRunnable( runnable = task, - cardId = cardId, initialMessage = initialMessage, ) { result -> when (result) { diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt index e636c4fa07..34b8289884 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt @@ -32,9 +32,10 @@ fun WalletManagerFactory.makeWalletManagerForApp( return when { scanResponse.isTangemTwins() && scanResponse.secondTwinPublicKey != null -> { makeTwinWalletManager( - card.cardId, - wallet.publicKey, scanResponse.secondTwinPublicKey!!.hexToBytes(), - environmentBlockchain, wallet.curve + walletPublicKey = wallet.publicKey, + pairPublicKey = scanResponse.secondTwinPublicKey!!.hexToBytes(), + blockchain = environmentBlockchain, + curve = wallet.curve ) } seedKey != null && derivationParams != null -> { @@ -47,7 +48,6 @@ fun WalletManagerFactory.makeWalletManagerForApp( ?: return null makeWalletManager( - cardId = card.cardId, blockchain = environmentBlockchain, seedKey = wallet.publicKey, derivedKey = derivedKey, @@ -56,7 +56,6 @@ fun WalletManagerFactory.makeWalletManagerForApp( } else -> { makeWalletManager( - cardId = card.cardId, blockchain = environmentBlockchain, walletPublicKey = wallet.publicKey, curve = wallet.curve diff --git a/app/src/main/java/com/tangem/tap/domain/statePrinter/WalletStateConverter.kt b/app/src/main/java/com/tangem/tap/domain/statePrinter/WalletStateConverter.kt index 07ac4886bb..57762aaf51 100644 --- a/app/src/main/java/com/tangem/tap/domain/statePrinter/WalletStateConverter.kt +++ b/app/src/main/java/com/tangem/tap/domain/statePrinter/WalletStateConverter.kt @@ -57,7 +57,6 @@ class WalletStateConverter : StringStateConverter { walletMap["publicKey"] = publicKeyMap walletMap["amounts"] = amounts walletMap["addresses"] = wallet.addresses.toString() - walletMap["cardId"] = wallet.cardId return walletMap } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index 1d0dc4a9e0..a3b0d31a89 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -5,8 +5,17 @@ import com.tangem.blockchain.blockchains.ethereum.EthereumGasLoader import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionExtras import com.tangem.blockchain.blockchains.ethereum.EthereumUtils import com.tangem.blockchain.blockchains.ethereum.EthereumUtils.Companion.toKeccak -import com.tangem.blockchain.common.* -import com.tangem.blockchain.extensions.* +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.AmountType +import com.tangem.blockchain.common.CommonSigner +import com.tangem.blockchain.common.TransactionData +import com.tangem.blockchain.common.TransactionSender +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.SimpleResult +import com.tangem.blockchain.extensions.hexToBigDecimal +import com.tangem.blockchain.extensions.isAscii import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.hexToBytes @@ -17,7 +26,11 @@ import com.tangem.operations.sign.SignHashCommand import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.extensions.toFormattedString -import com.tangem.tap.features.details.redux.walletconnect.* +import com.tangem.tap.features.details.redux.walletconnect.WalletConnectSession +import com.tangem.tap.features.details.redux.walletconnect.WalletForSession +import com.tangem.tap.features.details.redux.walletconnect.WcPersonalSignData +import com.tangem.tap.features.details.redux.walletconnect.WcTransactionData +import com.tangem.tap.features.details.redux.walletconnect.WcTransactionType import com.tangem.tap.features.details.ui.walletconnect.dialogs.PersonalSignDialogData import com.tangem.tap.features.details.ui.walletconnect.dialogs.TransactionRequestDialogData import com.tangem.tap.store @@ -25,8 +38,8 @@ import com.tangem.tap.tangemSdk import com.tangem.tap.tangemSdkManager import com.trustwallet.walletconnect.models.ethereum.WCEthereumSignMessage import com.trustwallet.walletconnect.models.ethereum.WCEthereumTransaction -import timber.log.Timber import java.math.BigDecimal +import timber.log.Timber class WalletConnectSdkHelper { @@ -108,9 +121,8 @@ class WalletConnectSdkHelper { ) val blockchain = session.wallet.getBlockchainForSession() return factory.makeWalletManager( - session.wallet.cardId, - blockchain, - publicKey + blockchain = blockchain, + publicKey = publicKey ) } @@ -124,7 +136,7 @@ class WalletConnectSdkHelper { private suspend fun sendTransaction(data: WcTransactionData): String? { val result = (data.walletManager as TransactionSender).send( transactionData = data.transaction, - signer = Signer(tangemSdk) + signer = CommonSigner(tangemSdk) ) return when (result) { SimpleResult.Success -> { diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt index 7fe717e1a5..f7ccf6156a 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt @@ -109,7 +109,7 @@ class DemoConfig { testDemoCardIds).distinct() } - private val releaseDemoCardIds = mutableListOf( + private val releaseDemoCardIds = mutableListOf( // Tangem Wallet: "AC01000000041100", "AC01000000042462", @@ -284,7 +284,10 @@ class DemoTransactionSender( override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { val dataToSign = randomString(32).toByteArray() - val signerResponse = signer.sign(dataToSign, walletManager.wallet.cardId, walletManager.wallet.publicKey) + val signerResponse = signer.sign( + hash = dataToSign, + publicKey = walletManager.wallet.publicKey + ) return when (signerResponse) { is CompletionResult.Success -> SimpleResult.Failure(Exception(ID)) is CompletionResult.Failure -> SimpleResult.fromTangemSdkError(signerResponse.error) diff --git a/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt b/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt index 99ecfbc227..66d09bdbf0 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/Extentions.kt @@ -1,10 +1,10 @@ package com.tangem.tap.features.demo -import com.tangem.blockchain.common.WalletManager +import com.tangem.common.card.Card import com.tangem.domain.common.ScanResponse /** [REDACTED_AUTHOR] */ fun ScanResponse.isDemoCard(): Boolean = DemoHelper.isDemoCardId(card.cardId) -fun WalletManager.isDemoWallet(): Boolean = DemoHelper.isDemoCardId(wallet.cardId) \ No newline at end of file +fun Card.isDemoCard(): Boolean = DemoHelper.isDemoCardId(cardId) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt index 29165f8bad..cd4075a0ca 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt @@ -7,7 +7,7 @@ import com.tangem.blockchain.extensions.Result import com.tangem.common.extensions.isZero import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.demo.DemoTransactionSender -import com.tangem.tap.features.demo.isDemoWallet +import com.tangem.tap.features.demo.isDemoCard import com.tangem.tap.features.send.redux.AmountActionUi import com.tangem.tap.features.send.redux.FeeAction import com.tangem.tap.features.send.redux.ReceiptAction @@ -28,6 +28,7 @@ class RequestFeeMiddleware { fun handle(appState: AppState?, dispatch: DispatchFunction) { val sendState = appState?.sendState ?: return val walletManager = sendState.walletManager ?: return + val scanResponse = appState.globalState.scanResponse ?: return if (!SendState.isReadyToRequestFee()) { dispatch(FeeAction.FeeCalculation.SetFeeError(FeeAction.Error.ADDRESS_OR_AMOUNT_IS_EMPTY)) @@ -40,7 +41,7 @@ class RequestFeeMiddleware { val destinationAddress = sendState.addressPayIdState.destinationWalletAddress!! val destinationAmount = Amount(typedAmount, sendState.amountState.amountToSendCrypto) - val txSender = if (walletManager.isDemoWallet()) { + val txSender = if (scanResponse.isDemoCard()) { DemoTransactionSender(walletManager) } else { walletManager as TransactionSender diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 1727c81944..8936c779d1 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -4,7 +4,11 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.stellar.StellarTransactionExtras import com.tangem.blockchain.blockchains.xrp.XrpTransactionBuilder -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.BlockchainSdkError +import com.tangem.blockchain.common.TransactionError +import com.tangem.blockchain.common.TransactionSender +import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.extensions.SimpleResult import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -15,7 +19,11 @@ import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.AnalyticsEvent import com.tangem.tap.common.analytics.AnalyticsParam -import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.extensions.dispatchDialogShow +import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.common.extensions.safeUpdate +import com.tangem.tap.common.extensions.stripZeroPlainString import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction @@ -26,9 +34,15 @@ import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.extensions.minimalAmount import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.demo.DemoTransactionSender -import com.tangem.tap.features.demo.isDemoWallet -import com.tangem.tap.features.send.redux.* +import com.tangem.tap.features.demo.isDemoCard +import com.tangem.tap.features.send.redux.AddressPayIdActionUi +import com.tangem.tap.features.send.redux.AddressPayIdVerifyAction +import com.tangem.tap.features.send.redux.AmountAction +import com.tangem.tap.features.send.redux.AmountActionUi import com.tangem.tap.features.send.redux.FeeAction.RequestFee +import com.tangem.tap.features.send.redux.PrepareSendScreen +import com.tangem.tap.features.send.redux.SendAction +import com.tangem.tap.features.send.redux.SendActionUi import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.send.redux.states.ExternalTransactionData import com.tangem.tap.features.send.redux.states.MainCurrencyType @@ -38,6 +52,7 @@ import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdk import com.tangem.wallet.R +import java.util.EnumSet import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -45,7 +60,6 @@ import kotlinx.coroutines.withContext import org.rekotlin.Action import org.rekotlin.Middleware import timber.log.Timber -import java.util.* /** [REDACTED_AUTHOR] @@ -171,7 +185,7 @@ private fun sendTransaction( ) } val sendResult = try { - if (walletManager.isDemoWallet()) { + if (card.isDemoCard()) { DemoTransactionSender(walletManager).send(txData, signer) } else { (walletManager as TransactionSender).send(txData, signer) @@ -340,5 +354,4 @@ private fun updateWarnings(dispatch: (Action) -> Unit) { val warnings = warningsManager.getWarnings(WarningMessage.Location.SendScreen, listOf(blockchain)) dispatch(SendAction.Warnings.Set(warnings)) -} - +} \ No newline at end of file From f9cc2dc30b4272b49fab31d52b0365d0d04155f5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 19 Jul 2022 17:54:10 +0300 Subject: [PATCH 29/33] Updated on 2026-08-14 --- domain/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/build.gradle b/domain/build.gradle index d7a8832fd4..f4b0183cc8 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -85,4 +85,4 @@ dependencies { testImplementation "com.google.truth:truth:1.1.3" androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} \ No newline at end of file +} From 29ace6c40b46ccc7c74154f625e6749e7e738f59 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Jul 2022 15:14:00 +0300 Subject: [PATCH 30/33] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2f727ccaa3..b4a597ff72 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,7 +1,7 @@ ext.versions = [ kotlin : '1.6.10', build_gradle : '7.1.3', - tamgem_card_sdk : 'develop-154', + tamgem_card_sdk : 'develop-156', tamgem_blockchain_sdk: 'develop-96', ] From e6b409eadce94ab087234caf1560efb5ac3f83bf Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Jul 2022 15:47:17 +0300 Subject: [PATCH 31/33] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TangemSigner.kt | 48 ++++++++----------- .../send/redux/middlewares/SendMiddleware.kt | 6 ++- .../middlewares/TradeCryptoMiddleware.kt | 9 +++- .../CurrencyExchangeManager.kt | 11 ++++- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt b/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt index 9de7e68894..9e22833682 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSigner.kt @@ -5,52 +5,29 @@ import com.tangem.TangemSdk import com.tangem.blockchain.common.TransactionSigner import com.tangem.blockchain.common.Wallet import com.tangem.common.CompletionResult -import com.tangem.tap.domain.tasks.SignHashTask +import com.tangem.common.card.Card import com.tangem.tap.domain.tasks.SignHashesTask import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine class TangemSigner( + private val card: Card, private val tangemSdk: TangemSdk, private val initialMessage: Message, private val signerCallback: (TangemSignerResponse) -> Unit, ) : TransactionSigner { - override suspend fun sign( - hash: ByteArray, - publicKey: Wallet.PublicKey - ): CompletionResult { - return suspendCoroutine { continuation -> - val command = SignHashTask(hash, publicKey) - tangemSdk.startSessionWithRunnable( - runnable = command, - initialMessage = initialMessage, - ) { result -> - when (result) { - is CompletionResult.Success -> { - signerCallback( - TangemSignerResponse( - result.data.totalSignedHashes, - result.data.remainingSignatures - ) - ) - continuation.resume(CompletionResult.Success(result.data.signature)) - } - is CompletionResult.Failure -> - continuation.resume(CompletionResult.Failure(result.error)) - } - } - } - } - override suspend fun sign( hashes: List, publicKey: Wallet.PublicKey ): CompletionResult> { return suspendCoroutine { continuation -> + val cardId = if (card.backupStatus?.isActive == true) null else card.cardId + val task = SignHashesTask(hashes, publicKey) tangemSdk.startSessionWithRunnable( runnable = task, + cardId = cardId, initialMessage = initialMessage, ) { result -> when (result) { @@ -69,6 +46,21 @@ class TangemSigner( } } } + + override suspend fun sign( + hash: ByteArray, + publicKey: Wallet.PublicKey + ): CompletionResult { + val result = sign( + hashes = listOf(hash), + publicKey = publicKey + ) + + return when (result) { + is CompletionResult.Success -> CompletionResult.Success(result.data.first()) + is CompletionResult.Failure -> CompletionResult.Failure(result.error) + } + } } data class TangemSignerResponse( diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 8936c779d1..4a1f2df785 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -175,7 +175,11 @@ private fun sendTransaction( tangemSdk.config.linkedTerminal = false } - val signer = TangemSigner(tangemSdk, action.messageForSigner) { signResponse -> + val signer = TangemSigner( + card = card, + tangemSdk = tangemSdk, + initialMessage = action.messageForSigner + ) { signResponse -> store.dispatch( GlobalAction.UpdateWalletSignedHashes( walletSignedHashes = signResponse.totalSignedHashes, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index a7ee50446d..064647d863 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -45,6 +45,7 @@ class TradeCryptoMiddleware { val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return val exchangeManager = store.state.globalState.exchangeManager ?: return + val card = store.state.globalState.scanResponse?.card ?: return val appCurrency = store.state.globalState.appCurrency val addresses = selectedWalletData.walletAddresses?.list.orEmpty() @@ -59,7 +60,13 @@ class TradeCryptoMiddleware { return } - scope.launch { exchangeManager.buyErc20TestnetTokens(walletManager, currency.token) } + scope.launch { + exchangeManager.buyErc20TestnetTokens( + card = card, + walletManager = walletManager, + token = currency.token + ) + } return } diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 811c9c0545..8d1085d316 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -7,6 +7,7 @@ import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.blockchain.extensions.Result +import com.tangem.common.card.Card import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.redux.global.GlobalAction @@ -68,7 +69,11 @@ class CurrencyExchangeManager( enum class Action { Buy, Sell } } -suspend fun CurrencyExchangeManager.buyErc20TestnetTokens(walletManager: EthereumWalletManager, token: Token) { +suspend fun CurrencyExchangeManager.buyErc20TestnetTokens( + card: Card, + walletManager: EthereumWalletManager, + token: Token, +) { walletManager.safeUpdate() val amountToSend = Amount(walletManager.wallet.blockchain) @@ -85,7 +90,9 @@ suspend fun CurrencyExchangeManager.buyErc20TestnetTokens(walletManager: Ethereu val transaction = walletManager.createTransaction(amountToSend, fee, destinationAddress) val signer = TangemSigner( - tangemSdk = tangemSdk, Message() + card = card, + tangemSdk = tangemSdk, + initialMessage = Message(), ) { signResponse -> store.dispatch( GlobalAction.UpdateWalletSignedHashes( From 072c5dd8a15ead490fac650c98d7996f9a0733ec Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 13:28:56 +0300 Subject: [PATCH 32/33] Updated on 2026-08-14 --- .editorconfig | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..57188dd623 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +[*.{kt,kts}] +ktlint_code_style = official +ktlint_ignore_back_ticked_identifier = true + +indent_size = 4 +indent_style = space +insert_final_newline = true + +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true + +ij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^ +ij_kotlin_packages_to_use_import_on_demand = java.util.*, kotlinx.android.synthetic.** + +max_line_length = 120 From 887ff2a509bff5c7a46bac5617813b9b4eb111de Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Jul 2022 11:15:26 +0300 Subject: [PATCH 33/33] Updated on 2026-08-14 --- .../java/com/tangem/tap/common/extensions/StringBuilder.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt b/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt index 8182db6828..961e77e8f7 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/StringBuilder.kt @@ -21,6 +21,4 @@ fun String.appendIfNotNull(value: String?, prefix: String? = null, postfix: Stri return StringBuilder(this).apply { appendIfNotNull(value, prefix, postfix) }.toString() } -fun StringBuilder.breakLine(count: Int = 1): StringBuilder { - return append(List(count) { "\n" }.joinToString(separator = "")) -} \ No newline at end of file +fun StringBuilder.breakLine(count: Int = 1): StringBuilder = append("\n".repeat(count)) \ No newline at end of file