diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApi.kt index 651e726ad3..cf950a0f66 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApi.kt @@ -117,8 +117,8 @@ interface OneInchApi { */ @GET("quote") suspend fun quote( - @Query("fromTokenAddress") fromTokenAddress: String, - @Query("toTokenAddress") toTokenAddress: String, + @Query("src") fromTokenAddress: String, + @Query("dst") toTokenAddress: String, @Query("amount") amount: String, @Query("protocols") protocols: String? = null, @Query("fee") fee: String? = null, @@ -128,6 +128,7 @@ interface OneInchApi { @Query("mainRouteParts") mainRouteParts: String? = null, @Query("parts") parts: String? = null, @Query("gasPrice") gasPrice: String? = null, + @Query("includeTokensInfo") includeTokensInfo: Boolean = true, ): Response /** @@ -178,18 +179,18 @@ interface OneInchApi { */ @GET("swap") suspend fun swap( - @Query("fromTokenAddress") fromTokenAddress: String, - @Query("toTokenAddress") toTokenAddress: String, + @Query("src") fromTokenAddress: String, + @Query("dst") toTokenAddress: String, @Query("amount") amount: String, - @Query("fromAddress") fromAddress: String, + @Query("from") fromAddress: String, @Query("slippage") slippage: Int, @Query("protocols") protocols: String? = null, - @Query("destReceiver") destinationAddress: String? = null, - @Query("referrerAddress") referrerAddress: String? = null, + @Query("receiver") destinationAddress: String? = null, + @Query("referrer") referrerAddress: String? = null, @Query("fee") fee: String? = null, @Query("disableEstimate") disableEstimate: Boolean? = null, @Query("permit") permit: String? = null, - @Query("compatibilityMode") compatibilityMode: Boolean? = null, + @Query("compatibility") compatibilityMode: Boolean? = null, @Query("burnChi") burnChi: Boolean? = null, @Query("allowPartialFill") allowPartialFill: Boolean? = null, @Query("parts") parts: String? = null, @@ -198,6 +199,7 @@ interface OneInchApi { @Query("complexityLevel") complexityLevel: String? = null, @Query("gasLimit") gasLimit: String? = null, @Query("gasPrice") gasPrice: String? = null, + @Query("includeTokensInfo") includeTokensInfo: Boolean = true, ): Response //endregion Swap } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/QuoteResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/QuoteResponse.kt index ecea3f4bc5..692f036f24 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/QuoteResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/QuoteResponse.kt @@ -5,16 +5,10 @@ import com.squareup.moshi.Json /** * Quote response * - * @property fromToken Source token info * @property toToken Destination token info * @property toTokenAmount Expected amount of destination token - * @property fromTokenAmount Amount of source token - * @property estimatedGas gas fee */ data class QuoteResponse( - @Json(name = "fromToken") val fromToken: TokenOneInchDto, @Json(name = "toToken") val toToken: TokenOneInchDto, - @Json(name = "toTokenAmount") val toTokenAmount: String, - @Json(name = "fromTokenAmount") val fromTokenAmount: String, - @Json(name = "estimatedGas") val estimatedGas: Int, + @Json(name = "toAmount") val toTokenAmount: String, ) \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/SwapResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/SwapResponse.kt index 4a72fcccc5..bc1f668360 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/SwapResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/models/SwapResponse.kt @@ -5,7 +5,6 @@ import com.squareup.moshi.Json data class SwapResponse( @Json(name = "fromToken") val fromToken: TokenOneInchDto, @Json(name = "toToken") val toToken: TokenOneInchDto, - @Json(name = "toTokenAmount") val toTokenAmount: String, - @Json(name = "fromTokenAmount") val fromTokenAmount: String, + @Json(name = "toAmount") val toTokenAmount: String, @Json(name = "tx") val transaction: TransactionDto, ) \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt index 68c9fdf683..341fd1a752 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt @@ -61,7 +61,7 @@ class OneInchApisModule { } companion object { - private const val ONE_INCH_BASE_URL = "https://api-tangem.1inch.io/v5.0/" + private const val ONE_INCH_BASE_URL = "https://api-tangem.1inch.io/v5.2/" private const val ONE_INCH_ETH_PATH = "1/" private const val ONE_INCH_BSC_PATH = "56/" private const val ONE_INCH_POLYGON_PATH = "137/" diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/QuotesConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/QuotesConverter.kt index f0f9160171..4352341538 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/QuotesConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/QuotesConverter.kt @@ -9,11 +9,7 @@ class QuotesConverter : Converter { override fun convert(value: QuoteResponse): QuoteModel { return QuoteModel( - fromTokenAmount = createFromAmountWithOffset(value.fromTokenAmount, value.fromToken.decimals), toTokenAmount = createFromAmountWithOffset(value.toTokenAmount, value.toToken.decimals), - fromTokenAddress = value.fromToken.address, - toTokenAddress = value.toToken.address, - estimatedGas = value.estimatedGas, ) } } \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapConverter.kt index c441455fb7..3c8c1003ec 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapConverter.kt @@ -11,9 +11,6 @@ class SwapConverter : Converter { override fun convert(value: SwapResponse): SwapDataModel { return SwapDataModel( - fromTokenAddress = value.fromToken.address, - toTokenAddress = value.toToken.address, - fromTokenAmount = createFromAmountWithOffset(value.fromTokenAmount, value.fromToken.decimals), toTokenAmount = createFromAmountWithOffset(value.toTokenAmount, value.toToken.decimals), transaction = convertTransaction(value.transaction), ) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt index 26d332d53b..56c1766da8 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt @@ -99,6 +99,8 @@ interface SwapInteractor { fun isAvailableToSwap(networkId: String): Boolean + fun getSwapAmountForToken(amount: String, token: Currency): SwapAmount + suspend fun checkFeeIsEnough( fee: BigDecimal?, spendAmount: SwapAmount, 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 7801531e8d..d76a2d777e 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 @@ -215,11 +215,12 @@ internal class SwapInteractorImpl @Inject constructor( amountToSwap: String, fee: TxFee, ): TxState { - val amount = requireNotNull(toBigDecimalOrNull(amountToSwap)) { "wrong amount format, use only digits" } + val amountDecimal = requireNotNull(toBigDecimalOrNull(amountToSwap)) { "wrong amount format" } + val amount = SwapAmount(amountDecimal, getTokenDecimals(currencyToSend)) val result = transactionManager.sendTransaction( txData = SwapTxData( networkId = networkId, - amountToSend = amount, + amountToSend = amountDecimal, currencyToSend = swapCurrencyConverter.convert(currencyToSend), feeAmount = fee.feeValue, gasLimit = fee.gasLimit, @@ -242,7 +243,7 @@ internal class SwapInteractorImpl @Inject constructor( } TxState.TxSent( fromAmount = amountFormatter.formatSwapAmountToUI( - swapStateData.swapModel.fromTokenAmount, + amount, currencyToSend.symbol, ), toAmount = amountFormatter.formatSwapAmountToUI( @@ -272,6 +273,11 @@ internal class SwapInteractorImpl @Inject constructor( return ONE_INCH_SUPPORTED_NETWORKS.contains(networkId) } + override fun getSwapAmountForToken(amount: String, token: Currency): SwapAmount { + val amountDecimal = requireNotNull(toBigDecimalOrNull(amount)) { "wrong amount format" } + return SwapAmount(amountDecimal, getTokenDecimals(token)) + } + private suspend fun onSuccessLegacyFlow(currency: Currency) { userWalletManager.addToken(swapCurrencyConverter.convert(currency), derivationPath) userWalletManager.refreshWallet() @@ -412,7 +418,7 @@ internal class SwapInteractorImpl @Inject constructor( networkId = networkId, fromToken = fromToken, toToken = toToken, - fromTokenAmount = quoteDataModel.fromTokenAmount, + fromTokenAmount = amount, toTokenAmount = quoteDataModel.toTokenAmount, swapStateData = null, ) @@ -494,7 +500,7 @@ internal class SwapInteractorImpl @Inject constructor( networkId = networkId, fromToken = fromToken, toToken = toToken, - fromTokenAmount = swapData.fromTokenAmount, + fromTokenAmount = amount, toTokenAmount = swapData.toTokenAmount, swapStateData = SwapStateData( fee = txFeeState, diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/QuoteModel.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/QuoteModel.kt index 871b9d77ea..5e5d782666 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/QuoteModel.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/QuoteModel.kt @@ -5,16 +5,8 @@ import com.tangem.feature.swap.domain.models.SwapAmount /** * Quote model holds data about current amounts of exchange and fees * - * @property fromTokenAmount amount of token you want to exchange * @property toTokenAmount amount of token you want to receive - * @property fromTokenAddress address token you want to exchange - * @property toTokenAddress address token you want to receive - * @property estimatedGas fee */ data class QuoteModel( - val fromTokenAmount: SwapAmount, val toTokenAmount: SwapAmount, - val fromTokenAddress: String, - val toTokenAddress: String, - val estimatedGas: Int, ) \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapDataModel.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapDataModel.kt index e2b5356100..7c15701329 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapDataModel.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapDataModel.kt @@ -5,15 +5,10 @@ import com.tangem.feature.swap.domain.models.SwapAmount /** * Swap transaction model * - * @property fromTokenAddress token from which want to convert - * @property toTokenAddress token to want to convert * @property toTokenAmount amount "target" token - * @property fromTokenAmount amount "initial" token + * @property transaction info about transaction */ data class SwapDataModel( - val fromTokenAddress: String, - val toTokenAddress: String, val toTokenAmount: SwapAmount, - val fromTokenAmount: SwapAmount, val transaction: TransactionModel, ) \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index c5e7f74bc7..8708aab05d 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -482,8 +482,10 @@ internal class SwapViewModel @Inject constructor( }, onSelectItemFee = { feeItem -> dataState = dataState.copy(selectedFee = feeItem.data) - val spendAmount = dataState.swapDataModel?.swapModel?.fromTokenAmount - ?: dataState.approveDataModel?.fromTokenAmount + val spendAmount = dataState.amount?.let { amount -> + val fromToken = dataState.fromCurrency ?: return@let null + swapInteractor.getSwapAmountForToken(amount, fromToken) + } ?: dataState.approveDataModel?.fromTokenAmount spendAmount ?: return@UiActions val fromToken = dataState.fromCurrency ?: return@UiActions viewModelScope.launch(dispatchers.io) {