11{-# LANGUAGE DataKinds #-}
22{-# LANGUAGE FlexibleContexts #-}
33{-# LANGUAGE GADTs #-}
4- {-# LANGUAGE KindSignatures #-}
54{-# LANGUAGE RankNTypes #-}
65{-# LANGUAGE ScopedTypeVariables #-}
76{-# LANGUAGE StandaloneDeriving #-}
87{-# LANGUAGE TypeApplications #-}
8+ {-# LANGUAGE TypeFamilies #-}
9+ {-# LANGUAGE UndecidableInstances #-}
910
1011module Cardano.Api.Experimental.Plutus.Internal.Script
1112 ( PlutusScriptInEra (.. )
@@ -16,13 +17,24 @@ module Cardano.Api.Experimental.Plutus.Internal.Script
1617 )
1718where
1819
20+ import Cardano.Api.HasTypeProxy
1921import Cardano.Api.Ledger.Internal.Reexport qualified as L
22+ import Cardano.Api.Plutus.Internal.Script (removePlutusScriptDoubleEncoding )
23+ import Cardano.Api.Serialise.Cbor
24+ import Cardano.Api.Serialise.TextEnvelope.Internal
2025import Cardano.Api.Tx.Internal.TxIn (TxIn )
2126
27+ import Cardano.Binary qualified as CBOR
28+ import Cardano.Ledger.Core qualified as L
2229import Cardano.Ledger.Plutus.Language (PlutusRunnable )
2330import Cardano.Ledger.Plutus.Language qualified as L
31+ import Cardano.Ledger.Plutus.Language qualified as Plutus
2432
25- import Data.Proxy
33+ import Data.ByteString.Lazy qualified as LBS
34+ import Data.ByteString.Short qualified as SBS
35+ import Data.Text qualified as Text
36+ import Data.Typeable
37+ import Prettyprinter
2638
2739-- | A Plutus script in a particular era.
2840-- Why PlutusRunnable? Mainly for deserialization benefits.
@@ -47,6 +59,44 @@ deriving instance Show (PlutusScriptInEra lang era)
4759
4860deriving instance Eq (PlutusScriptInEra lang era )
4961
62+ instance (Typeable era , Typeable lang ) => HasTypeProxy (PlutusScriptInEra lang era ) where
63+ data AsType (PlutusScriptInEra lang era ) = AsPlutusScriptInEra
64+ proxyToAsType _ = AsPlutusScriptInEra
65+
66+ instance
67+ (Plutus. PlutusLanguage lang , L. Era era )
68+ => HasTextEnvelope (PlutusScriptInEra lang era )
69+ where
70+ textEnvelopeType _ =
71+ case L. plutusLanguage (Proxy @ lang ) of
72+ L. PlutusV1 -> " PlutusScriptV1"
73+ L. PlutusV2 -> " PlutusScriptV2"
74+ L. PlutusV3 -> " PlutusScriptV3"
75+ L. PlutusV4 -> " PlutusScriptV4"
76+
77+ instance
78+ ( L. Era era
79+ , Typeable era
80+ , Typeable lang
81+ , Plutus. PlutusLanguage lang
82+ )
83+ => SerialiseAsCBOR (PlutusScriptInEra (lang :: L. Language ) era )
84+ where
85+ serialiseToCBOR (PlutusScriptInEra s) =
86+ L. serialize' (L. eraProtVerHigh @ era ) s
87+
88+ deserialiseFromCBOR _ bs = do
89+ let v = L. eraProtVerLow @ era
90+ scriptShortBs = SBS. toShort $ removePlutusScriptDoubleEncoding $ LBS. fromStrict bs
91+ let plutusScript :: Plutus. Plutus lang
92+ plutusScript = L. Plutus $ L. PlutusBinary scriptShortBs
93+
94+ case Plutus. decodePlutusRunnable v plutusScript of
95+ Left e ->
96+ Left $
97+ CBOR. DecoderErrorCustom " PlutusLedgerApi.Common.ScriptDecodeError" (Text. pack . show $ pretty e)
98+ Right s -> Right $ PlutusScriptInEra s
99+
50100plutusScriptInEraSLanguage
51101 :: forall lang era . L. PlutusLanguage lang => PlutusScriptInEra lang era -> L. SLanguage lang
52102plutusScriptInEraSLanguage (PlutusScriptInEra _) =
0 commit comments