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