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