Updated on 2026-08-14

This commit is contained in:
Tangem 2026-07-16 13:36:16 +02:00
parent a5488207ed
commit 2a41321e74
20 changed files with 440 additions and 9 deletions

View file

@ -13,6 +13,12 @@ sealed class StakingAvailability {
data object Unavailable : StakingAvailability()
data object TemporaryUnavailable : StakingAvailability()
/**
* The P2P API returned HTTP 451 staking is blocked in the user's region.
* New stakes are not offered; an existing stake is shown as a read-only block.
*/
data object RegionUnavailable : StakingAvailability()
}
/** Staking option if the integration is known (Available or Full), else null. */
@ -22,5 +28,6 @@ val StakingAvailability.optionOrNull: StakingOption?
is StakingAvailability.Full -> option
StakingAvailability.Unavailable,
StakingAvailability.TemporaryUnavailable,
StakingAvailability.RegionUnavailable,
-> null
}

View file

@ -7,4 +7,6 @@ interface StakingFeatureToggles {
fun isIntegrationEnabled(integrationId: StakingIntegrationID): Boolean
fun isSolanaUnstakeValidationEnabled(): Boolean
fun isRegionUnavailableHandlingEnabled(): Boolean
}

View file

@ -182,6 +182,7 @@ internal open class BaseActionsFactory(
)
is StakingAvailability.Full -> null
StakingAvailability.Unavailable -> null
StakingAvailability.RegionUnavailable -> null
}
}

View file

@ -95,14 +95,30 @@ internal class CommonActionsFactoryTest {
assertThat(buyAction.unavailabilityReason).isEqualTo(ScenarioUnavailabilityReason.None)
}
@Test
fun `GIVEN region unavailable WHEN create THEN no stake action offered`() = runTest {
// Arrange
every { cardTypesResolver.isStart2Coin() } returns false
// Act
val actions = createActions(stakingAvailability = StakingAvailability.RegionUnavailable)
// Assert
assertThat(actions.filterIsInstance<ActionState.Stake>()).isEmpty()
}
private suspend fun createBuyAction(): ActionState.Buy {
val actions = factory.create(
val actions = createActions(stakingAvailability = StakingAvailability.Unavailable)
return actions.filterIsInstance<ActionState.Buy>().single()
}
private suspend fun createActions(stakingAvailability: StakingAvailability): Set<ActionState> {
return factory.create(
userWallet = userWallet,
cryptoCurrencyStatus = cryptoCurrencyStatus,
stakingAvailability = StakingAvailability.Unavailable,
stakingAvailability = stakingAvailability,
yieldSupplyAvailability = YieldSupplyAvailability.Unavailable,
shouldShowSwapStories = false,
)
return actions.filterIsInstance<ActionState.Buy>().single()
}
}