{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.0.0 #-}

module Cardano.Ledger.Plutus.Preprocessor.Binary.V2 where

import Cardano.Ledger.Plutus.Language (PlutusBinary (..))
import Cardano.Ledger.Plutus.Preprocessor.Source.V2
import Language.Haskell.TH
import qualified PlutusLedgerApi.V2 as PV2
import qualified PlutusTx as P (compile)

-- ==========================================================================
-- Turn the Template Haskell Declarations into real haskell functions

$BuiltinData -> BuiltinData -> ()
alwaysSucceedsNoDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
alwaysSucceedsWithDatumQ
$BuiltinData -> BuiltinData -> ()
alwaysFailsNoDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
alwaysFailsWithDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
redeemerSameAsDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
evenDatumQ
$BuiltinData -> BuiltinData -> ()
evenRedeemerNoDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
evenRedeemerWithDatumQ
$BuiltinData -> BuiltinData -> ()
purposeIsWellformedNoDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
purposeIsWellformedWithDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
datumIsWellformedQ
$BuiltinData -> BuiltinData -> ()
inputsOutputsAreNotEmptyNoDatumQ
$BuiltinData -> BuiltinData -> BuiltinData -> ()
inputsOutputsAreNotEmptyWithDatumQ

-- ================================================================
-- Compile and serialize the real functions as Plutus scripts.
-- Here is where we depend on plutus-plugin.

alwaysSucceedsNoDatumBytes :: (Q [Dec], PlutusBinary)
alwaysSucceedsNoDatumBytes :: (Q [Dec], PlutusBinary)
alwaysSucceedsNoDatumBytes =
  ( Q [Dec]
alwaysSucceedsNoDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> ()) -> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||alwaysSucceedsNoDatum||])
  )

alwaysSucceedsWithDatumBytes :: (Q [Dec], PlutusBinary)
alwaysSucceedsWithDatumBytes :: (Q [Dec], PlutusBinary)
alwaysSucceedsWithDatumBytes =
  ( Q [Dec]
alwaysSucceedsWithDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||alwaysSucceedsWithDatum||])
  )

alwaysFailsNoDatumBytes :: (Q [Dec], PlutusBinary)
alwaysFailsNoDatumBytes :: (Q [Dec], PlutusBinary)
alwaysFailsNoDatumBytes =
  ( Q [Dec]
alwaysFailsNoDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> ()) -> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||alwaysFailsNoDatum||])
  )

alwaysFailsWithDatumBytes :: (Q [Dec], PlutusBinary)
alwaysFailsWithDatumBytes :: (Q [Dec], PlutusBinary)
alwaysFailsWithDatumBytes =
  ( Q [Dec]
alwaysFailsWithDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||alwaysFailsWithDatum||])
  )

redeemerSameAsDatumBytes :: (Q [Dec], PlutusBinary)
redeemerSameAsDatumBytes :: (Q [Dec], PlutusBinary)
redeemerSameAsDatumBytes =
  ( Q [Dec]
redeemerSameAsDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||redeemerSameAsDatum||])
  )

evenDatumBytes :: (Q [Dec], PlutusBinary)
evenDatumBytes :: (Q [Dec], PlutusBinary)
evenDatumBytes =
  ( Q [Dec]
evenDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||evenDatum||])
  )

evenRedeemerNoDatumBytes :: (Q [Dec], PlutusBinary)
evenRedeemerNoDatumBytes :: (Q [Dec], PlutusBinary)
evenRedeemerNoDatumBytes =
  ( Q [Dec]
evenRedeemerNoDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> ()) -> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||evenRedeemerNoDatum||])
  )

evenRedeemerWithDatumBytes :: (Q [Dec], PlutusBinary)
evenRedeemerWithDatumBytes :: (Q [Dec], PlutusBinary)
evenRedeemerWithDatumBytes =
  ( Q [Dec]
evenRedeemerWithDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||evenRedeemerWithDatum||])
  )

purposeIsWellformedNoDatumBytes :: (Q [Dec], PlutusBinary)
purposeIsWellformedNoDatumBytes :: (Q [Dec], PlutusBinary)
purposeIsWellformedNoDatumBytes =
  ( Q [Dec]
purposeIsWellformedNoDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> ()) -> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||purposeIsWellformedNoDatum||])
  )

purposeIsWellformedWithDatumBytes :: (Q [Dec], PlutusBinary)
purposeIsWellformedWithDatumBytes :: (Q [Dec], PlutusBinary)
purposeIsWellformedWithDatumBytes =
  ( Q [Dec]
purposeIsWellformedWithDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||purposeIsWellformedWithDatum||])
  )

datumIsWellformedBytes :: (Q [Dec], PlutusBinary)
datumIsWellformedBytes :: (Q [Dec], PlutusBinary)
datumIsWellformedBytes =
  ( Q [Dec]
datumIsWellformedQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||datumIsWellformed||])
  )

inputsOutputsAreNotEmptyNoDatumBytes :: (Q [Dec], PlutusBinary)
inputsOutputsAreNotEmptyNoDatumBytes :: (Q [Dec], PlutusBinary)
inputsOutputsAreNotEmptyNoDatumBytes =
  ( Q [Dec]
inputsOutputsAreNotEmptyNoDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> ()) -> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||inputsOutputsAreNotEmptyNoDatum||])
  )

inputsOutputsAreNotEmptyWithDatumBytes :: (Q [Dec], PlutusBinary)
inputsOutputsAreNotEmptyWithDatumBytes :: (Q [Dec], PlutusBinary)
inputsOutputsAreNotEmptyWithDatumBytes =
  ( Q [Dec]
inputsOutputsAreNotEmptyWithDatumQ
  , ShortByteString -> PlutusBinary
PlutusBinary (ShortByteString -> PlutusBinary)
-> ShortByteString -> PlutusBinary
forall a b. (a -> b) -> a -> b
$ CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ())
-> ShortByteString
forall a. CompiledCode a -> ShortByteString
PV2.serialiseCompiledCode $$(P.compile [||inputsOutputsAreNotEmptyWithDatum||])
  )