Updated on 2026-08-14
This commit is contained in:
parent
fb11527b5b
commit
b8fc09d6bf
6 changed files with 97 additions and 7 deletions
|
|
@ -21,6 +21,10 @@ class DemoTransactionSender(private val walletManager: WalletManager) : Transact
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun estimateFee(amount: Amount): Result<TransactionFee> {
|
||||||
|
return getFee(amount, walletManager.wallet.address)
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
|
override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
|
||||||
val signerResponse = signer.sign(
|
val signerResponse = signer.sign(
|
||||||
hash = getDataToSign(),
|
hash = getDataToSign(),
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ import timber.log.Timber
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
import java.util.EnumSet
|
import java.util.EnumSet
|
||||||
|
|
||||||
@Suppress("LargeClass")
|
@Suppress("LargeClass", "TooManyFunctions")
|
||||||
// FIXME: Move to its own module and make internal
|
// FIXME: Move to its own module and make internal
|
||||||
@Deprecated("Inject the WalletManagerFacade interface using DI instead")
|
@Deprecated("Inject the WalletManagerFacade interface using DI instead")
|
||||||
class DefaultWalletManagersFacade(
|
class DefaultWalletManagersFacade(
|
||||||
|
|
@ -433,6 +433,20 @@ class DefaultWalletManagersFacade(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun estimateFee(
|
||||||
|
amount: Amount,
|
||||||
|
userWalletId: UserWalletId,
|
||||||
|
network: Network,
|
||||||
|
): Result<TransactionFee>? {
|
||||||
|
val blockchain = Blockchain.fromId(network.id.value)
|
||||||
|
val walletManager = getOrCreateWalletManager(
|
||||||
|
userWalletId = userWalletId,
|
||||||
|
blockchain = blockchain,
|
||||||
|
derivationPath = network.derivationPath.value,
|
||||||
|
)
|
||||||
|
return (walletManager as? TransactionSender)?.estimateFee(amount = amount)
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun validateTransaction(
|
override suspend fun validateTransaction(
|
||||||
amount: Amount,
|
amount: Amount,
|
||||||
fee: Amount?,
|
fee: Amount?,
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import java.util.EnumSet
|
||||||
/**
|
/**
|
||||||
* A facade for managing wallets.
|
* A facade for managing wallets.
|
||||||
*/
|
*/
|
||||||
|
@Suppress("TooManyFunctions")
|
||||||
interface WalletManagersFacade {
|
interface WalletManagersFacade {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -166,6 +167,15 @@ interface WalletManagersFacade {
|
||||||
network: Network,
|
network: Network,
|
||||||
): Result<TransactionFee>?
|
): Result<TransactionFee>?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns estimated fee for transaction
|
||||||
|
*
|
||||||
|
* @param amount of transaction
|
||||||
|
* @param userWalletId selected wallet id
|
||||||
|
* @param network network of currency
|
||||||
|
*/
|
||||||
|
suspend fun estimateFee(amount: Amount, userWalletId: UserWalletId, network: Network): Result<TransactionFee>?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates transaction
|
* Validates transaction
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.tangem.domain.transaction.usecase
|
||||||
|
|
||||||
|
import arrow.core.Either
|
||||||
|
import arrow.core.left
|
||||||
|
import arrow.core.right
|
||||||
|
import com.tangem.blockchain.common.Amount
|
||||||
|
import com.tangem.blockchain.common.AmountType
|
||||||
|
import com.tangem.blockchain.common.Token
|
||||||
|
import com.tangem.blockchain.common.transaction.TransactionFee
|
||||||
|
import com.tangem.blockchain.extensions.Result
|
||||||
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
import com.tangem.domain.transaction.error.GetFeeError
|
||||||
|
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||||
|
import com.tangem.domain.wallets.models.UserWalletId
|
||||||
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.flow
|
||||||
|
import kotlinx.coroutines.flow.flowOn
|
||||||
|
import java.math.BigDecimal
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use case to estimate transaction fee
|
||||||
|
*/
|
||||||
|
class EstimateFeeUseCase(
|
||||||
|
private val walletManagersFacade: WalletManagersFacade,
|
||||||
|
private val dispatcher: CoroutineDispatcherProvider,
|
||||||
|
) {
|
||||||
|
suspend operator fun invoke(
|
||||||
|
amount: BigDecimal,
|
||||||
|
userWalletId: UserWalletId,
|
||||||
|
cryptoCurrency: CryptoCurrency,
|
||||||
|
): Flow<Either<GetFeeError.DataError, TransactionFee>> {
|
||||||
|
return flow {
|
||||||
|
val result = walletManagersFacade.estimateFee(
|
||||||
|
amount = convertCryptoCurrencyToAmount(cryptoCurrency, amount),
|
||||||
|
userWalletId = userWalletId,
|
||||||
|
network = cryptoCurrency.network,
|
||||||
|
)
|
||||||
|
|
||||||
|
val maybeFee = when (result) {
|
||||||
|
is Result.Success -> result.data.right()
|
||||||
|
else -> GetFeeError.DataError.left()
|
||||||
|
}
|
||||||
|
emit(maybeFee)
|
||||||
|
}.flowOn(dispatcher.io)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun convertCryptoCurrencyToAmount(cryptoCurrency: CryptoCurrency, amount: BigDecimal) = Amount(
|
||||||
|
currencySymbol = cryptoCurrency.symbol,
|
||||||
|
value = amount,
|
||||||
|
decimals = cryptoCurrency.decimals,
|
||||||
|
type = when (cryptoCurrency) {
|
||||||
|
is CryptoCurrency.Coin -> AmountType.Coin
|
||||||
|
is CryptoCurrency.Token -> AmountType.Token(
|
||||||
|
token = Token(
|
||||||
|
symbol = cryptoCurrency.symbol,
|
||||||
|
contractAddress = cryptoCurrency.contractAddress,
|
||||||
|
decimals = cryptoCurrency.decimals,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,7 @@ import com.tangem.domain.tokens.model.Quote
|
||||||
import com.tangem.domain.tokens.repository.QuotesRepository
|
import com.tangem.domain.tokens.repository.QuotesRepository
|
||||||
import com.tangem.domain.tokens.utils.convertToAmount
|
import com.tangem.domain.tokens.utils.convertToAmount
|
||||||
import com.tangem.domain.transaction.error.SendTransactionError
|
import com.tangem.domain.transaction.error.SendTransactionError
|
||||||
import com.tangem.domain.transaction.usecase.GetFeeUseCase
|
import com.tangem.domain.transaction.usecase.EstimateFeeUseCase
|
||||||
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
|
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
|
||||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||||
import com.tangem.domain.wallets.models.UserWallet
|
import com.tangem.domain.wallets.models.UserWallet
|
||||||
|
|
@ -54,8 +54,8 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
private val initialToCurrencyResolver: InitialToCurrencyResolver,
|
private val initialToCurrencyResolver: InitialToCurrencyResolver,
|
||||||
) : SwapInteractor {
|
) : SwapInteractor {
|
||||||
|
|
||||||
private val getFeeUseCase by lazy(LazyThreadSafetyMode.NONE) {
|
private val estimateFeeUseCase by lazy(LazyThreadSafetyMode.NONE) {
|
||||||
GetFeeUseCase(walletManagersFacade, dispatcher)
|
EstimateFeeUseCase(walletManagersFacade, dispatcher)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val swapCurrencyConverter = SwapCurrencyConverter()
|
private val swapCurrencyConverter = SwapCurrencyConverter()
|
||||||
|
|
@ -999,9 +999,8 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
networkId: String,
|
networkId: String,
|
||||||
): TxFeeState {
|
): TxFeeState {
|
||||||
getSelectedWalletSyncUseCase().getOrNull()?.walletId?.let { userWalletId ->
|
getSelectedWalletSyncUseCase().getOrNull()?.walletId?.let { userWalletId ->
|
||||||
val txFeeResult = getFeeUseCase(
|
val txFeeResult = estimateFeeUseCase(
|
||||||
amount = amount.value,
|
amount = amount.value,
|
||||||
destination = fromToken.value.networkAddress?.defaultAddress?.value ?: "",
|
|
||||||
userWalletId = userWalletId,
|
userWalletId = userWalletId,
|
||||||
cryptoCurrency = fromToken.currency,
|
cryptoCurrency = fromToken.currency,
|
||||||
).firstOrNull()
|
).firstOrNull()
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ spr-client = "3.6.2"
|
||||||
# endregion Other libraries
|
# endregion Other libraries
|
||||||
|
|
||||||
# region Tangem
|
# region Tangem
|
||||||
tangemBlockchainSdk = "release-app_5.4-416"
|
tangemBlockchainSdk = "release-app_5.4-417"
|
||||||
#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds
|
#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds
|
||||||
tangemCardSdk = "release-app_5.4-315"
|
tangemCardSdk = "release-app_5.4-315"
|
||||||
#tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^
|
#tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue