1414{-# LANGUAGE StandaloneDeriving #-}
1515{-# LANGUAGE TypeApplications #-}
1616{-# LANGUAGE TypeFamilies #-}
17- {-# LANGUAGE TypeOperators #-}
1817{-# LANGUAGE UndecidableInstances #-}
1918{-# LANGUAGE UndecidableSuperClasses #-}
2019{-# LANGUAGE ViewPatterns #-}
@@ -34,11 +33,10 @@ module Cardano.Ledger.Allegra.Scripts (
3433 getTimeStartTimelock ,
3534 mkTimeExpireTimelock ,
3635 getTimeExpireTimelock ,
37- Timelock ,
36+ Timelock ( MkTimelock , TimelockConstr ) ,
3837 pattern RequireTimeExpire ,
3938 pattern RequireTimeStart ,
40- TimelockRaw ,
41- pattern TimelockConstr ,
39+ TimelockRaw (.. ),
4240 inInterval ,
4341 showTimelock ,
4442 evalTimelock ,
@@ -78,11 +76,11 @@ import Cardano.Ledger.MemoBytes (
7876 byteCountMemoBytes ,
7977 decodeMemoized ,
8078 getMemoRawType ,
81- mkMemoBytes ,
8279 mkMemoizedEra ,
8380 packMemoBytesM ,
8481 unpackMemoBytesM ,
8582 )
83+ import Cardano.Ledger.MemoBytes.Internal (mkMemoBytes )
8684import Cardano.Ledger.Shelley.Scripts (
8785 ShelleyEraScript (.. ),
8886 nativeMultiSigTag ,
@@ -97,6 +95,7 @@ import Data.Aeson (ToJSON (..), (.=))
9795import qualified Data.Aeson as Aeson
9896import Data.ByteString.Lazy (fromStrict )
9997import Data.ByteString.Short (fromShort )
98+ import Data.Foldable as F (foldl' )
10099import Data.MemPack
101100import Data.Sequence.Strict as Seq (StrictSeq (Empty , (:<|) ))
102101import qualified Data.Sequence.Strict as SSeq
@@ -137,13 +136,13 @@ instance ToJSON ValidityInterval where
137136-- ==================================================================
138137
139138data TimelockRaw era
140- = Signature ! (KeyHash 'Witness)
141- | AllOf ! (StrictSeq (Timelock era )) -- NOTE that Timelock and
142- | AnyOf ! (StrictSeq (Timelock era )) -- TimelockRaw are mutually recursive.
143- | MOfN ! Int ! (StrictSeq (Timelock era ))
144- | -- Note that the Int may be negative in which case (MOfN (-2) [..]) is always True
145- TimeStart ! SlotNo -- The start time
146- | TimeExpire ! SlotNo -- The time it expires
139+ = TimelockSignature ! (KeyHash 'Witness)
140+ | TimelockAllOf ! (StrictSeq (Timelock era )) -- NOTE that Timelock and
141+ | TimelockAnyOf ! (StrictSeq (Timelock era )) -- TimelockRaw are mutually recursive.
142+ | TimelockMOf ! Int ! (StrictSeq (Timelock era ))
143+ | -- Note that the Int may be negative in which case (TimelockMOf (-2) [..]) is always True
144+ TimelockTimeStart ! SlotNo -- The start time
145+ | TimelockTimeExpire ! SlotNo -- The time it expires
147146 deriving (Eq , Generic , NFData )
148147
149148class ShelleyEraScript era => AllegraEraScript era where
@@ -167,51 +166,51 @@ translateTimelock ::
167166 ) =>
168167 Timelock era1 ->
169168 Timelock era2
170- translateTimelock (TimelockConstr (Memo tl bs)) =
171- let rewrap rtl = TimelockConstr $ mkMemoBytes rtl (fromStrict $ fromShort bs)
169+ translateTimelock (MkTimelock (Memo tl bs)) =
170+ let rewrap rtl = MkTimelock $ mkMemoBytes rtl (fromStrict $ fromShort bs)
172171 in case tl of
173- Signature s -> rewrap $ Signature s
174- AllOf l -> rewrap . AllOf $ translateTimelock <$> l
175- AnyOf l -> rewrap . AnyOf $ translateTimelock <$> l
176- MOfN n l -> rewrap $ MOfN n (translateTimelock <$> l)
177- TimeStart x -> rewrap $ TimeStart x
178- TimeExpire x -> rewrap $ TimeExpire x
172+ TimelockSignature s -> rewrap $ TimelockSignature s
173+ TimelockAllOf l -> rewrap . TimelockAllOf $ translateTimelock <$> l
174+ TimelockAnyOf l -> rewrap . TimelockAnyOf $ translateTimelock <$> l
175+ TimelockMOf n l -> rewrap $ TimelockMOf n (translateTimelock <$> l)
176+ TimelockTimeStart x -> rewrap $ TimelockTimeStart x
177+ TimelockTimeExpire x -> rewrap $ TimelockTimeExpire x
179178
180179-- These coding choices are chosen so that a MultiSig script
181180-- can be deserialised as a Timelock script
182181
183182instance Era era => EncCBOR (TimelockRaw era ) where
184183 encCBOR =
185184 encode . \ case
186- Signature hash -> Sum Signature 0 !> To hash
187- AllOf xs -> Sum AllOf 1 !> To xs
188- AnyOf xs -> Sum AnyOf 2 !> To xs
189- MOfN m xs -> Sum MOfN 3 !> To m !> To xs
190- TimeStart m -> Sum TimeStart 4 !> To m
191- TimeExpire m -> Sum TimeExpire 5 !> To m
185+ TimelockSignature hash -> Sum TimelockSignature 0 !> To hash
186+ TimelockAllOf xs -> Sum TimelockAllOf 1 !> To xs
187+ TimelockAnyOf xs -> Sum TimelockAnyOf 2 !> To xs
188+ TimelockMOf m xs -> Sum TimelockMOf 3 !> To m !> To xs
189+ TimelockTimeStart m -> Sum TimelockTimeStart 4 !> To m
190+ TimelockTimeExpire m -> Sum TimelockTimeExpire 5 !> To m
192191
193192-- This instance allows us to derive instance DecCBOR (Annotator (Timelock era)).
194193-- Since Timelock is a newtype around (Memo (Timelock era)).
195194instance Era era => DecCBOR (Annotator (TimelockRaw era )) where
196195 decCBOR = decode (Summands " TimelockRaw" decRaw)
197196 where
198197 decRaw :: Word -> Decode 'Open (Annotator (TimelockRaw era ))
199- decRaw 0 = Ann (SumD Signature <! From )
200- decRaw 1 = Ann (SumD AllOf ) <*! D (sequence <$> decCBOR)
201- decRaw 2 = Ann (SumD AnyOf ) <*! D (sequence <$> decCBOR)
202- decRaw 3 = Ann (SumD MOfN ) <*! Ann From <*! D (sequence <$> decCBOR)
203- decRaw 4 = Ann (SumD TimeStart <! From )
204- decRaw 5 = Ann (SumD TimeExpire <! From )
198+ decRaw 0 = Ann (SumD TimelockSignature <! From )
199+ decRaw 1 = Ann (SumD TimelockAllOf ) <*! D (sequence <$> decCBOR)
200+ decRaw 2 = Ann (SumD TimelockAnyOf ) <*! D (sequence <$> decCBOR)
201+ decRaw 3 = Ann (SumD TimelockMOf ) <*! Ann From <*! D (sequence <$> decCBOR)
202+ decRaw 4 = Ann (SumD TimelockTimeStart <! From )
203+ decRaw 5 = Ann (SumD TimelockTimeExpire <! From )
205204 decRaw n = Invalid n
206205
207206instance Era era => DecCBOR (TimelockRaw era ) where
208207 decCBOR = decode $ Summands " TimelockRaw" $ \ case
209- 0 -> SumD Signature <! From
210- 1 -> SumD AllOf <! From
211- 2 -> SumD AnyOf <! From
212- 3 -> SumD MOfN <! From <! From
213- 4 -> SumD TimeStart <! From
214- 5 -> SumD TimeExpire <! From
208+ 0 -> SumD TimelockSignature <! From
209+ 1 -> SumD TimelockAllOf <! From
210+ 2 -> SumD TimelockAnyOf <! From
211+ 3 -> SumD TimelockMOf <! From <! From
212+ 4 -> SumD TimelockTimeStart <! From
213+ 5 -> SumD TimelockTimeExpire <! From
215214 n -> Invalid n
216215
217216-- =================================================================
@@ -220,20 +219,25 @@ instance Era era => DecCBOR (TimelockRaw era) where
220219-- They rely on memoBytes, and TimelockRaw to memoize each constructor of Timelock
221220-- =================================================================
222221
223- newtype Timelock era = TimelockConstr (MemoBytes (TimelockRaw era ))
222+ newtype Timelock era = MkTimelock (MemoBytes (TimelockRaw era ))
224223 deriving (Eq , Generic )
225224 deriving newtype (ToCBOR , NFData , SafeToHash )
226225
226+ pattern TimelockConstr :: MemoBytes (TimelockRaw era ) -> Timelock era
227+ pattern TimelockConstr timelockRaw = MkTimelock timelockRaw
228+ {-# COMPLETE TimelockConstr #-}
229+ {-# DEPRECATED TimelockConstr "In favor of more consistently name `MkTimelock`" #-}
230+
227231instance Era era => MemPack (Timelock era ) where
228- packedByteCount (TimelockConstr mb) = byteCountMemoBytes mb
229- packM (TimelockConstr mb) = packMemoBytesM mb
230- unpackM = TimelockConstr <$> unpackMemoBytesM (eraProtVerLow @ era )
232+ packedByteCount (MkTimelock mb) = byteCountMemoBytes mb
233+ packM (MkTimelock mb) = packMemoBytesM mb
234+ unpackM = MkTimelock <$> unpackMemoBytesM (eraProtVerLow @ era )
231235
232236instance Era era => NoThunks (Timelock era )
233237instance Era era => EncCBOR (Timelock era )
234238
235239instance Era era => DecCBOR (Timelock era ) where
236- decCBOR = TimelockConstr <$> decodeMemoized decCBOR
240+ decCBOR = MkTimelock <$> decodeMemoized decCBOR
237241
238242instance Memoized (Timelock era ) where
239243 type RawType (Timelock era ) = TimelockRaw era
@@ -244,7 +248,7 @@ instance EqRaw (Timelock era) where
244248 eqRaw = eqTimelockRaw
245249
246250instance Era era => DecCBOR (Annotator (Timelock era )) where
247- decCBOR = fmap TimelockConstr <$> decCBOR
251+ decCBOR = fmap MkTimelock <$> decCBOR
248252
249253-- | Since Timelock scripts are a strictly backwards compatible extension of
250254-- MultiSig scripts, we can use the same 'scriptPrefixTag' tag here as we did
@@ -306,39 +310,39 @@ pattern RequireTimeStart mslot <- (getTimeStart -> Just mslot)
306310 #-}
307311
308312mkRequireSignatureTimelock :: forall era . Era era => KeyHash 'Witness -> Timelock era
309- mkRequireSignatureTimelock = mkMemoizedEra @ era . Signature
313+ mkRequireSignatureTimelock = mkMemoizedEra @ era . TimelockSignature
310314getRequireSignatureTimelock :: Timelock era -> Maybe (KeyHash 'Witness)
311- getRequireSignatureTimelock (TimelockConstr (Memo (Signature kh) _)) = Just kh
315+ getRequireSignatureTimelock (MkTimelock (Memo (TimelockSignature kh) _)) = Just kh
312316getRequireSignatureTimelock _ = Nothing
313317
314318mkRequireAllOfTimelock :: forall era . Era era => StrictSeq (Timelock era ) -> Timelock era
315- mkRequireAllOfTimelock = mkMemoizedEra @ era . AllOf
319+ mkRequireAllOfTimelock = mkMemoizedEra @ era . TimelockAllOf
316320getRequireAllOfTimelock :: Timelock era -> Maybe (StrictSeq (Timelock era ))
317- getRequireAllOfTimelock (TimelockConstr (Memo (AllOf ms) _)) = Just ms
321+ getRequireAllOfTimelock (MkTimelock (Memo (TimelockAllOf ms) _)) = Just ms
318322getRequireAllOfTimelock _ = Nothing
319323
320324mkRequireAnyOfTimelock :: forall era . Era era => StrictSeq (Timelock era ) -> Timelock era
321- mkRequireAnyOfTimelock = mkMemoizedEra @ era . AnyOf
325+ mkRequireAnyOfTimelock = mkMemoizedEra @ era . TimelockAnyOf
322326getRequireAnyOfTimelock :: Timelock era -> Maybe (StrictSeq (Timelock era ))
323- getRequireAnyOfTimelock (TimelockConstr (Memo (AnyOf ms) _)) = Just ms
327+ getRequireAnyOfTimelock (MkTimelock (Memo (TimelockAnyOf ms) _)) = Just ms
324328getRequireAnyOfTimelock _ = Nothing
325329
326330mkRequireMOfTimelock :: forall era . Era era => Int -> StrictSeq (Timelock era ) -> Timelock era
327- mkRequireMOfTimelock n = mkMemoizedEra @ era . MOfN n
331+ mkRequireMOfTimelock n = mkMemoizedEra @ era . TimelockMOf n
328332getRequireMOfTimelock :: Timelock era -> Maybe (Int , StrictSeq (Timelock era ))
329- getRequireMOfTimelock (TimelockConstr (Memo (MOfN n ms) _)) = Just (n, ms)
333+ getRequireMOfTimelock (MkTimelock (Memo (TimelockMOf n ms) _)) = Just (n, ms)
330334getRequireMOfTimelock _ = Nothing
331335
332336mkTimeStartTimelock :: forall era . Era era => SlotNo -> Timelock era
333- mkTimeStartTimelock = mkMemoizedEra @ era . TimeStart
337+ mkTimeStartTimelock = mkMemoizedEra @ era . TimelockTimeStart
334338getTimeStartTimelock :: Timelock era -> Maybe SlotNo
335- getTimeStartTimelock (TimelockConstr (Memo (TimeStart mslot) _)) = Just mslot
339+ getTimeStartTimelock (MkTimelock (Memo (TimelockTimeStart mslot) _)) = Just mslot
336340getTimeStartTimelock _ = Nothing
337341
338342mkTimeExpireTimelock :: forall era . Era era => SlotNo -> Timelock era
339- mkTimeExpireTimelock = mkMemoizedEra @ era . TimeExpire
343+ mkTimeExpireTimelock = mkMemoizedEra @ era . TimelockTimeExpire
340344getTimeExpireTimelock :: Timelock era -> Maybe SlotNo
341- getTimeExpireTimelock (TimelockConstr (Memo (TimeExpire mslot) _)) = Just mslot
345+ getTimeExpireTimelock (MkTimelock (Memo (TimelockTimeExpire mslot) _)) = Just mslot
342346getTimeExpireTimelock _ = Nothing
343347
344348-- =================================================================
@@ -390,13 +394,13 @@ inInterval slot (ValidityInterval (SJust bottom) (SJust top)) =
390394showTimelock :: AllegraEraScript era => NativeScript era -> String
391395showTimelock (RequireTimeStart (SlotNo i)) = " (Start >= " ++ show i ++ " )"
392396showTimelock (RequireTimeExpire (SlotNo i)) = " (Expire < " ++ show i ++ " )"
393- showTimelock (RequireAllOf xs) = " (AllOf " ++ foldl accum " )" xs
397+ showTimelock (RequireAllOf xs) = " (AllOf " ++ F. foldl' accum " )" xs
394398 where
395399 accum ans x = showTimelock x ++ " " ++ ans
396- showTimelock (RequireAnyOf xs) = " (AnyOf " ++ foldl accum " )" xs
400+ showTimelock (RequireAnyOf xs) = " (AnyOf " ++ F. foldl' accum " )" xs
397401 where
398402 accum ans x = showTimelock x ++ " " ++ ans
399- showTimelock (RequireMOf m xs) = " (MOf " ++ show m ++ " " ++ foldl accum " )" xs
403+ showTimelock (RequireMOf m xs) = " (MOf " ++ show m ++ " " ++ F. foldl' accum " )" xs
400404 where
401405 accum ans x = showTimelock x ++ " " ++ ans
402406showTimelock (RequireSignature hash) = " (Signature " ++ show hash ++ " )"
@@ -409,10 +413,10 @@ eqTimelockRaw t1 t2 = go (getMemoRawType t1) (getMemoRawType t2)
409413 seqEq Empty Empty = True
410414 seqEq (x :<| xs) (y :<| ys) = eqTimelockRaw x y && seqEq xs ys
411415 seqEq _ _ = False
412- go (Signature kh1) (Signature kh2) = kh1 == kh2
413- go (AllOf ts1) (AllOf ts2) = seqEq ts1 ts2
414- go (AnyOf ts1) (AnyOf ts2) = seqEq ts1 ts2
415- go (MOfN n1 ts1) (MOfN n2 ts2) = n1 == n2 && seqEq ts1 ts2
416- go (TimeStart sn1) (TimeStart sn2) = sn1 == sn2
417- go (TimeExpire sn1) (TimeExpire sn2) = sn1 == sn2
416+ go (TimelockSignature kh1) (TimelockSignature kh2) = kh1 == kh2
417+ go (TimelockAllOf ts1) (TimelockAllOf ts2) = seqEq ts1 ts2
418+ go (TimelockAnyOf ts1) (TimelockAnyOf ts2) = seqEq ts1 ts2
419+ go (TimelockMOf n1 ts1) (TimelockMOf n2 ts2) = n1 == n2 && seqEq ts1 ts2
420+ go (TimelockTimeStart sn1) (TimelockTimeStart sn2) = sn1 == sn2
421+ go (TimelockTimeExpire sn1) (TimelockTimeExpire sn2) = sn1 == sn2
418422 go _ _ = False
0 commit comments