From 8ffd626f40315d7d3dcee898e9d4429ebeafdf59 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 Mar 2023 17:19:43 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../tap/common/extensions/Blockchain.kt | 1 + .../tokens/LoadAvailableCoinsService.kt | 2 +- .../features/send/redux/SendScreenAction.kt | 6 +++++ .../middlewares/AddressPayIdMiddleware.kt | 11 ++++---- .../send/redux/middlewares/SendMiddleware.kt | 12 +++++++++ .../send/redux/reducers/SendScreenReducer.kt | 1 + .../send/ui/dialogs/KaspaWarningDialog.kt | 27 +++++++++++++++++++ .../stateSubscribers/SendStateSubscriber.kt | 7 +++++ .../main/res/drawable/ic_kaspa_no_color.xml | 12 +++++++++ .../datasource/config/ConfigManagerImpl.kt | 1 + .../datasource/config/models/JsonModels.kt | 1 + .../main/res/values-de/strings-blockchain.xml | 2 ++ .../main/res/values-fr/strings-blockchain.xml | 2 ++ .../main/res/values-it/strings-blockchain.xml | 2 ++ .../main/res/values-ru/strings-blockchain.xml | 2 ++ .../res/values-zh-rTW/strings-blockchain.xml | 4 ++- .../main/res/values/strings-blockchain.xml | 2 ++ .../core/ui/extensions/BlockchainIcons.kt | 2 ++ .../ui/src/main/res/drawable/img_kaspa_22.xml | 12 +++++++++ .../domain/common/extensions/Blockchain.kt | 3 +++ gradle/dependencies.toml | 4 +-- 22 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/send/ui/dialogs/KaspaWarningDialog.kt create mode 100644 app/src/main/res/drawable/ic_kaspa_no_color.xml create mode 100644 core/ui/src/main/res/drawable/img_kaspa_22.xml diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index a5f541fa43..c714678d9c 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit a5f541fa4380cf430144fab04e42b32b033ff548 +Subproject commit c714678d9c46dee1b15ef9e8d27aa23afa1dfd8d diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt index 133869ee22..4f9ab200f1 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt @@ -36,6 +36,7 @@ fun Blockchain.getGreyedOutIconRes(): Int { Blockchain.Kusama -> R.drawable.ic_kusama_no_color Blockchain.Optimism, Blockchain.OptimismTestnet -> R.drawable.ic_optimism_no_color Blockchain.Dash -> R.drawable.ic_dash_no_color + Blockchain.Kaspa -> R.drawable.ic_kaspa_no_color else -> R.drawable.ic_tangem_logo } } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt index e2cf3b1355..51c4c304e2 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt @@ -60,7 +60,7 @@ class LoadAvailableCoinsService( return withContext(dispatchers.io) { runCatching { tangemTechApi.getCoins( - networkIds = supportedBlockchains.toSet().map(Blockchain::toNetworkId).joinToString(","), + networkIds = supportedBlockchains.toSet().joinToString(",", transform = Blockchain::toNetworkId), active = true, searchText = searchInput, offset = offset, diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt index 64a01578f1..f69e50bf9c 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt @@ -155,6 +155,12 @@ sealed class SendAction : SendScreenAction { val reduceAmount: BigDecimal, ) : Dialog() + data class KaspaWarningDialog( + val maxOutputs: Int, + val maxAmount: BigDecimal, + val onOk: () -> Unit, + ) : Dialog() + sealed class SendTransactionFails : Dialog() { data class CardSdkError(val error: TangemSdkError) : Dialog() data class BlockchainSdkError(val error: com.tangem.blockchain.common.BlockchainSdkError) : Dialog() diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt index 7a94dce2a8..81d62770bc 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt @@ -52,7 +52,7 @@ internal class AddressPayIdMiddleware { } private fun setAddressAndCheck(data: String, isUserInput: Boolean, dispatch: (Action) -> Unit) { - val potentialPayId = data.toLowerCase() + val potentialPayId = data.lowercase() if (isPayIdEnabled() && PayIdManager.isPayId(potentialPayId)) { dispatch(SetPayIdWalletAddress(potentialPayId, "", isUserInput)) } else { @@ -113,10 +113,11 @@ internal class AddressPayIdMiddleware { } private fun verifyAddress(address: String, wallet: Wallet, isUserInput: Boolean, dispatch: (Action) -> Unit) { - val addressSchemeSplit = if (wallet.blockchain == Blockchain.BitcoinCash) { - listOf(address) - } else { - address.split(":") + val addressSchemeSplit = when (wallet.blockchain) { + Blockchain.BitcoinCash, + Blockchain.Kaspa, + -> listOf(address) + else -> address.split(":") } val noSchemeAddress = when (addressSchemeSplit.size) { 1 -> address // no scheme diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index 00d9ef32c1..b87cc3c49b 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -269,6 +269,18 @@ private fun sendTransaction( // from XLM, XRP, Polkadot dispatch(SendAction.Dialog.SendTransactionFails.BlockchainSdkError(error)) } + is BlockchainSdkError.Kaspa.UtxoAmountError -> { + dispatch( + SendAction.Dialog.KaspaWarningDialog( + maxOutputs = error.maxOutputs, + maxAmount = error.maxAmount, + onOk = { + dispatch(AmountAction.SetAmount(error.maxAmount, isUserInput = false)) + dispatch(AmountActionUi.CheckAmountToSend) + }, + ), + ) + } else -> { when { error.customMessage.contains(DemoTransactionSender.ID) -> { diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt index a0d911ccc8..a26e390555 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt @@ -55,6 +55,7 @@ private class SendReducer : SendInternalReducer { sendState.copy(sendButtonState = IndeterminateProgressButton(action.state)) } is SendAction.Dialog.TezosWarningDialog -> sendState.copy(dialog = action) + is SendAction.Dialog.KaspaWarningDialog -> sendState.copy(dialog = action) is SendAction.Dialog.SendTransactionFails.CardSdkError -> sendState.copy(dialog = action) is SendAction.Dialog.SendTransactionFails.BlockchainSdkError -> sendState.copy(dialog = action) is SendAction.Dialog.RequestFeeError -> sendState.copy(dialog = action) diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/KaspaWarningDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/KaspaWarningDialog.kt new file mode 100644 index 0000000000..0b60a105f5 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/KaspaWarningDialog.kt @@ -0,0 +1,27 @@ +package com.tangem.tap.features.send.ui.dialogs + +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.tangem.tap.features.send.redux.SendAction +import com.tangem.tap.store +import com.tangem.wallet.R + +object KaspaWarningDialog { + fun create(context: Context, dialog: SendAction.Dialog.KaspaWarningDialog): AlertDialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.common_warning) + setMessage( + context.getString( + R.string.kaspa_withdrawal_message_warning, + dialog.maxOutputs, + dialog.maxAmount.toPlainString(), + ), + ) + setPositiveButton(R.string.common_ok) { _, _ -> + store.dispatch(SendAction.Dialog.Hide) + dialog.onOk() + } + } + .create() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index ac418ad22c..055f885169 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -33,6 +33,7 @@ import com.tangem.tap.features.send.redux.states.TransactionExtraError import com.tangem.tap.features.send.redux.states.TransactionExtrasState import com.tangem.tap.features.send.ui.FeeUiHelper import com.tangem.tap.features.send.ui.SendFragment +import com.tangem.tap.features.send.ui.dialogs.KaspaWarningDialog import com.tangem.tap.features.send.ui.dialogs.RequestFeeErrorDialog import com.tangem.tap.features.send.ui.dialogs.SendTransactionFailsDialog import com.tangem.tap.features.send.ui.dialogs.TezosWarningDialog @@ -124,6 +125,12 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : dialog?.show() } } + is SendAction.Dialog.KaspaWarningDialog -> { + if (dialog == null) { + dialog = KaspaWarningDialog.create(fg.requireContext(), state.dialog) + dialog?.show() + } + } is SendAction.Dialog.SendTransactionFails.CardSdkError -> { if (dialog == null) { dialog = SendTransactionFailsDialog.create(fg.requireContext(), state.dialog) diff --git a/app/src/main/res/drawable/ic_kaspa_no_color.xml b/app/src/main/res/drawable/ic_kaspa_no_color.xml new file mode 100644 index 0000000000..cae1a10de8 --- /dev/null +++ b/app/src/main/res/drawable/ic_kaspa_no_color.xml @@ -0,0 +1,12 @@ + + + + diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt index d0c6d148c2..ed73d0bca4 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt @@ -102,6 +102,7 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager { saltPayAuthToken = configValues.saltPay.credentials.basicAuthToken, nowNodeCredentials = NowNodeCredentials(configValues.nowNodesApiKey), getBlockCredentials = GetBlockCredentials(configValues.getBlockApiKey), + kaspaSecondaryApiUrl = configValues.kaspaSecondaryApiUrl, ), appsFlyerDevKey = configValues.appsFlyer.appsFlyerDevKey, amplitudeApiKey = configValues.amplitudeApiKey, diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt index 7bfabdebf1..ff996033fd 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt @@ -35,6 +35,7 @@ class ConfigValueModel( val tronGridApiKey: String, val amplitudeApiKey: String, val swapReferrerAccount: SwapReferrerAccount?, + val kaspaSecondaryApiUrl: String, ) data class AppsFlyer( diff --git a/core/res/src/main/res/values-de/strings-blockchain.xml b/core/res/src/main/res/values-de/strings-blockchain.xml index 272b4f483c..b8c91dd3d6 100644 --- a/core/res/src/main/res/values-de/strings-blockchain.xml +++ b/core/res/src/main/res/values-de/strings-blockchain.xml @@ -3,6 +3,8 @@ Default Legacy Erhalt der Gebühr fehlgeschlagen + Not enough funds for the transaction. Please top up your account. + Due to Kaspa limitations only %1$d UTXOs can fit in a single transaction. This means you can only send %2$s or less. You need to reduce the amount. Laden Sie %1$s+ %2$s auf um ein Konto zu erstellen Destination account is not active. Send %s or more to activate the account. Interner Fehler der Blockchain diff --git a/core/res/src/main/res/values-fr/strings-blockchain.xml b/core/res/src/main/res/values-fr/strings-blockchain.xml index 1bfd82f0a6..8a4f00445a 100644 --- a/core/res/src/main/res/values-fr/strings-blockchain.xml +++ b/core/res/src/main/res/values-fr/strings-blockchain.xml @@ -3,6 +3,8 @@ Default Legacy Échec de réception des commissions + Not enough funds for the transaction. Please top up your account. + Due to Kaspa limitations only %1$d UTXOs can fit in a single transaction. This means you can only send %2$s or less. You need to reduce the amount. Pour créer un compte, téléchargez %1$s+ %2$s Destination account is not active. Send %s or more to activate the account. Erreur interne de la blockchain diff --git a/core/res/src/main/res/values-it/strings-blockchain.xml b/core/res/src/main/res/values-it/strings-blockchain.xml index e05f2a9a89..2581b20ac9 100644 --- a/core/res/src/main/res/values-it/strings-blockchain.xml +++ b/core/res/src/main/res/values-it/strings-blockchain.xml @@ -3,6 +3,8 @@ Default Legacy Impossibile ottenere la commissione + Not enough funds for the transaction. Please top up your account. + Due to Kaspa limitations only %1$d UTXOs can fit in a single transaction. This means you can only send %2$s or less. You need to reduce the amount. Scarica %1$s+ %2$s per creare un account Destination account is not active. Send %s or more to activate the account. Errore interno della blockchain diff --git a/core/res/src/main/res/values-ru/strings-blockchain.xml b/core/res/src/main/res/values-ru/strings-blockchain.xml index 74528753b1..53b0aa27f3 100644 --- a/core/res/src/main/res/values-ru/strings-blockchain.xml +++ b/core/res/src/main/res/values-ru/strings-blockchain.xml @@ -3,6 +3,8 @@ По умолчанию Устаревший Не удалось получить комиссию + Недостаточно средств для совершения транзакции. Пожалуйста, пополните свой аккаунт. + Из-за ограничений Kaspa в одну транзакцию может поместиться только %1$d UTXO. Это означает, что вы можете отправить только %2$s или меньше. Вам нужно уменьшить сумму. Пополните счет на %1$s+ %2$s, чтобы создать аккаунт Аккаунт получателя не активирован. Отправьте %s или более для активации аккаунта. Внутренняя ошибка блокчейна diff --git a/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml b/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml index 064dc69503..d593a969ce 100644 --- a/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml +++ b/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml @@ -3,8 +3,10 @@ 默認 遺留資產 獲取費用失敗 + 沒有足夠的資金進行交易。請先入金 + Due to Kaspa limitations only %1$d UTXOs can fit in a single transaction. This means you can only send %2$s or less. You need to reduce the amount. 加載 %1$s+ %2$s 以創建帳戶 - 目標帳戶未激活。發送 %s 或更多以激活帳戶。 + 目標帳戶未激活。發送 %s 或更多以激活帳戶 區塊鏈內部錯誤 最小數量是 %s 更動太小 diff --git a/core/res/src/main/res/values/strings-blockchain.xml b/core/res/src/main/res/values/strings-blockchain.xml index 3a01e0328f..c3df35291d 100644 --- a/core/res/src/main/res/values/strings-blockchain.xml +++ b/core/res/src/main/res/values/strings-blockchain.xml @@ -3,6 +3,8 @@ Default Legacy Failed to get fee + Not enough funds for the transaction. Please top up your account. + Due to Kaspa limitations only %1$d UTXOs can fit in a single transaction. This means you can only send %2$s or less. You need to reduce the amount. Load %1$s+ %2$s to create account Destination account is not active. Send %s or more to activate the account. Blockchain internal error diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt index ae4d3a5c93..f3d1e037fd 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt @@ -32,6 +32,7 @@ fun getActiveIconRes(blockchainId: String): Int { "Kusama" -> R.drawable.img_kusama_22 "OPTIMISM", "OPTIMISM/test" -> R.drawable.img_optimism_22 "DASH" -> R.drawable.img_dash_22 + "KAS" -> R.drawable.img_kaspa_22 else -> R.drawable.ic_alert_24 } } @@ -70,6 +71,7 @@ fun getActiveIconResByCoinId(coinId: String, networkId: String): Int { "ethereumfair" -> R.drawable.img_eth_fair_22 "kusama" -> R.drawable.img_kusama_22 "dash" -> R.drawable.img_dash_22 + "kaspa" -> R.drawable.img_kaspa_22 else -> R.drawable.ic_alert_24 } } \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/img_kaspa_22.xml b/core/ui/src/main/res/drawable/img_kaspa_22.xml new file mode 100644 index 0000000000..0fe4d6db53 --- /dev/null +++ b/core/ui/src/main/res/drawable/img_kaspa_22.xml @@ -0,0 +1,12 @@ + + + + diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index f8bb58f3f1..9ec8533263 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -49,6 +49,7 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "optimistic-ethereum/test" -> Blockchain.OptimismTestnet "dash" -> Blockchain.Dash "sxdai" -> Blockchain.SaltPay + "kaspa" -> Blockchain.Kaspa else -> null } } @@ -102,6 +103,7 @@ fun Blockchain.toNetworkId(): String { Blockchain.OptimismTestnet -> "optimistic-ethereum/test" Blockchain.Dash -> "dash" Blockchain.SaltPay -> "sxdai" + Blockchain.Kaspa -> "kaspa" } } @@ -135,6 +137,7 @@ fun Blockchain.toCoinId(): String { Blockchain.Optimism, Blockchain.OptimismTestnet -> "ethereum" Blockchain.Dash -> "dash" Blockchain.SaltPay -> "xdai" + Blockchain.Kaspa -> "kaspa" Blockchain.Unknown -> "unknown" } } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 5a50bb5667..c673ea6135 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -68,8 +68,8 @@ kotlinSerialization = "1.4.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-177" -# tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds +tangemBlockchainSdk = "develop-179" +#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-204" # tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem