Updated on 2026-08-14

This commit is contained in:
Tangem 2024-01-25 21:02:22 +05:00
parent 560b78cb43
commit b082a86c35
3 changed files with 38 additions and 11 deletions

View file

@ -552,6 +552,7 @@ class DefaultWalletManagersFacade(
blockchain = blockchain, blockchain = blockchain,
derivationPath = derivationPath, derivationPath = derivationPath,
) )
val feePaidCurrency = blockchain.feePaidCurrency()
if (walletManager == null) { if (walletManager == null) {
Timber.e("Unable to get a wallet manager for blockchain: $blockchain") Timber.e("Unable to get a wallet manager for blockchain: $blockchain")
@ -560,6 +561,7 @@ class DefaultWalletManagersFacade(
val transactionDataConverter = TransactionDataToTxHistoryItemConverter( val transactionDataConverter = TransactionDataToTxHistoryItemConverter(
walletAddresses = SdkAddressToAddressConverter.convertList(walletManager.wallet.addresses).toSet(), walletAddresses = SdkAddressToAddressConverter.convertList(walletManager.wallet.addresses).toSet(),
feePaidCurrency = feePaidCurrency,
) )
return walletManager.wallet.recentTransactions.mapNotNull(transactionDataConverter::convert) return walletManager.wallet.recentTransactions.mapNotNull(transactionDataConverter::convert)

View file

@ -1,8 +1,6 @@
package com.tangem.domain.walletmanager.utils package com.tangem.domain.walletmanager.utils
import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.*
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.TransactionStatus
import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.domain.txhistory.models.TxHistoryItem
import com.tangem.domain.walletmanager.model.Address import com.tangem.domain.walletmanager.model.Address
import com.tangem.utils.converter.Converter import com.tangem.utils.converter.Converter
@ -18,6 +16,7 @@ import java.math.BigDecimal
*/ */
internal class TransactionDataToTxHistoryItemConverter( internal class TransactionDataToTxHistoryItemConverter(
private val walletAddresses: Set<Address>, private val walletAddresses: Set<Address>,
private val feePaidCurrency: FeePaidCurrency,
) : Converter<TransactionData, TxHistoryItem?> { ) : Converter<TransactionData, TxHistoryItem?> {
override fun convert(value: TransactionData): TxHistoryItem? { override fun convert(value: TransactionData): TxHistoryItem? {
@ -48,12 +47,30 @@ internal class TransactionDataToTxHistoryItemConverter(
private fun getTransactionAmountValue(amount: Amount, feeAmount: Amount?): BigDecimal? { private fun getTransactionAmountValue(amount: Amount, feeAmount: Amount?): BigDecimal? {
val feeValue = feeAmount?.value ?: BigDecimal.ZERO val feeValue = feeAmount?.value ?: BigDecimal.ZERO
val value = amount.value?.plus(feeValue) val value = amount.value
if (value == null) { if (value == null) {
Timber.w("Transaction amount must not be null: ${amount.currencySymbol}") Timber.w("Transaction amount must not be null: ${amount.currencySymbol}")
} }
return value return when (feePaidCurrency) {
FeePaidCurrency.SameCurrency -> value?.plus(feeValue)
FeePaidCurrency.Coin -> {
if (amount.type is AmountType.Coin) value?.plus(feeValue) else value
}
is FeePaidCurrency.Token -> {
val token = (amount.type as? AmountType.Token)?.token ?: return value
if (isSameToken(token, feePaidCurrency.token)) {
value?.plus(feeValue)
} else {
value
}
}
}
}
private fun isSameToken(amountToken: Token, feeToken: Token): Boolean {
return amountToken.contractAddress.equals(feeToken.contractAddress, ignoreCase = true) &&
amountToken.symbol.equals(feeToken.symbol, ignoreCase = true)
} }
} }

View file

@ -15,24 +15,28 @@ internal class UpdateWalletManagerResultFactory {
fun getResult(walletManager: WalletManager): UpdateWalletManagerResult.Verified { fun getResult(walletManager: WalletManager): UpdateWalletManagerResult.Verified {
val wallet = walletManager.wallet val wallet = walletManager.wallet
val addresses = getAvailableAddresses(wallet.addresses) val addresses = getAvailableAddresses(wallet.addresses)
val feePaidCurrency = wallet.blockchain.feePaidCurrency()
val txHistoryItemConverter = TransactionDataToTxHistoryItemConverter(addresses, feePaidCurrency)
return UpdateWalletManagerResult.Verified( return UpdateWalletManagerResult.Verified(
selectedAddress = wallet.address, selectedAddress = wallet.address,
addresses = addresses, addresses = addresses,
currenciesAmounts = getTokensAmounts(wallet.amounts.values.toSet()), currenciesAmounts = getTokensAmounts(wallet.amounts.values.toSet()),
currentTransactions = getCurrentTransactions(addresses, wallet.recentTransactions.toSet()), currentTransactions = getCurrentTransactions(txHistoryItemConverter, wallet.recentTransactions.toSet()),
) )
} }
fun getDemoResult(walletManager: WalletManager, demoAmount: Amount): UpdateWalletManagerResult.Verified { fun getDemoResult(walletManager: WalletManager, demoAmount: Amount): UpdateWalletManagerResult.Verified {
val wallet = walletManager.wallet val wallet = walletManager.wallet
val addresses = getAvailableAddresses(wallet.addresses) val addresses = getAvailableAddresses(wallet.addresses)
val feePaidCurrency = wallet.blockchain.feePaidCurrency()
val txHistoryItemConverter = TransactionDataToTxHistoryItemConverter(addresses, feePaidCurrency)
return UpdateWalletManagerResult.Verified( return UpdateWalletManagerResult.Verified(
selectedAddress = wallet.address, selectedAddress = wallet.address,
addresses = addresses, addresses = addresses,
currenciesAmounts = getDemoTokensAmounts(demoAmount, walletManager.cardTokens), currenciesAmounts = getDemoTokensAmounts(demoAmount, walletManager.cardTokens),
currentTransactions = getCurrentTransactions(addresses, wallet.recentTransactions.toSet()), currentTransactions = getCurrentTransactions(txHistoryItemConverter, wallet.recentTransactions.toSet()),
) )
} }
@ -81,14 +85,19 @@ internal class UpdateWalletManagerResultFactory {
} }
private fun getCurrentTransactions( private fun getCurrentTransactions(
walletAddresses: Set<Address>, txHistoryItemConverter: TransactionDataToTxHistoryItemConverter,
recentTransactions: Set<TransactionData>, recentTransactions: Set<TransactionData>,
): Set<CryptoCurrencyTransaction> { ): Set<CryptoCurrencyTransaction> {
val unconfirmedTransactions = recentTransactions.filter { val unconfirmedTransactions = recentTransactions.filter {
it.status == TransactionStatus.Unconfirmed it.status == TransactionStatus.Unconfirmed
} }
return unconfirmedTransactions.mapNotNullTo(hashSetOf()) { createCurrencyTransaction(walletAddresses, it) } return unconfirmedTransactions.mapNotNullTo(hashSetOf()) {
createCurrencyTransaction(
txHistoryItemConverter = txHistoryItemConverter,
data = it,
)
}
} }
private fun createCurrencyAmount(amount: Amount): CryptoCurrencyAmount? { private fun createCurrencyAmount(amount: Amount): CryptoCurrencyAmount? {
@ -106,10 +115,9 @@ internal class UpdateWalletManagerResultFactory {
} }
private fun createCurrencyTransaction( private fun createCurrencyTransaction(
walletAddresses: Set<Address>, txHistoryItemConverter: TransactionDataToTxHistoryItemConverter,
data: TransactionData, data: TransactionData,
): CryptoCurrencyTransaction? { ): CryptoCurrencyTransaction? {
val txHistoryItemConverter = TransactionDataToTxHistoryItemConverter(walletAddresses)
return when (val type = data.amount.type) { return when (val type = data.amount.type) {
is AmountType.Coin -> { is AmountType.Coin -> {
val txHistoryItem = txHistoryItemConverter.convert(data) ?: return null val txHistoryItem = txHistoryItemConverter.convert(data) ?: return null