From 63b2961c3935bcb220610cb5510c744886bc9555 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Jul 2023 18:25:04 +0300 Subject: [PATCH 1/7] Updated on 2026-08-14 --- .../src/main/assets/configs/feature_toggles_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index d0e3fddbe4..b5005743ed 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -17,7 +17,7 @@ }, { "name": "1INCH_LEARN_2_EARN_ENABLED", - "version": "undefined" + "version": "4.9.0" }, { "name": "REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED", From 9028347b31b77af9d0d42f8de4ed1cb4c0f5e02e Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Jul 2023 18:31:42 +0300 Subject: [PATCH 2/7] Updated on 2026-08-14 --- .../moonpay/MoonPayService.kt | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index 0754f6c305..472fd9e6a5 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -7,7 +7,6 @@ import com.tangem.common.services.Result import com.tangem.common.services.performRequest import com.tangem.datasource.api.common.createRetrofitInstance import com.tangem.domain.common.extensions.withIOContext -import com.tangem.tap.common.extensions.urlEncode import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager @@ -103,39 +102,37 @@ class MoonPayService( cryptoCurrencyName: CryptoCurrencyName, fatCurrency: String, walletAddress: String, - ): String? { + ): String { if (action == CurrencyExchangeManager.Action.Buy) throw UnsupportedOperationException() val uri = Uri.Builder() .scheme(SCHEME) .authority(URL_SELL) - .appendQueryParameter("apiKey", apiKey.urlEncode()) - .appendQueryParameter("baseCurrencyCode", cryptoCurrencyName.urlEncode()) - .appendQueryParameter("refundWalletAddress", walletAddress.urlEncode()) - .appendQueryParameter("redirectURL", "tangem://sell-request.tangem.com".urlEncode()) + .appendQueryParameter("apiKey", apiKey) + .appendQueryParameter("baseCurrencyCode", cryptoCurrencyName) + .appendQueryParameter("refundWalletAddress", walletAddress) + .appendQueryParameter("redirectURL", "tangem://sell-request.tangem.com") - val originalQuery = uri.build().toString() + val originalQuery = uri.build().encodedQuery ?: uri.build().toString() val signature = createSignature(originalQuery) - uri.appendQueryParameter("signature", signature.urlEncode()) + uri.appendQueryParameter("signature", signature) - val url = uri.build().toString() - return url + return uri.build().toString() } - override fun getSellCryptoReceiptUrl(action: CurrencyExchangeManager.Action, transactionId: String): String? { - val url = Uri.Builder() + override fun getSellCryptoReceiptUrl(action: CurrencyExchangeManager.Action, transactionId: String): String { + return Uri.Builder() .scheme(SCHEME) .authority(URL_SELL) .appendPath("transaction_receipt") .appendQueryParameter("transactionId", transactionId).build().toString() - return url } private fun createSignature(data: String): String { val sha256Hmac = Mac.getInstance("HmacSHA256") val secretKey = SecretKeySpec(secretKey.toByteArray(), "HmacSHA256") sha256Hmac.init(secretKey) - val sha256encoded = sha256Hmac.doFinal(data.toByteArray()) + val sha256encoded = sha256Hmac.doFinal("?$data".toByteArray()) return Base64.encodeToString(sha256encoded, Base64.NO_WRAP) } From 587377f71083287eebd14c8c28054ac606919182 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 12 Jul 2023 17:43:53 +0300 Subject: [PATCH 3/7] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index bab54848a3..8366dd472c 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -78,7 +78,7 @@ walletConnectWeb3 = "1.10.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.9-274" +tangemBlockchainSdk = "release-app_4.9-282" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.9-274" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From fb8e73b12bbcc8489509bb1a7027b61a69a87975 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 13 Jul 2023 18:01:44 +0400 Subject: [PATCH 4/7] Updated on 2026-08-14 --- .../data/WalletConnectRepositoryImpl.kt | 48 ++++++++++++++----- .../walletconnect2/domain/WcJrpcMethods.kt | 44 +++++++++++++++-- gradle/dependencies.toml | 4 +- 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt index dcd79b0985..9890f9863f 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.tangem.core.analytics.Analytics import com.tangem.tap.common.analytics.events.WalletConnect import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository import com.tangem.tap.domain.walletconnect2.domain.WcJrpcRequestsDeserializer +import com.tangem.tap.domain.walletconnect2.domain.WcRequest import com.tangem.tap.domain.walletconnect2.domain.models.* import com.walletconnect.android.Core import com.walletconnect.android.CoreClient @@ -87,7 +88,10 @@ class WalletConnectRepositoryImpl @Inject constructor( private fun defineWalletDelegate(): Web3Wallet.WalletDelegate { return object : Web3Wallet.WalletDelegate { - override fun onSessionProposal(sessionProposal: Wallet.Model.SessionProposal) { + override fun onSessionProposal( + sessionProposal: Wallet.Model.SessionProposal, + verifyContext: Wallet.Model.VerifyContext, + ) { // Triggered when wallet receives the session proposal sent by a Dapp Timber.d("sessionProposal: $sessionProposal") this@WalletConnectRepositoryImpl.sessionProposal = sessionProposal @@ -106,7 +110,10 @@ class WalletConnectRepositoryImpl @Inject constructor( } } - override fun onSessionRequest(sessionRequest: Wallet.Model.SessionRequest) { + override fun onSessionRequest( + sessionRequest: Wallet.Model.SessionRequest, + verifyContext: Wallet.Model.VerifyContext, + ) { // Triggered when a Dapp sends SessionRequest to sign a transaction or a message Timber.d("sessionRequest: $sessionRequest") val request = wcRequestDeserializer.deserialize( @@ -115,22 +122,38 @@ class WalletConnectRepositoryImpl @Inject constructor( ) Timber.d("sessionRequestParsed: $request") - scope.launch { - _events.emit( - WalletConnectEvents.SessionRequest( - request = request, - chainId = sessionRequest.chainId, + when (request) { + is WcRequest.AddChain -> { + // we can send approval automatically, because in WC 2.0 the list of chains is approved when + // initial connection is established + sendRequest( topic = sessionRequest.topic, id = sessionRequest.request.id, - metaUrl = sessionRequest.peerMetaData?.url ?: "", - metaName = sessionRequest.peerMetaData?.name ?: "", - ), - ) + result = "", + ) + } + else -> + scope.launch { + _events.emit( + WalletConnectEvents.SessionRequest( + request = request, + chainId = sessionRequest.chainId, + topic = sessionRequest.topic, + id = sessionRequest.request.id, + metaUrl = sessionRequest.peerMetaData?.url ?: "", + metaName = sessionRequest.peerMetaData?.name ?: "", + ), + ) + } } } - override fun onAuthRequest(authRequest: Wallet.Model.AuthRequest) { + override fun onAuthRequest( + authRequest: Wallet.Model.AuthRequest, + verifyContext: Wallet.Model.VerifyContext, + ) { // Triggered when Dapp / Requester makes an authorization request + Timber.d("onAuthRequest: $authRequest") } override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) { @@ -174,6 +197,7 @@ class WalletConnectRepositoryImpl @Inject constructor( override fun onError(error: Wallet.Model.Error) { // Triggered whenever there is an issue inside the SDK + Timber.d("onError: $error") } } } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WcJrpcMethods.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WcJrpcMethods.kt index 86ae71084c..9a0da6c971 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WcJrpcMethods.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WcJrpcMethods.kt @@ -1,9 +1,6 @@ package com.tangem.tap.domain.walletconnect2.domain -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.JsonClass -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types +import com.squareup.moshi.* import com.tangem.datasource.di.SdkMoshi import com.tangem.tap.domain.walletconnect2.domain.models.binance.WCBinanceTxConfirmParam import com.tangem.tap.domain.walletconnect2.domain.models.binance.WcBinanceCancelOrder @@ -24,6 +21,7 @@ enum class WcJrpcMethods(val code: String) { BNB_SIGN("bnb_sign"), BNB_TRANSACTION_CONFIRM("bnb_tx_confirmation"), SIGN_TRANSACTION("trust_signTransaction"), + WALLET_ADD_ETHEREUM_CHAIN("wallet_addEthereumChain"), ; companion object { @@ -33,13 +31,25 @@ enum class WcJrpcMethods(val code: String) { @JsonClass(generateAdapter = true) data class WCSignTransaction( + @Json(name = "network") val network: Int, + + @Json(name = "transaction") val transaction: String, ) : WcRequestData +@JsonClass(generateAdapter = true) +data class WcAddChain( + @Json(name = "chainId") + val chainId: String, +) : WcRequestData + @JsonClass(generateAdapter = true) data class WcEthereumSignMessage( + @Json(name = "raw") val raw: List, + + @Json(name = "type") val type: WCSignType, ) : WcRequestData { enum class WCSignType { @@ -71,15 +81,34 @@ data class WcEthereumSignMessage( @JsonClass(generateAdapter = true) data class WcEthereumTransaction( + @Json(name = "from") val from: String, + + @Json(name = "to") val to: String?, + + @Json(name = "nonce") val nonce: String?, + + @Json(name = "gasPrice") val gasPrice: String?, + + @Json(name = "maxFeePerGas") val maxFeePerGas: String?, + + @Json(name = "maxPriorityFeePerGas") val maxPriorityFeePerGas: String?, + + @Json(name = "gas") val gas: String?, + + @Json(name = "gasLimit") val gasLimit: String?, + + @Json(name = "value") val value: String?, + + @Json(name = "data") val data: String, ) : WcRequestData @@ -96,6 +125,7 @@ sealed class WcRequest(open val data: WcRequestData) { data class BnbTransfer(override val data: WcBinanceTransferOrder) : WcRequest(data) data class BnbTxConfirm(override val data: WCBinanceTxConfirmParam) : WcRequest(data) data class SignTransaction(override val data: WCSignTransaction) : WcRequest(data) + data class AddChain(override val data: WcAddChain) : WcRequest(data) data class CustomRequest(override val data: WcCustomRequestData) : WcRequest(data) } @@ -167,6 +197,12 @@ class WcJrpcRequestsDeserializer @Inject constructor(@SdkMoshi private val moshi ).fromJsonFirstOrNull(params) ?: return customRequest WcRequest.SignTransaction(data = deserializedParams) } + WcJrpcMethods.WALLET_ADD_ETHEREUM_CHAIN -> { + val deserializedParams: WcAddChain = moshi.adapter>( + Types.newParameterizedType(List::class.java, WcAddChain::class.java), + ).fromJsonFirstOrNull(params) ?: return customRequest + WcRequest.AddChain(data = deserializedParams) + } } } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 8366dd472c..f2b0e53a58 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -73,8 +73,8 @@ mviCore = "1.3.1" kotlinSerialization = "1.4.1" arrow = "1.2.0-RC" reactiveNetwork = "3.0.8" -walletConnectCore = "1.17.0" -walletConnectWeb3 = "1.10.0" +walletConnectCore = "1.18.0" +walletConnectWeb3 = "1.11.0" # endregion Other libraries # region Tangem From c1d0f97f0b5c995ba81682821ec9c70e69e2b8b8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 14 Jul 2023 12:25:12 +0300 Subject: [PATCH 5/7] Updated on 2026-08-14 --- .../implementation/BiometricUserWalletsListManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt index 18ec89cb9c..f28f3b06ee 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/implementation/BiometricUserWalletsListManager.kt @@ -100,7 +100,7 @@ internal class BiometricUserWalletsListManager( } else { val isWalletSaved = state.value.userWallets .any { - it.walletId == userWallet.walletId || it.cardsInWallet.contains(userWallet.cardId) + it.walletId == userWallet.walletId } if (isWalletSaved) { From 4880781ad2290adcb027a6f09431e3d3e55b6b85 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 14 Jul 2023 14:58:18 +0300 Subject: [PATCH 6/7] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 15fb408bde..9bd2291a93 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -185,4 +185,6 @@ fun Blockchain.isSupportedInApp(): Boolean { private val excludedBlockchains = listOf( Blockchain.Unknown, Blockchain.Ducatus, + Blockchain.Telos, // disable in 4.9 + Blockchain.TelosTestnet, // disable in 4.9 ) \ No newline at end of file From a7d324ef9860c25028f9be431254a2205e7642a1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 14 Jul 2023 15:08:50 +0300 Subject: [PATCH 7/7] Updated on 2026-08-14 --- .../src/main/assets/configs/feature_toggles_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index b5005743ed..7acffe7244 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -17,7 +17,7 @@ }, { "name": "1INCH_LEARN_2_EARN_ENABLED", - "version": "4.9.0" + "version": "4.10.0" }, { "name": "REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED",