1+ {-# LANGUAGE DataKinds #-}
2+ {-# LANGUAGE FlexibleContexts #-}
13{-# LANGUAGE GADTs #-}
4+ {-# LANGUAGE ScopedTypeVariables #-}
25{-# LANGUAGE StandaloneDeriving #-}
6+ {-# LANGUAGE TypeOperators #-}
37
48module Cardano.Api.Experimental.AnyScriptWitness
5- ( AnyScriptWitness (.. )
6- ) where
9+ ( AnyScriptWitness (.. )
10+ , AnyPlutusScriptWitness (.. )
11+ , PlutusSpendingScriptWitness (.. )
12+ , getAnyPlutusScriptData
13+ , getAnyPlutusScriptWitnessExecutionUnits
14+ , getAnyPlutusScriptWitnessRedeemer
15+ , getAnyPlutusWitnessPlutusScript
16+ , getAnyPlutusScriptWitnessLanguage
17+ , langTypeEquality
18+ , updatePlutusScriptWitnessExecutionUnits
19+ )
20+ where
721
8- import Cardano.Api.Experimental.Simple.Script
922import Cardano.Api.Experimental.Plutus.Internal.ScriptWitness
10-
11- data AnyScriptWitness era where
12- AnyScriptWitnessSimple :: SimpleScriptOrReferenceInput era -> AnyScriptWitness era
13- AnyScriptWitnessPlutus :: PlutusScriptWitness lang purpose era -> AnyScriptWitness era
23+ import Cardano.Api.Experimental.Simple.Script
24+ import Cardano.Api.Ledger.Internal.Reexport qualified as L
25+ import Cardano.Api.Plutus.Internal.Script (ExecutionUnits )
26+
27+ import Cardano.Ledger.Plutus.Language qualified as L
28+
29+ import Data.Type.Equality
30+ import Data.Typeable
31+
32+ data PlutusSpendingScriptWitness era
33+ = PlutusSpendingScriptWitnessV1 (PlutusScriptWitness L. PlutusV1 SpendingScript era )
34+ | PlutusSpendingScriptWitnessV2 (PlutusScriptWitness L. PlutusV2 SpendingScript era )
35+ | PlutusSpendingScriptWitnessV3 (PlutusScriptWitness L. PlutusV3 SpendingScript era )
36+ | PlutusSpendingScriptWitnessV4 (PlutusScriptWitness L. PlutusV4 SpendingScript era )
37+ deriving (Show , Eq )
38+
39+ data AnyPlutusScriptWitness lang purpose era where
40+ AnyPlutusSpendingScriptWitness
41+ :: PlutusSpendingScriptWitness era -> AnyPlutusScriptWitness lang SpendingScript era
42+ AnyPlutusMintingScriptWitness
43+ :: Typeable lang
44+ => PlutusScriptWitness lang MintingScript era -> AnyPlutusScriptWitness lang MintingScript era
45+ AnyPlutusWithdrawingScriptWitness
46+ :: Typeable lang
47+ => PlutusScriptWitness lang WithdrawingScript era -> AnyPlutusScriptWitness lang WithdrawingScript era
48+ AnyPlutusCertifyingScriptWitness
49+ :: Typeable lang
50+ => PlutusScriptWitness lang CertifyingScript era -> AnyPlutusScriptWitness lang CertifyingScript era
51+ AnyPlutusProposingScriptWitness
52+ :: Typeable lang
53+ => PlutusScriptWitness lang ProposingScript era -> AnyPlutusScriptWitness lang ProposingScript era
54+ AnyPlutusVotingScriptWitness
55+ :: Typeable lang
56+ => PlutusScriptWitness lang VotingScript era -> AnyPlutusScriptWitness lang VotingScript era
57+
58+ deriving instance Show (AnyPlutusScriptWitness lang purpose era )
59+
60+ deriving instance Eq (AnyPlutusScriptWitness lang purpose era )
61+
62+ getAnyPlutusScriptWitnessExecutionUnits
63+ :: AnyPlutusScriptWitness lang purpose era -> ExecutionUnits
64+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusSpendingScriptWitness s) =
65+ case s of
66+ PlutusSpendingScriptWitnessV1 (PlutusScriptWitness _ _ _ _ eu) -> eu
67+ PlutusSpendingScriptWitnessV2 (PlutusScriptWitness _ _ _ _ eu) -> eu
68+ PlutusSpendingScriptWitnessV3 (PlutusScriptWitness _ _ _ _ eu) -> eu
69+ PlutusSpendingScriptWitnessV4 (PlutusScriptWitness _ _ _ _ eu) -> eu
70+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusMintingScriptWitness (PlutusScriptWitness _ _ _ _ eu)) = eu
71+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusWithdrawingScriptWitness (PlutusScriptWitness _ _ _ _ eu)) = eu
72+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusCertifyingScriptWitness (PlutusScriptWitness _ _ _ _ eu)) = eu
73+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusProposingScriptWitness (PlutusScriptWitness _ _ _ _ eu)) = eu
74+ getAnyPlutusScriptWitnessExecutionUnits (AnyPlutusVotingScriptWitness (PlutusScriptWitness _ _ _ _ eu)) = eu
1475
76+ getAnyPlutusScriptWitnessRedeemer
77+ :: AnyPlutusScriptWitness lang purpose era
78+ -> ScriptRedeemer
79+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusSpendingScriptWitness s) =
80+ case s of
81+ PlutusSpendingScriptWitnessV1 (PlutusScriptWitness _ _ _ redeemer _) -> redeemer
82+ PlutusSpendingScriptWitnessV2 (PlutusScriptWitness _ _ _ redeemer _) -> redeemer
83+ PlutusSpendingScriptWitnessV3 (PlutusScriptWitness _ _ _ redeemer _) -> redeemer
84+ PlutusSpendingScriptWitnessV4 (PlutusScriptWitness _ _ _ redeemer _) -> redeemer
85+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusMintingScriptWitness (PlutusScriptWitness _ _ _ redeemer _)) = redeemer
86+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusWithdrawingScriptWitness (PlutusScriptWitness _ _ _ redeemer _)) = redeemer
87+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusCertifyingScriptWitness (PlutusScriptWitness _ _ _ redeemer _)) = redeemer
88+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusProposingScriptWitness (PlutusScriptWitness _ _ _ redeemer _)) = redeemer
89+ getAnyPlutusScriptWitnessRedeemer (AnyPlutusVotingScriptWitness (PlutusScriptWitness _ _ _ redeemer _)) = redeemer
90+
91+ updatePlutusScriptWitnessExecutionUnits
92+ :: ExecutionUnits -> AnyPlutusScriptWitness lang purpose era -> AnyPlutusScriptWitness lang purpose era
93+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusSpendingScriptWitness s) =
94+ case s of
95+ PlutusSpendingScriptWitnessV1 (PlutusScriptWitness lang script dat redeemer _) ->
96+ AnyPlutusSpendingScriptWitness
97+ (PlutusSpendingScriptWitnessV1 (PlutusScriptWitness lang script dat redeemer eu))
98+ PlutusSpendingScriptWitnessV2 (PlutusScriptWitness lang script dat redeemer _) ->
99+ AnyPlutusSpendingScriptWitness
100+ (PlutusSpendingScriptWitnessV2 (PlutusScriptWitness lang script dat redeemer eu))
101+ PlutusSpendingScriptWitnessV3 (PlutusScriptWitness lang script dat redeemer _) ->
102+ AnyPlutusSpendingScriptWitness
103+ (PlutusSpendingScriptWitnessV3 (PlutusScriptWitness lang script dat redeemer eu))
104+ PlutusSpendingScriptWitnessV4 (PlutusScriptWitness lang script dat redeemer _) ->
105+ AnyPlutusSpendingScriptWitness
106+ (PlutusSpendingScriptWitnessV4 (PlutusScriptWitness lang script dat redeemer eu))
107+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusMintingScriptWitness (PlutusScriptWitness lang script dat redeemer _)) =
108+ AnyPlutusMintingScriptWitness (PlutusScriptWitness lang script dat redeemer eu)
109+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusWithdrawingScriptWitness (PlutusScriptWitness lang script dat redeemer _)) =
110+ AnyPlutusWithdrawingScriptWitness (PlutusScriptWitness lang script dat redeemer eu)
111+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusCertifyingScriptWitness (PlutusScriptWitness lang script dat redeemer _)) =
112+ AnyPlutusCertifyingScriptWitness (PlutusScriptWitness lang script dat redeemer eu)
113+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusProposingScriptWitness (PlutusScriptWitness lang script dat redeemer _)) =
114+ AnyPlutusProposingScriptWitness (PlutusScriptWitness lang script dat redeemer eu)
115+ updatePlutusScriptWitnessExecutionUnits eu (AnyPlutusVotingScriptWitness (PlutusScriptWitness lang script dat redeemer _)) =
116+ AnyPlutusVotingScriptWitness (PlutusScriptWitness lang script dat redeemer eu)
117+
118+ getAnyPlutusScriptWitnessLanguage
119+ :: AnyPlutusScriptWitness lang purpose era -> L. Language
120+ getAnyPlutusScriptWitnessLanguage (AnyPlutusSpendingScriptWitness s) =
121+ case s of
122+ PlutusSpendingScriptWitnessV1 s' -> getPlutusScriptWitnessLanguage s'
123+ PlutusSpendingScriptWitnessV2 s' -> getPlutusScriptWitnessLanguage s'
124+ PlutusSpendingScriptWitnessV3 s' -> getPlutusScriptWitnessLanguage s'
125+ PlutusSpendingScriptWitnessV4 s' -> getPlutusScriptWitnessLanguage s'
126+ getAnyPlutusScriptWitnessLanguage (AnyPlutusMintingScriptWitness s) = getPlutusScriptWitnessLanguage s
127+ getAnyPlutusScriptWitnessLanguage (AnyPlutusWithdrawingScriptWitness s) = getPlutusScriptWitnessLanguage s
128+ getAnyPlutusScriptWitnessLanguage (AnyPlutusCertifyingScriptWitness s) = getPlutusScriptWitnessLanguage s
129+ getAnyPlutusScriptWitnessLanguage (AnyPlutusProposingScriptWitness s) = getPlutusScriptWitnessLanguage s
130+ getAnyPlutusScriptWitnessLanguage (AnyPlutusVotingScriptWitness s) = getPlutusScriptWitnessLanguage s
131+
132+ getAnyPlutusScriptData
133+ :: L. Era era
134+ => AnyPlutusScriptWitness lang purpose era
135+ -> L. TxDats era
136+ getAnyPlutusScriptData (AnyPlutusSpendingScriptWitness s) =
137+ case s of
138+ PlutusSpendingScriptWitnessV1 sw -> getSpendingPlutusWitnessData sw
139+ PlutusSpendingScriptWitnessV2 sw -> getSpendingPlutusWitnessData sw
140+ PlutusSpendingScriptWitnessV3 sw -> getSpendingPlutusWitnessData sw
141+ PlutusSpendingScriptWitnessV4 sw -> getSpendingPlutusWitnessData sw
142+ getAnyPlutusScriptData AnyPlutusMintingScriptWitness {} = mempty
143+ getAnyPlutusScriptData AnyPlutusWithdrawingScriptWitness {} = mempty
144+ getAnyPlutusScriptData AnyPlutusCertifyingScriptWitness {} = mempty
145+ getAnyPlutusScriptData AnyPlutusProposingScriptWitness {} = mempty
146+ getAnyPlutusScriptData AnyPlutusVotingScriptWitness {} = mempty
147+
148+ getAnyPlutusWitnessPlutusScript
149+ :: L. AlonzoEraScript era
150+ => AnyPlutusScriptWitness lang purpose era
151+ -> Maybe (L. Script era )
152+ getAnyPlutusWitnessPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV1 s)) =
153+ let plutusScriptRunnable = getPlutusScriptRunnable s
154+ in L. fromPlutusScript <$> (fromPlutusRunnable L. SPlutusV1 =<< plutusScriptRunnable)
155+ getAnyPlutusWitnessPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV2 s)) =
156+ let plutusScriptRunnable = getPlutusScriptRunnable s
157+ in L. fromPlutusScript <$> (fromPlutusRunnable L. SPlutusV2 =<< plutusScriptRunnable)
158+ getAnyPlutusWitnessPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV3 s)) =
159+ let plutusScriptRunnable = getPlutusScriptRunnable s
160+ in L. fromPlutusScript <$> (fromPlutusRunnable L. SPlutusV3 =<< plutusScriptRunnable)
161+ getAnyPlutusWitnessPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV4 s)) =
162+ let plutusScriptRunnable = getPlutusScriptRunnable s
163+ in L. fromPlutusScript <$> (fromPlutusRunnable L. SPlutusV4 =<< plutusScriptRunnable)
164+ getAnyPlutusWitnessPlutusScript (AnyPlutusMintingScriptWitness s@ (PlutusScriptWitness l _ _ _ _)) =
165+ let plutusScriptRunnable = getPlutusScriptRunnable s
166+ in L. fromPlutusScript <$> (fromPlutusRunnable l =<< plutusScriptRunnable)
167+ getAnyPlutusWitnessPlutusScript (AnyPlutusWithdrawingScriptWitness s@ (PlutusScriptWitness l _ _ _ _)) =
168+ let plutusScriptRunnable = getPlutusScriptRunnable s
169+ in L. fromPlutusScript <$> (fromPlutusRunnable l =<< plutusScriptRunnable)
170+ getAnyPlutusWitnessPlutusScript (AnyPlutusCertifyingScriptWitness s@ (PlutusScriptWitness l _ _ _ _)) =
171+ let plutusScriptRunnable = getPlutusScriptRunnable s
172+ in L. fromPlutusScript <$> (fromPlutusRunnable l =<< plutusScriptRunnable)
173+ getAnyPlutusWitnessPlutusScript (AnyPlutusProposingScriptWitness s@ (PlutusScriptWitness l _ _ _ _)) =
174+ let plutusScriptRunnable = getPlutusScriptRunnable s
175+ in L. fromPlutusScript <$> (fromPlutusRunnable l =<< plutusScriptRunnable)
176+ getAnyPlutusWitnessPlutusScript (AnyPlutusVotingScriptWitness s@ (PlutusScriptWitness l _ _ _ _)) =
177+ let plutusScriptRunnable = getPlutusScriptRunnable s
178+ in L. fromPlutusScript <$> (fromPlutusRunnable l =<< plutusScriptRunnable)
179+
180+ -- It should be noted that 'PlutusRunnable' is constructed via deserialization. The deserialization
181+ -- instance lives in ledger and will fail for an invalid script language/era pairing. Therefore
182+ -- this function should never return 'Nothing'.
183+ fromPlutusRunnable
184+ :: L. AlonzoEraScript era
185+ => L. SLanguage lang
186+ -> L. PlutusRunnable lang
187+ -> Maybe (L. PlutusScript era )
188+ fromPlutusRunnable L. SPlutusV1 runnable =
189+ L. mkPlutusScript $ L. plutusFromRunnable runnable
190+ fromPlutusRunnable L. SPlutusV2 runnable =
191+ L. mkPlutusScript $ L. plutusFromRunnable runnable
192+ fromPlutusRunnable L. SPlutusV3 runnable =
193+ L. mkPlutusScript $ L. plutusFromRunnable runnable
194+ fromPlutusRunnable L. SPlutusV4 runnable =
195+ L. mkPlutusScript $ L. plutusFromRunnable runnable
196+
197+ -- getAnyPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV2 s)) = getPlutusScriptRunnable s
198+ -- getAnyPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV3 s)) = getPlutusScriptRunnable s
199+ -- getAnyPlutusScript (AnyPlutusSpendingScriptWitness (PlutusSpendingScriptWitnessV4 s)) = getPlutusScriptRunnable s
200+
201+ data AnyScriptWitness era where
202+ AnyScriptWitnessSimple :: SimpleScriptOrReferenceInput era -> AnyScriptWitness era
203+ AnyScriptWitnessPlutus :: AnyPlutusScriptWitness lang purpose era -> AnyScriptWitness era
15204
16205deriving instance Show (AnyScriptWitness era )
17- instance Eq (AnyScriptWitness era ) where
18- -- TODO LEFT OFF HERE!
206+
207+ instance Eq (AnyScriptWitness era ) where
208+ (AnyScriptWitnessSimple s1) == (AnyScriptWitnessSimple s2) = s1 == s2
209+ (AnyScriptWitnessPlutus (AnyPlutusSpendingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusSpendingScriptWitness s2)) = s1 == s2
210+ (AnyScriptWitnessPlutus (AnyPlutusMintingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusMintingScriptWitness s2)) =
211+ case langTypeEquality s1 s2 of
212+ Just Refl -> s1 == s2
213+ Nothing -> False
214+ (AnyScriptWitnessPlutus (AnyPlutusWithdrawingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusWithdrawingScriptWitness s2)) =
215+ case langTypeEquality s1 s2 of
216+ Just Refl -> s1 == s2
217+ Nothing -> False
218+ (AnyScriptWitnessPlutus (AnyPlutusCertifyingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusCertifyingScriptWitness s2)) =
219+ case langTypeEquality s1 s2 of
220+ Just Refl -> s1 == s2
221+ Nothing -> False
222+ (AnyScriptWitnessPlutus (AnyPlutusProposingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusProposingScriptWitness s2)) =
223+ case langTypeEquality s1 s2 of
224+ Just Refl -> s1 == s2
225+ Nothing -> False
226+ (AnyScriptWitnessPlutus (AnyPlutusVotingScriptWitness s1)) == (AnyScriptWitnessPlutus (AnyPlutusVotingScriptWitness s2)) =
227+ case langTypeEquality s1 s2 of
228+ Just Refl -> s1 == s2
229+ Nothing -> False
230+ _ == _ = False
231+
232+ langTypeEquality
233+ :: (Typeable langA , Typeable langB )
234+ => PlutusScriptWitness langA purpose era
235+ -> PlutusScriptWitness langB purpose era
236+ -> Maybe (langA :~: langB )
237+ langTypeEquality _ _ = eqT
0 commit comments