1111module Cardano.Api.Experimental.Plutus.Internal.Script
1212 ( AnyPlutusScript (.. )
1313 , decodeAnyPlutusScript
14+ , serialiseAnyPlutusScriptToTextEnvelope
15+ , deserialiseAnyPlutusScriptFromTextEnvelope
1416 , AnyPlutusScriptLanguage (.. )
1517 , PlutusScriptInEra (.. )
1618 , PlutusScriptOrReferenceInput (.. )
@@ -115,8 +117,11 @@ instance
115117 )
116118 => SerialiseAsCBOR (PlutusScriptInEra (lang :: L. Language ) era )
117119 where
120+ -- The 'PlutusBinary' stored in the 'PlutusRunnable' already contains
121+ -- CBOR-wrapped Flat-encoded UPLC bytes (see 'Cardano.Ledger.Plutus.Language'),
122+ -- so we extract them directly rather than re-encoding with 'L.serialize''.
118123 serialiseToCBOR (PlutusScriptInEra s) =
119- L. serialize' ( L. eraProtVerHigh @ era ) s
124+ SBS. fromShort . L. unPlutusBinary . L. plutusBinary $ L. plutusFromRunnable s
120125
121126 deserialiseFromCBOR _ bs = do
122127 let v = L. eraProtVerHigh @ era
@@ -179,6 +184,15 @@ data AnyPlutusScript era where
179184 :: (L. Era era , Typeable lang , L. PlutusLanguage lang )
180185 => PlutusScriptInEra lang era -> AnyPlutusScript era
181186
187+ instance Show (AnyPlutusScript era ) where
188+ show (AnyPlutusScript ps) = " AnyPlutusScript " ++ show ps
189+
190+ instance Eq (AnyPlutusScript era ) where
191+ AnyPlutusScript (ps1 :: PlutusScriptInEra lang1 era ) == AnyPlutusScript (ps2 :: PlutusScriptInEra lang2 era ) =
192+ case eqT @ lang1 @ lang2 of
193+ Just Refl -> ps1 == ps2
194+ Nothing -> False
195+
182196decodeAnyPlutusScript
183197 :: L. Era era
184198 => ByteString
@@ -201,3 +215,32 @@ data AnyPlutusScriptLanguage where
201215 AnyPlutusScriptLanguage
202216 :: L. PlutusLanguage lang
203217 => L. SLanguage lang -> AnyPlutusScriptLanguage
218+
219+ -- | Serialise an 'AnyPlutusScript' to a 'TextEnvelope'. The text envelope type
220+ -- is determined by the Plutus language version of the script.
221+ serialiseAnyPlutusScriptToTextEnvelope
222+ :: Maybe TextEnvelopeDescr -> AnyPlutusScript era -> TextEnvelope
223+ serialiseAnyPlutusScriptToTextEnvelope mbDescr (AnyPlutusScript script) =
224+ obtainLangConstraints (plutusScriptInEraSLanguage script) $
225+ serialiseToTextEnvelope mbDescr script
226+
227+ -- | Deserialise an 'AnyPlutusScript' from a 'TextEnvelope'. The text envelope type
228+ -- is matched against all known Plutus language versions derived from
229+ -- 'Plutus.nonNativeLanguages', so new language versions are picked up automatically.
230+ deserialiseAnyPlutusScriptFromTextEnvelope
231+ :: forall era
232+ . L. Era era
233+ => TextEnvelope
234+ -> Either TextEnvelopeError (AnyPlutusScript era )
235+ deserialiseAnyPlutusScriptFromTextEnvelope =
236+ deserialiseFromTextEnvelopeAnyOf textEnvTypes
237+ where
238+ textEnvTypes :: [FromSomeType HasTextEnvelope (AnyPlutusScript era )]
239+ textEnvTypes =
240+ map
241+ ( \ l ->
242+ Plutus. withSLanguage l $ \ (slang :: Plutus. SLanguage l ) ->
243+ obtainLangConstraints slang $
244+ FromSomeType (asType @ (PlutusScriptInEra l era )) AnyPlutusScript
245+ )
246+ Plutus. nonNativeLanguages
0 commit comments