Skip to content

Commit 09be8fd

Browse files
authored
Merge pull request #1775 from novasamatech/myth_staking/confirm_start_staking
Myth staking/confirm start staking
2 parents 84358bc + cb9387e commit 09be8fd

File tree

56 files changed

+1246
-332
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1246
-332
lines changed

app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/StakingNavigationModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class StakingNavigationModule {
2222

2323
@Provides
2424
@ApplicationScope
25-
fun provideStakingDashboardNavigator(): StakingDashboardNavigator {
26-
return StakingDashboardNavigator()
25+
fun provideStakingDashboardNavigator(navigationHoldersRegistry: NavigationHoldersRegistry): StakingDashboardNavigator {
26+
return StakingDashboardNavigator(navigationHoldersRegistry)
2727
}
2828

2929
@Provides

app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StakingDashboardNavigator.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ package io.novafoundation.nova.app.root.navigation.navigators.staking
33
import androidx.lifecycle.MutableLiveData
44
import androidx.navigation.NavController
55
import io.novafoundation.nova.app.R
6+
import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator
7+
import io.novafoundation.nova.app.root.navigation.navigators.NavigationHoldersRegistry
68
import io.novafoundation.nova.common.utils.Event
79
import io.novafoundation.nova.common.utils.event
810
import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter
911

10-
class StakingDashboardNavigator : StakingDashboardRouter {
12+
class StakingDashboardNavigator(
13+
navigationHoldersRegistry: NavigationHoldersRegistry
14+
) : BaseNavigator(navigationHoldersRegistry), StakingDashboardRouter {
1115

1216
private var stakingTabNavController: NavController? = null
1317
private var pendingAction: Int? = null
@@ -36,7 +40,9 @@ class StakingDashboardNavigator : StakingDashboardRouter {
3640
}
3741

3842
override fun returnToStakingDashboard() {
39-
stakingTabNavController?.navigate(R.id.back_to_main)
43+
navigationBuilder()
44+
.action(R.id.back_to_main)
45+
.navigateInFirstAttachedContext()
4046

4147
returnToStakingTabRoot()
4248
scrollToDashboardTopEvent.value = Unit.event()

app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/mythos/MythosStakingNavigator.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import io.novafoundation.nova.app.R
44
import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator
55
import io.novafoundation.nova.app.root.navigation.navigators.NavigationHoldersRegistry
66
import io.novafoundation.nova.feature_staking_impl.presentation.MythosStakingRouter
7+
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.confirm.ConfirmStartMythosStakingFragment
8+
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.confirm.ConfirmStartMythosStakingPayload
79
import io.novafoundation.nova.feature_staking_impl.presentation.validators.details.StakeTargetDetailsPayload
810
import io.novafoundation.nova.feature_staking_impl.presentation.validators.details.ValidatorDetailsFragment
911

@@ -18,9 +20,26 @@ class MythosStakingNavigator(
1820
.navigateInFirstAttachedContext()
1921
}
2022

23+
override fun openConfirmStartStaking(payload: ConfirmStartMythosStakingPayload) {
24+
navigationBuilder()
25+
.action(R.id.action_startMythosStakingFragment_to_confirmStartMythosStakingFragment)
26+
.setArgs(ConfirmStartMythosStakingFragment.getBundle(payload))
27+
.navigateInFirstAttachedContext()
28+
}
29+
30+
override fun openClaimRewards() {
31+
TODO("Not yet implemented")
32+
}
33+
2134
override fun returnToStartStaking() {
2235
navigationBuilder()
2336
.action(R.id.action_return_to_start_staking)
2437
.navigateInFirstAttachedContext()
2538
}
39+
40+
override fun returnToStakingMain() {
41+
navigationBuilder()
42+
.action(R.id.back_to_staking_main)
43+
.navigateInFirstAttachedContext()
44+
}
2645
}

app/src/main/res/navigation/staking_mythos_start_graph.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626
app:exitAnim="@anim/fragment_open_exit"
2727
app:popEnterAnim="@anim/fragment_close_enter"
2828
app:popExitAnim="@anim/fragment_close_exit" />
29+
30+
<action
31+
app:enterAnim="@anim/fragment_open_enter"
32+
app:exitAnim="@anim/fragment_open_exit"
33+
app:popEnterAnim="@anim/fragment_close_enter"
34+
app:popExitAnim="@anim/fragment_close_exit"
35+
android:id="@+id/action_startMythosStakingFragment_to_confirmStartMythosStakingFragment"
36+
app:destination="@id/confirmStartMythosStakingFragment" />
2937
</fragment>
3038

3139
<fragment
@@ -44,5 +52,11 @@
4452
<fragment
4553
android:id="@+id/selectMythCollatorSettingsFragment"
4654
android:name="io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.selectCollatorSettings.SelectMythCollatorSettingsFragment"
47-
android:label="SelectMythCollatorSettingsFragment" />
55+
android:label="SelectMythCollatorSettingsFragment">
56+
</fragment>
57+
58+
<fragment
59+
android:id="@+id/confirmStartMythosStakingFragment"
60+
android:name="io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.confirm.ConfirmStartMythosStakingFragment"
61+
android:label="ConfirmStartMythosStakingFragment" />
4862
</navigation>

common/src/main/java/io/novafoundation/nova/common/utils/KotlinExt.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ inline fun <T> Result<T>.mapError(transform: (throwable: Throwable) -> Throwable
7373
}
7474
}
7575

76+
fun Result<*>.coerceToUnit(): Result<Unit> = map { }
77+
7678
@OptIn(ExperimentalTime::class)
7779
inline fun <R> measureExecution(label: String, function: () -> R): R {
7880
val (value, time) = measureTimedValue(function)

common/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyEllipsis">
3+
<string name="common_claim">Claim</string>
4+
5+
<string name="staking_myth_start_validation_pending_rewards_title">You have unpaid staking rewards</string>
6+
<string name="staking_myth_start_validation_pending_rewards_description">You cannot stake more before claiming all unpaid staking rewards</string>
7+
38
<string name="swap_intermediate_too_low_amount_to_stay_abow_ed_message">During swap execution intermediate receive amount is %s which is less than minimum balance of %s. Try specifying larger swap amount.</string>
49

510
<string name="common_not_enough_to_pay_fee_message">You don\'t have enough balance to pay network fee of %s. Current balance is %s</string>

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/mythos/repository/MythosLocks.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import io.novafoundation.nova.feature_wallet_api.domain.model.BalanceLock
99
import io.novafoundation.nova.feature_wallet_api.domain.model.BalanceLockId
1010
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
1111
import kotlinx.coroutines.flow.Flow
12+
import kotlinx.coroutines.flow.distinctUntilChanged
1213
import kotlinx.coroutines.flow.map
1314

14-
class MythosLocks(
15+
data class MythosLocks(
1516
val releasing: Balance,
1617
val staked: Balance
1718
)
@@ -25,7 +26,7 @@ fun BalanceLocksRepository.observeMythosLocks(metaId: Long, chain: Chain, chainA
2526
releasing = locks.findAmountOrZero(MythosStakingFreezeIds.RELEASING),
2627
staked = locks.findAmountOrZero(MythosStakingFreezeIds.STAKING)
2728
)
28-
}
29+
}.distinctUntilChanged()
2930
}
3031

3132
private fun List<BalanceLock>.findAmountOrZero(id: BalanceLockId): Balance {

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/mythos/repository/MythosStakingRepository.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId
1313
import io.novafoundation.nova.runtime.multiNetwork.withRuntime
1414
import io.novafoundation.nova.runtime.storage.source.StorageDataSource
1515
import io.novafoundation.nova.runtime.storage.source.query.api.observeNonNull
16+
import io.novafoundation.nova.runtime.storage.source.query.api.queryNonNull
1617
import kotlinx.coroutines.flow.Flow
1718
import javax.inject.Inject
1819
import javax.inject.Named
@@ -21,7 +22,11 @@ interface MythosStakingRepository {
2122

2223
fun minStakeFlow(chainId: ChainId): Flow<Balance>
2324

24-
suspend fun maxCandidatesPerDelegator(chainId: ChainId): Int
25+
suspend fun minStake(chainId: ChainId): Balance
26+
27+
suspend fun maxCollatorsPerDelegator(chainId: ChainId): Int
28+
29+
suspend fun maxDelegatorsPerCollator(chainId: ChainId): Int
2530

2631
suspend fun unstakeDurationInSessions(chainId: ChainId): Int
2732
}
@@ -39,12 +44,24 @@ class RealMythosStakingRepository @Inject constructor(
3944
}
4045
}
4146

42-
override suspend fun maxCandidatesPerDelegator(chainId: ChainId): Int {
47+
override suspend fun minStake(chainId: ChainId): Balance {
48+
return localStorageDataSource.query(chainId) {
49+
metadata.collatorStaking.minStake.queryNonNull()
50+
}
51+
}
52+
53+
override suspend fun maxCollatorsPerDelegator(chainId: ChainId): Int {
4354
return chainRegistry.withRuntime(chainId) {
4455
metadata.collatorStaking().numberConstant("MaxStakedCandidates").toInt()
4556
}
4657
}
4758

59+
override suspend fun maxDelegatorsPerCollator(chainId: ChainId): Int {
60+
return chainRegistry.withRuntime(chainId) {
61+
metadata.collatorStaking().numberConstant("MaxStakers").toInt()
62+
}
63+
}
64+
4865
override suspend fun unstakeDurationInSessions(chainId: ChainId): Int {
4966
return chainRegistry.withRuntime(chainId) {
5067
metadata.collatorStaking().numberConstant("StakeUnlockDelay").toInt()
Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.novafoundation.nova.feature_staking_impl.data.mythos.repository
22

33
import io.novafoundation.nova.common.address.AccountIdKey
4+
import io.novafoundation.nova.common.data.network.runtime.binding.bindBoolean
45
import io.novafoundation.nova.common.di.scope.FeatureScope
56
import io.novafoundation.nova.common.utils.filterNotNull
67
import io.novafoundation.nova.common.utils.metadata
@@ -9,6 +10,8 @@ import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchai
910
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.api.userStake
1011
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.model.MythDelegation
1112
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.model.UserStakeInfo
13+
import io.novafoundation.nova.runtime.call.MultiChainRuntimeCallsApi
14+
import io.novafoundation.nova.runtime.call.RuntimeCallsApi
1215
import io.novafoundation.nova.runtime.di.LOCAL_STORAGE_SOURCE
1316
import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId
1417
import io.novafoundation.nova.runtime.storage.source.StorageDataSource
@@ -18,7 +21,7 @@ import kotlinx.coroutines.flow.map
1821
import javax.inject.Inject
1922
import javax.inject.Named
2023

21-
interface UserStakeRepository {
24+
interface MythosUserStakeRepository {
2225

2326
fun userStakeFlow(chainId: ChainId, accountId: AccountId): Flow<UserStakeInfo?>
2427

@@ -27,13 +30,19 @@ interface UserStakeRepository {
2730
userId: AccountIdKey,
2831
delegationIds: List<AccountIdKey>
2932
): Flow<Map<AccountIdKey, MythDelegation>>
33+
34+
suspend fun shouldClaimRewards(
35+
chainId: ChainId,
36+
accountId: AccountIdKey
37+
): Boolean
3038
}
3139

3240
@FeatureScope
33-
class RealUserStakeRepository @Inject constructor(
41+
class RealMythosUserStakeRepository @Inject constructor(
3442
@Named(LOCAL_STORAGE_SOURCE)
3543
private val localStorageDataSource: StorageDataSource,
36-
) : UserStakeRepository {
44+
private val callApi: MultiChainRuntimeCallsApi,
45+
) : MythosUserStakeRepository {
3746

3847
override fun userStakeFlow(chainId: ChainId, accountId: AccountId): Flow<UserStakeInfo?> {
3948
return localStorageDataSource.subscribe(chainId) {
@@ -47,12 +56,27 @@ class RealUserStakeRepository @Inject constructor(
4756
delegationIds: List<AccountIdKey>
4857
): Flow<Map<AccountIdKey, MythDelegation>> {
4958
return localStorageDataSource.subscribe(chainId) {
50-
val allKeys = delegationIds.map { userId to it }
59+
val allKeys = delegationIds.map { it to userId }
5160

5261
metadata.collatorStaking.candidateStake.observe(allKeys).map { resultMap ->
5362
resultMap.mapKeys { (keys, _) -> keys.first }
5463
.filterNotNull()
5564
}
5665
}
5766
}
67+
68+
override suspend fun shouldClaimRewards(chainId: ChainId, accountId: AccountIdKey): Boolean {
69+
return callApi.forChain(chainId).shouldClaimPendingRewards(accountId)
70+
}
71+
72+
private suspend fun RuntimeCallsApi.shouldClaimPendingRewards(accountId: AccountIdKey): Boolean {
73+
return call(
74+
section = "CollatorStakingApi",
75+
method = "should_claim",
76+
arguments = mapOf(
77+
"account" to accountId.value
78+
),
79+
returnBinding = ::bindBoolean
80+
)
81+
}
5882
}

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/mythos/updaters/MythosSelectedCandidatesUpdater.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import io.novafoundation.nova.feature_staking_impl.data.StakingSharedState
1414
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.api.candidateStake
1515
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.api.collatorStaking
1616
import io.novafoundation.nova.feature_staking_impl.data.mythos.network.blockchain.model.UserStakeInfo
17-
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.UserStakeRepository
17+
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.MythosUserStakeRepository
1818
import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId
1919
import io.novafoundation.nova.runtime.state.chain
2020
import io.novafoundation.nova.runtime.storage.source.StorageDataSource
@@ -25,7 +25,7 @@ class MythosSelectedCandidatesUpdater(
2525
override val scope: AccountUpdateScope,
2626
private val stakingSharedState: StakingSharedState,
2727
private val storageCache: StorageCache,
28-
private val mythosUserStakeRepository: UserStakeRepository,
28+
private val mythosUserStakeRepository: MythosUserStakeRepository,
2929
private val remoteStorageDataSource: StorageDataSource,
3030
) : Updater<MetaAccount> {
3131

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureComponent.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@ import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboard
2828
import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter
2929
import io.novafoundation.nova.feature_staking_impl.presentation.StartMultiStakingRouter
3030
import io.novafoundation.nova.feature_staking_impl.presentation.bagList.rebag.di.RebagComponent
31-
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.confirm.di.ConfirmChangeValidatorsComponent
32-
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.confirm.nominations.di.ConfirmNominationsComponent
3331
import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.main.di.StakingDashboardComponent
3432
import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.more.di.MoreStakingOptionsComponent
3533
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.SelectMythosInterScreenCommunicator
34+
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.confirm.di.ConfirmStartMythosStakingComponent
3635
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.selectCollator.di.SelectMythosCollatorComponent
3736
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.selectCollatorSettings.SelectMythCollatorSettingsInterScreenCommunicator
3837
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.selectCollatorSettings.di.SelectMythCollatorSettingsComponent
@@ -78,12 +77,14 @@ import io.novafoundation.nova.feature_staking_impl.presentation.staking.redeem.d
7877
import io.novafoundation.nova.feature_staking_impl.presentation.staking.rewardDestination.confirm.di.ConfirmRewardDestinationComponent
7978
import io.novafoundation.nova.feature_staking_impl.presentation.staking.rewardDestination.select.di.SelectRewardDestinationComponent
8079
import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.confirm.di.ConfirmMultiStakingComponent
81-
import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.setupStakingType.di.SetupStakingTypeComponent
8280
import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.landing.di.StartStakingLandingComponent
8381
import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.setupAmount.di.SetupAmountMultiStakingComponent
82+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.setupStakingType.di.SetupStakingTypeComponent
8483
import io.novafoundation.nova.feature_staking_impl.presentation.staking.unbond.confirm.di.ConfirmUnbondComponent
8584
import io.novafoundation.nova.feature_staking_impl.presentation.staking.unbond.select.di.SelectUnbondComponent
8685
import io.novafoundation.nova.feature_staking_impl.presentation.story.di.StoryComponent
86+
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.confirm.di.ConfirmChangeValidatorsComponent
87+
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.confirm.nominations.di.ConfirmNominationsComponent
8788
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.custom.review.di.ReviewCustomValidatorsComponent
8889
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.custom.search.di.SearchCustomValidatorsComponent
8990
import io.novafoundation.nova.feature_staking_impl.presentation.validators.change.custom.select.di.SelectCustomValidatorsComponent
@@ -249,6 +250,8 @@ interface StakingFeatureComponent : StakingFeatureApi {
249250

250251
fun selectMythosSettingsFactory(): SelectMythCollatorSettingsComponent.Factory
251252

253+
fun confirmStartMythosStakingFactory(): ConfirmStartMythosStakingComponent.Factory
254+
252255
@Component.Factory
253256
interface Factory {
254257

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/staking/mythos/MythosBindsModule.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import dagger.Module
55
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.MythosCandidatesRepository
66
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.MythosSessionRepository
77
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.MythosStakingRepository
8+
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.MythosUserStakeRepository
89
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.RealMythosCandidatesRepository
910
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.RealMythosSessionRepository
1011
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.RealMythosStakingRepository
11-
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.RealUserStakeRepository
12-
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.UserStakeRepository
12+
import io.novafoundation.nova.feature_staking_impl.data.mythos.repository.RealMythosUserStakeRepository
13+
import io.novafoundation.nova.feature_staking_impl.domain.common.RealStakingBlockNumberUseCase
14+
import io.novafoundation.nova.feature_staking_impl.domain.common.StakingBlockNumberUseCase
1315
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.MythosDelegatorStateUseCase
1416
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.RealMythosDelegatorStateUseCase
1517
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.collator.MythosCollatorProvider
@@ -20,12 +22,14 @@ import io.novafoundation.nova.feature_staking_impl.domain.mythos.start.RealStart
2022
import io.novafoundation.nova.feature_staking_impl.domain.mythos.start.StartMythosStakingInteractor
2123
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.common.MythosCollatorFormatter
2224
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.common.RealMythosCollatorFormatter
25+
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.common.validations.MythosStartStakingValidationFailureFormatter
26+
import io.novafoundation.nova.feature_staking_impl.presentation.mythos.start.common.validations.RealMythosStartStakingValidationFailureFormatter
2327

2428
@Module
2529
interface MythosBindsModule {
2630

2731
@Binds
28-
fun bindUserStakeRepository(implementation: RealUserStakeRepository): UserStakeRepository
32+
fun bindUserStakeRepository(implementation: RealMythosUserStakeRepository): MythosUserStakeRepository
2933

3034
@Binds
3135
fun bindStakingRepository(implementation: RealMythosStakingRepository): MythosStakingRepository
@@ -50,4 +54,10 @@ interface MythosBindsModule {
5054

5155
@Binds
5256
fun bindMythosCollatorFormatter(implementation: RealMythosCollatorFormatter): MythosCollatorFormatter
57+
58+
@Binds
59+
fun bindBlockNumberUseCase(implementation: RealStakingBlockNumberUseCase): StakingBlockNumberUseCase
60+
61+
@Binds
62+
fun bindValidationFormatter(implementation: RealMythosStartStakingValidationFailureFormatter): MythosStartStakingValidationFailureFormatter
5363
}

0 commit comments

Comments
 (0)