44{-# LANGUAGE FlexibleContexts #-}
55{-# LANGUAGE FlexibleInstances #-}
66{-# LANGUAGE MultiParamTypeClasses #-}
7+ {-# LANGUAGE OverloadedStrings #-}
78{-# LANGUAGE PolyKinds #-}
89{-# LANGUAGE ScopedTypeVariables #-}
910{-# LANGUAGE TypeApplications #-}
@@ -43,6 +44,10 @@ module Cardano.Ledger.Core (
4344 EraPParams (.. ),
4445 mkCoinTxOut ,
4546 wireSizeTxF ,
47+ binaryUpgradeTx ,
48+ binaryUpgradeTxBody ,
49+ binaryUpgradeTxWits ,
50+ binaryUpgradeTxAuxData ,
4651
4752 -- * Era
4853 module Cardano.Ledger.Core.Era ,
@@ -76,6 +81,7 @@ import Cardano.Ledger.Binary (
7681 Annotator ,
7782 DecCBOR ,
7883 DecShareCBOR (Share ),
84+ DecoderError ,
7985 EncCBOR (.. ),
8086 EncCBORGroup ,
8187 Interns ,
@@ -85,6 +91,7 @@ import Cardano.Ledger.Binary (
8591 mkSized ,
8692 serialize ,
8793 serialize' ,
94+ translateViaCBORAnnotator ,
8895 )
8996import Cardano.Ledger.Coin (Coin )
9097import Cardano.Ledger.Compactible (Compactible (.. ))
@@ -102,6 +109,7 @@ import Cardano.Ledger.Rewards (Reward (..), RewardType (..))
102109import Cardano.Ledger.TxIn (TxId (.. ), TxIn (.. ))
103110import Cardano.Ledger.Val (Val (.. ), inject )
104111import Control.DeepSeq (NFData )
112+ import Control.Monad.Except (Except )
105113import Data.Aeson (ToJSON )
106114import qualified Data.ByteString as BS
107115import qualified Data.ByteString.Lazy as LBS
@@ -114,6 +122,8 @@ import Data.MemPack
114122import Data.Sequence.Strict (StrictSeq )
115123import Data.Set (Set )
116124import qualified Data.Set as Set
125+ import Data.Text (Text )
126+ import qualified Data.Text as T
117127import Data.Word (Word32 , Word64 )
118128import GHC.Stack (HasCallStack )
119129import Lens.Micro
@@ -611,3 +621,38 @@ wireSizeTxF =
611621 then fromIntegral n
612622 else error $ " Impossible: Size of the transaction is too big: " ++ show n
613623{-# INLINEABLE wireSizeTxF #-}
624+
625+ -- | Translate a transaction through its binary representation from previous to current era.
626+ binaryUpgradeTx ::
627+ forall era .
628+ (Era era , ToCBOR (Tx (PreviousEra era )), DecCBOR (Annotator (Tx era ))) =>
629+ Tx (PreviousEra era ) ->
630+ Except DecoderError (Tx era )
631+ binaryUpgradeTx = translateViaCBORAnnotator (eraProtVerLow @ era ) (withEraName @ era " Tx" )
632+
633+ -- | Translate a tx body through its binary representation from previous to current era.
634+ binaryUpgradeTxBody ::
635+ forall era .
636+ (Era era , ToCBOR (TxBody (PreviousEra era )), DecCBOR (Annotator (TxBody era ))) =>
637+ TxBody (PreviousEra era ) ->
638+ Except DecoderError (TxBody era )
639+ binaryUpgradeTxBody = translateViaCBORAnnotator (eraProtVerLow @ era ) (withEraName @ era " TxBody" )
640+
641+ -- | Translate tx witnesses through its binary representation from previous to current era.
642+ binaryUpgradeTxWits ::
643+ forall era .
644+ (Era era , ToCBOR (TxWits (PreviousEra era )), DecCBOR (Annotator (TxWits era ))) =>
645+ TxWits (PreviousEra era ) ->
646+ Except DecoderError (TxWits era )
647+ binaryUpgradeTxWits = translateViaCBORAnnotator (eraProtVerLow @ era ) (withEraName @ era " TxWits" )
648+
649+ -- | Translate tx auxData through its binary representation from previous to current era.
650+ binaryUpgradeTxAuxData ::
651+ forall era .
652+ (Era era , ToCBOR (TxAuxData (PreviousEra era )), DecCBOR (Annotator (TxAuxData era ))) =>
653+ TxAuxData (PreviousEra era ) ->
654+ Except DecoderError (TxAuxData era )
655+ binaryUpgradeTxAuxData = translateViaCBORAnnotator (eraProtVerLow @ era ) (withEraName @ era " TxAuxData" )
656+
657+ withEraName :: forall era . Era era => Text -> Text
658+ withEraName t = t <> " " <> T. pack (eraName @ era ) <> " Era"
0 commit comments