Skip to content

Commit 35a5bb0

Browse files
authored
Merge pull request #4973 from IntersectMBO/lehins/export-previously-internal-parts
Make `MemoBytes` interface safe
2 parents 0627e36 + e20d523 commit 35a5bb0

File tree

45 files changed

+535
-671
lines changed

Some content is hidden

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

45 files changed

+535
-671
lines changed

eras/allegra/impl/CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
# Version history for `cardano-ledger-allegra`
22

3-
## 1.7.0.1
3+
## 1.8.0.0
44

5-
*
5+
* Expose access to `AllegraTxBodyRaw` and `TimelockRaw`
6+
* Expose constructor `MkAllegraTxBody` and `MkTimelock`
7+
* Deprecate `TimelockConstr`
8+
* Rename `atbrTxFee` to `atbrFee` for consistency
69

710
## 1.7.0.0
811

eras/allegra/impl/cardano-ledger-allegra.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 3.0
22
name: cardano-ledger-allegra
3-
version: 1.7.0.1
3+
version: 1.8.0.0
44
license: Apache-2.0
55
maintainer: operations@iohk.io
66
author: IOHK

eras/allegra/impl/src/Cardano/Ledger/Allegra/Scripts.hs

Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
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)
8684
import Cardano.Ledger.Shelley.Scripts (
8785
ShelleyEraScript (..),
8886
nativeMultiSigTag,
@@ -97,6 +95,7 @@ import Data.Aeson (ToJSON (..), (.=))
9795
import qualified Data.Aeson as Aeson
9896
import Data.ByteString.Lazy (fromStrict)
9997
import Data.ByteString.Short (fromShort)
98+
import Data.Foldable as F (foldl')
10099
import Data.MemPack
101100
import Data.Sequence.Strict as Seq (StrictSeq (Empty, (:<|)))
102101
import qualified Data.Sequence.Strict as SSeq
@@ -137,13 +136,13 @@ instance ToJSON ValidityInterval where
137136
-- ==================================================================
138137

139138
data 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

149148
class 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

183182
instance 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)).
195194
instance 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

207206
instance 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+
227231
instance 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

232236
instance Era era => NoThunks (Timelock era)
233237
instance Era era => EncCBOR (Timelock era)
234238

235239
instance Era era => DecCBOR (Timelock era) where
236-
decCBOR = TimelockConstr <$> decodeMemoized decCBOR
240+
decCBOR = MkTimelock <$> decodeMemoized decCBOR
237241

238242
instance Memoized (Timelock era) where
239243
type RawType (Timelock era) = TimelockRaw era
@@ -244,7 +248,7 @@ instance EqRaw (Timelock era) where
244248
eqRaw = eqTimelockRaw
245249

246250
instance 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

308312
mkRequireSignatureTimelock :: forall era. Era era => KeyHash 'Witness -> Timelock era
309-
mkRequireSignatureTimelock = mkMemoizedEra @era . Signature
313+
mkRequireSignatureTimelock = mkMemoizedEra @era . TimelockSignature
310314
getRequireSignatureTimelock :: Timelock era -> Maybe (KeyHash 'Witness)
311-
getRequireSignatureTimelock (TimelockConstr (Memo (Signature kh) _)) = Just kh
315+
getRequireSignatureTimelock (MkTimelock (Memo (TimelockSignature kh) _)) = Just kh
312316
getRequireSignatureTimelock _ = Nothing
313317

314318
mkRequireAllOfTimelock :: forall era. Era era => StrictSeq (Timelock era) -> Timelock era
315-
mkRequireAllOfTimelock = mkMemoizedEra @era . AllOf
319+
mkRequireAllOfTimelock = mkMemoizedEra @era . TimelockAllOf
316320
getRequireAllOfTimelock :: Timelock era -> Maybe (StrictSeq (Timelock era))
317-
getRequireAllOfTimelock (TimelockConstr (Memo (AllOf ms) _)) = Just ms
321+
getRequireAllOfTimelock (MkTimelock (Memo (TimelockAllOf ms) _)) = Just ms
318322
getRequireAllOfTimelock _ = Nothing
319323

320324
mkRequireAnyOfTimelock :: forall era. Era era => StrictSeq (Timelock era) -> Timelock era
321-
mkRequireAnyOfTimelock = mkMemoizedEra @era . AnyOf
325+
mkRequireAnyOfTimelock = mkMemoizedEra @era . TimelockAnyOf
322326
getRequireAnyOfTimelock :: Timelock era -> Maybe (StrictSeq (Timelock era))
323-
getRequireAnyOfTimelock (TimelockConstr (Memo (AnyOf ms) _)) = Just ms
327+
getRequireAnyOfTimelock (MkTimelock (Memo (TimelockAnyOf ms) _)) = Just ms
324328
getRequireAnyOfTimelock _ = Nothing
325329

326330
mkRequireMOfTimelock :: forall era. Era era => Int -> StrictSeq (Timelock era) -> Timelock era
327-
mkRequireMOfTimelock n = mkMemoizedEra @era . MOfN n
331+
mkRequireMOfTimelock n = mkMemoizedEra @era . TimelockMOf n
328332
getRequireMOfTimelock :: 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)
330334
getRequireMOfTimelock _ = Nothing
331335

332336
mkTimeStartTimelock :: forall era. Era era => SlotNo -> Timelock era
333-
mkTimeStartTimelock = mkMemoizedEra @era . TimeStart
337+
mkTimeStartTimelock = mkMemoizedEra @era . TimelockTimeStart
334338
getTimeStartTimelock :: Timelock era -> Maybe SlotNo
335-
getTimeStartTimelock (TimelockConstr (Memo (TimeStart mslot) _)) = Just mslot
339+
getTimeStartTimelock (MkTimelock (Memo (TimelockTimeStart mslot) _)) = Just mslot
336340
getTimeStartTimelock _ = Nothing
337341

338342
mkTimeExpireTimelock :: forall era. Era era => SlotNo -> Timelock era
339-
mkTimeExpireTimelock = mkMemoizedEra @era . TimeExpire
343+
mkTimeExpireTimelock = mkMemoizedEra @era . TimelockTimeExpire
340344
getTimeExpireTimelock :: Timelock era -> Maybe SlotNo
341-
getTimeExpireTimelock (TimelockConstr (Memo (TimeExpire mslot) _)) = Just mslot
345+
getTimeExpireTimelock (MkTimelock (Memo (TimelockTimeExpire mslot) _)) = Just mslot
342346
getTimeExpireTimelock _ = Nothing
343347

344348
-- =================================================================
@@ -390,13 +394,13 @@ inInterval slot (ValidityInterval (SJust bottom) (SJust top)) =
390394
showTimelock :: AllegraEraScript era => NativeScript era -> String
391395
showTimelock (RequireTimeStart (SlotNo i)) = "(Start >= " ++ show i ++ ")"
392396
showTimelock (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
402406
showTimelock (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

eras/allegra/impl/src/Cardano/Ledger/Allegra/TxBody.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Cardano.Ledger.Allegra.TxBody (
22
AllegraEraTxBody (..),
33
AllegraTxBody (
4+
MkAllegraTxBody,
45
AllegraTxBody,
56
atbAuxDataHash,
67
atbCerts,

eras/allegra/impl/src/Cardano/Ledger/Allegra/TxBody/Internal.hs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
{-# LANGUAGE StandaloneDeriving #-}
1313
{-# LANGUAGE TypeApplications #-}
1414
{-# LANGUAGE TypeFamilies #-}
15-
{-# LANGUAGE TypeOperators #-}
1615
{-# LANGUAGE UndecidableInstances #-}
1716
{-# LANGUAGE UndecidableSuperClasses #-}
1817
{-# LANGUAGE ViewPatterns #-}
@@ -30,7 +29,7 @@
3029
module Cardano.Ledger.Allegra.TxBody.Internal (
3130
AllegraEraTxBody (..),
3231
AllegraTxBody (
33-
..,
32+
MkAllegraTxBody,
3433
AllegraTxBody,
3534
atbAuxDataHash,
3635
atbCerts,
@@ -102,7 +101,7 @@ data AllegraTxBodyRaw ma era = AllegraTxBodyRaw
102101
, atbrOutputs :: !(StrictSeq (TxOut era))
103102
, atbrCerts :: !(StrictSeq (TxCert era))
104103
, atbrWithdrawals :: !Withdrawals
105-
, atbrTxFee :: !Coin
104+
, atbrFee :: !Coin
106105
, atbrValidityInterval :: !ValidityInterval
107106
, atbrUpdate :: !(StrictMaybe (Update era))
108107
, atbrAuxDataHash :: !(StrictMaybe TxAuxDataHash)
@@ -134,10 +133,13 @@ instance (DecCBOR ma, Monoid ma, AllegraEraTxBody era) => DecCBOR (AllegraTxBody
134133
"AllegraTxBodyRaw"
135134
emptyAllegraTxBodyRaw
136135
bodyFields
137-
[(0, "atbrInputs"), (1, "atbrOutputs"), (2, "atbrTxFee")]
136+
[(0, "atbrInputs"), (1, "atbrOutputs"), (2, "atbrFee")]
138137
)
139138

140-
instance AllegraEraTxBody era => DecCBOR (Annotator (AllegraTxBodyRaw () era)) where
139+
instance
140+
(DecCBOR m, Monoid m, AllegraEraTxBody era) =>
141+
DecCBOR (Annotator (AllegraTxBodyRaw m era))
142+
where
141143
decCBOR = pure <$> decCBOR
142144

143145
-- Sparse encodings of AllegraTxBodyRaw, the key values are fixed by backward compatibility
@@ -167,7 +169,7 @@ instance
167169
bodyFields :: (DecCBOR ma, EraTxOut era, EraTxCert era) => Word -> Field (AllegraTxBodyRaw ma era)
168170
bodyFields 0 = field (\x tx -> tx {atbrInputs = x}) From
169171
bodyFields 1 = field (\x tx -> tx {atbrOutputs = x}) From
170-
bodyFields 2 = field (\x tx -> tx {atbrTxFee = x}) From
172+
bodyFields 2 = field (\x tx -> tx {atbrFee = x}) From
171173
bodyFields 3 =
172174
ofield
173175
( \x tx ->
@@ -209,7 +211,7 @@ emptyAllegraTxBodyRaw =
209211
-- ===========================================================================
210212
-- Wrap it all up in a newtype, hiding the insides with a pattern construtor.
211213

212-
newtype AllegraTxBody e = TxBodyConstr (MemoBytes (AllegraTxBodyRaw () e))
214+
newtype AllegraTxBody e = MkAllegraTxBody (MemoBytes (AllegraTxBodyRaw () e))
213215
deriving newtype (SafeToHash, ToCBOR, DecCBOR)
214216

215217
instance Memoized (AllegraTxBody era) where
@@ -279,7 +281,7 @@ pattern AllegraTxBody
279281
, atbrOutputs = atbOutputs
280282
, atbrCerts = atbCerts
281283
, atbrWithdrawals = atbWithdrawals
282-
, atbrTxFee = atbTxFee
284+
, atbrFee = atbTxFee
283285
, atbrValidityInterval = atbValidityInterval
284286
, atbrUpdate = atbUpdate
285287
, atbrAuxDataHash = atbAuxDataHash
@@ -301,7 +303,7 @@ pattern AllegraTxBody
301303
, atbrOutputs = outputs
302304
, atbrCerts = certs
303305
, atbrWithdrawals = withdrawals
304-
, atbrTxFee = txFee
306+
, atbrFee = txFee
305307
, atbrValidityInterval = validityInterval
306308
, atbrUpdate = update
307309
, atbrAuxDataHash = auxDataHash
@@ -326,8 +328,7 @@ instance EraTxBody AllegraEra where
326328
{-# INLINEABLE outputsTxBodyL #-}
327329

328330
feeTxBodyL =
329-
lensMemoRawType @AllegraEra atbrTxFee $
330-
\txBodyRaw fee -> txBodyRaw {atbrTxFee = fee}
331+
lensMemoRawType @AllegraEra atbrFee $ \txBodyRaw fee -> txBodyRaw {atbrFee = fee}
331332
{-# INLINEABLE feeTxBodyL #-}
332333

333334
auxDataHashTxBodyL =

0 commit comments

Comments
 (0)