@@ -46,8 +46,12 @@ module Test.Gen.Cardano.Api.Typed
4646 , genHashableScriptData
4747 , genReferenceScript
4848 , genScript
49+ , genValidScript
4950 , genSimpleScript
5051 , genPlutusScript
52+ , genPlutusV1Script
53+ , genPlutusV2Script
54+ , genPlutusV3Script
5155 , genScriptInAnyLang
5256 , genScriptInEra
5357 , genScriptHash
@@ -159,8 +163,10 @@ import qualified Data.ByteString.Short as SBS
159163import Data.Coerce
160164import Data.Int (Int64 )
161165import Data.Maybe
166+ import qualified Data.ByteString.Base16 as Base16
162167import Data.Ratio (Ratio , (%) )
163168import Data.String
169+ import Test.Gen.Cardano.Api.Hardcoded
164170import Data.Word (Word16 , Word32 , Word64 )
165171import GHC.Exts (IsList (.. ))
166172import GHC.Stack
@@ -211,6 +217,14 @@ genPositiveLovelace = L.Coin <$> Gen.integral (Range.linear 1 5000)
211217-- SimpleScript generators
212218--
213219
220+ -- This generator does not generate the deprecated double encoded plutus scripts
221+ genValidScript :: ScriptLanguage lang -> Gen (Script lang )
222+ genValidScript SimpleScriptLanguage =
223+ SimpleScript <$> genSimpleScript
224+ genValidScript (PlutusScriptLanguage lang) =
225+ PlutusScript lang <$> genValidPlutusScript lang
226+
227+ -- This generator will also generate the deprecated double encoded plutus scripts
214228genScript :: ScriptLanguage lang -> Gen (Script lang )
215229genScript SimpleScriptLanguage =
216230 SimpleScript <$> genSimpleScript
@@ -240,10 +254,72 @@ genSimpleScript =
240254 return (RequireMOf m ts)
241255 ]
242256
257+ -- | 'genPlutusScript' will generate the deprecated double encoded
258+ -- plutus scripts as well as valid plutus scripts.
243259genPlutusScript :: PlutusScriptVersion lang -> Gen (PlutusScript lang )
244- genPlutusScript _ =
245- -- We make no attempt to create a valid script
246- PlutusScriptSerialised . SBS. toShort <$> Gen. bytes (Range. linear 0 32 )
260+ genPlutusScript l =
261+ case l of
262+ PlutusScriptV1 -> do
263+ PlutusScript _ s <- genPlutusV1Script
264+ return s
265+ PlutusScriptV2 -> do
266+ PlutusScript _ s <- genPlutusV2Script
267+ return s
268+ PlutusScriptV3 -> do
269+ PlutusScript _ s <- genPlutusV3Script
270+ return s
271+
272+ genValidPlutusScript :: PlutusScriptVersion lang -> Gen (PlutusScript lang )
273+ genValidPlutusScript l =
274+ case l of
275+ PlutusScriptV1 -> do
276+ PlutusScript _ s <- genValidPlutusV1Script
277+ return s
278+ PlutusScriptV2 -> do
279+ PlutusScript _ s <- genValidPlutusV2Script
280+ return s
281+ PlutusScriptV3 -> do
282+ PlutusScript _ s <- genValidPlutusV3Script
283+ return s
284+
285+ genPlutusV1Script :: Gen (Script PlutusScriptV1 )
286+ genPlutusV1Script = do
287+ v1Script <- Gen. element [v1Loop2024PlutusScriptHexDoubleEncoded,v1Loop2024PlutusScriptHex]
288+ let v1ScriptBytes = Base16. decodeLenient v1Script
289+ return . PlutusScript PlutusScriptV1 . PlutusScriptSerialised $ SBS. toShort v1ScriptBytes
290+
291+ genValidPlutusV1Script :: Gen (Script PlutusScriptV1 )
292+ genValidPlutusV1Script = do
293+ v1Script <- Gen. element [v1Loop2024PlutusScriptHex]
294+ let v1ScriptBytes = Base16. decodeLenient v1Script
295+ return . PlutusScript PlutusScriptV1 . PlutusScriptSerialised $ SBS. toShort v1ScriptBytes
296+
297+ genPlutusV2Script :: Gen (Script PlutusScriptV2 )
298+ genPlutusV2Script = do
299+ v2Script <- Gen. element [v2EcdsaLoopPlutusScriptHexDoubleEncoded, v2EcdsaLoopPlutusScriptHex]
300+ let v2ScriptBytes = Base16. decodeLenient v2Script
301+ return . PlutusScript PlutusScriptV2 . PlutusScriptSerialised $ SBS. toShort v2ScriptBytes
302+
303+ genValidPlutusV2Script :: Gen (Script PlutusScriptV2 )
304+ genValidPlutusV2Script = do
305+ v2Script <- Gen. element [v2EcdsaLoopPlutusScriptHex]
306+ let v2ScriptBytes = Base16. decodeLenient v2Script
307+ return . PlutusScript PlutusScriptV2 . PlutusScriptSerialised $ SBS. toShort v2ScriptBytes
308+
309+ genPlutusV3Script :: Gen (Script PlutusScriptV3 )
310+ genPlutusV3Script = do
311+ v3AlwaysSucceedsPlutusScriptHex
312+ <- Gen. element [v3AlwaysSucceedsPlutusScriptDoubleEncoded, v3AlwaysSucceedsPlutusScript]
313+ let v3ScriptBytes = Base16. decodeLenient v3AlwaysSucceedsPlutusScriptHex
314+ return . PlutusScript PlutusScriptV3 . PlutusScriptSerialised $ SBS. toShort v3ScriptBytes
315+
316+ genValidPlutusV3Script :: Gen (Script PlutusScriptV3 )
317+ genValidPlutusV3Script = do
318+ v3AlwaysSucceedsPlutusScriptHex
319+ <- Gen. element [v3AlwaysSucceedsPlutusScript]
320+ let v3ScriptBytes = Base16. decodeLenient v3AlwaysSucceedsPlutusScriptHex
321+ return . PlutusScript PlutusScriptV3 . PlutusScriptSerialised $ SBS. toShort v3ScriptBytes
322+
247323
248324genScriptDataSchema :: Gen ScriptDataJsonSchema
249325genScriptDataSchema = Gen. element [ScriptDataJsonNoSchema , ScriptDataJsonDetailedSchema ]
@@ -320,7 +396,7 @@ genScriptInAnyLang =
320396genScriptInEra :: ShelleyBasedEra era -> Gen (ScriptInEra era )
321397genScriptInEra era =
322398 Gen. choice
323- [ ScriptInEra langInEra <$> genScript lang
399+ [ ScriptInEra langInEra <$> genValidScript lang
324400 | AnyScriptLanguage lang <- [minBound .. maxBound ]
325401 , Just langInEra <- [scriptLanguageSupportedInEra era lang]
326402 ]
0 commit comments