diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/YieldSupplyApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/YieldSupplyApi.kt index e343461417..b8db77d439 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/YieldSupplyApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/YieldSupplyApi.kt @@ -3,6 +3,7 @@ package com.tangem.datasource.api.tangemTech import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.tangemTech.models.YieldMarketsResponse import com.tangem.datasource.api.tangemTech.models.YieldTokenStatusResponse +import com.tangem.datasource.api.tangemTech.models.YieldTokenChartResponse import retrofit2.http.GET import retrofit2.http.Path @@ -13,4 +14,7 @@ interface YieldSupplyApi { @GET("api/v1/yield/token/{tokenAddress}") suspend fun getYieldTokenStatus(@Path("tokenAddress") tokenAddress: String): ApiResponse + + @GET("api/v1/yield/token/{tokenAddress}/chart") + suspend fun getYieldTokenChart(@Path("tokenAddress") tokenAddress: String): ApiResponse } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldMarketsResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldMarketsResponse.kt index 7f816f3161..936c4954bf 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldMarketsResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldMarketsResponse.kt @@ -16,14 +16,6 @@ data class YieldMarketsResponse( @Json(name = "tokenSymbol") val tokenSymbol: String, @Json(name = "tokenName") val tokenName: String, @Json(name = "apy") val apy: BigDecimal, - @Json(name = "totalSupplied") val totalSupplied: String, - @Json(name = "totalBorrowed") val totalBorrowed: String, - @Json(name = "liquidityRate") val liquidityRate: String, - @Json(name = "borrowRate") val borrowRate: String, - @Json(name = "utilizationRate") val utilizationRate: BigDecimal, @Json(name = "isActive") val isActive: Boolean, - @Json(name = "ltv") val ltv: BigDecimal, - @Json(name = "liquidationThreshold") val liquidationThreshold: BigDecimal, - @Json(name = "decimals") val decimals: Int, ) } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenChartResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenChartResponse.kt new file mode 100644 index 0000000000..0b0a01a5a4 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenChartResponse.kt @@ -0,0 +1,22 @@ +package com.tangem.datasource.api.tangemTech.models + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import java.math.BigDecimal + +@JsonClass(generateAdapter = true) +data class YieldTokenChartResponse( + @Json(name = "underlying") val underlying: String, + @Json(name = "market") val market: String, + @Json(name = "bucketSizeDays") val bucketSizeDays: Int, + @Json(name = "period") val period: String, + @Json(name = "data") val data: List, + @Json(name = "avr") val averageApy: BigDecimal, +) { + + @JsonClass(generateAdapter = true) + data class DataPoint( + @Json(name = "bucketIndex") val bucketIndex: Int, + @Json(name = "avgApy") val avgApy: BigDecimal, + ) +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenStatusResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenStatusResponse.kt index 31680bf78b..a0232bd3c9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenStatusResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/YieldTokenStatusResponse.kt @@ -10,17 +10,5 @@ data class YieldTokenStatusResponse( @Json(name = "tokenSymbol") val tokenSymbol: String, @Json(name = "tokenName") val tokenName: String, @Json(name = "apy") val apy: BigDecimal, - @Json(name = "totalSupplied") val totalSupplied: String, - @Json(name = "totalBorrowed") val totalBorrowed: String, - @Json(name = "liquidityRate") val liquidityRate: String, - @Json(name = "borrowRate") val borrowRate: String, - @Json(name = "utilizationRate") val utilizationRate: Double, @Json(name = "isActive") val isActive: Boolean, - @Json(name = "ltv") val ltv: Int, - @Json(name = "liquidationThreshold") val liquidationThreshold: Int, - @Json(name = "decimals") val decimals: Int, - @Json(name = "chainId") val chainId: Int, - @Json(name = "priority") val priority: Int, - @Json(name = "isEnabled") val isEnabled: Boolean, - @Json(name = "lastUpdatedAt") val lastUpdatedAt: String, ) \ No newline at end of file diff --git a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyMarketRepository.kt b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyMarketRepository.kt index ba199c71d2..74c43f85be 100644 --- a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyMarketRepository.kt +++ b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyMarketRepository.kt @@ -5,9 +5,10 @@ import com.tangem.datasource.local.yieldsupply.YieldMarketsStore import com.tangem.data.yield.supply.converters.YieldMarketTokenConverter import com.tangem.datasource.api.tangemTech.YieldSupplyApi import com.tangem.data.yield.supply.converters.YieldTokenStatusConverter +import com.tangem.data.yield.supply.converters.YieldTokenChartConverter import com.tangem.domain.yield.supply.YieldSupplyMarketRepository import com.tangem.domain.yield.supply.models.YieldMarketToken -import com.tangem.domain.yield.supply.models.YieldTokenStatus +import com.tangem.domain.yield.supply.models.YieldSupplyMarketChartData import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext @@ -31,8 +32,13 @@ internal class DefaultYieldSupplyMarketRepository( override fun getMarketsFlow(): Flow> = store.get() - override suspend fun getTokenStatus(contractAddress: String): YieldTokenStatus { + override suspend fun getTokenStatus(contractAddress: String): YieldMarketToken { val response = yieldSupplyApi.getYieldTokenStatus(contractAddress).getOrThrow() return YieldTokenStatusConverter.convert(response) } + + override suspend fun getTokenChart(contractAddress: String): YieldSupplyMarketChartData { + val response = yieldSupplyApi.getYieldTokenChart(contractAddress).getOrThrow() + return YieldTokenChartConverter.convert(response) + } } \ No newline at end of file diff --git a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/converters/YieldMarketTokenConverter.kt b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/converters/YieldMarketTokenConverter.kt index e9483d7ae9..82ff8d2d18 100644 --- a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/converters/YieldMarketTokenConverter.kt +++ b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/converters/YieldMarketTokenConverter.kt @@ -11,14 +11,7 @@ internal object YieldMarketTokenConverter : Converter { - override fun convert(value: YieldTokenStatusResponse): YieldTokenStatus { - return YieldTokenStatus( +internal object YieldTokenStatusConverter : Converter { + override fun convert(value: YieldTokenStatusResponse): YieldMarketToken { + return YieldMarketToken( tokenAddress = value.tokenAddress, tokenSymbol = value.tokenSymbol, tokenName = value.tokenName, apy = value.apy, - totalSupplied = value.totalSupplied, - totalBorrowed = value.totalBorrowed, - liquidityRate = value.liquidityRate, - borrowRate = value.borrowRate, - utilizationRate = value.utilizationRate, isActive = value.isActive, - ltv = value.ltv, - liquidationThreshold = value.liquidationThreshold, - decimals = value.decimals, - chainId = value.chainId, - priority = value.priority, - isEnabled = value.isEnabled, - lastUpdatedAt = value.lastUpdatedAt, ) } } \ No newline at end of file diff --git a/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldMarketToken.kt b/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldMarketToken.kt index 003f1131e6..0223cd6630 100644 --- a/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldMarketToken.kt +++ b/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldMarketToken.kt @@ -12,12 +12,5 @@ data class YieldMarketToken( val tokenSymbol: String, val tokenName: String, val apy: SerializedBigDecimal, - val totalSupplied: String, - val totalBorrowed: String, - val liquidityRate: String, - val borrowRate: String, - val utilizationRate: SerializedBigDecimal, val isActive: Boolean, - val ltv: SerializedBigDecimal, - val liquidationThreshold: SerializedBigDecimal, ) \ No newline at end of file diff --git a/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldSupplyMarketChartData.kt b/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldSupplyMarketChartData.kt new file mode 100644 index 0000000000..20f32a5ee7 --- /dev/null +++ b/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldSupplyMarketChartData.kt @@ -0,0 +1,10 @@ +package com.tangem.domain.yield.supply.models + +import kotlinx.serialization.Serializable + +@Serializable +data class YieldSupplyMarketChartData( + val y: List, + val x: List, + val avr: Double, +) \ No newline at end of file diff --git a/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldTokenStatus.kt b/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldTokenStatus.kt deleted file mode 100644 index 030a176732..0000000000 --- a/domain/yield-supply/models/src/main/java/com/tangem/domain/yield/supply/models/YieldTokenStatus.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.tangem.domain.yield.supply.models - -import com.tangem.domain.models.serialization.SerializedBigDecimal -import kotlinx.serialization.Serializable - -/** - * Domain model representing yield market status for a specific token. - */ -@Serializable -data class YieldTokenStatus( - val tokenAddress: String, - val tokenSymbol: String, - val tokenName: String, - val apy: SerializedBigDecimal, - val totalSupplied: String, - val totalBorrowed: String, - val liquidityRate: String, - val borrowRate: String, - val utilizationRate: Double, - val isActive: Boolean, - val ltv: Int, - val liquidationThreshold: Int, - val decimals: Int, - val chainId: Int, - val priority: Int, - val isEnabled: Boolean, - val lastUpdatedAt: String, -) \ No newline at end of file diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyMarketRepository.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyMarketRepository.kt index 80615aa63f..8de4c5ba6a 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyMarketRepository.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyMarketRepository.kt @@ -1,7 +1,7 @@ package com.tangem.domain.yield.supply import com.tangem.domain.yield.supply.models.YieldMarketToken -import com.tangem.domain.yield.supply.models.YieldTokenStatus +import com.tangem.domain.yield.supply.models.YieldSupplyMarketChartData import kotlinx.coroutines.flow.Flow interface YieldSupplyMarketRepository { @@ -26,5 +26,11 @@ interface YieldSupplyMarketRepository { * Get yield token status by contract address. */ @Throws - suspend fun getTokenStatus(contractAddress: String): YieldTokenStatus + suspend fun getTokenStatus(contractAddress: String): YieldMarketToken + + /** + * Get yield token APY chart by contract address. + */ + @Throws + suspend fun getTokenChart(contractAddress: String): YieldSupplyMarketChartData } \ No newline at end of file diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt index 767fc53c11..b696f2429c 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt @@ -3,13 +3,13 @@ package com.tangem.domain.yield.supply.usecase import arrow.core.Either import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.yield.supply.YieldSupplyMarketRepository -import com.tangem.domain.yield.supply.models.YieldTokenStatus +import com.tangem.domain.yield.supply.models.YieldMarketToken class YieldSupplyGetTokenStatusUseCase( private val yieldSupplyMarketRepository: YieldSupplyMarketRepository, ) { - suspend operator fun invoke(token: CryptoCurrency.Token): Either = Either.catch { + suspend operator fun invoke(token: CryptoCurrency.Token): Either = Either.catch { yieldSupplyMarketRepository.getTokenStatus(token.contractAddress) } } \ No newline at end of file diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/entity/YieldSupplyChartUM.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/entity/YieldSupplyChartUM.kt index c642e0745e..a14dd6c6b7 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/entity/YieldSupplyChartUM.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/entity/YieldSupplyChartUM.kt @@ -14,23 +14,24 @@ internal sealed class YieldSupplyChartUM { data class Error(val onRetry: () -> Unit) : YieldSupplyChartUM() @Immutable - data class Data(val chartData: YieldSupplyMarketChartData) : YieldSupplyChartUM() + data class Data(val chartData: YieldSupplyMarketChartDataUM) : YieldSupplyChartUM() } @Immutable -internal data class YieldSupplyMarketChartData( +internal data class YieldSupplyMarketChartDataUM( val y: ImmutableList, val x: ImmutableList, + val avr: Double, ) { companion object { @Suppress("MagicNumber") - fun mock(): YieldSupplyMarketChartData { + fun mock(): YieldSupplyMarketChartDataUM { // TODO [REDACTED_TASK_KEY] replace mock values with real APY series val y = listOf( 4.6, 4.0, 4.2, 3.3, 2.5, 5.6, 4.2, 6.7, 3.5, 2.5, 4.5, 3.4, ).toImmutableList() val x = List(y.size) { 1.0 }.toImmutableList() - return YieldSupplyMarketChartData(y = y, x = x) + return YieldSupplyMarketChartDataUM(y = y, x = x, avr = 5.15) } } } \ No newline at end of file diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/model/YieldSupplyChartModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/model/YieldSupplyChartModel.kt index cedb9e80d5..e5e0c3992d 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/model/YieldSupplyChartModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/model/YieldSupplyChartModel.kt @@ -4,7 +4,7 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyChartUM -import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyMarketChartData +import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyMarketChartDataUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -30,7 +30,7 @@ internal class YieldSupplyChartModel @Inject constructor( init { // TODO [REDACTED_TASK_KEY] - val chartData = YieldSupplyMarketChartData.mock() + val chartData = YieldSupplyMarketChartDataUM.mock() uiState.update { YieldSupplyChartUM.Data(chartData = chartData) } } } \ No newline at end of file diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/ui/YieldSupplyChartContent.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/ui/YieldSupplyChartContent.kt index d9aef20d88..8dca6004ab 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/ui/YieldSupplyChartContent.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/chart/ui/YieldSupplyChartContent.kt @@ -51,7 +51,7 @@ import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyChartUM -import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyMarketChartData +import com.tangem.features.yield.supply.impl.chart.entity.YieldSupplyMarketChartDataUM @Composable internal fun YieldSupplyChartContent(state: YieldSupplyChartUM, modifier: Modifier = Modifier) { @@ -199,7 +199,7 @@ private class YieldSupplyChartPreviewProvider : PreviewParameterProvider