From 52f7454657e5e720b3b82d7da0de40760984ef40 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Sep 2023 17:17:13 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../middlewares/TradeCryptoMiddleware.kt | 6 +- .../tap/proxy/TransactionManagerImpl.kt | 2 +- .../tangem/tap/proxy/UserWalletManagerImpl.kt | 2 +- .../DefaultWalletManagersFacade.kt | 29 +++-- .../walletmanager/WalletManagersFacade.kt | 3 +- .../tangem/feature/swap/SwapRepositoryImpl.kt | 101 +++++++++++++----- .../swap/converters/ApproveConverter.kt | 16 --- .../tangem/feature/swap/di/SwapDataModule.kt | 3 + .../feature/swap/domain/SwapInteractorImpl.kt | 74 +++++++++---- .../feature/swap/domain/SwapRepository.kt | 43 ++++---- .../domain/models/cache/SwapDataHolder.kt | 21 ---- .../swap/domain/models/domain/ApproveModel.kt | 14 --- .../swap/domain/models/ui/SwapState.kt | 3 +- gradle/dependencies.toml | 2 +- 14 files changed, 174 insertions(+), 145 deletions(-) delete mode 100644 features/swap/data/src/main/java/com/tangem/feature/swap/converters/ApproveConverter.kt delete mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/cache/SwapDataHolder.kt delete mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ApproveModel.kt diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 2324133b75..36ab93bff5 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -155,7 +155,7 @@ class TradeCryptoMiddleware { val walletManager = store.state.daggerGraphState .get(DaggerGraphState::walletManagersFacade) .getOrCreateWalletManager( - userWallet = action.userWallet, + userWalletId = action.userWallet.walletId, blockchain = blockchain, derivationPath = currency.network.derivationPath.value, ) @@ -338,7 +338,7 @@ class TradeCryptoMiddleware { val walletManager = store.state.daggerGraphState .get(DaggerGraphState::walletManagersFacade) .getOrCreateWalletManager( - userWallet = action.userWallet, + userWalletId = action.userWallet.walletId, blockchain = blockchain, derivationPath = currency.network.derivationPath.value, ) @@ -379,7 +379,7 @@ class TradeCryptoMiddleware { val walletManager = store.state.daggerGraphState .get(DaggerGraphState::walletManagersFacade) .getOrCreateWalletManager( - userWallet = action.userWallet, + userWalletId = action.userWallet.walletId, blockchain = blockchain, derivationPath = currency.network.derivationPath.value, ) 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 3df732e168..cfce94b52b 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -419,7 +419,7 @@ class TransactionManagerImpl( appStateHolder.userWalletsListManager?.selectedUserWalletSync, ) { "userWallet or userWalletsListManager is null" } walletManagersFacade.getOrCreateWalletManager( - selectedUserWallet, + selectedUserWallet.walletId, blockchain, derivationPath, ) diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 6165cbd367..3640c46412 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -230,7 +230,7 @@ class UserWalletManagerImpl( appStateHolder.userWalletsListManager?.selectedUserWalletSync, ) { "userWallet or userWalletsListManager is null" } walletManagersFacade.getOrCreateWalletManager( - selectedUserWallet, + selectedUserWallet.walletId, blockchain, derivationPath, ) diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index 31d72a5476..7d0e1e2593 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -61,11 +61,10 @@ class DefaultWalletManagersFacade( network: Network, addressType: AddressType, ): String { - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) val walletManager = getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = network.derivationPath.value, ) @@ -79,10 +78,9 @@ class DefaultWalletManagersFacade( } override suspend fun getTxHistoryState(userWalletId: UserWalletId, network: Network): TxHistoryState { - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) val walletManager = getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = network.derivationPath.value, ) @@ -102,10 +100,9 @@ class DefaultWalletManagersFacade( page: Int, pageSize: Int, ): PaginationWrapper { - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(currency.network.id.value) val walletManager = getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = currency.network.derivationPath.value, ) @@ -154,7 +151,11 @@ class DefaultWalletManagersFacade( return UpdateWalletManagerResult.MissedDerivation } - val walletManager = getOrCreateWalletManager(userWallet, blockchain, derivationPath) + val walletManager = getOrCreateWalletManager( + userWalletId = userWallet.walletId, + blockchain = blockchain, + derivationPath = derivationPath, + ) if (walletManager == null || blockchain == Blockchain.Unknown) { Timber.w("Unable to get a wallet manager for blockchain: $blockchain") return UpdateWalletManagerResult.Unreachable @@ -195,12 +196,11 @@ class DefaultWalletManagersFacade( } override suspend fun getOrCreateWalletManager( - userWallet: UserWallet, + userWalletId: UserWalletId, blockchain: Blockchain, derivationPath: String?, ): WalletManager? { - val userWalletId = userWallet.walletId - + val userWallet = getUserWallet(userWalletId) var walletManager = walletManagersStore.getSyncOrNull( userWalletId = userWalletId, blockchain = blockchain, @@ -221,11 +221,10 @@ class DefaultWalletManagersFacade( } override suspend fun getAddress(userWalletId: UserWalletId, network: Network): List
{ - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) return getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = network.derivationPath.value, ) @@ -236,10 +235,9 @@ class DefaultWalletManagersFacade( } override suspend fun getRentInfo(userWalletId: UserWalletId, network: Network): CryptoCurrencyWarning.Rent? { - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) val manager = getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = network.derivationPath.value, ) @@ -267,10 +265,9 @@ class DefaultWalletManagersFacade( } override suspend fun getExistentialDeposit(userWalletId: UserWalletId, network: Network): BigDecimal? { - val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) val manager = getOrCreateWalletManager( - userWallet = userWallet, + userWalletId = userWalletId, blockchain = blockchain, derivationPath = network.derivationPath.value, ) diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt index 9ec947d51e..5be94faf27 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt @@ -12,7 +12,6 @@ import com.tangem.domain.txhistory.models.PaginationWrapper import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.domain.txhistory.models.TxHistoryState import com.tangem.domain.walletmanager.model.UpdateWalletManagerResult -import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import java.math.BigDecimal @@ -72,7 +71,7 @@ interface WalletManagersFacade { // TODO: Remove after refactoring suspend fun getOrCreateWalletManager( - userWallet: UserWallet, + userWalletId: UserWalletId, blockchain: Blockchain, derivationPath: String?, ): WalletManager? diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index 897c742670..e5394f3013 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -1,6 +1,10 @@ package com.tangem.feature.swap +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.Approver import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.extensions.Result import com.tangem.data.tokens.utils.CryptoCurrencyFactory import com.tangem.datasource.api.oneinch.OneInchApi import com.tangem.datasource.api.oneinch.OneInchApiFactory @@ -12,20 +16,21 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network +import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWallet -import com.tangem.feature.swap.converters.ApproveConverter +import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.converters.QuotesConverter import com.tangem.feature.swap.converters.SwapConverter import com.tangem.feature.swap.converters.TokensConverter import com.tangem.feature.swap.domain.SwapRepository import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel -import com.tangem.feature.swap.domain.models.domain.ApproveModel import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.domain.QuoteModel import com.tangem.feature.swap.domain.models.domain.SwapDataModel import com.tangem.feature.swap.domain.models.mapErrors import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext +import java.math.BigDecimal import javax.inject.Inject import com.tangem.blockchain.common.Token as SdkToken @@ -35,12 +40,12 @@ internal class SwapRepositoryImpl @Inject constructor( private val oneInchErrorsHandler: OneInchErrorsHandler, private val coroutineDispatcher: CoroutineDispatcherProvider, private val configManager: ConfigManager, + private val walletManagersFacade: WalletManagersFacade, ) : SwapRepository { private val tokensConverter = TokensConverter() private val quotesConverter = QuotesConverter() private val swapConverter = SwapConverter() - private val approveConverter = ApproveConverter() override suspend fun getRates(currencyId: String, tokenIds: List): Map { // workaround cause backend do not return arbitrum and optimism rates @@ -104,29 +109,6 @@ internal class SwapRepositoryImpl @Inject constructor( } } - override suspend fun dataToApprove(networkId: String, tokenAddress: String, amount: String?): ApproveModel { - return withContext(coroutineDispatcher.io) { - approveConverter.convert(getOneInchApi(networkId).approveTransaction(tokenAddress, amount)) - } - } - - override suspend fun checkTokensSpendAllowance( - networkId: String, - tokenAddress: String, - walletAddress: String, - ): AggregatedSwapDataModel { - return withContext(coroutineDispatcher.io) { - try { - val response = oneInchErrorsHandler.handleOneInchResponse( - getOneInchApi(networkId).approveAllowance(tokenAddress, walletAddress), - ) - AggregatedSwapDataModel(response.allowance) - } catch (ex: OneIncResponseException) { - AggregatedSwapDataModel(null, mapErrors(ex.data.description)) - } - } - } - override suspend fun prepareSwapTransaction( networkId: String, fromTokenAddress: String, @@ -191,6 +173,73 @@ internal class SwapRepositoryImpl @Inject constructor( } as CryptoCurrency } + override suspend fun getAllowance( + userWalletId: UserWalletId, + networkId: String, + derivationPath: String?, + tokenDecimalCount: Int, + tokenAddress: String, + ): BigDecimal { + val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } + val walletManager = walletManagersFacade.getOrCreateWalletManager( + userWalletId = userWalletId, + blockchain = blockchain, + derivationPath = derivationPath, + ) + val spenderAddress = addressForTrust(networkId) + + val result = (walletManager as? Approver)?.getAllowance( + spenderAddress, + Token( + symbol = blockchain.currency, + contractAddress = tokenAddress, + decimals = tokenDecimalCount, + ), + ) ?: error("Cannot cast to Approver") + + return when (result) { + is Result.Success -> result.data + is Result.Failure -> error(result.error) + } + } + + override suspend fun getApproveData( + userWalletId: UserWalletId, + networkId: String, + derivationPath: String?, + currency: Currency, + amount: BigDecimal?, + ): String { + val blockchain = + requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } + val walletManager = walletManagersFacade.getOrCreateWalletManager( + userWalletId = userWalletId, + blockchain = blockchain, + derivationPath = derivationPath, + ) + val spenderAddress = addressForTrust(networkId) + + return (walletManager as? Approver)?.getApproveData( + spenderAddress, + amount?.let { convertToAmount(it, currency, blockchain) }, + ) ?: error("Cannot cast to Approver") + } + + private fun convertToAmount(amount: BigDecimal, currency: Currency, blockchain: Blockchain): Amount { + return when (currency) { + is Currency.NativeToken -> { + Amount(value = amount, blockchain = blockchain) + } + is Currency.NonNativeToken -> { + Amount( + currencySymbol = currency.symbol, + value = amount, + decimals = currency.decimalCount, + ) + } + } + } + private fun getOneInchApi(networkId: String): OneInchApi { return oneInchApiFactory.getApi(networkId) } diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ApproveConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ApproveConverter.kt deleted file mode 100644 index b281f8df49..0000000000 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ApproveConverter.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.feature.swap.converters - -import com.tangem.datasource.api.oneinch.models.ApproveCalldataResponse -import com.tangem.feature.swap.domain.models.domain.ApproveModel -import com.tangem.utils.converter.Converter - -class ApproveConverter : Converter { - - override fun convert(value: ApproveCalldataResponse): ApproveModel { - return ApproveModel( - data = value.data, - gasPrice = value.gasPrice, - toAddress = value.toAddress, - ) - } -} \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index bdb28d8007..81931ca111 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -4,6 +4,7 @@ import com.tangem.datasource.api.oneinch.OneInchApiFactory import com.tangem.datasource.api.oneinch.OneInchErrorsHandler import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.config.ConfigManager +import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.feature.swap.SwapRepositoryImpl import com.tangem.feature.swap.domain.SwapRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -25,6 +26,7 @@ class SwapDataModule { oneInchErrorsHandler: OneInchErrorsHandler, coroutineDispatcher: CoroutineDispatcherProvider, configManager: ConfigManager, + walletManagerFacade: WalletManagersFacade, ): SwapRepository { return SwapRepositoryImpl( tangemTechApi = tangemTechApi, @@ -32,6 +34,7 @@ class SwapDataModule { oneInchErrorsHandler = oneInchErrorsHandler, coroutineDispatcher = coroutineDispatcher, configManager = configManager, + walletManagersFacade = walletManagerFacade, ) } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 8eb7545ecb..10e542bd74 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -6,7 +6,6 @@ import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase import com.tangem.feature.swap.domain.cache.SwapDataCache import com.tangem.feature.swap.domain.converters.SwapCurrencyConverter -import com.tangem.feature.swap.domain.models.DataError import com.tangem.feature.swap.domain.models.SwapAmount import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.domain.Currency @@ -118,16 +117,20 @@ internal class SwapInteractorImpl @Inject constructor( override suspend fun givePermissionToSwap(networkId: String, permissionOptions: PermissionOptions): TxState { val dataToSign = if (permissionOptions.approveType == SwapApproveType.UNLIMITED) { - repository.dataToApprove(networkId, getTokenAddress(permissionOptions.fromToken)).data + getApproveData( + networkId = networkId, + derivationPath = derivationPath, + fromToken = permissionOptions.fromToken, + ) } else { - permissionOptions.approveData.approveModel.data + permissionOptions.approveData.approveData } val result = transactionManager.sendApproveTransaction( txData = ApproveTxData( networkId = networkId, feeAmount = permissionOptions.txFee.feeValue, gasLimit = permissionOptions.txFee.gasLimit, - destinationAddress = permissionOptions.approveData.approveModel.toAddress, + destinationAddress = getTokenAddress(permissionOptions.fromToken), dataToSign = dataToSign, ), derivationPath = derivationPath, @@ -164,7 +167,7 @@ internal class SwapInteractorImpl @Inject constructor( val amount = SwapAmount(amountDecimal, getTokenDecimals(fromToken)) val fromTokenAddress = getTokenAddress(fromToken) val toTokenAddress = getTokenAddress(toToken) - val isAllowedToSpend = isAllowedToSpend(networkId, fromTokenAddress, amount) + val isAllowedToSpend = isAllowedToSpend(networkId, fromToken, amount) if (isAllowedToSpend && allowPermissionsHandler.isAddressAllowanceInProgress(fromTokenAddress)) { allowPermissionsHandler.removeAddressFromProgress(fromTokenAddress) transactionManager.updateWalletManager(networkId, derivationPath) @@ -340,14 +343,23 @@ internal class SwapInteractorImpl @Inject constructor( } } - private suspend fun isAllowedToSpend(networkId: String, fromTokenAddress: String, amount: SwapAmount): Boolean { - val allowance = repository.checkTokensSpendAllowance( - networkId = networkId, - tokenAddress = fromTokenAddress, - walletAddress = userWalletManager.getWalletAddress(networkId, derivationPath), + private suspend fun isAllowedToSpend(networkId: String, fromToken: Currency, amount: SwapAmount): Boolean { + return getSelectedWalletUseCase().fold( + ifRight = { userWallet -> + val allowance = repository.getAllowance( + userWallet.walletId, + networkId, + derivationPath, + getTokenDecimals(fromToken), + getTokenAddress(fromToken), + ) + allowance >= amount.value + }, + ifLeft = { + Timber.e("Swap Error on isAllowedToSpend") + false + }, ) - val allowanceAmount = allowance.dataModel?.toBigDecimalOrNull() ?: BigDecimal.ZERO - return allowance.error == DataError.NoError && allowanceAmount >= amount.value.movePointRight(amount.decimals) } private fun createEmptyAmountState(networkId: String, fromToken: Currency, toToken: Currency): SwapState { @@ -558,18 +570,19 @@ internal class SwapInteractorImpl @Inject constructor( ) } // setting up amount for approve with given amount for swap [SwapApproveType.Limited] - val transactionData = repository.dataToApprove( + val transactionData = getApproveData( networkId = networkId, - tokenAddress = getTokenAddress(fromToken), - amount = swapAmount.toStringWithRightOffset(), + derivationPath = derivationPath, + fromToken = fromToken, + swapAmount = swapAmount, ) val feeData = transactionManager.getFee( networkId = networkId, amountToSend = BigDecimal.ZERO, currencyToSend = userWalletManager.getNativeTokenForNetwork(networkId), - destinationAddress = transactionData.toAddress, + destinationAddress = getTokenAddress(fromToken), increaseBy = INCREASE_GAS_LIMIT_BY, - data = transactionData.data, + data = transactionData, derivationPath = derivationPath, ) val feeState = proxyFeesToFeeState(networkId, feeData) @@ -584,10 +597,10 @@ internal class SwapInteractorImpl @Inject constructor( currency = fromToken.symbol, amount = INFINITY_SYMBOL, walletAddress = getWalletAddress(networkId), - spenderAddress = transactionData.toAddress, + spenderAddress = getTokenAddress(fromToken), requestApproveData = RequestApproveStateData( fee = feeState, - approveModel = transactionData, + approveData = transactionData, ), ), preparedSwapConfigState = quotesLoadedState.preparedSwapConfigState.copy( @@ -718,6 +731,29 @@ internal class SwapInteractorImpl @Inject constructor( return (BigDecimal.ONE - toTokenFiatValue.divide(fromTokenFiatValue, 2, RoundingMode.HALF_UP)).toFloat() } + private suspend fun getApproveData( + networkId: String, + derivationPath: String?, + fromToken: Currency, + swapAmount: SwapAmount? = null, + ): String { + return getSelectedWalletUseCase().fold( + ifRight = { userWallet -> + repository.getApproveData( + userWalletId = userWallet.walletId, + networkId = networkId, + derivationPath = derivationPath, + currency = fromToken, + amount = swapAmount?.value, + ) + }, + ifLeft = { + Timber.e("Swap Error on getApproveData") + error("Swap Error on getApproveData") + }, + ) + } + companion object { private const val DEFAULT_SLIPPAGE = 2 private const val ZERO_BALANCE = "0" diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt index 449df97cdb..b303325c8c 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt @@ -3,11 +3,12 @@ package com.tangem.feature.swap.domain import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.UserWallet +import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel -import com.tangem.feature.swap.domain.models.domain.ApproveModel import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.domain.QuoteModel import com.tangem.feature.swap.domain.models.domain.SwapDataModel +import java.math.BigDecimal interface SwapRepository { @@ -29,28 +30,6 @@ interface SwapRepository { */ suspend fun addressForTrust(networkId: String): String - /** - * Generate "data" for calling contract in order to allow 1inch spend funds - * - * @param tokenAddress token you want to exchange - * @param amount number of tokens is allowed. By default infinite - */ - suspend fun dataToApprove(networkId: String, tokenAddress: String, amount: String? = null): ApproveModel - - /** - * Get the number of tokens that the 1inch router is allowed to spend - * - * @param tokenAddress Token address you want to exchange - * @param walletAddress address for which you want to check - * - * @return amount of tokens allowed to spend - */ - suspend fun checkTokensSpendAllowance( - networkId: String, - tokenAddress: String, - walletAddress: String, - ): AggregatedSwapDataModel - @Suppress("LongParameterList") suspend fun prepareSwapTransaction( networkId: String, @@ -68,4 +47,22 @@ interface SwapRepository { fun getTangemFee(): Double suspend fun getCryptoCurrency(userWallet: UserWallet, currency: Currency, network: Network): CryptoCurrency? + + @Throws(IllegalStateException::class) + suspend fun getAllowance( + userWalletId: UserWalletId, + networkId: String, + derivationPath: String?, + tokenDecimalCount: Int, + tokenAddress: String, + ): BigDecimal + + @Throws(IllegalStateException::class) + suspend fun getApproveData( + userWalletId: UserWalletId, + networkId: String, + derivationPath: String?, + currency: Currency, + amount: BigDecimal?, + ): String } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/cache/SwapDataHolder.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/cache/SwapDataHolder.kt deleted file mode 100644 index 1271078626..0000000000 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/cache/SwapDataHolder.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.tangem.feature.swap.domain.models.cache - -import com.tangem.feature.swap.domain.models.domain.ApproveModel -import com.tangem.feature.swap.domain.models.domain.Currency -import com.tangem.feature.swap.domain.models.domain.QuoteModel -import com.tangem.feature.swap.domain.models.SwapAmount -import com.tangem.feature.swap.domain.models.domain.SwapDataModel - -data class SwapDataHolder( - val quoteModel: QuoteModel? = null, - val swapModel: SwapDataModel? = null, - val approveTxModel: ApproveModel? = null, - val amountToSwap: SwapAmount? = null, - val networkId: String? = null, - val exchangeCurrencies: ExchangeCurrencies? = null, -) - -data class ExchangeCurrencies( - val fromCurrency: Currency? = null, - val toCurrency: Currency? = null, -) \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ApproveModel.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ApproveModel.kt deleted file mode 100644 index c21b52c0fa..0000000000 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ApproveModel.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.tangem.feature.swap.domain.models.domain - -/** - * Approve model - * - * @property data The encoded data to call the approve method on the swapped token contract - * @property gasPrice Gas price for fast transaction processing - * @property toAddress Token address that will be allowed to exchange through 1inch router - */ -data class ApproveModel( - val data: String, - val gasPrice: String, - val toAddress: String, -) \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/SwapState.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/SwapState.kt index d2b760740e..d212c8d259 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/SwapState.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/SwapState.kt @@ -2,7 +2,6 @@ package com.tangem.feature.swap.domain.models.ui import com.tangem.feature.swap.domain.models.DataError import com.tangem.feature.swap.domain.models.SwapAmount -import com.tangem.feature.swap.domain.models.domain.ApproveModel import com.tangem.feature.swap.domain.models.domain.PreparedSwapConfigState import com.tangem.feature.swap.domain.models.domain.SwapDataModel import java.math.BigDecimal @@ -59,7 +58,7 @@ data class TokenSwapInfo( data class RequestApproveStateData( val fee: TxFeeState, - val approveModel: ApproveModel, + val approveData: String, ) data class SwapStateData( diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 89c974eda0..3ecbc0bcfb 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -82,7 +82,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-351" +tangemBlockchainSdk = "develop-354" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-300" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds