From 55a740c941565f8a6529d3c7d21de93aa4fcb2ee Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Apr 2025 12:37:05 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../DefaultTransactionRepository.kt | 30 +++++++++++++------ .../transaction/TransactionRepository.kt | 4 +-- .../CreateApprovalTransactionUseCase.kt | 2 +- .../transaction/usecase/GetFeeUseCase.kt | 2 +- .../helpers/StakingFeeTransactionLoader.kt | 20 +++++++++++-- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index da6951cafd..69af643654 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -38,7 +38,7 @@ internal class DefaultTransactionRepository( override suspend fun createTransaction( amount: Amount, - fee: Fee, + fee: Fee?, memo: String?, destination: String, userWalletId: UserWalletId, @@ -52,13 +52,25 @@ internal class DefaultTransactionRepository( derivationPath = network.derivationPath.value, ) ?: error("Wallet manager not found") - return@withContext walletManager.createTransaction( - amount = amount, - fee = fee, - destination = destination, - ).copy( - extras = txExtras ?: getMemoExtras(networkId = network.id.value, memo), - ) + val extras = txExtras ?: getMemoExtras(networkId = network.id.value, memo) + + return@withContext if (fee != null) { + walletManager.createTransaction( + amount = amount, + fee = fee, + destination = destination, + ).copy( + extras = extras, + ) + } else { + TransactionData.Uncompiled( + amount = amount, + sourceAddress = walletManager.wallet.address, + destinationAddress = destination, + extras = extras, + fee = null, + ) + } } override suspend fun createTransferTransaction( @@ -102,7 +114,7 @@ internal class DefaultTransactionRepository( override suspend fun createApprovalTransaction( amount: Amount, approvalAmount: Amount?, - fee: Fee, + fee: Fee?, contractAddress: String, spenderAddress: String, userWalletId: UserWalletId, diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt index 9ef573a666..01d37e849d 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt @@ -16,7 +16,7 @@ interface TransactionRepository { @Suppress("LongParameterList") suspend fun createTransaction( amount: Amount, - fee: Fee, + fee: Fee?, memo: String?, destination: String, userWalletId: UserWalletId, @@ -38,7 +38,7 @@ interface TransactionRepository { suspend fun createApprovalTransaction( amount: Amount, approvalAmount: Amount?, - fee: Fee, + fee: Fee?, contractAddress: String, spenderAddress: String, userWalletId: UserWalletId, diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt index d3b136ff3e..903025cb16 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt @@ -20,7 +20,7 @@ class CreateApprovalTransactionUseCase( cryptoCurrency: CryptoCurrency.Token, userWalletId: UserWalletId, amount: BigDecimal?, - fee: Fee, + fee: Fee?, contractAddress: String, spenderAddress: String, ) = Either.catch { diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetFeeUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetFeeUseCase.kt index ed841119c1..0e427fb8c0 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetFeeUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetFeeUseCase.kt @@ -33,7 +33,7 @@ class GetFeeUseCase( walletManagersFacade.getOrCreateWalletManager( userWalletId = userWallet.walletId, network = network, - ) as? TransactionSender + ) } val result = transactionSender?.getFee(transactionData = transactionData) ?: error("Fee is null") diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt index 8043052fe7..3bbd7b2f6e 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt @@ -14,9 +14,11 @@ import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType import com.tangem.domain.staking.model.stakekit.transaction.ActionParams import com.tangem.domain.staking.model.stakekit.transaction.StakingGasEstimate +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.staking.getCurrentToken import com.tangem.domain.transaction.error.GetFeeError +import com.tangem.domain.transaction.usecase.CreateApprovalTransactionUseCase import com.tangem.domain.transaction.usecase.GetFeeUseCase import com.tangem.domain.transaction.usecase.IsFeeApproximateUseCase import com.tangem.domain.wallets.models.UserWallet @@ -40,6 +42,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( private val getFeeUseCase: GetFeeUseCase, private val estimateGasUseCase: EstimateGasUseCase, private val isFeeApproximateUseCase: IsFeeApproximateUseCase, + private val createApprovalTransactionUseCase: CreateApprovalTransactionUseCase, @Assisted private val cryptoCurrencyStatus: CryptoCurrencyStatus, @Assisted private val userWallet: UserWallet, @Assisted private val yield: Yield, @@ -183,11 +186,22 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( onApprovalFee: (TransactionFee) -> Unit, onApprovalFeeError: (GetFeeError) -> Unit, ) { - getFeeUseCase( + val tokenCurrency = cryptoCurrencyStatus.currency as? CryptoCurrency.Token + ?: return onApprovalFeeError(GetFeeError.UnknownError) + val approvalTransactionData = createApprovalTransactionUseCase( + cryptoCurrency = tokenCurrency, + userWalletId = userWallet.walletId, amount = amount, - destination = validatorAddress, + fee = null, + contractAddress = tokenCurrency.contractAddress, + spenderAddress = validatorAddress, + ).getOrElse { + return onApprovalFeeError(GetFeeError.DataError(it)) + } + getFeeUseCase( userWallet = userWallet, - cryptoCurrency = cryptoCurrencyStatus.currency, + network = tokenCurrency.network, + transactionData = approvalTransactionData, ).fold( ifRight = { fee -> onApprovalFee(fee)