Skip to content

Commit dcc6988

Browse files
authored
Merge pull request #1122 from IntersectMBO/jordan/1088-serialise-as-cbor-any-simple-script
Implement SerialiseAsCBOR and Eq for AnyScript era
2 parents d1aff7b + c0b6e6a commit dcc6988

File tree

5 files changed

+560
-6
lines changed

5 files changed

+560
-6
lines changed

cardano-api/gen/Test/Gen/Cardano/Api/Experimental.hs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
{-# LANGUAGE DataKinds #-}
22

33
module Test.Gen.Cardano.Api.Experimental
4-
( genScriptWitnessedTxCertificates
4+
( genAnyScript
5+
, genScriptWitnessedTxCertificates
56
, genScriptWitnessedTxIn
67
, genScriptWitnessedTxMintValue
78
, genScriptWitnessedTxProposals
89
, genScriptWitnesssedTxVotingProcedures
910
, genScriptWitnessedTxWithdrawals
11+
, genSimpleScriptInEra
1012
)
1113
where
1214

1315
import Cardano.Api (TxIn)
16+
import Cardano.Api qualified as Old
1417
import Cardano.Api.Experimental
1518
import Cardano.Api.Experimental.AnyScriptWitness
1619
import Cardano.Api.Experimental.Tx
@@ -19,7 +22,13 @@ import Cardano.Api.Ledger qualified as L
1922
import Data.Map.Ordered.Strict qualified as OMap
2023
import Data.Typeable
2124

22-
import Test.Gen.Cardano.Api.Typed (genExecutionUnits, genHashableScriptData, genTxIn)
25+
import Test.Gen.Cardano.Api.Typed
26+
( genExecutionUnits
27+
, genHashableScriptData
28+
, genPlutusScriptInEra
29+
, genSimpleScript
30+
, genTxIn
31+
)
2332

2433
import Hedgehog (Gen)
2534
import Hedgehog.Gen qualified as Gen
@@ -88,6 +97,19 @@ genAnyPlutusScriptWitnessV4 :: Gen (AnyWitness era)
8897
genAnyPlutusScriptWitnessV4 =
8998
genAnyPlutusScriptWitness L.SPlutusV4
9099

100+
genSimpleScriptInEra :: Gen (SimpleScript (LedgerEra ConwayEra))
101+
genSimpleScriptInEra = do
102+
oldSimpleScript <- genSimpleScript
103+
let timelock = Old.toAllegraTimelock oldSimpleScript
104+
return $ SimpleScript timelock
105+
106+
genAnyScript :: Gen (AnyScript (LedgerEra ConwayEra))
107+
genAnyScript =
108+
Gen.choice
109+
[ AnySimpleScript <$> genSimpleScriptInEra
110+
, AnyPlutusScript <$> genPlutusScriptInEra
111+
]
112+
91113
genAnySimpleScriptWitness :: Gen (SimpleScriptOrReferenceInput era)
92114
genAnySimpleScriptWitness = SReferenceScript <$> genTxIn
93115

cardano-api/src/Cardano/Api/Experimental.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ module Cardano.Api.Experimental
5050
, Witnessable (..)
5151
, WitnessableItem (..)
5252

53+
-- ** AnyScript related
54+
, AnyScript (..)
55+
, deserialiseAnyPlutusScriptOfLanguage
56+
, deserialiseAnySimpleScript
57+
, hashAnyScript
58+
5359
-- ** Simple script related
5460
, SimpleScript (..)
5561
, SimpleScriptOrReferenceInput (..)
@@ -98,6 +104,7 @@ module Cardano.Api.Experimental
98104
)
99105
where
100106

107+
import Cardano.Api.Experimental.AnyScript
101108
import Cardano.Api.Experimental.Certificate
102109
import Cardano.Api.Experimental.Era
103110
import Cardano.Api.Experimental.Plutus.Internal.IndexedPlutusScriptWitness

cardano-api/src/Cardano/Api/Experimental/AnyScript.hs

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
{-# LANGUAGE FlexibleContexts #-}
2+
{-# LANGUAGE FlexibleInstances #-}
23
{-# LANGUAGE GADTs #-}
34
{-# LANGUAGE KindSignatures #-}
45
{-# LANGUAGE RankNTypes #-}
56
{-# LANGUAGE ScopedTypeVariables #-}
67
{-# LANGUAGE TypeApplications #-}
8+
{-# LANGUAGE TypeFamilies #-}
79

810
module Cardano.Api.Experimental.AnyScript
911
( AnyScript (..)
12+
, AsType (..)
1013
, deserialiseAnyPlutusScriptOfLanguage
1114
, deserialiseAnySimpleScript
1215
, hashAnyScript
@@ -18,16 +21,76 @@ import Cardano.Api.Experimental.Plutus.Internal.Script hiding (AnyPlutusScript)
1821
import Cardano.Api.Experimental.Simple.Script
1922
import Cardano.Api.HasTypeProxy
2023
import Cardano.Api.Ledger.Internal.Reexport qualified as L
24+
import Cardano.Api.Serialise.Cbor
2125

22-
import Cardano.Binary qualified as CBOR
26+
import Cardano.Ledger.Binary qualified as CBOR
2327
import Cardano.Ledger.Core qualified as L
2428
import Cardano.Ledger.Plutus.Language qualified as Plutus
2529

2630
import Data.ByteString qualified as BS
31+
import Data.Either.Combinators (maybeToRight, rightToMaybe)
32+
import Data.Foldable (asum)
33+
import Data.Type.Equality ((:~:) (..))
34+
import Data.Typeable (Typeable, eqT)
2735

2836
data AnyScript era where
2937
AnySimpleScript :: SimpleScript era -> AnyScript era
30-
AnyPlutusScript :: Plutus.PlutusLanguage lang => PlutusScriptInEra lang era -> AnyScript era
38+
AnyPlutusScript
39+
:: (Plutus.PlutusLanguage lang, Typeable lang) => PlutusScriptInEra lang era -> AnyScript era
40+
41+
instance L.Era era => HasTypeProxy (AnyScript era) where
42+
data AsType (AnyScript era) = AsAnyScript
43+
proxyToAsType _ = AsAnyScript
44+
45+
instance Show (AnyScript era) where
46+
show (AnySimpleScript ss) = "AnySimpleScript " ++ show ss
47+
show (AnyPlutusScript ps) = "AnyPlutusScript " ++ show ps
48+
49+
instance Eq (AnyScript era) where
50+
AnySimpleScript s1 == AnySimpleScript s2 = s1 == s2
51+
AnyPlutusScript (ps1 :: PlutusScriptInEra lang1 era) == AnyPlutusScript (ps2 :: PlutusScriptInEra lang2 era) =
52+
case eqT @lang1 @lang2 of
53+
Just Refl -> ps1 == ps2
54+
Nothing -> False
55+
_ == _ = False
56+
57+
instance
58+
L.AlonzoEraScript era
59+
=> SerialiseAsCBOR (AnyScript era)
60+
where
61+
serialiseToCBOR (AnySimpleScript (SimpleScript ns)) =
62+
L.serialize' (L.eraProtVerHigh @era) (L.fromNativeScript ns :: L.Script era)
63+
serialiseToCBOR (AnyPlutusScript ps) =
64+
L.serialize' (L.eraProtVerHigh @era) (plutusScriptInEraToScript ps)
65+
66+
deserialiseFromCBOR _ bs = do
67+
script <- decodeScript
68+
maybeToRight noParseError $
69+
asum
70+
[ tryNativeScript script
71+
, tryPlutusScript script
72+
]
73+
where
74+
decodeScript :: Either CBOR.DecoderError (L.Script era)
75+
decodeScript = do
76+
r <- CBOR.runAnnotator <$> CBOR.decodeFull' (L.eraProtVerHigh @era) bs
77+
return $ r $ CBOR.Full $ BS.fromStrict bs
78+
79+
tryNativeScript :: L.Script era -> Maybe (AnyScript era)
80+
tryNativeScript = fmap (AnySimpleScript . SimpleScript) . L.getNativeScript
81+
82+
tryPlutusScript :: L.Script era -> Maybe (AnyScript era)
83+
tryPlutusScript script = do
84+
ps <- L.toPlutusScript script
85+
L.withPlutusScript ps $ \(plutus :: Plutus.Plutus l) ->
86+
AnyPlutusScript . PlutusScriptInEra
87+
<$> rightToMaybe (Plutus.decodePlutusRunnable (L.eraProtVerHigh @era) plutus)
88+
89+
noParseError :: CBOR.DecoderError
90+
noParseError =
91+
CBOR.DecoderErrorCustom
92+
"AnyScript"
93+
"Decoded Script era is neither a NativeScript nor a PlutusScript"
3194

3295
hashAnyScript :: forall era. IsEra era => AnyScript (LedgerEra era) -> L.ScriptHash
3396
hashAnyScript (AnySimpleScript ss) =

0 commit comments

Comments
 (0)