From 5fafcc65d4237e06db525b35f6ee9dc8f1c2ae9f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 2 Nov 2023 17:33:12 +0200 Subject: [PATCH 1/6] Updated on 2026-08-14 --- .../features/send/redux/middlewares/AddressValidator.kt | 7 ++++--- .../java/com/tangem/domain/common/extensions/Blockchain.kt | 2 -- gradle/dependencies.toml | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt index 4c99c1e5c8..f4b4a3c488 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt @@ -13,16 +13,17 @@ internal class AddressValidator { suspend fun validateAddress(walletManager: WalletManager, address: String): AddressVerifyAction.Error? { val blockchain = walletManager.wallet.blockchain val wallet = walletManager.wallet + val regex = Regex("^[a-z0-9-_]+$") return if ((blockchain == Blockchain.Near || blockchain == Blockchain.NearTestnet) && - address.length != NEAR_IMPLICIT_ADDRESS_LENGTH + address.length != NEAR_IMPLICIT_ADDRESS_LENGTH && regex.matches(address) ) { - validateNearAddress(walletManager, address) + validateNearNamedAddress(walletManager, address) } else { validateAddress(wallet, address) } } - private suspend fun validateNearAddress( + private suspend fun validateNearNamedAddress( walletManager: WalletManager, address: String, ): AddressVerifyAction.Error? { 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 5a87b12b7f..69fe697d8a 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 @@ -221,6 +221,4 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, Blockchain.TelosTestnet, - Blockchain.Near, - Blockchain.NearTestnet, ) \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 8b17366339..a11a1924f1 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -81,7 +81,7 @@ spr-client = "3.6.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.0-374" +tangemBlockchainSdk = "release-app_5.0-376" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.0-309" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 7bf535ffb6a08f268880ca3f28d4d5b82329ec44 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 Nov 2023 14:11:21 +0200 Subject: [PATCH 2/6] Updated on 2026-08-14 --- .../redux/middlewares/AddressValidator.kt | 39 +++++++++++++------ gradle/dependencies.toml | 2 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt index f4b4a3c488..195250f789 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressValidator.kt @@ -13,26 +13,40 @@ internal class AddressValidator { suspend fun validateAddress(walletManager: WalletManager, address: String): AddressVerifyAction.Error? { val blockchain = walletManager.wallet.blockchain val wallet = walletManager.wallet - val regex = Regex("^[a-z0-9-_]+$") - return if ((blockchain == Blockchain.Near || blockchain == Blockchain.NearTestnet) && - address.length != NEAR_IMPLICIT_ADDRESS_LENGTH && regex.matches(address) - ) { - validateNearNamedAddress(walletManager, address) + + return if (blockchain.isNear()) { + validateNearAddress(walletManager, address) } else { validateAddress(wallet, address) } } - private suspend fun validateNearNamedAddress( + private suspend fun validateNearAddress( walletManager: WalletManager, address: String, ): AddressVerifyAction.Error? { - val result = (walletManager as? NearWalletManager)?.getAccount(address) - return if (result is Result.Success && result.data is NearAccount.Full) { - null - } else { - AddressVerifyAction.Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN + // implicit address validation + if (address.length == NEAR_IMPLICIT_ADDRESS_LENGTH && hexRegex.matches(address)) { + return validateAddress(walletManager.wallet, address) } + + // named address validation + if (address.length in NEAR_MIN_ADDRESS_LENGTH until NEAR_IMPLICIT_ADDRESS_LENGTH && + nearAddressRegex.matches(address) + ) { + val result = (walletManager as? NearWalletManager)?.getAccount(address) + return if (result is Result.Success && result.data is NearAccount.Full) { + null + } else { + AddressVerifyAction.Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN + } + } + + return AddressVerifyAction.Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN + } + + private fun Blockchain.isNear(): Boolean { + return this == Blockchain.Near || this == Blockchain.NearTestnet } private fun validateAddress(wallet: Wallet, address: String): AddressVerifyAction.Error? { @@ -48,6 +62,9 @@ internal class AddressValidator { } companion object { + private const val NEAR_MIN_ADDRESS_LENGTH = 2 private const val NEAR_IMPLICIT_ADDRESS_LENGTH = 64 + private val hexRegex = Regex("^[0-9a-f]+$") + private val nearAddressRegex = Regex("^(([a-z\\d]+[\\-_])*[a-z\\d]+\\.)*([a-z\\d]+[\\-_])*[a-z\\d]+\$") } } \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index a11a1924f1..00f30a9c5c 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -81,7 +81,7 @@ spr-client = "3.6.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.0-376" +tangemBlockchainSdk = "release-app_5.0-378" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.0-309" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From d65c12dbb8c366e5627eefa08a4ddfe669b53481 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 Nov 2023 17:06:03 +0300 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index 4d30db8c36..d20875298c 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -32,6 +32,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware +import timber.log.Timber import java.util.Locale object GlobalMiddleware { @@ -190,6 +191,7 @@ private fun handleAction(action: Action, appState: () -> AppState?) { .getAll(userWallet.walletId) .distinctUntilChanged() .onEach(infoHolder::setWalletsInfo) + .catch { Timber.e(it) } .launchIn(mainScope) } } From ff74b5375f9519f7260bc4e76601293909b84705 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 Nov 2023 17:09:17 +0300 Subject: [PATCH 4/6] 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 00f30a9c5c..a4408cd2b2 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -81,7 +81,7 @@ spr-client = "3.6.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.0-378" +tangemBlockchainSdk = "release-app_5.0-379" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.0-309" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 733a577f8f8b681fb2e9f06014ecfea3716d8f02 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 Nov 2023 18:32:33 +0300 Subject: [PATCH 5/6] Updated on 2026-08-14 --- .../domain/walletconnect/WalletConnectSdkHelper.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 e9f267c509..3344347b20 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 @@ -178,7 +178,12 @@ class WalletConnectSdkHelper { SimpleResult.Success -> { val sentFrom = AnalyticsParam.TxSentFrom.WalletConnect Analytics.send(Basic.TransactionSent(sentFrom = sentFrom, memoType = MemoType.Null)) - HEX_PREFIX + data.walletManager.wallet.recentTransactions.last().hash + val hash = data.walletManager.wallet.recentTransactions.last().hash + if (hash?.startsWith(HEX_PREFIX) == true) { + hash + } else { + HEX_PREFIX + hash + } } is SimpleResult.Failure -> { Timber.e(result.error as BlockchainSdkError) @@ -202,12 +207,17 @@ class WalletConnectSdkHelper { val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId) return when (result) { is CompletionResult.Success -> { - HEX_PREFIX + EthereumUtils.prepareTransactionToSend( + val hash = EthereumUtils.prepareTransactionToSend( signature = result.data.signature, transactionToSign = dataToSign, walletPublicKey = data.walletManager.wallet.publicKey, blockchain = data.walletManager.wallet.blockchain, ).toHexString() + if (hash.startsWith(HEX_PREFIX)) { + hash + } else { + HEX_PREFIX + hash + } } is CompletionResult.Failure -> { Timber.e(result.error.customMessage) From c6e9a766dc097c066b325d641ca8dba8e42ad4af Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 5 Nov 2023 15:27:51 +0300 Subject: [PATCH 6/6] Updated on 2026-08-14 --- .../java/com/tangem/datasource/files/AndroidFileReader.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/files/AndroidFileReader.kt b/core/datasource/src/main/java/com/tangem/datasource/files/AndroidFileReader.kt index 5957268681..fa1cd570f0 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/files/AndroidFileReader.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/files/AndroidFileReader.kt @@ -2,6 +2,7 @@ package com.tangem.datasource.files import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext +import okio.use import javax.inject.Inject class AndroidFileReader @Inject constructor(@ApplicationContext private val context: Context) : FileReader { @@ -16,7 +17,10 @@ class AndroidFileReader @Inject constructor(@ApplicationContext private val cont override fun rewriteFile(content: String, fileName: String) { context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream -> - stream.write(content.toByteArray(), 0, content.length) + stream.writer().use { writer -> + // warning: don't write byteArray as json, its break cyrillic encoding + writer.write(content) + } } }