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..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,9 +13,8 @@ internal class AddressValidator { suspend fun validateAddress(walletManager: WalletManager, address: String): AddressVerifyAction.Error? { val blockchain = walletManager.wallet.blockchain val wallet = walletManager.wallet - return if ((blockchain == Blockchain.Near || blockchain == Blockchain.NearTestnet) && - address.length != NEAR_IMPLICIT_ADDRESS_LENGTH - ) { + + return if (blockchain.isNear()) { validateNearAddress(walletManager, address) } else { validateAddress(wallet, address) @@ -26,12 +25,28 @@ internal class AddressValidator { 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? { @@ -47,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/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..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-374" +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