Updated on 2026-08-14

This commit is contained in:
Tangem 2025-04-23 13:28:11 +05:00
parent e87d946e40
commit a3a18854c8
48 changed files with 544 additions and 328 deletions

View file

@ -21,9 +21,12 @@ import com.tangem.datasource.api.express.models.response.SwapPair
import com.tangem.datasource.api.express.models.response.SwapPairsWithProviders
import com.tangem.datasource.api.express.models.response.TxDetails
import com.tangem.datasource.crypto.DataSignatureVerifier
import com.tangem.datasource.exchangeservice.swap.ExpressUtils
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.swap.converters.*
import com.tangem.feature.swap.domain.api.SwapRepository
@ -48,6 +51,7 @@ internal class DefaultSwapRepository(
private val userWalletsListManager: UserWalletsListManager,
private val errorsDataConverter: ErrorsDataConverter,
private val dataSignatureVerifier: DataSignatureVerifier,
private val appPreferencesStore: AppPreferencesStore,
moshi: Moshi,
excludedBlockchains: ExcludedBlockchains,
) : SwapRepository {
@ -60,6 +64,7 @@ internal class DefaultSwapRepository(
private val txDetailsMoshiAdapter = moshi.adapter(TxDetails::class.java)
override suspend fun getPairs(
userWallet: UserWallet,
initialCurrency: LeastTokenInfo,
currencyList: List<CryptoCurrency>,
): PairsWithProviders {
@ -73,6 +78,7 @@ internal class DefaultSwapRepository(
val pairsDeferred = async {
getPairsInternal(
userWallet = userWallet,
from = arrayListOf(initial),
to = currenciesList,
)
@ -80,6 +86,7 @@ internal class DefaultSwapRepository(
val reversedPairsDeferred = async {
getPairsInternal(
userWallet = userWallet,
from = currenciesList,
to = arrayListOf(initial),
)
@ -90,7 +97,13 @@ internal class DefaultSwapRepository(
val allPairs = pairs + reversedPairs
val providers = tangemExpressApi.getProviders().getOrThrow()
val providers = tangemExpressApi.getProviders(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
).getOrThrow()
return@withContext swapPairInfoConverter.convert(
SwapPairsWithProviders(
@ -109,6 +122,7 @@ internal class DefaultSwapRepository(
}
override suspend fun getPairsOnly(
userWallet: UserWallet,
initialCurrency: LeastTokenInfo,
currencyList: List<CryptoCurrency>,
): PairsWithProviders {
@ -122,6 +136,7 @@ internal class DefaultSwapRepository(
val pairsDeferred = async {
getPairsInternal(
userWallet = userWallet,
from = arrayListOf(initial),
to = currenciesList,
)
@ -129,6 +144,7 @@ internal class DefaultSwapRepository(
val reversedPairsDeferred = async {
getPairsInternal(
userWallet = userWallet,
from = currenciesList,
to = arrayListOf(initial),
)
@ -156,25 +172,42 @@ internal class DefaultSwapRepository(
}
private suspend fun getPairsInternal(
userWallet: UserWallet,
from: List<NetworkLeastTokenInfo>,
to: List<NetworkLeastTokenInfo>,
): ApiResponse<List<SwapPair>> {
return tangemExpressApi.getPairs(
PairsRequestBody(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
body = PairsRequestBody(
from = from,
to = to,
),
)
}
override suspend fun getExchangeStatus(txId: String): Either<UnknownError, ExchangeStatusModel> {
override suspend fun getExchangeStatus(
userWallet: UserWallet,
txId: String,
): Either<UnknownError,
ExchangeStatusModel,> {
return withContext(coroutineDispatcher.io) {
either {
catch(
block = {
exchangeStatusConverter.convert(
tangemExpressApi
.getExchangeStatus(txId)
.getExchangeStatus(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
txId = txId,
)
.getOrThrow(),
)
},
@ -188,7 +221,7 @@ internal class DefaultSwapRepository(
}
override suspend fun findBestQuote(
userWalletId: UserWalletId,
userWallet: UserWallet,
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,
@ -211,6 +244,11 @@ internal class DefaultSwapRepository(
toDecimals = toDecimals,
providerId = providerId,
rateType = rateType.name.lowercase(),
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
).getOrThrow()
QuoteModel(
toTokenAmount = createFromAmountWithOffset(response.toAmount, response.toDecimals),
@ -223,6 +261,7 @@ internal class DefaultSwapRepository(
}
override suspend fun getExchangeData(
userWallet: UserWallet,
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,
@ -255,6 +294,11 @@ internal class DefaultSwapRepository(
requestId = requestId,
refundAddress = refundAddress,
refundExtraId = refundExtraId,
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
).getOrThrow()
if (dataSignatureVerifier.verifySignature(response.signature, response.txDetailsJson)) {
val txDetails = parseTxDetails(response.txDetailsJson)
@ -281,6 +325,7 @@ internal class DefaultSwapRepository(
}
override suspend fun exchangeSent(
userWallet: UserWallet,
txId: String,
fromNetwork: String,
fromAddress: String,
@ -290,7 +335,12 @@ internal class DefaultSwapRepository(
): Either<ExpressDataError, Unit> = withContext(coroutineDispatcher.io) {
try {
tangemExpressApi.exchangeSent(
ExchangeSentRequestBody(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
appPreferencesStore = appPreferencesStore,
),
body = ExchangeSentRequestBody(
txId = txId,
fromNetwork = fromNetwork,
fromAddress = fromAddress,

View file

@ -7,8 +7,8 @@ import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getObjectList
import com.tangem.datasource.local.preferences.utils.getObjectListSync
import com.tangem.datasource.local.preferences.utils.getObjectMapSync
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.swap.converters.SavedSwapTransactionListConverter
import com.tangem.feature.swap.domain.SwapTransactionRepository
@ -80,9 +80,8 @@ internal class DefaultSwapTransactionRepository(
}
override suspend fun getTransactions(
userWalletId: UserWalletId,
userWallet: UserWallet,
cryptoCurrencyId: CryptoCurrency.ID,
scanResponse: ScanResponse,
): Flow<List<SavedSwapTransactionListModel>?> {
return withContext(dispatchers.io) {
val txStatuses = appPreferencesStore.getObjectMapSync<ExchangeStatusModel>(
@ -93,7 +92,7 @@ internal class DefaultSwapTransactionRepository(
).map { savedTransactions ->
val currencyTxs = savedTransactions
?.filter {
it.userWalletId == userWalletId.stringValue &&
it.userWalletId == userWallet.walletId.stringValue &&
(
it.toCryptoCurrencyId == cryptoCurrencyId.value ||
it.fromCryptoCurrencyId == cryptoCurrencyId.value
@ -103,7 +102,7 @@ internal class DefaultSwapTransactionRepository(
currencyTxs?.mapNotNull {
converter.convertBack(
value = it,
scanResponse = scanResponse,
scanResponse = userWallet.scanResponse,
txStatuses = txStatuses,
)
}

View file

@ -36,6 +36,7 @@ internal class SwapDataModule {
errorsDataConverter: ErrorsDataConverter,
@NetworkMoshi moshi: Moshi,
excludedBlockchains: ExcludedBlockchains,
appPreferencesStore: AppPreferencesStore,
): SwapRepository {
return DefaultSwapRepository(
tangemExpressApi = tangemExpressApi,
@ -46,6 +47,7 @@ internal class SwapDataModule {
dataSignatureVerifier = dataSignature,
moshi = moshi,
excludedBlockchains = excludedBlockchains,
appPreferencesStore = appPreferencesStore,
)
}