From 5fafcc65d4237e06db525b35f6ee9dc8f1c2ae9f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 2 Nov 2023 17:33:12 +0200 Subject: [PATCH 1/2] 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/2] 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