Skip to content

Commit 9fe2dbd

Browse files
committed
Add Transition datatype to delegation model
1 parent 12ef04a commit 9fe2dbd

File tree

6 files changed

+45
-30
lines changed

6 files changed

+45
-30
lines changed

lib/unit/test/unit/Cardano/Wallet/DB/Store/Delegations/StoreSpec.hs

+16-11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import Cardano.Wallet.DB.Store.Delegations.Store
4242
import Cardano.Wallet.Delegation.Model
4343
( Operation (..)
4444
, Status (..)
45+
, Transition (..)
4546
, status
4647
)
4748
import Cardano.Wallet.Delegation.ModelSpec
@@ -112,16 +113,20 @@ conf =
112113
}
113114

114115
pattern Register :: slot -> Operation slot drep pool
115-
pattern Register i = VoteAndDelegate Nothing Nothing i
116+
pattern Register i = ApplyTransition (VoteAndDelegate Nothing Nothing) i
116117

117118
pattern Delegate :: pool -> slot -> Operation slot drep pool
118-
pattern Delegate p i = VoteAndDelegate Nothing (Just p) i
119+
pattern Delegate p i = ApplyTransition (VoteAndDelegate Nothing (Just p)) i
119120

120121
pattern Vote :: drep -> slot -> Operation slot drep pool
121-
pattern Vote v i = VoteAndDelegate (Just v) Nothing i
122+
pattern Vote v i = ApplyTransition (VoteAndDelegate (Just v) Nothing) i
123+
124+
pattern Deregister' :: slot -> Operation slot drep pool
125+
pattern Deregister' i = ApplyTransition (VoteAndDelegate Nothing Nothing) i
122126

123127
pattern DelegateAndVote :: pool -> drep -> slot -> Operation slot drep pool
124-
pattern DelegateAndVote p v i = VoteAndDelegate (Just v) (Just p) i
128+
pattern DelegateAndVote p v i
129+
= ApplyTransition (VoteAndDelegate (Just v) (Just p)) i
125130

126131
pattern Registered :: Status drep pool
127132
pattern Registered = Active Nothing Nothing
@@ -151,20 +156,20 @@ units = withInitializedWalletProp $ \_ runQ -> do
151156
runQ $ unitTestStore mempty mkStoreDelegations $ do
152157
unit "reg-dereg" $ do
153158
applyS $ Register 0
154-
applyS $ Deregister 0
159+
applyS $ Deregister' 0
155160
observeStatus 0 Inactive
156161
unit "reg-dereg, different time" $ do
157162
applyS $ Register 0
158163
observeStatus 0 Registered
159-
applyS $ Deregister 1
164+
applyS $ Deregister' 1
160165
observeStatus 0 Registered
161166
observeStatus 1 Inactive
162167
unit "dereg-reg" $ do
163-
applyS $ Deregister 0
168+
applyS $ Deregister' 0
164169
applyS $ Register 0
165170
observeStatus 0 Registered
166171
unit "dereg-reg different time" $ do
167-
applyS $ Deregister 0
172+
applyS $ Deregister' 0
168173
applyS $ Register 1
169174
observeStatus 1 Registered
170175
unit "reg-deleg" $ do
@@ -184,7 +189,7 @@ units = withInitializedWalletProp $ \_ runQ -> do
184189
unit "reg-deleg-dereg" $ do
185190
applyS $ Register 0
186191
applyS $ Delegate p0 0
187-
applyS $ Deregister 1
192+
applyS $ Deregister' 1
188193
observeStatus 2 Inactive
189194
unit "reg-vote" $ do
190195
applyS $ Register 0
@@ -203,7 +208,7 @@ units = withInitializedWalletProp $ \_ runQ -> do
203208
unit "reg-vote-dereg" $ do
204209
applyS $ Register 0
205210
applyS $ Vote v0 0
206-
applyS $ Deregister 1
211+
applyS $ Deregister' 1
207212
observeStatus 2 Inactive
208213
unit "reg-deleg-and-vote" $ do
209214
applyS $ Register 0
@@ -222,7 +227,7 @@ units = withInitializedWalletProp $ \_ runQ -> do
222227
unit "reg-deleg-and-vote-dereg" $ do
223228
applyS $ Register 0
224229
applyS $ DelegateAndVote p0 v0 0
225-
applyS $ Deregister 1
230+
applyS $ Deregister' 1
226231
observeStatus 2 Inactive
227232
unit "reg-deleg-then-vote" $ do
228233
applyS $ Register 0

lib/unit/test/unit/Cardano/Wallet/Delegation/ModelSpec.hs

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import Cardano.Wallet.Delegation.Model
2222
( History
2323
, Operation (..)
2424
, Status (Active)
25+
, Transition (..)
2526
)
2627
import Cardano.Wallet.Delegation.Properties
2728
( Step (Step)
@@ -89,9 +90,9 @@ genDelta c h = do
8990
pool <- genPool c h
9091
drep <- genRep c h
9192
elements
92-
[ VoteAndDelegate (Just drep) (Just pool) slot
93-
, VoteAndDelegate Nothing (Just pool) slot
94-
, VoteAndDelegate (Just drep) Nothing slot
93+
[ ApplyTransition (VoteAndDelegate (Just drep) (Just pool)) slot
94+
, ApplyTransition (VoteAndDelegate Nothing (Just pool)) slot
95+
, ApplyTransition (VoteAndDelegate (Just drep) Nothing) slot
9596
, Rollback slot
9697
]
9798

lib/wallet/src/Cardano/Wallet/DB/Store/Delegations/Layer.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import Cardano.Wallet.DB.Store.Delegations.Model
2525
import Cardano.Wallet.Delegation.Model
2626
( Operation (..)
2727
, Status (..)
28+
, Transition (..)
2829
)
2930
import Cardano.Wallet.Primitive.Slotting
3031
( TimeInterpreter
@@ -87,8 +88,9 @@ putDelegationCertificate
8788
-> SlotNo
8889
-> DeltaDelegations
8990
putDelegationCertificate cert sl = case cert of
90-
CertDelegateNone _ -> Deregister sl
91-
CertVoteAndDelegate _ pool drep -> VoteAndDelegate drep pool sl
91+
CertDelegateNone _ -> ApplyTransition Deregister sl
92+
CertVoteAndDelegate _ pool drep -> ApplyTransition
93+
(VoteAndDelegate drep pool) sl
9294

9395
-- | Arguments to 'readDelegation'.
9496
data CurrentEpochSlotting = CurrentEpochSlotting

lib/wallet/src/Cardano/Wallet/DB/Store/Delegations/Model.hs

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Cardano.Pool.Types
1515
import Cardano.Wallet.Delegation.Model
1616
( History
1717
, Operation (..)
18+
, Transition (..)
1819
)
1920
import Cardano.Wallet.Primitive.Types
2021
( SlotNo
@@ -35,8 +36,8 @@ type DeltaDelegations = Operation SlotNo DRep PoolId
3536

3637
instance Buildable DeltaDelegations where
3738
build = \case
38-
Deregister slot -> "Deregister " <> build slot
39-
VoteAndDelegate vote pool slot ->
39+
ApplyTransition Deregister slot -> "Deregister " <> build slot
40+
ApplyTransition (VoteAndDelegate vote pool) slot ->
4041
"Delegate " <> build pool
4142
<> " and vote "<> build vote <> " " <> build slot
4243
Rollback slot -> "Rollback " <> build slot

lib/wallet/src/Cardano/Wallet/Delegation/Model.hs

+15-10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
-- Data types that represents a history of delegations and its changes.
88
module Cardano.Wallet.Delegation.Model
99
( Operation (..)
10+
, Transition (..)
1011
, slotOf
1112
, Status (..)
1213
, History
@@ -27,18 +28,21 @@ import Data.Map.Strict
2728

2829
import qualified Data.Map.Strict as Map
2930

31+
data Transition drep pool
32+
= VoteAndDelegate (Maybe drep) (Maybe pool)
33+
| Deregister
34+
deriving (Show)
35+
3036
-- | Delta type for the delegation 'History'.
3137
data Operation slot drep pool
32-
= VoteAndDelegate (Maybe drep) (Maybe pool) slot
33-
| Deregister slot
38+
= ApplyTransition (Transition drep pool) slot
3439
| Rollback slot
3540
deriving (Show)
3641

3742
-- | Target slot of each 'Operation'.
3843
slotOf :: Operation slot drep pool -> slot
39-
slotOf (Deregister x) = x
4044
slotOf (Rollback x) = x
41-
slotOf (VoteAndDelegate _ _ x) = x
45+
slotOf (ApplyTransition _ x) = x
4246

4347
-- | Valid state for the delegations, independent of time.
4448
data Status drep pool
@@ -56,16 +60,17 @@ instance (Ord slot, Eq pool, Eq drep) => Delta (Operation slot drep pool) where
5660
slot = slotOf r
5761
hist' = cut (< slot) hist
5862
miss = status slot hist'
59-
wanted = transition r $ status slot hist
63+
wanted = case r of
64+
ApplyTransition t _ -> applyTransition t $ status slot hist
65+
Rollback _ -> status slot hist
6066

61-
transition :: Operation slot drep pool -> Status drep pool -> Status drep pool
62-
transition (Deregister _) _ = Inactive
63-
transition (VoteAndDelegate d p _) (Active d' p') = Active d'' p''
67+
applyTransition :: Transition drep pool -> Status drep pool -> Status drep pool
68+
applyTransition Deregister _ = Inactive
69+
applyTransition (VoteAndDelegate d p) (Active d' p') = Active d'' p''
6470
where
6571
d'' = insertIfJust d d'
6672
p'' = insertIfJust p p'
67-
transition (VoteAndDelegate d p _) _ = Active d p
68-
transition _ s = s
73+
applyTransition (VoteAndDelegate d p) _ = Active d p
6974

7075
insertIfJust :: Maybe a -> Maybe a -> Maybe a
7176
insertIfJust (Just y) _ = Just y

lib/wallet/src/Cardano/Wallet/Delegation/Properties.hs

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import Cardano.Wallet.Delegation.Model
2020
( History
2121
, Operation (..)
2222
, Status (..)
23+
, Transition (..)
2324
, slotOf
2425
, status
2526
)
@@ -88,15 +89,15 @@ properties genSlot step =
8889
$ property' genSlot step
8990
$ precond cond target
9091
in case delta_ step of
91-
Deregister _ ->
92+
ApplyTransition Deregister _ ->
9293
that "deregister invariant is respected"
9394
$ prop
9495
( \case
9596
Active _ _ -> (True, Nothing)
9697
_ -> (False, Nothing)
9798
)
9899
(const Inactive)
99-
VoteAndDelegate v p _ -> do
100+
ApplyTransition (VoteAndDelegate v p) _ -> do
100101
that "delegate and/or vote invariant is respected"
101102
$ prop
102103
( \case

0 commit comments

Comments
 (0)