diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index 3914707cc3..18ce548096 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -72,7 +72,7 @@ class WalletConnectSdkHelper { } // TODO move fee calculation to SDK getFee() [REDACTED_JIRA] - val gasLimit = getGasLimitFromTx(value, walletManager, transaction) + val gasLimit = getGasLimitFromTx(value, walletManager, transaction, blockchain) val gasPrice = getGasPrice(walletManager, transaction) val feeDecimal = (gasLimit * gasPrice).movePointLeft(decimals) @@ -170,6 +170,7 @@ class WalletConnectSdkHelper { value: BigDecimal, walletManager: WalletManager, transaction: WcEthereumTransaction, + blockchain: Blockchain, ): BigDecimal { return transaction.gas?.hexToBigDecimal() ?: transaction.gasLimit?.hexToBigDecimal() @@ -177,7 +178,7 @@ class WalletConnectSdkHelper { value = value, walletManager = walletManager, transaction = transaction, - ) + ).increaseForMantleIfNeeded(blockchain) } private suspend fun getGasLimitFromBlockchain( @@ -200,6 +201,15 @@ class WalletConnectSdkHelper { } } + // TODO Workaround for Mantle. Remove after [REDACTED_JIRA] + private fun BigDecimal.increaseForMantleIfNeeded(blockchain: Blockchain): BigDecimal { + return if (blockchain == Blockchain.Mantle) { + this.multiply(MANTLE_FEE_ESTIMATE_MULTIPLIER) + } else { + this + } + } + private suspend fun sendTransaction(data: WcTransactionData, cardId: String?): String? { val result = (data.walletManager as TransactionSender).send( transactionData = data.transaction, diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index 4e8c1bbf82..f42a80725e 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -272,22 +272,24 @@ class TransactionManagerImpl( * @param blockchain */ private fun createMultipleProxyFees(gasPrice: BigInteger, gasLimit: BigInteger, blockchain: Blockchain): ProxyFees { - val gasPriceNormal = gasPrice.increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE) + val patchedGasLimit = gasLimit.toBigDecimal().increaseForMantleIfNeeded(blockchain).toBigInteger() + val gasPriceNormal = gasPrice + .increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE) val gasPricePriority = gasPrice.increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_PRIORITY_FEE) - val feeMin = gasLimit.multiply(gasPrice).toBigDecimal( + val feeMin = patchedGasLimit.multiply(gasPrice).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) - val feeNormal = gasLimit.multiply(gasPriceNormal).toBigDecimal( + val feeNormal = patchedGasLimit.multiply(gasPriceNormal).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) - val feePriority = gasLimit.multiply(gasPricePriority).toBigDecimal( + val feePriority = patchedGasLimit.multiply(gasPricePriority).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) val minFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feeMin, @@ -295,7 +297,7 @@ class TransactionManagerImpl( ), ) val normalFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feeNormal, @@ -303,7 +305,7 @@ class TransactionManagerImpl( ), ) val priorityFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feePriority, diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index f142066bec..c9b6c36eff 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -875,6 +875,8 @@ Auf dieser Karte sind nur noch %s Unterschriften übrig. Du musst dein gesamtes Guthaben abheben. Geringe Anzahl von Unterschriften Token in verschiedenen Netzwerken können unterschiedliche Adressen haben. Überprüfe bei der Überweisung noch einmal, ob deine Adresse mit der des Netzwerks übereinstimmt. + Migration von MATIC zu POL + MATIC wird auf POL migriert. Es gibt jedoch keine Frist, und MATIC wird noch nicht abgeschafft. Du kannst MATIC-Token weiterhin verwenden oder sie über eien Exchange gegen POL tauschen. Verwende deine Karte, um eine Adresse für das %d-Netz zu erhalten Verwende deine Karte, um mehrere Adressen für die %d-Netzwerke zu erhalten diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index af264b0a88..55189ebf68 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -863,6 +863,8 @@ このカードには%sの署名のみが残っています。資金をすべて引き出す必要があります。 署名数が少ないです 異なるネットワーク上のトークンは、異なるアドレスを持つ場合があります。資金を送金する際には、アドレスがネットワークと一致していることを再確認してください。 + MATICからPOLへの移行 + MATICはPOLに移行中です。ただし、期限は設定されておらず、MATICはまだ廃止されていません。MATICトークンを引き続き安全に使用することも、取引所でPOLに交換することもできます。 %d ネットワークのアドレスを取得するために、カードを利用してください diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 83717a3ab1..324a1a41ba 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -882,6 +882,8 @@ На этой карте осталось всего %s подписей. Вам следует вывести все ваши средства. Малое количество подписей Токены на разных сетях могут иметь разные адреса. Пожалуйста, убедитесь при переводе средств, что ваш адрес соответствует сети. + Миграция MATIC в POL + Токен MATIC мигрирует на POL. Однако крайний срок не установлен, и MATIC пока не устарел. Вы можете спокойно продолжать использовать токен MATIC или воспользоваться биржами, чтобы обменять его на POL. Используйте вашу карту, чтобы получить адрес для %d сети Используйте вашу карту, чтобы получить адреса для %d сетей diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 784a17bf0f..957150188b 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -875,6 +875,8 @@ Only %s signatures are left on this card. You must withdraw all of your funds. Low signature count Tokens on different networks can have different addresses. Double-check that your address matches the network when you transfer funds. + MATIC to POL Migration + MATIC is being migrated to POL. However there is no deadline set and MATIC isn\'t being deprecated yet. You can safely continue using MATIC token or use exchanges to swap it for POL. Use your card to get an address for %d network Use your card to get an addresses for %d networks diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt index 2fa13a5018..4c4473250c 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt @@ -48,6 +48,8 @@ sealed class CryptoCurrencyWarning { data object BeaconChainShutdown : CryptoCurrencyWarning() + data object MigrationMaticToPol : CryptoCurrencyWarning() + /** * Shows a warning about an available fee resource for a transaction in several blockchains (ex. Koinos) */ diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 03c0debc06..fc77aa776b 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -76,6 +76,7 @@ class GetCurrencyWarningsUseCase( getNetworkNoAccountWarning(currencyStatus), getBeaconChainShutdownWarning(currency.network.id), getAssetRequirementsWarning(userWalletId = userWalletId, currency = currency), + getMigrationFromMaticToPolWarning(currency), ) }.flowOn(dispatchers.io) } @@ -304,7 +305,19 @@ class GetCurrencyWarningsUseCase( } } + private fun getMigrationFromMaticToPolWarning(currency: CryptoCurrency): CryptoCurrencyWarning? { + return if (currency.symbol == MATIC_SYMBOL && !BlockchainUtils.isPolygonChain(currency.network.id.value)) { + CryptoCurrencyWarning.MigrationMaticToPol + } else { + null + } + } + private fun BigDecimal?.isZero(): Boolean { return this?.signum() == 0 } + + companion object { + private const val MATIC_SYMBOL = "MATIC" + } } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt index 300083d876..e46cc3f47c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt @@ -49,6 +49,7 @@ internal class TokenDetailsNotificationsAnalyticsSender( is TokenDetailsNotification.NetworkShutdown, is TokenDetailsNotification.HederaAssociateWarning, is TokenDetailsNotification.KoinosMana, + is TokenDetailsNotification.MigrationMaticToPol, -> null } } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt index a09065820b..69b5beb389 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt @@ -201,4 +201,9 @@ internal sealed class TokenDetailsNotification(val config: NotificationConfig) { formatArgs = wrappedList(manaBalanceAmount, maxManaBalanceAmount), ), ) + + data object MigrationMaticToPol : Warning( + title = resourceReference(id = R.string.warning_matic_migration_title), + subtitle = resourceReference(id = R.string.warning_matic_migration_message), + ) } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt index fd828b47d0..0722f5a792 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt @@ -122,6 +122,7 @@ internal class TokenDetailsNotificationConverter( "" }, ) + is CryptoCurrencyWarning.MigrationMaticToPol -> MigrationMaticToPol } } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt index 35b8386cd9..30767aeb4b 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt @@ -55,4 +55,10 @@ object BlockchainUtils { val blockchain = Blockchain.fromId(networkId) return blockchain == Blockchain.Binance || blockchain == Blockchain.BinanceTestnet } + + /** If current [networkId] is Polygon */ + fun isPolygonChain(networkId: String): Boolean { + val blockchain = Blockchain.fromId(networkId) + return blockchain == Blockchain.Polygon || blockchain == Blockchain.PolygonTestnet + } } \ No newline at end of file