Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-20 02:26:36 +03:00
parent e26394399f
commit f506db9c0e
38 changed files with 1182 additions and 406 deletions

View file

@ -2,10 +2,11 @@ package com.tangem.datasource.api.common.adapter
import com.squareup.moshi.*
import com.squareup.moshi.adapters.EnumJsonAdapter
import com.tangem.datasource.api.stakekit.models.response.model.StakingActionTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO
import com.tangem.datasource.api.stakekit.models.response.model.*
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionStatusDTO
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionStatusDTO
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionTypeDTO
/**
* Object to create a adapter for enum types with support for unknown enum values.
@ -20,11 +21,14 @@ object UnknownEnumMoshiAdapter {
fun Moshi.Builder.addStakeKitEnumFallbackAdapters(): Moshi.Builder {
val map = mapOf(
TokenDTO.NetworkTypeDTO::class.java to TokenDTO.NetworkTypeDTO.UNKNOWN,
NetworkTypeDTO::class.java to NetworkTypeDTO.UNKNOWN,
StakingActionTypeDTO::class.java to StakingActionTypeDTO.UNKNOWN,
YieldDTO.RewardTypeDTO::class.java to YieldDTO.RewardTypeDTO.UNKNOWN,
YieldBalanceWrapperDTO.BalanceDTO.BalanceType::class.java to
YieldBalanceWrapperDTO.BalanceDTO.BalanceType.UNKNOWN,
StakingTransactionTypeDTO::class.java to StakingTransactionTypeDTO.UNKNOWN,
StakingTransactionStatusDTO::class.java to StakingTransactionStatusDTO.UNKNOWN,
StakingActionStatusDTO::class.java to StakingActionStatusDTO.UNKNOWN,
)
return apply {

View file

@ -1,17 +1,14 @@
package com.tangem.datasource.api.stakekit
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.stakekit.models.request.YieldBalanceRequestBody
import com.tangem.datasource.api.stakekit.models.request.RevenueOption
import com.tangem.datasource.api.stakekit.models.request.YieldType
import com.tangem.datasource.api.stakekit.models.request.*
import com.tangem.datasource.api.stakekit.models.response.EnabledYieldsResponse
import com.tangem.datasource.api.stakekit.models.response.EnterActionResponse
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionDTO
import com.tangem.datasource.api.stakekit.models.response.model.TokenWithYieldDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query
import retrofit2.http.*
@Suppress("LongParameterList")
interface StakeKitApi {
@ -45,4 +42,19 @@ interface StakeKitApi {
@GET("tokens")
suspend fun getTokens(): ApiResponse<List<TokenWithYieldDTO>>
@POST("actions/enter")
suspend fun createEnterAction(@Body body: EnterActionRequestBody): ApiResponse<EnterActionResponse>
@PATCH("transactions/{transactionId}")
suspend fun constructTransaction(
@Path("transactionId") transactionId: String,
@Body body: ConstructTransactionRequestBody,
): ApiResponse<StakingTransactionDTO>
@POST("transactions/{transactionId}/submit_hash")
suspend fun submitTransactionHash(
@Path("transactionId") transactionId: String,
@Body body: SubmitTransactionHashRequestBody,
): ApiResponse<Unit>
}

View file

@ -0,0 +1,39 @@
package com.tangem.datasource.api.stakekit.models.request
import com.squareup.moshi.Json
data class Address(
@Json(name = "address")
val address: String,
@Json(name = "additionalAddresses")
val additionalAddresses: AdditionalAddresses? = null,
@Json(name = "explorerUrl")
val explorerUrl: String? = null,
) {
data class AdditionalAddresses(
// cosmos-specific
@Json(name = "cosmosPubKey")
val cosmosPubKey: String? = null,
// binance-specific
@Json(name = "binanceBeaconAddress")
val binanceBeaconAddress: String? = null,
// solana-specific
@Json(name = "stakeAccounts")
val stakeAccounts: List<String>? = null,
@Json(name = "lidoStakeAccounts")
val lidoStakeAccounts: List<String>? = null,
// tezos-specific
@Json(name = "tezosPubKey")
val tezosPubKey: String? = null,
// avalanche-specific
@Json(name = "cAddressBech")
val cAddressBech: String? = null,
@Json(name = "pAddressBech")
val pAddressBech: String? = null,
)
}

View file

@ -0,0 +1,24 @@
package com.tangem.datasource.api.stakekit.models.request
import com.squareup.moshi.Json
import java.math.BigDecimal
data class ConstructTransactionRequestBody(
@Json(name = "gasArgs")
val gasArgs: GasArgs? = null,
@Json(name = "ledgerWalletAPICompatible")
val ledgerWalletAPICompatible: Boolean? = null,
) {
data class GasArgs(
// cosmos-specific
@Json(name = "gasPrice")
val gasPrice: BigDecimal? = null,
// EVM eip 1559 specific
@Json(name = "type")
val type: Int? = null,
@Json(name = "maxFeePerGas")
val maxFeePerGas: BigDecimal? = null,
@Json(name = "maxPriorityFeePerGas")
val maxPriorityFeePerGas: BigDecimal? = null,
)
}

View file

@ -0,0 +1,47 @@
package com.tangem.datasource.api.stakekit.models.request
import com.squareup.moshi.Json
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO
data class EnterActionRequestBody(
@Json(name = "integrationId")
val integrationId: String,
@Json(name = "addresses")
val addresses: Address,
@Json(name = "args")
val args: EnterActionRequestBodyArgs,
@Json(name = "referralCode")
val referralCode: String? = null,
) {
data class EnterActionRequestBodyArgs(
@Json(name = "amount")
val amount: String,
@Json(name = "validatorAddress")
val validatorAddress: String? = null,
@Json(name = "validatorAddresses")
val validatorAddresses: List<String>? = null,
@Json(name = "providerId")
val providerId: String? = null,
@Json(name = "duration")
val duration: String? = null,
@Json(name = "nfts")
val nfts: List<YieldBalanceWrapperDTO.BalanceDTO.PendingAction.PendingActionArgs.Nft>? = null,
@Json(name = "ledgerWalletAPICompatible")
val ledgerWalletAPICompatible: Boolean? = null,
@Json(name = "tronResource")
val tronResource: String? = null,
@Json(name = "signatureVerification")
val signatureVerification: SignatureVerification? = null,
@Json(name = "inputToken")
val inputToken: TokenDTO? = null,
)
data class SignatureVerification(
@Json(name = "message")
val message: String,
@Json(name = "signed")
val signed: String,
)
}

View file

@ -0,0 +1,8 @@
package com.tangem.datasource.api.stakekit.models.request
import com.squareup.moshi.Json
data class SubmitTransactionHashRequestBody(
@Json(name = "hash")
val hash: String,
)

View file

@ -8,23 +8,6 @@ data class YieldBalanceRequestBody(
@Json(name = "integrationId") val integrationId: String? = null,
) {
data class Address(
@Json(name = "address") val address: String,
@Json(name = "additionalAddresses") val additionalAddresses: AdditionalAddresses? = null,
@Json(name = "explorerUrl") val explorerUrl: String,
) {
data class AdditionalAddresses(
@Json(name = "cosmosPubKey") val cosmosPubKey: String? = null,
@Json(name = "binanceBeaconAddress") val binanceBeaconAddress: String? = null,
@Json(name = "stakeAccounts") val stakeAccounts: List<String>? = null,
@Json(name = "lidoStakeAccounts") val lidoStakeAccounts: List<String>? = null,
@Json(name = "tezosPubKey") val tezosPubKey: String? = null,
@Json(name = "cAddressBech") val cAddressBech: String? = null,
@Json(name = "pAddressBech") val pAddressBech: String? = null,
)
}
data class YieldBalanceRequestArgs(
@Json(name = "validatorAddresses") val validatorAddresses: List<String>,
)

View file

@ -0,0 +1,33 @@
package com.tangem.datasource.api.stakekit.models.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionStatusDTO
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionDTO
import org.joda.time.DateTime
import java.math.BigDecimal
@JsonClass(generateAdapter = true)
data class EnterActionResponse(
@Json(name = "id")
val id: String,
@Json(name = "integrationId")
val integrationId: String,
@Json(name = "status")
val status: StakingActionStatusDTO,
@Json(name = "type")
val type: StakingActionTypeDTO,
@Json(name = "currentStepIndex")
val currentStepIndex: Int,
@Json(name = "amount")
val amount: BigDecimal,
@Json(name = "validatorAddress")
val validatorAddress: String?,
@Json(name = "validatorAddresses")
val validatorAddresses: List<String>?,
@Json(name = "transactions")
val transactions: List<StakingTransactionDTO>?,
@Json(name = "createdAt")
val createdAt: DateTime,
)

View file

@ -0,0 +1,205 @@
package com.tangem.datasource.api.stakekit.models.response.model
import com.squareup.moshi.Json
enum class NetworkTypeDTO {
@Json(name = "avalanche-c")
AVALANCHE_C,
@Json(name = "avalanche-atomic")
AVALANCHE_ATOMIC,
@Json(name = "avalanche-p")
AVALANCHE_P,
@Json(name = "arbitrum")
ARBITRUM,
@Json(name = "binance")
BINANCE,
@Json(name = "celo")
CELO,
@Json(name = "ethereum")
ETHEREUM,
@Json(name = "ethereum-goerli")
ETHEREUM_GOERLI,
@Json(name = "ethereum-holesky")
ETHEREUM_HOLESKY,
@Json(name = "fantom")
FANTOM,
@Json(name = "harmony")
HARMONY,
@Json(name = "optimism")
OPTIMISM,
@Json(name = "polygon")
POLYGON,
@Json(name = "gnosis")
GNOSIS,
@Json(name = "moonriver")
MOONRIVER,
@Json(name = "okc")
OKC,
@Json(name = "zksync")
ZKSYNC,
@Json(name = "viction")
VICTION,
@Json(name = "agoric")
AGORIC,
@Json(name = "akash")
AKASH,
@Json(name = "axelar")
AXELAR,
@Json(name = "band-protocol")
BAND_PROTOCOL,
@Json(name = "bitsong")
BITSONG,
@Json(name = "canto")
CANTO,
@Json(name = "chihuahua")
CHIHUAHUA,
@Json(name = "comdex")
COMDEX,
@Json(name = "coreum")
COREUM,
@Json(name = "cosmos")
COSMOS,
@Json(name = "crescent")
CRESCENT,
@Json(name = "cronos")
CRONOS,
@Json(name = "cudos")
CUDOS,
@Json(name = "desmos")
DESMOS,
@Json(name = "dydx")
DYDX,
@Json(name = "evmos")
EVMOS,
@Json(name = "fetch-ai")
FETCH_AI,
@Json(name = "gravity-bridge")
GRAVITY_BRIDGE,
@Json(name = "injective")
INJECTIVE,
@Json(name = "irisnet")
IRISNET,
@Json(name = "juno")
JUNO,
@Json(name = "kava")
KAVA,
@Json(name = "ki-network")
KI_NETWORK,
@Json(name = "mars-protocol")
MARS_PROTOCOL,
@Json(name = "nym")
NYM,
@Json(name = "okex-chain")
OKEX_CHAIN,
@Json(name = "onomy")
ONOMY,
@Json(name = "osmosis")
OSMOSIS,
@Json(name = "persistence")
PERSISTENCE,
@Json(name = "quicksilver")
QUICKSILVER,
@Json(name = "regen")
REGEN,
@Json(name = "secret")
SECRET,
@Json(name = "sentinel")
SENTINEL,
@Json(name = "sommelier")
SOMMELIER,
@Json(name = "stafi")
STAFI,
@Json(name = "stargaze")
STARGAZE,
@Json(name = "stride")
STRIDE,
@Json(name = "teritori")
TERITORI,
@Json(name = "tgrade")
TGRADE,
@Json(name = "umee")
UMEE,
@Json(name = "polkadot")
POLKADOT,
@Json(name = "kusama")
KUSAMA,
@Json(name = "westend")
WESTEND,
@Json(name = "binancebeacon")
BINANCEBEACON,
@Json(name = "near")
NEAR,
@Json(name = "solana")
SOLANA,
@Json(name = "tezos")
TEZOS,
@Json(name = "tron")
TRON,
UNKNOWN,
}

View file

@ -5,214 +5,20 @@ import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class TokenDTO(
@Json(name = "name") val name: String,
@Json(name = "network") val network: NetworkTypeDTO,
@Json(name = "symbol") val symbol: String,
@Json(name = "decimals") val decimals: Int,
@Json(name = "address") val address: String?,
@Json(name = "coinGeckoId") val coinGeckoId: String?,
@Json(name = "logoURI") val logoURI: String?,
@Json(name = "isPoints") val isPoints: Boolean?,
) {
enum class NetworkTypeDTO {
@Json(name = "avalanche-c")
AVALANCHE_C,
@Json(name = "avalanche-atomic")
AVALANCHE_ATOMIC,
@Json(name = "avalanche-p")
AVALANCHE_P,
@Json(name = "arbitrum")
ARBITRUM,
@Json(name = "binance")
BINANCE,
@Json(name = "celo")
CELO,
@Json(name = "ethereum")
ETHEREUM,
@Json(name = "ethereum-goerli")
ETHEREUM_GOERLI,
@Json(name = "ethereum-holesky")
ETHEREUM_HOLESKY,
@Json(name = "fantom")
FANTOM,
@Json(name = "harmony")
HARMONY,
@Json(name = "optimism")
OPTIMISM,
@Json(name = "polygon")
POLYGON,
@Json(name = "gnosis")
GNOSIS,
@Json(name = "moonriver")
MOONRIVER,
@Json(name = "okc")
OKC,
@Json(name = "zksync")
ZKSYNC,
@Json(name = "viction")
VICTION,
@Json(name = "agoric")
AGORIC,
@Json(name = "akash")
AKASH,
@Json(name = "axelar")
AXELAR,
@Json(name = "band-protocol")
BAND_PROTOCOL,
@Json(name = "bitsong")
BITSONG,
@Json(name = "canto")
CANTO,
@Json(name = "chihuahua")
CHIHUAHUA,
@Json(name = "comdex")
COMDEX,
@Json(name = "coreum")
COREUM,
@Json(name = "cosmos")
COSMOS,
@Json(name = "crescent")
CRESCENT,
@Json(name = "cronos")
CRONOS,
@Json(name = "cudos")
CUDOS,
@Json(name = "desmos")
DESMOS,
@Json(name = "dydx")
DYDX,
@Json(name = "evmos")
EVMOS,
@Json(name = "fetch-ai")
FETCH_AI,
@Json(name = "gravity-bridge")
GRAVITY_BRIDGE,
@Json(name = "injective")
INJECTIVE,
@Json(name = "irisnet")
IRISNET,
@Json(name = "juno")
JUNO,
@Json(name = "kava")
KAVA,
@Json(name = "ki-network")
KI_NETWORK,
@Json(name = "mars-protocol")
MARS_PROTOCOL,
@Json(name = "nym")
NYM,
@Json(name = "okex-chain")
OKEX_CHAIN,
@Json(name = "onomy")
ONOMY,
@Json(name = "osmosis")
OSMOSIS,
@Json(name = "persistence")
PERSISTENCE,
@Json(name = "quicksilver")
QUICKSILVER,
@Json(name = "regen")
REGEN,
@Json(name = "secret")
SECRET,
@Json(name = "sentinel")
SENTINEL,
@Json(name = "sommelier")
SOMMELIER,
@Json(name = "stafi")
STAFI,
@Json(name = "stargaze")
STARGAZE,
@Json(name = "stride")
STRIDE,
@Json(name = "teritori")
TERITORI,
@Json(name = "tgrade")
TGRADE,
@Json(name = "umee")
UMEE,
@Json(name = "polkadot")
POLKADOT,
@Json(name = "kusama")
KUSAMA,
@Json(name = "westend")
WESTEND,
@Json(name = "binancebeacon")
BINANCEBEACON,
@Json(name = "near")
NEAR,
@Json(name = "solana")
SOLANA,
@Json(name = "tezos")
TEZOS,
@Json(name = "tron")
TRON,
UNKNOWN,
}
}
@Json(name = "name")
val name: String,
@Json(name = "network")
val network: NetworkTypeDTO,
@Json(name = "symbol")
val symbol: String,
@Json(name = "decimals")
val decimals: Int,
@Json(name = "address")
val address: String?,
@Json(name = "coinGeckoId")
val coinGeckoId: String?,
@Json(name = "logoURI")
val logoURI: String?,
@Json(name = "isPoints")
val isPoints: Boolean?,
)

View file

@ -2,6 +2,7 @@ package com.tangem.datasource.api.stakekit.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionTypeDTO
import org.joda.time.DateTime
import java.math.BigDecimal

View file

@ -0,0 +1,25 @@
package com.tangem.datasource.api.stakekit.models.response.model.action
import com.squareup.moshi.Json
enum class StakingActionStatusDTO {
@Json(name = "CANCELED")
CANCELED,
@Json(name = "CREATED")
CREATED,
@Json(name = "WAITING_FOR_NEXT")
WAITING_FOR_NEXT,
@Json(name = "PROCESSING")
PROCESSING,
@Json(name = "FAILED")
FAILED,
@Json(name = "SUCCESS")
SUCCESS,
UNKNOWN,
}

View file

@ -1,4 +1,4 @@
package com.tangem.datasource.api.stakekit.models.response.model
package com.tangem.datasource.api.stakekit.models.response.model.action
import com.squareup.moshi.Json

View file

@ -0,0 +1,16 @@
package com.tangem.datasource.api.stakekit.models.response.model.transaction
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
import java.math.BigDecimal
@JsonClass(generateAdapter = true)
data class StakingGasEstimateDTO(
@Json(name = "amount")
val amount: BigDecimal,
@Json(name = "token")
val token: TokenDTO,
@Json(name = "gasLimit")
val gasLimit: BigDecimal,
)

View file

@ -0,0 +1,37 @@
package com.tangem.datasource.api.stakekit.models.response.model.transaction
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.api.stakekit.models.response.model.NetworkTypeDTO
@JsonClass(generateAdapter = true)
data class StakingTransactionDTO(
@Json(name = "id")
val id: String,
@Json(name = "network")
val network: NetworkTypeDTO,
@Json(name = "status")
val status: StakingTransactionStatusDTO,
@Json(name = "type")
val type: StakingTransactionTypeDTO,
@Json(name = "hash")
val hash: String?,
@Json(name = "signedTransaction")
val signedTransaction: String?,
@Json(name = "unsignedTransaction")
val unsignedTransaction: String?,
@Json(name = "stepIndex")
val stepIndex: Int,
@Json(name = "error")
val error: String?,
@Json(name = "gasEstimate")
val gasEstimate: StakingGasEstimateDTO?,
@Json(name = "stakeId")
val stakeId: String?,
@Json(name = "explorerUrl")
val explorerUrl: String?,
@Json(name = "ledgerHwAppId")
val ledgerHwAppId: String?,
@Json(name = "isMessage")
val isMessage: Boolean,
)

View file

@ -0,0 +1,37 @@
package com.tangem.datasource.api.stakekit.models.response.model.transaction
import com.squareup.moshi.Json
enum class StakingTransactionStatusDTO {
@Json(name = "NOT_FOUND")
NOT_FOUND,
@Json(name = "CREATED")
CREATED,
@Json(name = "BLOCKED")
BLOCKED,
@Json(name = "WAITING_FOR_SIGNATURE")
WAITING_FOR_SIGNATURE,
@Json(name = "SIGNED")
SIGNED,
@Json(name = "BROADCASTED")
BROADCASTED,
@Json(name = "PENDING")
PENDING,
@Json(name = "CONFIRMED")
CONFIRMED,
@Json(name = "FAILED")
FAILED,
@Json(name = "SKIPPED")
SKIPPED,
UNKNOWN,
}

View file

@ -0,0 +1,124 @@
package com.tangem.datasource.api.stakekit.models.response.model.transaction
import com.squareup.moshi.Json
enum class StakingTransactionTypeDTO {
@Json(name = "SWAP")
SWAP,
@Json(name = "DEPOSIT")
DEPOSIT,
@Json(name = "APPROVAL")
APPROVAL,
@Json(name = "STAKE")
STAKE,
@Json(name = "CLAIM_UNSTAKED")
CLAIM_UNSTAKED,
@Json(name = "CLAIM_REWARDS")
CLAIM_REWARDS,
@Json(name = "RESTAKE_REWARDS")
RESTAKE_REWARDS,
@Json(name = "UNSTAKE")
UNSTAKE,
@Json(name = "SPLIT")
SPLIT,
@Json(name = "MERGE")
MERGE,
@Json(name = "LOCK")
LOCK,
@Json(name = "UNLOCK")
UNLOCK,
@Json(name = "SUPPLY")
SUPPLY,
@Json(name = "BRIDGE")
BRIDGE,
@Json(name = "VOTE")
VOTE,
@Json(name = "REVOKE")
REVOKE,
@Json(name = "RESTAKE")
RESTAKE,
@Json(name = "REBOND")
REBOND,
@Json(name = "WITHDRAW")
WITHDRAW,
@Json(name = "CREATE_ACCOUNT")
CREATE_ACCOUNT,
@Json(name = "REVEAL")
REVEAL,
@Json(name = "MIGRATE")
MIGRATE,
@Json(name = "UTXO_P_TO_C_IMPORT")
UTXO_P_TO_C_IMPORT,
@Json(name = "UTXO_C_TO_P_IMPORT")
UTXO_C_TO_P_IMPORT,
@Json(name = "UNFREEZE_LEGACY")
UNFREEZE_LEGACY,
@Json(name = "UNFREEZE_LEGACY_BANDWIDTH")
UNFREEZE_LEGACY_BANDWIDTH,
@Json(name = "UNFREEZE_LEGACY_ENERGY")
UNFREEZE_LEGACY_ENERGY,
@Json(name = "UNFREEZE_BANDWIDTH")
UNFREEZE_BANDWIDTH,
@Json(name = "UNFREEZE_ENERGY")
UNFREEZE_ENERGY,
@Json(name = "FREEZE_BANDWIDTH")
FREEZE_BANDWIDTH,
@Json(name = "FREEZE_ENERGY")
FREEZE_ENERGY,
@Json(name = "UNDELEGATE_BANDWIDTH")
UNDELEGATE_BANDWIDTH,
@Json(name = "UNDELEGATE_ENERGY")
UNDELEGATE_ENERGY,
@Json(name = "P2P_NODE_REQUEST")
P2P_NODE_REQUEST,
@Json(name = "LUGANODES_PROVISION")
LUGANODES_PROVISION,
@Json(name = "LUGANODES_EXIT_REQUEST")
LUGANODES_EXIT_REQUEST,
@Json(name = "INFSTONES_PROVISION")
INFSTONES_PROVISION,
@Json(name = "INFSTONES_EXIT_REQUEST")
INFSTONES_EXIT_REQUEST,
@Json(name = "INFSTONES_CLAIM_REQUEST")
INFSTONES_CLAIM_REQUEST,
UNKNOWN,
}

View file

@ -2,6 +2,8 @@ package com.tangem.data.staking
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchainsdk.utils.toCoinId
import com.tangem.data.staking.converters.StakingNetworkTypeConverter
import com.tangem.data.staking.converters.TokenConverter
import com.tangem.data.staking.converters.YieldConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.stakekit.StakeKitApi
@ -20,7 +22,14 @@ internal class DefaultStakingRepository(
private val dispatchers: CoroutineDispatcherProvider,
) : StakingRepository {
private val yieldConverter = YieldConverter()
private val stakingNetworkTypeConverter = StakingNetworkTypeConverter()
private val tokenConverter = TokenConverter(
stakingNetworkTypeConverter = stakingNetworkTypeConverter,
)
private val yieldConverter = YieldConverter(
tokenConverter = tokenConverter,
)
override fun isStakingSupported(currencyId: String): Boolean {
return integrationIds.contains(currencyId)

View file

@ -0,0 +1,81 @@
package com.tangem.data.staking.converters
import com.tangem.datasource.api.stakekit.models.response.model.NetworkTypeDTO
import com.tangem.domain.staking.model.NetworkType
import com.tangem.utils.converter.Converter
@Suppress("CyclomaticComplexMethod", "LongMethod")
class StakingNetworkTypeConverter : Converter<NetworkTypeDTO, NetworkType> {
override fun convert(value: NetworkTypeDTO): NetworkType {
return when (value) {
NetworkTypeDTO.AVALANCHE_C -> NetworkType.AVALANCHE_C
NetworkTypeDTO.AVALANCHE_ATOMIC -> NetworkType.AVALANCHE_ATOMIC
NetworkTypeDTO.AVALANCHE_P -> NetworkType.AVALANCHE_P
NetworkTypeDTO.ARBITRUM -> NetworkType.ARBITRUM
NetworkTypeDTO.BINANCE -> NetworkType.BINANCE
NetworkTypeDTO.CELO -> NetworkType.CELO
NetworkTypeDTO.ETHEREUM -> NetworkType.ETHEREUM
NetworkTypeDTO.ETHEREUM_GOERLI -> NetworkType.ETHEREUM_GOERLI
NetworkTypeDTO.ETHEREUM_HOLESKY -> NetworkType.ETHEREUM_HOLESKY
NetworkTypeDTO.FANTOM -> NetworkType.FANTOM
NetworkTypeDTO.HARMONY -> NetworkType.HARMONY
NetworkTypeDTO.OPTIMISM -> NetworkType.OPTIMISM
NetworkTypeDTO.POLYGON -> NetworkType.POLYGON
NetworkTypeDTO.GNOSIS -> NetworkType.GNOSIS
NetworkTypeDTO.MOONRIVER -> NetworkType.MOONRIVER
NetworkTypeDTO.OKC -> NetworkType.OKC
NetworkTypeDTO.ZKSYNC -> NetworkType.ZKSYNC
NetworkTypeDTO.VICTION -> NetworkType.VICTION
NetworkTypeDTO.AGORIC -> NetworkType.AGORIC
NetworkTypeDTO.AKASH -> NetworkType.AKASH
NetworkTypeDTO.AXELAR -> NetworkType.AXELAR
NetworkTypeDTO.BAND_PROTOCOL -> NetworkType.BAND_PROTOCOL
NetworkTypeDTO.BITSONG -> NetworkType.BITSONG
NetworkTypeDTO.CANTO -> NetworkType.CANTO
NetworkTypeDTO.CHIHUAHUA -> NetworkType.CHIHUAHUA
NetworkTypeDTO.COMDEX -> NetworkType.COMDEX
NetworkTypeDTO.COREUM -> NetworkType.COREUM
NetworkTypeDTO.COSMOS -> NetworkType.COSMOS
NetworkTypeDTO.CRESCENT -> NetworkType.CRESCENT
NetworkTypeDTO.CRONOS -> NetworkType.CRONOS
NetworkTypeDTO.CUDOS -> NetworkType.CUDOS
NetworkTypeDTO.DESMOS -> NetworkType.DESMOS
NetworkTypeDTO.DYDX -> NetworkType.DYDX
NetworkTypeDTO.EVMOS -> NetworkType.EVMOS
NetworkTypeDTO.FETCH_AI -> NetworkType.FETCH_AI
NetworkTypeDTO.GRAVITY_BRIDGE -> NetworkType.GRAVITY_BRIDGE
NetworkTypeDTO.INJECTIVE -> NetworkType.INJECTIVE
NetworkTypeDTO.IRISNET -> NetworkType.IRISNET
NetworkTypeDTO.JUNO -> NetworkType.JUNO
NetworkTypeDTO.KAVA -> NetworkType.KAVA
NetworkTypeDTO.KI_NETWORK -> NetworkType.KI_NETWORK
NetworkTypeDTO.MARS_PROTOCOL -> NetworkType.MARS_PROTOCOL
NetworkTypeDTO.NYM -> NetworkType.NYM
NetworkTypeDTO.OKEX_CHAIN -> NetworkType.OKEX_CHAIN
NetworkTypeDTO.ONOMY -> NetworkType.ONOMY
NetworkTypeDTO.OSMOSIS -> NetworkType.OSMOSIS
NetworkTypeDTO.PERSISTENCE -> NetworkType.PERSISTENCE
NetworkTypeDTO.QUICKSILVER -> NetworkType.QUICKSILVER
NetworkTypeDTO.REGEN -> NetworkType.REGEN
NetworkTypeDTO.SECRET -> NetworkType.SECRET
NetworkTypeDTO.SENTINEL -> NetworkType.SENTINEL
NetworkTypeDTO.SOMMELIER -> NetworkType.SOMMELIER
NetworkTypeDTO.STAFI -> NetworkType.STAFI
NetworkTypeDTO.STARGAZE -> NetworkType.STARGAZE
NetworkTypeDTO.STRIDE -> NetworkType.STRIDE
NetworkTypeDTO.TERITORI -> NetworkType.TERITORI
NetworkTypeDTO.TGRADE -> NetworkType.TGRADE
NetworkTypeDTO.UMEE -> NetworkType.UMEE
NetworkTypeDTO.POLKADOT -> NetworkType.POLKADOT
NetworkTypeDTO.KUSAMA -> NetworkType.KUSAMA
NetworkTypeDTO.WESTEND -> NetworkType.WESTEND
NetworkTypeDTO.BINANCEBEACON -> NetworkType.BINANCEBEACON
NetworkTypeDTO.NEAR -> NetworkType.NEAR
NetworkTypeDTO.SOLANA -> NetworkType.SOLANA
NetworkTypeDTO.TEZOS -> NetworkType.TEZOS
NetworkTypeDTO.TRON -> NetworkType.TRON
else -> NetworkType.UNKNOWN
}
}
}

View file

@ -0,0 +1,23 @@
package com.tangem.data.staking.converters
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
import com.tangem.domain.staking.model.Token
import com.tangem.utils.converter.Converter
class TokenConverter(
private val stakingNetworkTypeConverter: StakingNetworkTypeConverter,
) : Converter<TokenDTO, Token> {
override fun convert(value: TokenDTO): Token {
return Token(
name = value.name,
network = stakingNetworkTypeConverter.convert(value.network),
symbol = value.symbol,
decimals = value.decimals,
address = value.address,
coinGeckoId = value.coinGeckoId,
logoURI = value.logoURI,
isPoints = value.isPoints,
)
}
}

View file

@ -1,18 +1,19 @@
package com.tangem.data.staking.converters
import com.tangem.datasource.api.stakekit.models.response.model.AddressArgumentDTO
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO
import com.tangem.domain.staking.model.*
import com.tangem.utils.converter.Converter
class YieldConverter : Converter<YieldDTO, Yield> {
class YieldConverter(
private val tokenConverter: TokenConverter,
) : Converter<YieldDTO, Yield> {
override fun convert(value: YieldDTO): Yield {
return Yield(
id = value.id,
token = convertToken(value.token),
tokens = value.tokens.map { convertToken(it) },
token = tokenConverter.convert(value.token),
tokens = value.tokens.map { tokenConverter.convert(it) },
args = convertArgs(value.args),
status = convertStatus(value.status),
apy = value.apy,
@ -24,92 +25,6 @@ class YieldConverter : Converter<YieldDTO, Yield> {
)
}
private fun convertToken(tokenDTO: TokenDTO): Token {
return Token(
name = tokenDTO.name,
network = convertNetworkType(tokenDTO.network),
symbol = tokenDTO.symbol,
decimals = tokenDTO.decimals,
address = tokenDTO.address,
coinGeckoId = tokenDTO.coinGeckoId,
logoURI = tokenDTO.logoURI,
isPoints = tokenDTO.isPoints,
)
}
@Suppress("LongMethod", "CyclomaticComplexMethod")
private fun convertNetworkType(networkTypeDTO: TokenDTO.NetworkTypeDTO): Token.NetworkType {
return when (networkTypeDTO) {
TokenDTO.NetworkTypeDTO.AVALANCHE_C -> Token.NetworkType.AVALANCHE_C
TokenDTO.NetworkTypeDTO.AVALANCHE_ATOMIC -> Token.NetworkType.AVALANCHE_ATOMIC
TokenDTO.NetworkTypeDTO.AVALANCHE_P -> Token.NetworkType.AVALANCHE_P
TokenDTO.NetworkTypeDTO.ARBITRUM -> Token.NetworkType.ARBITRUM
TokenDTO.NetworkTypeDTO.BINANCE -> Token.NetworkType.BINANCE
TokenDTO.NetworkTypeDTO.CELO -> Token.NetworkType.CELO
TokenDTO.NetworkTypeDTO.ETHEREUM -> Token.NetworkType.ETHEREUM
TokenDTO.NetworkTypeDTO.ETHEREUM_GOERLI -> Token.NetworkType.ETHEREUM_GOERLI
TokenDTO.NetworkTypeDTO.ETHEREUM_HOLESKY -> Token.NetworkType.ETHEREUM_HOLESKY
TokenDTO.NetworkTypeDTO.FANTOM -> Token.NetworkType.FANTOM
TokenDTO.NetworkTypeDTO.HARMONY -> Token.NetworkType.HARMONY
TokenDTO.NetworkTypeDTO.OPTIMISM -> Token.NetworkType.OPTIMISM
TokenDTO.NetworkTypeDTO.POLYGON -> Token.NetworkType.POLYGON
TokenDTO.NetworkTypeDTO.GNOSIS -> Token.NetworkType.GNOSIS
TokenDTO.NetworkTypeDTO.MOONRIVER -> Token.NetworkType.MOONRIVER
TokenDTO.NetworkTypeDTO.OKC -> Token.NetworkType.OKC
TokenDTO.NetworkTypeDTO.ZKSYNC -> Token.NetworkType.ZKSYNC
TokenDTO.NetworkTypeDTO.VICTION -> Token.NetworkType.VICTION
TokenDTO.NetworkTypeDTO.AGORIC -> Token.NetworkType.AGORIC
TokenDTO.NetworkTypeDTO.AKASH -> Token.NetworkType.AKASH
TokenDTO.NetworkTypeDTO.AXELAR -> Token.NetworkType.AXELAR
TokenDTO.NetworkTypeDTO.BAND_PROTOCOL -> Token.NetworkType.BAND_PROTOCOL
TokenDTO.NetworkTypeDTO.BITSONG -> Token.NetworkType.BITSONG
TokenDTO.NetworkTypeDTO.CANTO -> Token.NetworkType.CANTO
TokenDTO.NetworkTypeDTO.CHIHUAHUA -> Token.NetworkType.CHIHUAHUA
TokenDTO.NetworkTypeDTO.COMDEX -> Token.NetworkType.COMDEX
TokenDTO.NetworkTypeDTO.COREUM -> Token.NetworkType.COREUM
TokenDTO.NetworkTypeDTO.COSMOS -> Token.NetworkType.COSMOS
TokenDTO.NetworkTypeDTO.CRESCENT -> Token.NetworkType.CRESCENT
TokenDTO.NetworkTypeDTO.CRONOS -> Token.NetworkType.CRONOS
TokenDTO.NetworkTypeDTO.CUDOS -> Token.NetworkType.CUDOS
TokenDTO.NetworkTypeDTO.DESMOS -> Token.NetworkType.DESMOS
TokenDTO.NetworkTypeDTO.DYDX -> Token.NetworkType.DYDX
TokenDTO.NetworkTypeDTO.EVMOS -> Token.NetworkType.EVMOS
TokenDTO.NetworkTypeDTO.FETCH_AI -> Token.NetworkType.FETCH_AI
TokenDTO.NetworkTypeDTO.GRAVITY_BRIDGE -> Token.NetworkType.GRAVITY_BRIDGE
TokenDTO.NetworkTypeDTO.INJECTIVE -> Token.NetworkType.INJECTIVE
TokenDTO.NetworkTypeDTO.IRISNET -> Token.NetworkType.IRISNET
TokenDTO.NetworkTypeDTO.JUNO -> Token.NetworkType.JUNO
TokenDTO.NetworkTypeDTO.KAVA -> Token.NetworkType.KAVA
TokenDTO.NetworkTypeDTO.KI_NETWORK -> Token.NetworkType.KI_NETWORK
TokenDTO.NetworkTypeDTO.MARS_PROTOCOL -> Token.NetworkType.MARS_PROTOCOL
TokenDTO.NetworkTypeDTO.NYM -> Token.NetworkType.NYM
TokenDTO.NetworkTypeDTO.OKEX_CHAIN -> Token.NetworkType.OKEX_CHAIN
TokenDTO.NetworkTypeDTO.ONOMY -> Token.NetworkType.ONOMY
TokenDTO.NetworkTypeDTO.OSMOSIS -> Token.NetworkType.OSMOSIS
TokenDTO.NetworkTypeDTO.PERSISTENCE -> Token.NetworkType.PERSISTENCE
TokenDTO.NetworkTypeDTO.QUICKSILVER -> Token.NetworkType.QUICKSILVER
TokenDTO.NetworkTypeDTO.REGEN -> Token.NetworkType.REGEN
TokenDTO.NetworkTypeDTO.SECRET -> Token.NetworkType.SECRET
TokenDTO.NetworkTypeDTO.SENTINEL -> Token.NetworkType.SENTINEL
TokenDTO.NetworkTypeDTO.SOMMELIER -> Token.NetworkType.SOMMELIER
TokenDTO.NetworkTypeDTO.STAFI -> Token.NetworkType.STAFI
TokenDTO.NetworkTypeDTO.STARGAZE -> Token.NetworkType.STARGAZE
TokenDTO.NetworkTypeDTO.STRIDE -> Token.NetworkType.STRIDE
TokenDTO.NetworkTypeDTO.TERITORI -> Token.NetworkType.TERITORI
TokenDTO.NetworkTypeDTO.TGRADE -> Token.NetworkType.TGRADE
TokenDTO.NetworkTypeDTO.UMEE -> Token.NetworkType.UMEE
TokenDTO.NetworkTypeDTO.POLKADOT -> Token.NetworkType.POLKADOT
TokenDTO.NetworkTypeDTO.KUSAMA -> Token.NetworkType.KUSAMA
TokenDTO.NetworkTypeDTO.WESTEND -> Token.NetworkType.WESTEND
TokenDTO.NetworkTypeDTO.BINANCEBEACON -> Token.NetworkType.BINANCEBEACON
TokenDTO.NetworkTypeDTO.NEAR -> Token.NetworkType.NEAR
TokenDTO.NetworkTypeDTO.SOLANA -> Token.NetworkType.SOLANA
TokenDTO.NetworkTypeDTO.TEZOS -> Token.NetworkType.TEZOS
TokenDTO.NetworkTypeDTO.TRON -> Token.NetworkType.TRON
else -> Token.NetworkType.UNKNOWN
}
}
private fun convertArgs(argsDTO: YieldDTO.ArgsDTO): Yield.Args {
return Yield.Args(
enter = convertEnter(argsDTO.enter),
@ -153,9 +68,9 @@ class YieldConverter : Converter<YieldDTO, Yield> {
logoUri = metadataDTO.logoUri,
description = metadataDTO.description,
documentation = metadataDTO.documentation,
gasFeeToken = convertToken(metadataDTO.gasFeeTokenDTO),
token = convertToken(metadataDTO.tokenDTO),
tokens = metadataDTO.tokensDTO.map { convertToken(it) },
gasFeeToken = tokenConverter.convert(metadataDTO.gasFeeTokenDTO),
token = tokenConverter.convert(metadataDTO.tokenDTO),
tokens = metadataDTO.tokensDTO.map { tokenConverter.convert(it) },
type = metadataDTO.type,
rewardSchedule = metadataDTO.rewardSchedule,
cooldownPeriod = convertPeriod(metadataDTO.cooldownPeriod),

View file

@ -0,0 +1,19 @@
package com.tangem.data.staking.converters.action
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionStatusDTO
import com.tangem.domain.staking.model.action.StakingActionStatus
import com.tangem.utils.converter.Converter
class ActionStatusConverter : Converter<StakingActionStatusDTO, StakingActionStatus> {
override fun convert(value: StakingActionStatusDTO): StakingActionStatus {
return when (value) {
StakingActionStatusDTO.CANCELED -> StakingActionStatus.CANCELED
StakingActionStatusDTO.CREATED -> StakingActionStatus.CREATED
StakingActionStatusDTO.WAITING_FOR_NEXT -> StakingActionStatus.WAITING_FOR_NEXT
StakingActionStatusDTO.PROCESSING -> StakingActionStatus.PROCESSING
StakingActionStatusDTO.FAILED -> StakingActionStatus.FAILED
StakingActionStatusDTO.SUCCESS -> StakingActionStatus.SUCCESS
else -> StakingActionStatus.UNKNOWN
}
}
}

View file

@ -0,0 +1,28 @@
package com.tangem.data.staking.converters.action
import com.tangem.data.staking.converters.transaction.StakingTransactionConverter
import com.tangem.datasource.api.stakekit.models.response.EnterActionResponse
import com.tangem.domain.staking.model.action.EnterAction
import com.tangem.utils.converter.Converter
class EnterActionResponseConverter(
private val actionStatusConverter: ActionStatusConverter,
private val stakingActionTypeConverter: StakingActionTypeConverter,
private val transactionConverter: StakingTransactionConverter,
) : Converter<EnterActionResponse, EnterAction> {
override fun convert(value: EnterActionResponse): EnterAction {
return EnterAction(
id = value.id,
integrationId = value.integrationId,
status = actionStatusConverter.convert(value.status),
type = stakingActionTypeConverter.convert(value.type),
currentStepIndex = value.currentStepIndex,
amount = value.amount,
validatorAddress = value.validatorAddress,
validatorAddresses = value.validatorAddresses,
transactions = value.transactions?.map(transactionConverter::convert),
createdAt = value.createdAt,
)
}
}

View file

@ -0,0 +1,30 @@
package com.tangem.data.staking.converters.action
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionTypeDTO
import com.tangem.domain.staking.model.action.StakingActionType
import com.tangem.utils.converter.Converter
@Suppress("CyclomaticComplexMethod")
class StakingActionTypeConverter : Converter<StakingActionTypeDTO, StakingActionType> {
override fun convert(value: StakingActionTypeDTO): StakingActionType {
return when (value) {
StakingActionTypeDTO.STAKE -> StakingActionType.STAKE
StakingActionTypeDTO.UNSTAKE -> StakingActionType.UNSTAKE
StakingActionTypeDTO.CLAIM_REWARDS -> StakingActionType.CLAIM_REWARDS
StakingActionTypeDTO.RESTAKE_REWARDS -> StakingActionType.RESTAKE_REWARDS
StakingActionTypeDTO.WITHDRAW -> StakingActionType.WITHDRAW
StakingActionTypeDTO.RESTAKE -> StakingActionType.RESTAKE
StakingActionTypeDTO.CLAIM_UNSTAKED -> StakingActionType.CLAIM_UNSTAKED
StakingActionTypeDTO.UNLOCK_LOCKED -> StakingActionType.UNLOCK_LOCKED
StakingActionTypeDTO.STAKE_LOCKED -> StakingActionType.STAKE_LOCKED
StakingActionTypeDTO.VOTE -> StakingActionType.VOTE
StakingActionTypeDTO.REVOKE -> StakingActionType.REVOKE
StakingActionTypeDTO.VOTE_LOCKED -> StakingActionType.VOTE_LOCKED
StakingActionTypeDTO.REVOTE -> StakingActionType.REVOTE
StakingActionTypeDTO.REBOND -> StakingActionType.REBOND
StakingActionTypeDTO.MIGRATE -> StakingActionType.MIGRATE
StakingActionTypeDTO.UNKNOWN -> StakingActionType.UNKNOWN
}
}
}

View file

@ -0,0 +1,19 @@
package com.tangem.data.staking.converters.transaction
import com.tangem.data.staking.converters.TokenConverter
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingGasEstimateDTO
import com.tangem.domain.staking.model.transaction.StakingGasEstimate
import com.tangem.utils.converter.Converter
class GasEstimateConverter(
private val tokenConverter: TokenConverter,
) : Converter<StakingGasEstimateDTO, StakingGasEstimate> {
override fun convert(value: StakingGasEstimateDTO): StakingGasEstimate {
return StakingGasEstimate(
amount = value.amount,
token = tokenConverter.convert(value.token),
gasLimit = value.gasLimit,
)
}
}

View file

@ -0,0 +1,33 @@
package com.tangem.data.staking.converters.transaction
import com.tangem.data.staking.converters.StakingNetworkTypeConverter
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionDTO
import com.tangem.domain.staking.model.transaction.StakingTransaction
import com.tangem.utils.converter.Converter
class StakingTransactionConverter(
private val networkTypeConverter: StakingNetworkTypeConverter,
private val transactionStatusConverter: StakingTransactionStatusConverter,
private val transactionTypeConverter: StakingTransactionTypeConverter,
private val gasEstimateConverter: GasEstimateConverter,
) : Converter<StakingTransactionDTO, StakingTransaction> {
override fun convert(value: StakingTransactionDTO): StakingTransaction {
return StakingTransaction(
id = value.id,
network = networkTypeConverter.convert(value.network),
status = transactionStatusConverter.convert(value.status),
type = transactionTypeConverter.convert(value.type),
hash = value.hash,
signedTransaction = value.signedTransaction,
unsignedTransaction = value.unsignedTransaction,
stepIndex = value.stepIndex,
error = value.error,
gasEstimate = value.gasEstimate?.let { gasEstimateConverter.convert(it) },
stakeId = value.stakeId,
explorerUrl = value.explorerUrl,
ledgerHwAppId = value.ledgerHwAppId,
isMessage = value.isMessage,
)
}
}

View file

@ -0,0 +1,24 @@
package com.tangem.data.staking.converters.transaction
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionStatusDTO
import com.tangem.domain.staking.model.transaction.StakingTransactionStatus
import com.tangem.utils.converter.Converter
class StakingTransactionStatusConverter : Converter<StakingTransactionStatusDTO, StakingTransactionStatus> {
override fun convert(value: StakingTransactionStatusDTO): StakingTransactionStatus {
return when (value) {
StakingTransactionStatusDTO.NOT_FOUND -> StakingTransactionStatus.NOT_FOUND
StakingTransactionStatusDTO.CREATED -> StakingTransactionStatus.CREATED
StakingTransactionStatusDTO.BLOCKED -> StakingTransactionStatus.BLOCKED
StakingTransactionStatusDTO.WAITING_FOR_SIGNATURE -> StakingTransactionStatus.WAITING_FOR_SIGNATURE
StakingTransactionStatusDTO.SIGNED -> StakingTransactionStatus.SIGNED
StakingTransactionStatusDTO.BROADCASTED -> StakingTransactionStatus.BROADCASTED
StakingTransactionStatusDTO.PENDING -> StakingTransactionStatus.PENDING
StakingTransactionStatusDTO.CONFIRMED -> StakingTransactionStatus.CONFIRMED
StakingTransactionStatusDTO.FAILED -> StakingTransactionStatus.FAILED
StakingTransactionStatusDTO.SKIPPED -> StakingTransactionStatus.SKIPPED
StakingTransactionStatusDTO.UNKNOWN -> StakingTransactionStatus.UNKNOWN
}
}
}

View file

@ -0,0 +1,54 @@
package com.tangem.data.staking.converters.transaction
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionTypeDTO
import com.tangem.domain.staking.model.transaction.StakingTransactionType
import com.tangem.utils.converter.Converter
@Suppress("CyclomaticComplexMethod")
class StakingTransactionTypeConverter : Converter<StakingTransactionTypeDTO, StakingTransactionType> {
override fun convert(value: StakingTransactionTypeDTO): StakingTransactionType {
return when (value) {
StakingTransactionTypeDTO.SWAP -> StakingTransactionType.SWAP
StakingTransactionTypeDTO.DEPOSIT -> StakingTransactionType.DEPOSIT
StakingTransactionTypeDTO.APPROVAL -> StakingTransactionType.APPROVAL
StakingTransactionTypeDTO.STAKE -> StakingTransactionType.STAKE
StakingTransactionTypeDTO.CLAIM_UNSTAKED -> StakingTransactionType.CLAIM_UNSTAKED
StakingTransactionTypeDTO.CLAIM_REWARDS -> StakingTransactionType.CLAIM_REWARDS
StakingTransactionTypeDTO.RESTAKE_REWARDS -> StakingTransactionType.RESTAKE_REWARDS
StakingTransactionTypeDTO.UNSTAKE -> StakingTransactionType.UNSTAKE
StakingTransactionTypeDTO.SPLIT -> StakingTransactionType.SPLIT
StakingTransactionTypeDTO.MERGE -> StakingTransactionType.MERGE
StakingTransactionTypeDTO.LOCK -> StakingTransactionType.LOCK
StakingTransactionTypeDTO.UNLOCK -> StakingTransactionType.UNLOCK
StakingTransactionTypeDTO.SUPPLY -> StakingTransactionType.SUPPLY
StakingTransactionTypeDTO.BRIDGE -> StakingTransactionType.BRIDGE
StakingTransactionTypeDTO.VOTE -> StakingTransactionType.VOTE
StakingTransactionTypeDTO.REVOKE -> StakingTransactionType.REVOKE
StakingTransactionTypeDTO.RESTAKE -> StakingTransactionType.RESTAKE
StakingTransactionTypeDTO.REBOND -> StakingTransactionType.REBOND
StakingTransactionTypeDTO.WITHDRAW -> StakingTransactionType.WITHDRAW
StakingTransactionTypeDTO.CREATE_ACCOUNT -> StakingTransactionType.CREATE_ACCOUNT
StakingTransactionTypeDTO.REVEAL -> StakingTransactionType.REVEAL
StakingTransactionTypeDTO.MIGRATE -> StakingTransactionType.MIGRATE
StakingTransactionTypeDTO.UTXO_P_TO_C_IMPORT -> StakingTransactionType.UTXO_P_TO_C_IMPORT
StakingTransactionTypeDTO.UTXO_C_TO_P_IMPORT -> StakingTransactionType.UTXO_C_TO_P_IMPORT
StakingTransactionTypeDTO.UNFREEZE_LEGACY -> StakingTransactionType.UNFREEZE_LEGACY
StakingTransactionTypeDTO.UNFREEZE_LEGACY_BANDWIDTH -> StakingTransactionType.UNFREEZE_LEGACY_BANDWIDTH
StakingTransactionTypeDTO.UNFREEZE_LEGACY_ENERGY -> StakingTransactionType.UNFREEZE_LEGACY_ENERGY
StakingTransactionTypeDTO.UNFREEZE_BANDWIDTH -> StakingTransactionType.UNFREEZE_BANDWIDTH
StakingTransactionTypeDTO.UNFREEZE_ENERGY -> StakingTransactionType.UNFREEZE_ENERGY
StakingTransactionTypeDTO.FREEZE_BANDWIDTH -> StakingTransactionType.FREEZE_BANDWIDTH
StakingTransactionTypeDTO.FREEZE_ENERGY -> StakingTransactionType.FREEZE_ENERGY
StakingTransactionTypeDTO.UNDELEGATE_BANDWIDTH -> StakingTransactionType.UNDELEGATE_BANDWIDTH
StakingTransactionTypeDTO.UNDELEGATE_ENERGY -> StakingTransactionType.UNDELEGATE_ENERGY
StakingTransactionTypeDTO.P2P_NODE_REQUEST -> StakingTransactionType.P2P_NODE_REQUEST
StakingTransactionTypeDTO.LUGANODES_PROVISION -> StakingTransactionType.LUGANODES_PROVISION
StakingTransactionTypeDTO.LUGANODES_EXIT_REQUEST -> StakingTransactionType.LUGANODES_EXIT_REQUEST
StakingTransactionTypeDTO.INFSTONES_PROVISION -> StakingTransactionType.INFSTONES_PROVISION
StakingTransactionTypeDTO.INFSTONES_EXIT_REQUEST -> StakingTransactionType.INFSTONES_EXIT_REQUEST
StakingTransactionTypeDTO.INFSTONES_CLAIM_REQUEST -> StakingTransactionType.INFSTONES_CLAIM_REQUEST
StakingTransactionTypeDTO.UNKNOWN -> StakingTransactionType.UNKNOWN
}
}
}

View file

@ -8,4 +8,5 @@ dependencies {
implementation(projects.domain.core)
implementation(deps.kotlin.serialization)
implementation(deps.jodatime)
}

View file

@ -0,0 +1,71 @@
package com.tangem.domain.staking.model
enum class NetworkType {
AVALANCHE_C,
AVALANCHE_ATOMIC,
AVALANCHE_P,
ARBITRUM,
BINANCE,
CELO,
ETHEREUM,
ETHEREUM_GOERLI,
ETHEREUM_HOLESKY,
FANTOM,
HARMONY,
OPTIMISM,
POLYGON,
GNOSIS,
MOONRIVER,
OKC,
ZKSYNC,
VICTION,
AGORIC,
AKASH,
AXELAR,
BAND_PROTOCOL,
BITSONG,
CANTO,
CHIHUAHUA,
COMDEX,
COREUM,
COSMOS,
CRESCENT,
CRONOS,
CUDOS,
DESMOS,
DYDX,
EVMOS,
FETCH_AI,
GRAVITY_BRIDGE,
INJECTIVE,
IRISNET,
JUNO,
KAVA,
KI_NETWORK,
MARS_PROTOCOL,
NYM,
OKEX_CHAIN,
ONOMY,
OSMOSIS,
PERSISTENCE,
QUICKSILVER,
REGEN,
SECRET,
SENTINEL,
SOMMELIER,
STAFI,
STARGAZE,
STRIDE,
TERITORI,
TGRADE,
UMEE,
POLKADOT,
KUSAMA,
WESTEND,
BINANCEBEACON,
NEAR,
SOLANA,
TEZOS,
TRON,
UNKNOWN,
}

View file

@ -107,77 +107,7 @@ data class Token(
val coinGeckoId: String?,
val logoURI: String?,
val isPoints: Boolean?,
) {
enum class NetworkType {
AVALANCHE_C,
AVALANCHE_ATOMIC,
AVALANCHE_P,
ARBITRUM,
BINANCE,
CELO,
ETHEREUM,
ETHEREUM_GOERLI,
ETHEREUM_HOLESKY,
FANTOM,
HARMONY,
OPTIMISM,
POLYGON,
GNOSIS,
MOONRIVER,
OKC,
ZKSYNC,
VICTION,
AGORIC,
AKASH,
AXELAR,
BAND_PROTOCOL,
BITSONG,
CANTO,
CHIHUAHUA,
COMDEX,
COREUM,
COSMOS,
CRESCENT,
CRONOS,
CUDOS,
DESMOS,
DYDX,
EVMOS,
FETCH_AI,
GRAVITY_BRIDGE,
INJECTIVE,
IRISNET,
JUNO,
KAVA,
KI_NETWORK,
MARS_PROTOCOL,
NYM,
OKEX_CHAIN,
ONOMY,
OSMOSIS,
PERSISTENCE,
QUICKSILVER,
REGEN,
SECRET,
SENTINEL,
SOMMELIER,
STAFI,
STARGAZE,
STRIDE,
TERITORI,
TGRADE,
UMEE,
POLKADOT,
KUSAMA,
WESTEND,
BINANCEBEACON,
NEAR,
SOLANA,
TEZOS,
TRON,
UNKNOWN,
}
}
)
@Serializable
data class AddressArgument(

View file

@ -0,0 +1,18 @@
package com.tangem.domain.staking.model.action
import com.tangem.domain.staking.model.transaction.StakingTransaction
import org.joda.time.DateTime
import java.math.BigDecimal
data class EnterAction(
val id: String,
val integrationId: String,
val status: StakingActionStatus,
val type: StakingActionType,
val currentStepIndex: Int,
val amount: BigDecimal,
val validatorAddress: String?,
val validatorAddresses: List<String>?,
val transactions: List<StakingTransaction>?,
val createdAt: DateTime,
)

View file

@ -0,0 +1,11 @@
package com.tangem.domain.staking.model.action
enum class StakingActionStatus {
CANCELED,
CREATED,
WAITING_FOR_NEXT,
PROCESSING,
FAILED,
SUCCESS,
UNKNOWN,
}

View file

@ -0,0 +1,20 @@
package com.tangem.domain.staking.model.action
enum class StakingActionType {
STAKE,
UNSTAKE,
CLAIM_REWARDS,
RESTAKE_REWARDS,
WITHDRAW,
RESTAKE,
CLAIM_UNSTAKED,
UNLOCK_LOCKED,
STAKE_LOCKED,
VOTE,
REVOKE,
VOTE_LOCKED,
REVOTE,
REBOND,
MIGRATE,
UNKNOWN,
}

View file

@ -0,0 +1,10 @@
package com.tangem.domain.staking.model.transaction
import com.tangem.domain.staking.model.Token
import java.math.BigDecimal
data class StakingGasEstimate(
val amount: BigDecimal,
val token: Token,
val gasLimit: BigDecimal,
)

View file

@ -0,0 +1,20 @@
package com.tangem.domain.staking.model.transaction
import com.tangem.domain.staking.model.NetworkType
data class StakingTransaction(
val id: String,
val network: NetworkType,
val status: StakingTransactionStatus,
val type: StakingTransactionType,
val hash: String?,
val signedTransaction: String?,
val unsignedTransaction: String?,
val stepIndex: Int,
val error: String?,
val gasEstimate: StakingGasEstimate?,
val stakeId: String?,
val explorerUrl: String?,
val ledgerHwAppId: String?,
val isMessage: Boolean,
)

View file

@ -0,0 +1,15 @@
package com.tangem.domain.staking.model.transaction
enum class StakingTransactionStatus {
NOT_FOUND,
CREATED,
BLOCKED,
WAITING_FOR_SIGNATURE,
SIGNED,
BROADCASTED,
PENDING,
CONFIRMED,
FAILED,
SKIPPED,
UNKNOWN,
}

View file

@ -0,0 +1,44 @@
package com.tangem.domain.staking.model.transaction
enum class StakingTransactionType {
SWAP,
DEPOSIT,
APPROVAL,
STAKE,
CLAIM_UNSTAKED,
CLAIM_REWARDS,
RESTAKE_REWARDS,
UNSTAKE,
SPLIT,
MERGE,
LOCK,
UNLOCK,
SUPPLY,
BRIDGE,
VOTE,
REVOKE,
RESTAKE,
REBOND,
WITHDRAW,
CREATE_ACCOUNT,
REVEAL,
MIGRATE,
UTXO_P_TO_C_IMPORT,
UTXO_C_TO_P_IMPORT,
UNFREEZE_LEGACY,
UNFREEZE_LEGACY_BANDWIDTH,
UNFREEZE_LEGACY_ENERGY,
UNFREEZE_BANDWIDTH,
UNFREEZE_ENERGY,
FREEZE_BANDWIDTH,
FREEZE_ENERGY,
UNDELEGATE_BANDWIDTH,
UNDELEGATE_ENERGY,
P2P_NODE_REQUEST,
LUGANODES_PROVISION,
LUGANODES_EXIT_REQUEST,
INFSTONES_PROVISION,
INFSTONES_EXIT_REQUEST,
INFSTONES_CLAIM_REQUEST,
UNKNOWN,
}