diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config
index 4ec5de6632..d1f1bdcca8 160000
--- a/app/src/main/assets/tangem-app-config
+++ b/app/src/main/assets/tangem-app-config
@@ -1 +1 @@
-Subproject commit 4ec5de66321afa82c04104746015ea9e6bc9fe64
+Subproject commit d1f1bdcca80c2b1f1b53f331fcb0ce78e76d5615
diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
index c952e46d1d..41a2ec1111 100644
--- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
+++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
@@ -5,7 +5,7 @@
},
{
"name": "ONRAMP_ENABLED",
- "version": "5.24.1"
+ "version": "5.24.2"
},
{
"name": "VISA_ONBOARDING_ENABLED",
diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml
index b630fbb909..7dccd4ed94 100644
--- a/core/res/src/main/res/values-de/strings.xml
+++ b/core/res/src/main/res/values-de/strings.xml
@@ -114,6 +114,7 @@
Abbrechen
Ändern
Aktion wählen
+ Netzwerk auswählen
Token auswählen
Beanspruchen
Stakingbelohnungen beanspruchen
diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml
index 5cd0491808..f3c8df4619 100644
--- a/core/res/src/main/res/values-ja/strings.xml
+++ b/core/res/src/main/res/values-ja/strings.xml
@@ -112,6 +112,7 @@
キャンセル
変更
アクションを選択
+ ネットワークを選択
トークンを選択
請求
報酬を受け取る
@@ -332,6 +333,7 @@
さらに多くのプロバイダーが利用可能になる予定です
プロバイダー
ベストレート
+ FCA警告リスト
最大 %s まで使用可能
%s 以上で利用可能
このペアは利用できません
@@ -343,6 +345,8 @@
この取引を非表示にする
一度非表示にすると、取引状況を再度表示することはできません。代わりに、スワイプして閉じることができます。
取引状況を非表示にしますか?
+ このトークンはサポートされていません。別のトークンを選択してスワップしてください。
+ %sはサポートされていません
スワップする
トークンが見つかりません。別のリクエストをお試しください。
ID: %s
@@ -864,6 +868,7 @@
ウォレット削除
これにより、ウォレットがアプリから削除されます。ウォレットは再度追加できます。
名前
+ このトークンのステーキングに参加
ステーキング金額は %s 以上である必要があります
ネットワークルールにより、ステーキング金額は%1$s TRX に切り上げられます。
ネットワークルールにより、ステーキング解除の量は%1$s TRX に切り上げられます。
@@ -998,6 +1003,7 @@
Web3.0対応
続行するには少なくとも%1$sの受信取引が必要です
残高不足
+ 固定レート
ネットワークは、あなたがトークンのスワップを承認していることを確認するために、トークン承認手数料を請求します。
より多くのトークンをより良いレートで、ウォレット内にて直接交換します。
新しいスワッププロバイダーが利用可能になりました!
@@ -1205,6 +1211,8 @@
受け取る金額は、 %s 以上である必要があります。
これは、選択したペアがプロバイダーでは現在交換できないために発生する可能性があります。しばらく待ってからもう一度お試しください。(コード%s )
選択されたペアは一時的に利用できません
+ 一部のプロバイダーは英国金融行動監視機構(FCA)の認可を受けていません。そのようなプロバイダーとの取引は避けるべきです。
+ FCA警告リスト
サービスは一時的に利用できません
スワップするトークンの量は %s を超えないでください
スワップ金額は %s 以上である必要があります
@@ -1239,7 +1247,7 @@
あなたのレビューは、Tangemウォレットをさらに良くするためのモチベーションになります
Tangemを楽しんでいますか?
トークンを受け取る前に、トークンを関連付ける必要があります。
- トークンを受け取る前にトラストラインを開く必要があります
+ トークンを受け取る前に、トラストラインを開く必要があります
ネットワーク使用料が必要です
対応が必要です
ウォレットの作成後、7日以内にアプリ経由でサポートに連絡しましたか?連絡した場合、あるいは連絡したかわからない場合は、「はい」をクリックして指示に従ってください。
@@ -1255,9 +1263,10 @@
下にスワイプして更新するか、後でもう一度お試しください。
一部のネットワークにアクセスできません
一部のトークン残高を更新できませんでした
- 必要な最低XLMリザーブ %1$s
- トラストラインを開く
- トラストラインタイトルを開く
+ %1$sが足りません。このトークンを関連付けるには、XLMアカウントにチャージしてください。
+ トラストラインを有効にする
+ ネットワークルールに従い、このトークンを入金する前にトラストラインを開設する必要があります。これにより、ウォレットが資産を受け入れ、保管できるようになります。
+ このトークンのトラストラインを有効にする
これはテストネットカードです。取引処理はできませんので、テストおよび開発目的でのみご利用ください。
テスト目的のみ
残高が古い可能性があります。ページを更新してください。
@@ -1281,8 +1290,10 @@
使用を許可する
アドレス
接続する
+ 読み込み中
ネットワーク
ネットワーク
+ 無制限
ウォレット
接続されたネットワーク
ウォレットの残高とアクティビティを表示する
@@ -1299,6 +1310,7 @@
すべてのdAppsの接続解除に関するテキスト
すべてのdAppを接続解除する
ウォレットの変更の予測
+ 取引をシミュレーションできませんでした。注意して続行してください。
悪意のある取引
このウォレットのプロフィールに%sネットワークを追加する
ウォレットに必要なネットワークはありません
diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index 8d442b7857..132232d93f 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -112,6 +112,7 @@
Отмена
Изменить
Выберите действие
+ Выберите сеть
Выберите токен
Получить
Вывести награду
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 8f66364be9..27c5144b7f 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -114,6 +114,7 @@
Cancel
Change
Choose action
+ Choose network
Choose token
Claim
Claim rewards
@@ -289,6 +290,7 @@
Cannot be swapped for %s
Provided by
Status
+ Choose provider
Providers facilitate transactions
Provider
An error occurred. Code: %s
@@ -349,6 +351,8 @@
Hide this transaction
Once hidden, the transaction status cannot be viewed again. You can simply swipe to dismiss instead.
Hide Transaction Status?
+ This token is not supported. Please choose a different token to swap.
+ %s is not supported
Swap with
No tokens found. Please try another request
ID: %s
@@ -864,7 +868,6 @@
network fee will be covered by using %1$s energy
network fee will be reduced by spending %1$s energy
including a network fee of %1$s
- asdflkdsl;kfasl;fn;lnf asdjfnasdk;jf dfk;jasdjf;kajsdnf
Transaction has been successfully signed and sent to the blockchain node. Wallet balance will be updated in a while
%1$s is an asset in the Tron network. To calculate the fee and make a transaction you need to deposit some Tron (TRX) in your account.
Amount exceeds balance
@@ -880,6 +883,7 @@
Forget wallet
This will remove the wallet from the application. The wallet itself can be added again.
Name
+ Join staking with this token
The amount to stake must be at least %s
Staking amount will be rounded to %1$s TRX due to network rules.
Unstaking amount will be rounded to %1$s TRX due to network rules.
@@ -1014,6 +1018,7 @@
Web 3.0 Compatible
An incoming transaction of at least %1$s is required to proceed
Insufficient funds
+ Fixed Rate
The network will charge a token approval fee to verify that you are authorizing the use of your token for the swap.
Exchange more tokens at better rates directly in your wallet.
New Swap Provider Available!
@@ -1337,6 +1342,7 @@
This domain cannot be verified. Check the request carefully approving.
Please return to your browser and reconnect via WalletConnect.
WalletConnect session was disconnected
+ Sign anyway
Error code: %s. If the problem persists — feel free to contact our support.
We\'ve encountered unknown error
Error code: 8 005. If the problem persists — feel free to contact our support.
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt
index 9c29b2fa46..9d9b421b9f 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt
@@ -485,6 +485,7 @@ internal class SwapModel @Inject constructor(
expressDataError = state.error,
includeFeeInAmount = state.includeFeeInAmount,
isReverseSwapPossible = isReverseSwapPossible(),
+ needApplyFCARestrictions = userCountry.needApplyFCARestrictions(),
)
sendErrorAnalyticsEvent(state.error, provider)
}
@@ -1102,6 +1103,7 @@ internal class SwapModel @Inject constructor(
selectedProviderId = providerId,
pricesLowerBest = pricesLowerBest,
providersStates = dataState.lastLoadedSwapStates,
+ needApplyFCARestrictions = userCountry.needApplyFCARestrictions(),
) { uiState = stateBuilder.dismissBottomSheet(uiState) }
},
onProviderSelect = {
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ChooseProviderBottomSheetConfig.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ChooseProviderBottomSheetConfig.kt
index 68c761cd14..abcec59888 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ChooseProviderBottomSheetConfig.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ChooseProviderBottomSheetConfig.kt
@@ -1,9 +1,11 @@
package com.tangem.feature.swap.models.states
+import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import kotlinx.collections.immutable.ImmutableList
data class ChooseProviderBottomSheetConfig(
val selectedProviderId: String,
val providers: ImmutableList,
+ val notification: NotificationUM?,
) : TangemBottomSheetConfigContent
\ No newline at end of file
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt
index 5fb9348584..8ab97bb746 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt
@@ -44,6 +44,7 @@ sealed class ProviderState {
@Immutable
sealed class AdditionalBadge {
+ data object FCAWarningList : AdditionalBadge()
data object BestTrade : AdditionalBadge()
data object Empty : AdditionalBadge()
data object PermissionRequired : AdditionalBadge()
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/SwapNotificationUM.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/SwapNotificationUM.kt
index 5dc1ffb0c6..a5f0f1a251 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/SwapNotificationUM.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/states/SwapNotificationUM.kt
@@ -99,6 +99,12 @@ internal object SwapNotificationUM {
subtitle = resourceReference(R.string.warning_express_wrong_amount_description),
iconResId = R.drawable.ic_alert_circle_24,
)
+
+ data object FCAWarningList : Error(
+ title = resourceReference(R.string.warning_express_providers_fca_warning_title),
+ subtitle = resourceReference(R.string.warning_express_providers_fca_warning_description),
+ iconResId = R.drawable.ic_alert_circle_24,
+ )
}
sealed class Warning(
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt
index 1b45b356a8..996b41aa9e 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt
@@ -14,8 +14,11 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.ui.components.bottomsheets.sheet.TangemBottomSheet
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
+import com.tangem.core.ui.components.notifications.Notification
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.stringResourceSafe
@@ -47,17 +50,32 @@ private fun ChooseProviderBottomSheetContent(content: ChooseProviderBottomSheetC
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.secondary,
modifier = Modifier
- .padding(top = TangemTheme.dimens.spacing10)
+ .padding(
+ top = 10.dp,
+ bottom = 16.dp,
+ )
.padding(horizontal = TangemTheme.dimens.spacing56),
textAlign = TextAlign.Center,
)
+ if (content.notification != null) {
+ Notification(
+ config = content.notification.config,
+ modifier = Modifier
+ .padding(
+ start = 16.dp,
+ end = 16.dp,
+ bottom = 12.dp,
+ ),
+ iconTint = TangemTheme.colors.icon.warning,
+ )
+ }
+
Column(
modifier = Modifier
.padding(
- top = TangemTheme.dimens.spacing16,
- start = TangemTheme.dimens.spacing16,
- end = TangemTheme.dimens.spacing16,
- bottom = TangemTheme.dimens.spacing14,
+ start = 16.dp,
+ end = 16.dp,
+ bottom = 14.dp,
)
.background(
color = TangemTheme.colors.background.action,
@@ -129,6 +147,10 @@ private fun Preview_ChooseProviderBottomSheet() {
)
val content = ChooseProviderBottomSheetConfig(
selectedProviderId = "1",
+ notification = NotificationUM.Error(
+ title = resourceReference(R.string.warning_express_providers_fca_warning_title),
+ subtitle = resourceReference(R.string.warning_express_providers_fca_warning_description),
+ ),
providers = providers,
)
TangemThemePreview {
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt
index d743a4ebda..3c9d32501e 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt
@@ -145,6 +145,7 @@ private fun ProviderContentState(
}
val badgeModifier = Modifier.padding(start = TangemTheme.dimens.spacing4)
when (state.additionalBadge) {
+ ProviderState.AdditionalBadge.FCAWarningList -> FCABadgeItem(badgeModifier)
ProviderState.AdditionalBadge.BestTrade -> BestTradeItem(badgeModifier)
ProviderState.AdditionalBadge.PermissionRequired -> PermissionBadgeItem(badgeModifier)
ProviderState.AdditionalBadge.Recommended -> RecommendedItem(badgeModifier)
@@ -361,6 +362,7 @@ private fun BestTradeItem(modifier: Modifier = Modifier) {
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.icon.accent,
modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing6),
+ maxLines = 1,
)
}
}
@@ -378,6 +380,25 @@ private fun PermissionBadgeItem(modifier: Modifier = Modifier) {
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing6),
+ maxLines = 1,
+ )
+ }
+}
+
+@Composable
+private fun FCABadgeItem(modifier: Modifier = Modifier) {
+ Box(
+ modifier = modifier.background(
+ color = TangemTheme.colors.background.secondary,
+ shape = TangemTheme.shapes.roundedCornersLarge,
+ ),
+ ) {
+ Text(
+ text = stringResourceSafe(id = R.string.express_provider_fca_warning_list),
+ style = TangemTheme.typography.caption1,
+ color = TangemTheme.colors.text.tertiary,
+ modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing6),
+ maxLines = 1,
)
}
}
@@ -395,6 +416,7 @@ private fun RecommendedItem(modifier: Modifier = Modifier) {
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.icon.accent,
modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing6),
+ maxLines = 1,
)
}
}
diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
index 6fe7b46155..ad13b81ea0 100644
--- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
+++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
@@ -347,13 +347,13 @@ internal class StateBuilder(
ChangeCardsButtonState.DISABLED
},
providerState = swapProvider.convertToContentClickableProviderState(
- needApplyFCARestrictions = needApplyFCARestrictions,
isBestRate = bestRatedProviderId == swapProvider.providerId,
fromTokenInfo = quoteModel.fromTokenInfo,
toTokenInfo = quoteModel.toTokenInfo,
isNeedBestRateBadge = isNeedBestRateBadge,
selectionType = ProviderState.SelectionType.CLICK,
onProviderClick = actions.onProviderClick,
+ needApplyFCARestrictions = needApplyFCARestrictions,
),
priceImpact = if (quoteModel.priceImpact.value > PRICE_IMPACT_THRESHOLD) {
quoteModel.priceImpact
@@ -411,6 +411,7 @@ internal class StateBuilder(
includeFeeInAmount: IncludeFeeInAmount,
expressDataError: ExpressDataError,
isReverseSwapPossible: Boolean,
+ needApplyFCARestrictions: Boolean,
): SwapStateHolder {
if (uiStateHolder.sendCardData !is SwapCardState.SwapCardData) return uiStateHolder
if (uiStateHolder.receiveCardData !is SwapCardState.SwapCardData) return uiStateHolder
@@ -427,6 +428,7 @@ internal class StateBuilder(
expressDataError = expressDataError,
onProviderClick = actions.onProviderClick,
selectionType = ProviderState.SelectionType.CLICK,
+ needApplyFCARestrictions = needApplyFCARestrictions,
)
val receiveCardData = toToken?.let {
SwapCardState.SwapCardData(
@@ -477,12 +479,14 @@ internal class StateBuilder(
)
}
+ @Suppress("LongParameterList")
private fun getProviderStateForError(
swapProvider: SwapProvider,
fromToken: CryptoCurrency,
expressDataError: ExpressDataError,
onProviderClick: (String) -> Unit,
selectionType: ProviderState.SelectionType,
+ needApplyFCARestrictions: Boolean,
): ProviderState {
return when (expressDataError) {
is ExpressDataError.ExchangeTooSmallAmountError -> {
@@ -494,6 +498,7 @@ internal class StateBuilder(
),
selectionType = selectionType,
onProviderClick = onProviderClick,
+ needApplyFCARestrictions = needApplyFCARestrictions,
)
}
is ExpressDataError.ExchangeTooBigAmountError -> {
@@ -505,6 +510,7 @@ internal class StateBuilder(
),
selectionType = selectionType,
onProviderClick = onProviderClick,
+ needApplyFCARestrictions = needApplyFCARestrictions,
)
}
else -> {
@@ -991,17 +997,27 @@ internal class StateBuilder(
selectedProviderId: String,
pricesLowerBest: Map,
providersStates: Map,
+ needApplyFCARestrictions: Boolean,
onDismiss: () -> Unit,
): SwapStateHolder {
val availableProvidersStates = providersStates.entries
.mapNotNull {
- it.convertToProviderBottomSheetState(pricesLowerBest, actions.onProviderSelect)
+ it.convertToProviderBottomSheetState(
+ pricesLowerBest = pricesLowerBest,
+ onProviderSelect = actions.onProviderSelect,
+ needApplyFCARestrictions = needApplyFCARestrictions,
+ )
}
.sortedWith(ProviderPercentDiffComparator)
.toImmutableList()
+
+ val isAnyFCABadge = availableProvidersStates.any {
+ (it as? ProviderState.Content)?.additionalBadge == ProviderState.AdditionalBadge.FCAWarningList
+ }
val config = ChooseProviderBottomSheetConfig(
selectedProviderId = selectedProviderId,
providers = availableProvidersStates,
+ notification = SwapNotificationUM.Error.FCAWarningList.takeIf { isAnyFCABadge },
)
return uiState.copy(
bottomSheetConfig = TangemBottomSheetConfig(
@@ -1109,6 +1125,7 @@ internal class StateBuilder(
private fun Map.Entry.convertToProviderBottomSheetState(
pricesLowerBest: Map,
onProviderSelect: (String) -> Unit,
+ needApplyFCARestrictions: Boolean,
): ProviderState? {
val provider = this.key
return when (val state = this.value) {
@@ -1119,6 +1136,7 @@ internal class StateBuilder(
onProviderClick = onProviderSelect,
pricesLowerBest = pricesLowerBest,
selectionType = ProviderState.SelectionType.SELECT,
+ needApplyFCARestrictions = needApplyFCARestrictions,
)
}
is SwapState.SwapError -> getProviderStateForError(
@@ -1127,6 +1145,7 @@ internal class StateBuilder(
expressDataError = state.error,
onProviderClick = onProviderSelect,
selectionType = ProviderState.SelectionType.SELECT,
+ needApplyFCARestrictions = needApplyFCARestrictions,
)
}
}
@@ -1143,13 +1162,13 @@ internal class StateBuilder(
@Suppress("LongParameterList")
private fun SwapProvider.convertToContentClickableProviderState(
- needApplyFCARestrictions: Boolean,
isBestRate: Boolean,
fromTokenInfo: TokenSwapInfo,
toTokenInfo: TokenSwapInfo,
selectionType: ProviderState.SelectionType,
isNeedBestRateBadge: Boolean,
onProviderClick: (String) -> Unit,
+ needApplyFCARestrictions: Boolean,
): ProviderState {
val rate = toTokenInfo.tokenAmount.value.calculateRate(
fromTokenInfo.tokenAmount.value,
@@ -1161,21 +1180,21 @@ internal class StateBuilder(
append(" ≈ ")
append(rate.format { crypto(toTokenInfo.cryptoCurrencyStatus.currency) })
}
- // val rateString = "1 $fromCurrencySymbol ≈ $rate $toCurrencySymbol"
- val badge = if (isRecommended) {
- ProviderState.AdditionalBadge.Recommended
- } else if (isNeedBestRateBadge && isBestRate && !needApplyFCARestrictions) {
- ProviderState.AdditionalBadge.BestTrade
- } else {
- ProviderState.AdditionalBadge.Empty
+
+ val additionalBadge = when {
+ needApplyFCARestrictions && isFCARestrictedProvider() -> ProviderState.AdditionalBadge.FCAWarningList
+ isRecommended -> ProviderState.AdditionalBadge.Recommended
+ isNeedBestRateBadge && isBestRate && !needApplyFCARestrictions -> ProviderState.AdditionalBadge.BestTrade
+ else -> ProviderState.AdditionalBadge.Empty
}
+
return ProviderState.Content(
id = this.providerId,
name = this.name,
iconUrl = this.imageLarge,
type = this.type.providerName,
subtitle = stringReference(rateString),
- additionalBadge = badge,
+ additionalBadge = additionalBadge,
selectionType = selectionType,
percentLowerThenBest = PercentDifference.Empty,
namePrefix = ProviderState.PrefixType.NONE,
@@ -1188,16 +1207,20 @@ internal class StateBuilder(
selectionType: ProviderState.SelectionType,
pricesLowerBest: Map,
onProviderClick: (String) -> Unit,
+ needApplyFCARestrictions: Boolean,
): ProviderState {
val toTokenInfo = state.toTokenInfo
val rateString = toTokenInfo.tokenAmount.getFormattedCryptoAmount(toTokenInfo.cryptoCurrencyStatus.currency)
- val additionalBadge = if (state.permissionState is PermissionDataState.PermissionReadyForRequest) {
- ProviderState.AdditionalBadge.PermissionRequired
- } else if (isRecommended) {
- ProviderState.AdditionalBadge.Recommended
- } else {
- ProviderState.AdditionalBadge.Empty
+
+ val additionalBadge = when {
+ needApplyFCARestrictions && isFCARestrictedProvider() -> ProviderState.AdditionalBadge.FCAWarningList
+ state.permissionState is PermissionDataState.PermissionReadyForRequest -> {
+ ProviderState.AdditionalBadge.PermissionRequired
+ }
+ isRecommended -> ProviderState.AdditionalBadge.Recommended
+ else -> ProviderState.AdditionalBadge.Empty
}
+
return ProviderState.Content(
id = this.providerId,
name = this.name,
@@ -1219,12 +1242,14 @@ internal class StateBuilder(
alertText: TextReference,
selectionType: ProviderState.SelectionType,
onProviderClick: (String) -> Unit,
+ needApplyFCARestrictions: Boolean,
): ProviderState {
- val additionalBadge = if (swapProvider.isRecommended) {
- ProviderState.AdditionalBadge.Recommended
- } else {
- ProviderState.AdditionalBadge.Empty
+ val additionalBadge = when {
+ needApplyFCARestrictions && isFCARestrictedProvider() -> ProviderState.AdditionalBadge.FCAWarningList
+ swapProvider.isRecommended -> ProviderState.AdditionalBadge.Recommended
+ else -> ProviderState.AdditionalBadge.Empty
}
+
return ProviderState.Content(
id = this.providerId,
name = this.name,
@@ -1272,6 +1297,10 @@ internal class StateBuilder(
return "$TILDE_SIGN $this"
}
+ private fun SwapProvider.isFCARestrictedProvider(): Boolean {
+ return FCA_RESTRICTED_PROVIDER_IDS.contains(providerId)
+ }
+
private companion object {
private const val RU_LOCALE = "ru"
private const val EN_LOCALE = "en"
@@ -1282,7 +1311,14 @@ internal class StateBuilder(
private const val MAX_DECIMALS_TO_SHOW = 8
private const val IF_ZERO_DECIMALS_TO_SHOW = 2
private const val FEE_READ_MORE_URL_FIRST_PART = "https://tangem.com/"
- private const val FEE_READ_MORE_URL_SECOND_PART =
- "/blog/post/what-is-a-transaction-fee-and-why-do-we-need-it/"
+ private const val FEE_READ_MORE_URL_SECOND_PART = "/blog/post/what-is-a-transaction-fee-and-why-do-we-need-it/"
+
+ private val FCA_RESTRICTED_PROVIDER_IDS = setOf(
+ "changelly",
+ "changenow",
+ "okx-cross-chain",
+ "okx-on-chain",
+ "simpleswap",
+ )
}
}
\ No newline at end of file