Updated on 2026-08-14
This commit is contained in:
parent
ec7dcde2d3
commit
75f8a45cd4
23 changed files with 569 additions and 65 deletions
|
|
@ -0,0 +1,19 @@
|
|||
package com.tangem.data.staking
|
||||
|
||||
import com.tangem.data.staking.converters.error.StakeKitErrorConverter
|
||||
import com.tangem.datasource.api.common.response.ApiResponseError
|
||||
import com.tangem.domain.staking.model.StakingError
|
||||
import com.tangem.domain.staking.repositories.StakingErrorResolver
|
||||
|
||||
internal class DefaultStakingErrorResolver(
|
||||
private val stakeKitErrorConverter: StakeKitErrorConverter,
|
||||
) : StakingErrorResolver {
|
||||
|
||||
override fun resolve(throwable: Throwable): StakingError {
|
||||
return if (throwable is ApiResponseError.HttpException) {
|
||||
stakeKitErrorConverter.convert(throwable.errorBody.orEmpty())
|
||||
} else {
|
||||
StakingError.UnknownError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
package com.tangem.data.staking.converters.error
|
||||
|
||||
import com.squareup.moshi.JsonAdapter
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.error.StakeKitErrorMessageDTO
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.error.StakeKitErrorResponse
|
||||
import com.tangem.domain.staking.model.StakingError
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
internal class StakeKitErrorConverter(
|
||||
private val jsonAdapter: JsonAdapter<StakeKitErrorResponse>,
|
||||
) : Converter<String, StakingError> {
|
||||
|
||||
@Suppress("CyclomaticComplexMethod", "LongMethod")
|
||||
override fun convert(value: String): StakingError {
|
||||
return try {
|
||||
val stakeKitErrorResponse = jsonAdapter.fromJson(value) ?: return StakingError.UnknownError
|
||||
|
||||
when (stakeKitErrorResponse.message) {
|
||||
StakeKitErrorMessageDTO.MINIMUM_AMOUNT_NOT_REACHED -> StakingError.MinimumAmountNotReachedError(
|
||||
amount = stakeKitErrorResponse.details?.amount ?: "",
|
||||
)
|
||||
StakeKitErrorMessageDTO.MISSING_ARGUMENTS_ERROR -> StakingError.MissingArgumentsError(
|
||||
arguments = stakeKitErrorResponse.details?.arguments ?: "",
|
||||
)
|
||||
StakeKitErrorMessageDTO.YIELD_UNDER_MAINTENANCE_ERROR -> StakingError.YieldUnderMaintenanceError(
|
||||
yieldId = stakeKitErrorResponse.details?.yieldId ?: "",
|
||||
)
|
||||
StakeKitErrorMessageDTO.INSUFFICIENT_FUNDS_ERROR ->
|
||||
StakingError.InsufficientFundsError
|
||||
StakeKitErrorMessageDTO.STAKED_POSITION_NOT_FOUND_ERROR ->
|
||||
StakingError.StakedPositionNotFoundError
|
||||
StakeKitErrorMessageDTO.INVALID_AMOUNT_SUBMITTED_ERROR ->
|
||||
StakingError.InvalidAmountSubmittedError
|
||||
StakeKitErrorMessageDTO.BALANCE_UNAVAILABLE_ERROR ->
|
||||
StakingError.BalanceUnavailableError
|
||||
StakeKitErrorMessageDTO.GAS_PRICE_UNAVAILABLE_ERROR ->
|
||||
StakingError.GasPriceUnavailableError
|
||||
StakeKitErrorMessageDTO.NOT_IMPLEMENTED_ERROR ->
|
||||
StakingError.NotImplementedError
|
||||
StakeKitErrorMessageDTO.TOKEN_NOT_FOUND_ERROR ->
|
||||
StakingError.TokenNotFoundError
|
||||
StakeKitErrorMessageDTO.BROADCAST_TRANSACTION_ERROR ->
|
||||
StakingError.BroadcastTransactionError
|
||||
StakeKitErrorMessageDTO.MISSING_GAS_PRICE_STRATEGY_ERROR ->
|
||||
StakingError.MissingGasPriceStrategyError
|
||||
StakeKitErrorMessageDTO.SUBSTRATE_MALFORMED_TRANSACTION_HASH_ERROR ->
|
||||
StakingError.SubstrateMalformedTransactionHashError
|
||||
StakeKitErrorMessageDTO.TRON_MAXIMUM_AMOUNT_OF_VALIDATORS_EXCEEDED_ERROR ->
|
||||
StakingError.TronMaximumAmountOfValidatorsExceededError
|
||||
StakeKitErrorMessageDTO.SUBSTRATE_POOL_NOT_FOUND_ERROR ->
|
||||
StakingError.SubstratePoolNotFoundError
|
||||
StakeKitErrorMessageDTO.SUBSTRATE_BONDED_AMOUNT_TOO_LOW_ERROR ->
|
||||
StakingError.SubstrateBondedAmountTooLowError
|
||||
StakeKitErrorMessageDTO.TRON_MISSING_RESOURCE_TYPE_ARGUMENT_ERROR ->
|
||||
StakingError.TronMissingResourceTypeArgumentError
|
||||
StakeKitErrorMessageDTO.AAVE_V3_POOL_FROZEN_ERROR ->
|
||||
StakingError.AaveV3PoolFrozenError
|
||||
StakeKitErrorMessageDTO.AAVE_V3_TOKEN_PAIR_NOT_FOUND_ERROR ->
|
||||
StakingError.AaveV3TokenPairNotFoundError
|
||||
StakeKitErrorMessageDTO.YEARN_VAULT_AT_MAX_CAPACITY_ERROR ->
|
||||
StakingError.YearnVaultAtMaxCapacityError
|
||||
StakeKitErrorMessageDTO.STETH_NO_WITHDRAWAL_REQUESTS_FOUND_ERROR ->
|
||||
StakingError.StETHNoWithdrawalRequestsFoundError
|
||||
StakeKitErrorMessageDTO.MORPHO_LENDING_POOL_PAUSED_ERROR ->
|
||||
StakingError.MorphoLendingPoolPausedError
|
||||
StakeKitErrorMessageDTO.NONCE_UNAVAILABLE_ERROR ->
|
||||
StakingError.NonceUnavailableError
|
||||
StakeKitErrorMessageDTO.COSMOS_ACCOUNT_NOT_FOUND_ERROR ->
|
||||
StakingError.CosmosAcccountNotFoundError
|
||||
StakeKitErrorMessageDTO.AVALANCHE_MISSING_ADDITIONAL_ADDRESSES_ARGUMENT_ERROR ->
|
||||
StakingError.AvalancheMissingAdditionalAddressesArgumentError
|
||||
StakeKitErrorMessageDTO.AVALANCHE_VALIDATOR_INFO_NOT_FOUND_ERROR ->
|
||||
StakingError.AvalancheValidatorInfoNotFoundError
|
||||
StakeKitErrorMessageDTO.SOLANA_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE_ERROR ->
|
||||
StakingError.SolanaTransactionSignatureVerificationFailureError
|
||||
StakeKitErrorMessageDTO.SOLANA_UNABLE_TO_CREATE_STAKE_ACCOUNT_ERROR ->
|
||||
StakingError.SolanaUnableTocreateStakeAccountError
|
||||
StakeKitErrorMessageDTO.SOLANA_STAKE_AMOUNT_TOO_LOW_ERROR ->
|
||||
StakingError.SolanaStakeAmountTooLowError
|
||||
StakeKitErrorMessageDTO.SOLANA_UNSTAKE_AMOUNT_TOO_LOW_ERROR ->
|
||||
StakingError.SolanaUnstakeAmountTooLowError
|
||||
StakeKitErrorMessageDTO.SOLANA_STAKE_ACCOUNTS_NOT_FOUND_ERROR ->
|
||||
StakingError.SolanaStakeAccountsNotFoundError
|
||||
StakeKitErrorMessageDTO.SOLANA_ELIGIBLE_STAKE_ACCOUNTS_NOT_FOUND_ERROR ->
|
||||
StakingError.SolanaEligibleStakeAccountsNotFoundError
|
||||
StakeKitErrorMessageDTO.TEZOS_NO_BALANCE_DELEGATED_ERROR ->
|
||||
StakingError.TezosNoBalanceDelegatedError
|
||||
StakeKitErrorMessageDTO.TEZOS_MISSING_PUBKEY_ARGUMENT_ERROR ->
|
||||
StakingError.TezosMissingPubkeyArgumentError
|
||||
StakeKitErrorMessageDTO.TEZOS_ESTIMATE_REVEAL_GAS_LIMIT_ERROR ->
|
||||
StakingError.TezosEstimateRevealGasLimitError
|
||||
StakeKitErrorMessageDTO.TEZOS_BALANCE_ALREADY_DELEGATED_ERROR ->
|
||||
StakingError.TezosBalanceAlreadyDelegatedError
|
||||
StakeKitErrorMessageDTO.BINANCE_ACCOUNT_NOT_FOUND_ERROR ->
|
||||
StakingError.BinanceAccountNotFoundError
|
||||
StakeKitErrorMessageDTO.BINANCE_MISSING_ACCOUNT_NUMBER_OR_SEQUENCE_ERROR ->
|
||||
StakingError.BinanceMissingAccountNumberOrSequenceError
|
||||
StakeKitErrorMessageDTO.GRT_STAKING_DISABLED_ERROR ->
|
||||
StakingError.GRTStakingDisabledError
|
||||
StakeKitErrorMessageDTO.GRT_STAKING_DISABLED_LEDGER_LIVE_ERROR ->
|
||||
StakingError.GRTStakingDisabledLedgerLiveError
|
||||
else -> StakingError.UnknownError
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
StakingError.UnknownError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +1,17 @@
|
|||
package com.tangem.data.staking.di
|
||||
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.tangem.data.common.cache.CacheRegistry
|
||||
import com.tangem.data.staking.DefaultStakingErrorResolver
|
||||
import com.tangem.data.staking.DefaultStakingRepository
|
||||
import com.tangem.data.staking.converters.error.StakeKitErrorConverter
|
||||
import com.tangem.datasource.api.stakekit.StakeKitApi
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.error.StakeKitErrorResponse
|
||||
import com.tangem.datasource.di.NetworkMoshi
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.token.StakingBalanceStore
|
||||
import com.tangem.datasource.local.token.StakingYieldsStore
|
||||
import com.tangem.domain.staking.repositories.StakingErrorResolver
|
||||
import com.tangem.domain.staking.repositories.StakingRepository
|
||||
import com.tangem.features.staking.api.featuretoggles.StakingFeatureToggles
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
|
|
@ -40,4 +46,13 @@ internal object StakingDataModule {
|
|||
stakingFeatureToggle = stakingFeatureToggle,
|
||||
)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
internal fun provideStakingErrorResolver(@NetworkMoshi moshi: Moshi): StakingErrorResolver {
|
||||
val jsonAdapter = moshi.adapter(StakeKitErrorResponse::class.java)
|
||||
return DefaultStakingErrorResolver(
|
||||
stakeKitErrorConverter = StakeKitErrorConverter(jsonAdapter),
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue