Skip to content

Commit d50863b

Browse files
committed
Add serialisation instances for PlutusScriptInEra
1 parent 38ac9f8 commit d50863b

File tree

1 file changed

+52
-2
lines changed
  • cardano-api/src/Cardano/Api/Experimental/Plutus/Internal

1 file changed

+52
-2
lines changed

cardano-api/src/Cardano/Api/Experimental/Plutus/Internal/Script.hs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
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

1011
module Cardano.Api.Experimental.Plutus.Internal.Script
1112
( PlutusScriptInEra (..)
@@ -16,13 +17,24 @@ module Cardano.Api.Experimental.Plutus.Internal.Script
1617
)
1718
where
1819

20+
import Cardano.Api.HasTypeProxy
1921
import 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
2025
import Cardano.Api.Tx.Internal.TxIn (TxIn)
2126

27+
import Cardano.Binary qualified as CBOR
28+
import Cardano.Ledger.Core qualified as L
2229
import Cardano.Ledger.Plutus.Language (PlutusRunnable)
2330
import 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

4860
deriving 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+
50100
plutusScriptInEraSLanguage
51101
:: forall lang era. L.PlutusLanguage lang => PlutusScriptInEra lang era -> L.SLanguage lang
52102
plutusScriptInEraSLanguage (PlutusScriptInEra _) =

0 commit comments

Comments
 (0)