Updated on 2026-08-14

This commit is contained in:
Tangem 2023-11-25 17:27:19 +03:00
commit 3e5ab44b4c
35 changed files with 225 additions and 59 deletions

View file

@ -90,7 +90,7 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager {
infuraProjectId = configValues.infuraProjectId,
tronGridApiKey = configValues.tronGridApiKey,
nowNodeCredentials = NowNodeCredentials(configValues.nowNodesApiKey),
getBlockCredentials = GetBlockCredentials(configValues.getBlockApiKey),
getBlockCredentials = createGetBlockCredentials(configValues),
kaspaSecondaryApiUrl = configValues.kaspaSecondaryApiUrl,
tonCenterCredentials = TonCenterCredentials(
mainnetApiKey = configValues.tonCenterKeys.mainnet,
@ -109,4 +109,45 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager {
tangemExpressApiKey = configValues.tangemExpressApiKey,
)
}
private fun createGetBlockCredentials(configValues: ConfigValueModel): GetBlockCredentials? {
return configValues.getBlockAccessTokens?.let { accessTokens ->
GetBlockCredentials(
xrp = GetBlockAccessToken(jsonRpc = accessTokens.xrp?.jsonRPC),
cardano = GetBlockAccessToken(rosetta = accessTokens.cardano?.rosetta),
avalanche = GetBlockAccessToken(jsonRpc = accessTokens.avalanche?.jsonRPC),
eth = GetBlockAccessToken(jsonRpc = accessTokens.eth?.jsonRPC),
etc = GetBlockAccessToken(jsonRpc = accessTokens.etc?.jsonRPC),
fantom = GetBlockAccessToken(jsonRpc = accessTokens.fantom?.jsonRPC),
rsk = GetBlockAccessToken(jsonRpc = accessTokens.rsk?.jsonRPC),
bsc = GetBlockAccessToken(jsonRpc = accessTokens.bsc?.jsonRPC),
polygon = GetBlockAccessToken(jsonRpc = accessTokens.polygon?.jsonRPC),
gnosis = GetBlockAccessToken(jsonRpc = accessTokens.gnosis?.jsonRPC),
cronos = GetBlockAccessToken(jsonRpc = accessTokens.cronos?.jsonRPC),
solana = GetBlockAccessToken(jsonRpc = accessTokens.solana?.jsonRPC),
stellar = GetBlockAccessToken(rest = accessTokens.stellar?.rest),
ton = GetBlockAccessToken(jsonRpc = accessTokens.ton?.jsonRPC),
tron = GetBlockAccessToken(rest = accessTokens.tron?.rest),
cosmos = GetBlockAccessToken(rest = accessTokens.cosmos?.rest),
near = GetBlockAccessToken(jsonRpc = accessTokens.near?.jsonRPC),
luna = GetBlockAccessToken(rest = accessTokens.luna?.rest),
dogecoin = GetBlockAccessToken(
jsonRpc = accessTokens.dogecoin?.jsonRPC,
blockBookRest = accessTokens.dogecoin?.blockBookRest,
),
litecoin = GetBlockAccessToken(
jsonRpc = accessTokens.litecoin?.jsonRPC,
blockBookRest = accessTokens.litecoin?.blockBookRest,
),
dash = GetBlockAccessToken(
jsonRpc = accessTokens.dash?.jsonRPC,
blockBookRest = accessTokens.dash?.blockBookRest,
),
bitcoin = GetBlockAccessToken(
jsonRpc = accessTokens.bitcoin?.jsonRPC,
blockBookRest = accessTokens.bitcoin?.blockBookRest,
),
)
}
}
}

View file

@ -1,6 +1,7 @@
package com.tangem.datasource.config.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
[REDACTED_AUTHOR]
@ -25,7 +26,7 @@ class ConfigValueModel(
val bscQuiknodeSubdomain: String,
val bscQuiknodeApiKey: String,
val nowNodesApiKey: String,
val getBlockApiKey: String,
@Json(name = "getBlockAccessTokens") val getBlockAccessTokens: GetBlockAccessTokens?,
@Json(name = "tonCenterApiKey") val tonCenterKeys: TonCenterKeys,
val blockcypherTokens: Set<String>?,
val infuraProjectId: String?,
@ -43,6 +44,40 @@ class ConfigValueModel(
val tangemExpressApiKey: String,
)
@JsonClass(generateAdapter = true)
data class GetBlockAccessTokens(
@Json(name = "xrp") val xrp: GetBlockToken?,
@Json(name = "cardano") val cardano: GetBlockToken?,
@Json(name = "avalanche") val avalanche: GetBlockToken?,
@Json(name = "ethereum") val eth: GetBlockToken?,
@Json(name = "ethereumClassic") val etc: GetBlockToken?,
@Json(name = "fantom") val fantom: GetBlockToken?,
@Json(name = "rsk") val rsk: GetBlockToken?,
@Json(name = "bsc") val bsc: GetBlockToken?,
@Json(name = "polygon") val polygon: GetBlockToken?,
@Json(name = "xdai") val gnosis: GetBlockToken?,
@Json(name = "cronos") val cronos: GetBlockToken?,
@Json(name = "solana") val solana: GetBlockToken?,
@Json(name = "stellar") val stellar: GetBlockToken?,
@Json(name = "ton") val ton: GetBlockToken?,
@Json(name = "tron") val tron: GetBlockToken?,
@Json(name = "cosmos-hub") val cosmos: GetBlockToken?,
@Json(name = "near") val near: GetBlockToken?,
@Json(name = "terra-2") val luna: GetBlockToken?,
@Json(name = "dogecoin") val dogecoin: GetBlockToken?,
@Json(name = "litecoin") val litecoin: GetBlockToken?,
@Json(name = "dash") val dash: GetBlockToken?,
@Json(name = "bitcoin") val bitcoin: GetBlockToken?,
)
@JsonClass(generateAdapter = true)
data class GetBlockToken(
@Json(name = "jsonRpc") val jsonRPC: String?,
@Json(name = "blockBookRest") val blockBookRest: String?,
@Json(name = "rest") val rest: String?,
@Json(name = "rosetta") val rosetta: String?,
)
data class AppsFlyer(
val appsFlyerDevKey: String,
val appsFlyerAppID: String,

View file

@ -86,6 +86,7 @@
<string name="common_error">Ошибка</string>
<string name="common_exchange">Обменять</string>
<string name="common_explore_transaction_history">Посмотреть историю транзакций</string>
<string name="common_explore">Обозреватель</string>
<string name="common_explorer">Обозреватель</string>
<string name="common_fee_selector_footer">Сетевые комиссии за транзакции используются для поддержки безопасности сети, поощрения валидаторов, выделения ресурсов и определения приоритета транзакции.</string>
<string name="common_fee_selector_option_custom">Свое</string>

View file

@ -2,9 +2,7 @@ package com.tangem.core.ui.components.bottomsheets.tokenreceive
import android.widget.Toast
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.rememberLazyListState
@ -43,6 +41,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi
var selectedAddress by remember { mutableStateOf(content.addresses.first()) }
Column(
modifier = Modifier
.verticalScroll(state = rememberScrollState())
.padding(
start = TangemTheme.dimens.spacing24,
top = TangemTheme.dimens.spacing24,

View file

@ -81,7 +81,7 @@ private fun LazyListScope.contentItems(
count = txHistoryItems.itemCount,
key = txHistoryItems.itemKey { item ->
when (item) {
is TxHistoryState.TxHistoryItemState.GroupTitle -> item.title
is TxHistoryState.TxHistoryItemState.GroupTitle -> item.itemKey
is TxHistoryState.TxHistoryItemState.Title -> item.onExploreClick.hashCode()
is TxHistoryState.TxHistoryItemState.Transaction -> item.state.txHash
}

View file

@ -10,6 +10,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.transactions.state.TxHistoryState.TxHistoryItemState
import com.tangem.core.ui.res.TangemTheme
import java.util.UUID
/**
* Transactions block group title
@ -38,7 +39,9 @@ internal fun TxHistoryGroupTitle(config: TxHistoryItemState.GroupTitle, modifier
@Composable
private fun Preview_TransactionsBlockGroupTitle_Light() {
TangemTheme(isDark = false) {
TxHistoryGroupTitle(config = TxHistoryItemState.GroupTitle(title = "Today"))
TxHistoryGroupTitle(
config = TxHistoryItemState.GroupTitle(title = "Today", itemKey = UUID.randomUUID().toString()),
)
}
}
@ -46,6 +49,8 @@ private fun Preview_TransactionsBlockGroupTitle_Light() {
@Composable
private fun Preview_TransactionsBlockGroupTitle_Dark() {
TangemTheme(isDark = true) {
TxHistoryGroupTitle(config = TxHistoryItemState.GroupTitle(title = "Today"))
TxHistoryGroupTitle(
config = TxHistoryItemState.GroupTitle(title = "Today", itemKey = UUID.randomUUID().toString()),
)
}
}

View file

@ -49,8 +49,12 @@ sealed interface TxHistoryState {
* Group title item
*
* @property title title
* @property itemKey key to use in compose
*/
data class GroupTitle(val title: String) : TxHistoryItemState
data class GroupTitle(
val title: String,
val itemKey: String,
) : TxHistoryItemState
/**
* Transaction item

View file

@ -45,6 +45,7 @@ fun getActiveIconRes(blockchainId: String): Int {
"aleph-zero", "aleph-zero/test" -> R.drawable.img_azero_22
"octaspace", "octaspace/test" -> R.drawable.img_octaspace_22
"chia", "chia/test" -> R.drawable.img_chia_22
"NEAR", "NEAR/test" -> R.drawable.img_near_22
"decimal", "decimal/testnet" -> R.drawable.img_decimal_22
else -> R.drawable.ic_alert_24
}
@ -135,6 +136,7 @@ fun getGreyedOutIconRes(blockchainId: String): Int {
"aleph-zero", "aleph-zero/test" -> R.drawable.ic_azero_22
"octaspace", "octaspace/test" -> R.drawable.ic_octaspace_22
"chia", "chia/test" -> R.drawable.ic_chia_22
"NEAR", "NEAR/test" -> R.drawable.ic_near_22
"decimal", "decimal/test" -> R.drawable.ic_decimal_22
else -> R.drawable.ic_alert_24
}

View file

@ -156,7 +156,7 @@ private fun darkThemeColors(): TangemColors {
attention = TangemColorPalette.Mustard,
),
button = TangemColors.Button(
primary = TangemColorPalette.Light1,
primary = TangemColorPalette.Light4,
secondary = TangemColorPalette.Dark5,
disabled = TangemColorPalette.Dark5,
positiveDisabled = TangemColorPalette.DarkGreen,

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:pathData="M15.721,5C15.277,5 14.864,5.23 14.632,5.609L12.123,9.333C12.042,9.456 12.075,9.622 12.197,9.703C12.297,9.77 12.429,9.761 12.519,9.683L14.988,7.542C15.029,7.505 15.092,7.509 15.129,7.55C15.146,7.569 15.155,7.593 15.155,7.618V14.323C15.155,14.378 15.11,14.423 15.055,14.423C15.025,14.423 14.997,14.41 14.978,14.387L7.515,5.453C7.272,5.166 6.915,5 6.539,5H6.278C5.572,5 5,5.572 5,6.278V15.722C5,16.428 5.572,17 6.278,17C6.723,17 7.135,16.77 7.368,16.391L9.876,12.667C9.958,12.544 9.925,12.378 9.802,12.297C9.703,12.23 9.571,12.239 9.481,12.317L7.012,14.458C6.971,14.495 6.907,14.491 6.87,14.45C6.854,14.432 6.845,14.407 6.845,14.382V7.676C6.845,7.62 6.89,7.576 6.945,7.576C6.975,7.576 7.003,7.589 7.022,7.612L14.484,16.547C14.727,16.834 15.084,17 15.46,17H15.721C16.427,17 16.999,16.428 17,15.722V6.278C17,5.572 16.428,5 15.722,5H15.721Z"
android:fillColor="#000000" />
</vector>