{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Alonzo.Scripts (
  PlutusBinary (..),
  AlonzoScript (TimelockScript, PlutusScript),
  Script,
  isPlutusScript,
  validScript,
  eqAlonzoScriptRaw,
  AlonzoEraScript (..),
  eraLanguages,
  PlutusScript (..),
  withPlutusScriptLanguage,
  plutusScriptLanguage,
  decodePlutusScript,
  plutusScriptBinary,
  mkBinaryPlutusScript,
  isValidPlutusScript,
  toPlutusSLanguage,
  alonzoScriptPrefixTag,
  lookupPlutusScript,

  -- ** Plutus Purpose
  pattern SpendingPurpose,
  pattern MintingPurpose,
  pattern CertifyingPurpose,
  pattern RewardingPurpose,
  AlonzoPlutusPurpose (..),
  AsItem (..),
  AsIx (..),
  AsIxItem (..),
  toAsItem,
  toAsIx,

  -- * Re-exports
  module Cardano.Ledger.Plutus.CostModels,
  module Cardano.Ledger.Plutus.ExUnits,
) where

import Cardano.Ledger.Address (RewardAccount)
import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Alonzo.Era (AlonzoEra)
import Cardano.Ledger.Alonzo.TxCert ()
import Cardano.Ledger.BaseTypes (ProtVer (..), kindObject)
import Cardano.Ledger.Binary (
  DecCBOR (decCBOR),
  DecCBORGroup (..),
  Decoder,
  EncCBOR (..),
  EncCBORGroup (..),
  ToCBOR (toCBOR),
  Version,
  decodeWord8,
  encodeWord8,
 )
import Cardano.Ledger.Binary.Coders (
  Decode (D, From, Invalid, SumD, Summands),
  Encode (Sum, To),
  Wrapped (..),
  decode,
  encode,
  (!>),
  (<!),
 )
import Cardano.Ledger.Binary.Plain (serializeAsHexText)
import Cardano.Ledger.Core
import Cardano.Ledger.Mary.Value (PolicyID)
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Plutus.CostModels
import Cardano.Ledger.Plutus.ExUnits
import Cardano.Ledger.Plutus.Language (
  Language (..),
  Plutus (..),
  PlutusBinary (..),
  PlutusLanguage (..),
  SLanguage (..),
  asSLanguage,
  isValidPlutus,
  plutusLanguage,
  plutusSLanguage,
  withSLanguage,
 )
import Cardano.Ledger.Shelley.Scripts (ShelleyEraScript (..), nativeMultiSigTag)
import Cardano.Ledger.TxIn (TxIn)
import Control.DeepSeq (NFData (..), deepseq)
import Control.Monad (guard, (>=>))
import Data.Aeson (ToJSON (..), Value (String), object, (.=))
import qualified Data.ByteString as BS
import Data.Kind (Type)
import qualified Data.Map.Strict as Map
import Data.Maybe (fromJust, isJust)
import Data.MemPack
import Data.Typeable
import Data.Word (Word16, Word32, Word8)
import GHC.Generics (Generic)
import GHC.Stack
import NoThunks.Class (NoThunks (..))

class
  ( EraScript era
  , Eq (PlutusScript era)
  , Ord (PlutusScript era)
  , Show (PlutusScript era)
  , NoThunks (PlutusScript era)
  , NFData (PlutusScript era)
  , SafeToHash (PlutusScript era)
  , Eq (PlutusPurpose AsItem era)
  , Show (PlutusPurpose AsItem era)
  , EncCBOR (PlutusPurpose AsItem era)
  , DecCBOR (PlutusPurpose AsItem era)
  , NoThunks (PlutusPurpose AsItem era)
  , NFData (PlutusPurpose AsItem era)
  , Eq (PlutusPurpose AsIx era)
  , Ord (PlutusPurpose AsIx era)
  , Show (PlutusPurpose AsIx era)
  , EncCBOR (PlutusPurpose AsIx era)
  , DecCBOR (PlutusPurpose AsIx era)
  , EncCBORGroup (PlutusPurpose AsIx era)
  , DecCBORGroup (PlutusPurpose AsIx era)
  , NoThunks (PlutusPurpose AsIx era)
  , NFData (PlutusPurpose AsIx era)
  , Eq (PlutusPurpose AsIxItem era)
  , Show (PlutusPurpose AsIxItem era)
  , NoThunks (PlutusPurpose AsIxItem era)
  , NFData (PlutusPurpose AsIxItem era)
  , AllegraEraScript era
  ) =>
  AlonzoEraScript era
  where
  data PlutusScript era :: Type

  type PlutusPurpose (f :: Type -> Type -> Type) era = (r :: Type) | r -> era

  -- | Highest supported Plutus language version for this era.
  eraMaxLanguage :: Language

  -- | Attempt to extract a `PlutusScript` from a wrapper type family `Script`. Whenevr
  -- `Script` is a native script `Nothing` will be returned
  toPlutusScript :: Script era -> Maybe (PlutusScript era)
  default toPlutusScript :: Script era ~ AlonzoScript era => Script era -> Maybe (PlutusScript era)
  toPlutusScript = \case
    PlutusScript PlutusScript era
ps -> PlutusScript era -> Maybe (PlutusScript era)
forall a. a -> Maybe a
Just PlutusScript era
ps
    Script era
_ -> Maybe (PlutusScript era)
forall a. Maybe a
Nothing

  -- | Convert a `PlutusScript` to a wrapper type family `Script`
  fromPlutusScript :: PlutusScript era -> Script era
  default fromPlutusScript :: Script era ~ AlonzoScript era => PlutusScript era -> Script era
  fromPlutusScript = PlutusScript era -> Script era
PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript

  -- | Returns Nothing, whenver plutus language is not supported for this era.
  mkPlutusScript :: PlutusLanguage l => Plutus l -> Maybe (PlutusScript era)

  -- | Give a `PlutusScript` apply a function that can handle `Plutus` scripts of all
  -- known versions.
  withPlutusScript ::
    PlutusScript era ->
    (forall l. PlutusLanguage l => Plutus l -> a) ->
    a

  hoistPlutusPurpose ::
    (forall ix it. g ix it -> f ix it) ->
    PlutusPurpose g era ->
    PlutusPurpose f era

  mkSpendingPurpose :: f Word32 TxIn -> PlutusPurpose f era

  toSpendingPurpose :: PlutusPurpose f era -> Maybe (f Word32 TxIn)

  mkMintingPurpose :: f Word32 PolicyID -> PlutusPurpose f era

  toMintingPurpose :: PlutusPurpose f era -> Maybe (f Word32 PolicyID)

  mkCertifyingPurpose :: f Word32 (TxCert era) -> PlutusPurpose f era

  toCertifyingPurpose :: PlutusPurpose f era -> Maybe (f Word32 (TxCert era))

  mkRewardingPurpose :: f Word32 RewardAccount -> PlutusPurpose f era

  toRewardingPurpose :: PlutusPurpose f era -> Maybe (f Word32 RewardAccount)

  upgradePlutusPurposeAsIx ::
    AlonzoEraScript (PreviousEra era) =>
    PlutusPurpose AsIx (PreviousEra era) ->
    PlutusPurpose AsIx era

mkBinaryPlutusScript :: AlonzoEraScript era => Language -> PlutusBinary -> Maybe (PlutusScript era)
mkBinaryPlutusScript :: forall era.
AlonzoEraScript era =>
Language -> PlutusBinary -> Maybe (PlutusScript era)
mkBinaryPlutusScript Language
lang PlutusBinary
pb = Language
-> (forall (l :: Language).
    PlutusLanguage l =>
    SLanguage l -> Maybe (PlutusScript era))
-> Maybe (PlutusScript era)
forall a.
Language
-> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a)
-> a
withSLanguage Language
lang (Plutus l -> Maybe (PlutusScript era)
forall era (l :: Language).
(AlonzoEraScript era, PlutusLanguage l) =>
Plutus l -> Maybe (PlutusScript era)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript era)
mkPlutusScript (Plutus l -> Maybe (PlutusScript era))
-> (SLanguage l -> Plutus l)
-> SLanguage l
-> Maybe (PlutusScript era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SLanguage l -> Plutus l -> Plutus l
forall (l :: Language) (proxy :: Language -> *).
SLanguage l -> proxy l -> proxy l
`asSLanguage` PlutusBinary -> Plutus l
forall (l :: Language). PlutusBinary -> Plutus l
Plutus PlutusBinary
pb))

-- | Apply a function to a plutus script, but only if it is of expected language version,
-- otherwise it will return Nothing.
withPlutusScriptLanguage ::
  AlonzoEraScript era =>
  Language ->
  PlutusScript era ->
  (forall l. PlutusLanguage l => Plutus l -> a) ->
  Maybe a
withPlutusScriptLanguage :: forall era a.
AlonzoEraScript era =>
Language
-> PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a)
-> Maybe a
withPlutusScriptLanguage Language
lang PlutusScript era
ps forall (l :: Language). PlutusLanguage l => Plutus l -> a
f =
  PlutusScript era
-> (forall {l :: Language}.
    PlutusLanguage l =>
    Plutus l -> Maybe a)
-> Maybe a
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
ps ((forall {l :: Language}. PlutusLanguage l => Plutus l -> Maybe a)
 -> Maybe a)
-> (forall {l :: Language}.
    PlutusLanguage l =>
    Plutus l -> Maybe a)
-> Maybe a
forall a b. (a -> b) -> a -> b
$ \Plutus l
plutus ->
    Plutus l -> a
forall (l :: Language). PlutusLanguage l => Plutus l -> a
f Plutus l
plutus a -> Maybe () -> Maybe a
forall a b. a -> Maybe b -> Maybe a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Plutus l -> Language
forall (l :: Language) (proxy :: Language -> *).
PlutusLanguage l =>
proxy l -> Language
plutusLanguage Plutus l
plutus Language -> Language -> Bool
forall a. Eq a => a -> a -> Bool
== Language
lang)

-- | Attempt to extract the version aware `Plutus` script, but only if it matches the
-- language version supplied. This is useful whenever the version is known by some other
-- means.
toPlutusSLanguage ::
  forall l era.
  (PlutusLanguage l, AlonzoEraScript era) =>
  SLanguage l ->
  PlutusScript era ->
  Maybe (Plutus l)
toPlutusSLanguage :: forall (l :: Language) era.
(PlutusLanguage l, AlonzoEraScript era) =>
SLanguage l -> PlutusScript era -> Maybe (Plutus l)
toPlutusSLanguage SLanguage l
_ PlutusScript era
ps = PlutusScript era
-> (forall (l :: Language).
    PlutusLanguage l =>
    Plutus l -> Maybe (Plutus l))
-> Maybe (Plutus l)
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
ps Plutus l -> Maybe (Plutus l)
forall {k} (a :: k) (b :: k) (c :: k -> *).
(Typeable a, Typeable b) =>
c a -> Maybe (c b)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (Plutus l)
gcast

-- | Get value level plutus language of the plutus script
plutusScriptLanguage :: AlonzoEraScript era => PlutusScript era -> Language
plutusScriptLanguage :: forall era. AlonzoEraScript era => PlutusScript era -> Language
plutusScriptLanguage PlutusScript era
ps = PlutusScript era
-> (forall (l :: Language).
    PlutusLanguage l =>
    Plutus l -> Language)
-> Language
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
ps Plutus l -> Language
forall (l :: Language). PlutusLanguage l => Plutus l -> Language
forall (l :: Language) (proxy :: Language -> *).
PlutusLanguage l =>
proxy l -> Language
plutusLanguage

-- | Extract binary representation of the script.
plutusScriptBinary :: AlonzoEraScript era => PlutusScript era -> PlutusBinary
plutusScriptBinary :: forall era. AlonzoEraScript era => PlutusScript era -> PlutusBinary
plutusScriptBinary PlutusScript era
ps = PlutusScript era
-> (forall (l :: Language).
    PlutusLanguage l =>
    Plutus l -> PlutusBinary)
-> PlutusBinary
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
ps Plutus l -> PlutusBinary
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> PlutusBinary
forall (l :: Language). Plutus l -> PlutusBinary
plutusBinary

-- | Verifies whether Plutus script is well formed or not, which simply means whether it
-- deserializes successfully or not.
isValidPlutusScript :: AlonzoEraScript era => Version -> PlutusScript era -> Bool
isValidPlutusScript :: forall era.
AlonzoEraScript era =>
Version -> PlutusScript era -> Bool
isValidPlutusScript Version
pv PlutusScript era
ps = PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> Bool)
-> Bool
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
ps (Version -> Plutus l -> Bool
forall (l :: Language).
PlutusLanguage l =>
Version -> Plutus l -> Bool
isValidPlutus Version
pv)

-- Alonzo Plutus Purpose =======================================================

newtype AsIx ix it = AsIx {forall ix it. AsIx ix it -> ix
unAsIx :: ix}
  deriving stock (Int -> AsIx ix it -> ShowS
[AsIx ix it] -> ShowS
AsIx ix it -> String
(Int -> AsIx ix it -> ShowS)
-> (AsIx ix it -> String)
-> ([AsIx ix it] -> ShowS)
-> Show (AsIx ix it)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ix it. Show ix => Int -> AsIx ix it -> ShowS
forall ix it. Show ix => [AsIx ix it] -> ShowS
forall ix it. Show ix => AsIx ix it -> String
$cshowsPrec :: forall ix it. Show ix => Int -> AsIx ix it -> ShowS
showsPrec :: Int -> AsIx ix it -> ShowS
$cshow :: forall ix it. Show ix => AsIx ix it -> String
show :: AsIx ix it -> String
$cshowList :: forall ix it. Show ix => [AsIx ix it] -> ShowS
showList :: [AsIx ix it] -> ShowS
Show)
  deriving newtype (AsIx ix it -> AsIx ix it -> Bool
(AsIx ix it -> AsIx ix it -> Bool)
-> (AsIx ix it -> AsIx ix it -> Bool) -> Eq (AsIx ix it)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ix it. Eq ix => AsIx ix it -> AsIx ix it -> Bool
$c== :: forall ix it. Eq ix => AsIx ix it -> AsIx ix it -> Bool
== :: AsIx ix it -> AsIx ix it -> Bool
$c/= :: forall ix it. Eq ix => AsIx ix it -> AsIx ix it -> Bool
/= :: AsIx ix it -> AsIx ix it -> Bool
Eq, Eq (AsIx ix it)
Eq (AsIx ix it) =>
(AsIx ix it -> AsIx ix it -> Ordering)
-> (AsIx ix it -> AsIx ix it -> Bool)
-> (AsIx ix it -> AsIx ix it -> Bool)
-> (AsIx ix it -> AsIx ix it -> Bool)
-> (AsIx ix it -> AsIx ix it -> Bool)
-> (AsIx ix it -> AsIx ix it -> AsIx ix it)
-> (AsIx ix it -> AsIx ix it -> AsIx ix it)
-> Ord (AsIx ix it)
AsIx ix it -> AsIx ix it -> Bool
AsIx ix it -> AsIx ix it -> Ordering
AsIx ix it -> AsIx ix it -> AsIx ix it
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ix it. Ord ix => Eq (AsIx ix it)
forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Bool
forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Ordering
forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> AsIx ix it
$ccompare :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Ordering
compare :: AsIx ix it -> AsIx ix it -> Ordering
$c< :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Bool
< :: AsIx ix it -> AsIx ix it -> Bool
$c<= :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Bool
<= :: AsIx ix it -> AsIx ix it -> Bool
$c> :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Bool
> :: AsIx ix it -> AsIx ix it -> Bool
$c>= :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> Bool
>= :: AsIx ix it -> AsIx ix it -> Bool
$cmax :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> AsIx ix it
max :: AsIx ix it -> AsIx ix it -> AsIx ix it
$cmin :: forall ix it. Ord ix => AsIx ix it -> AsIx ix it -> AsIx ix it
min :: AsIx ix it -> AsIx ix it -> AsIx ix it
Ord, AsIx ix it -> ()
(AsIx ix it -> ()) -> NFData (AsIx ix it)
forall a. (a -> ()) -> NFData a
forall ix it. NFData ix => AsIx ix it -> ()
$crnf :: forall ix it. NFData ix => AsIx ix it -> ()
rnf :: AsIx ix it -> ()
NFData, Context -> AsIx ix it -> IO (Maybe ThunkInfo)
Proxy (AsIx ix it) -> String
(Context -> AsIx ix it -> IO (Maybe ThunkInfo))
-> (Context -> AsIx ix it -> IO (Maybe ThunkInfo))
-> (Proxy (AsIx ix it) -> String)
-> NoThunks (AsIx ix it)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall ix it.
NoThunks ix =>
Context -> AsIx ix it -> IO (Maybe ThunkInfo)
forall ix it. NoThunks ix => Proxy (AsIx ix it) -> String
$cnoThunks :: forall ix it.
NoThunks ix =>
Context -> AsIx ix it -> IO (Maybe ThunkInfo)
noThunks :: Context -> AsIx ix it -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall ix it.
NoThunks ix =>
Context -> AsIx ix it -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> AsIx ix it -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall ix it. NoThunks ix => Proxy (AsIx ix it) -> String
showTypeOf :: Proxy (AsIx ix it) -> String
NoThunks, Typeable (AsIx ix it)
Typeable (AsIx ix it) =>
(AsIx ix it -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy (AsIx ix it) -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy [AsIx ix it] -> Size)
-> EncCBOR (AsIx ix it)
AsIx ix it -> Encoding
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsIx ix it] -> Size
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsIx ix it) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> EncCBOR a
forall ix it. (Typeable it, EncCBOR ix) => Typeable (AsIx ix it)
forall ix it. (Typeable it, EncCBOR ix) => AsIx ix it -> Encoding
forall ix it.
(Typeable it, EncCBOR ix) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsIx ix it] -> Size
forall ix it.
(Typeable it, EncCBOR ix) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsIx ix it) -> Size
$cencCBOR :: forall ix it. (Typeable it, EncCBOR ix) => AsIx ix it -> Encoding
encCBOR :: AsIx ix it -> Encoding
$cencodedSizeExpr :: forall ix it.
(Typeable it, EncCBOR ix) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsIx ix it) -> Size
encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsIx ix it) -> Size
$cencodedListSizeExpr :: forall ix it.
(Typeable it, EncCBOR ix) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsIx ix it] -> Size
encodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsIx ix it] -> Size
EncCBOR, Typeable (AsIx ix it)
Typeable (AsIx ix it) =>
(forall s. Decoder s (AsIx ix it))
-> (forall s. Proxy (AsIx ix it) -> Decoder s ())
-> (Proxy (AsIx ix it) -> Text)
-> DecCBOR (AsIx ix it)
Proxy (AsIx ix it) -> Text
forall s. Decoder s (AsIx ix it)
forall a.
Typeable a =>
(forall s. Decoder s a)
-> (forall s. Proxy a -> Decoder s ())
-> (Proxy a -> Text)
-> DecCBOR a
forall s. Proxy (AsIx ix it) -> Decoder s ()
forall ix it. (Typeable it, DecCBOR ix) => Typeable (AsIx ix it)
forall ix it.
(Typeable it, DecCBOR ix) =>
Proxy (AsIx ix it) -> Text
forall ix it s. (Typeable it, DecCBOR ix) => Decoder s (AsIx ix it)
forall ix it s.
(Typeable it, DecCBOR ix) =>
Proxy (AsIx ix it) -> Decoder s ()
$cdecCBOR :: forall ix it s. (Typeable it, DecCBOR ix) => Decoder s (AsIx ix it)
decCBOR :: forall s. Decoder s (AsIx ix it)
$cdropCBOR :: forall ix it s.
(Typeable it, DecCBOR ix) =>
Proxy (AsIx ix it) -> Decoder s ()
dropCBOR :: forall s. Proxy (AsIx ix it) -> Decoder s ()
$clabel :: forall ix it.
(Typeable it, DecCBOR ix) =>
Proxy (AsIx ix it) -> Text
label :: Proxy (AsIx ix it) -> Text
DecCBOR, (forall x. AsIx ix it -> Rep (AsIx ix it) x)
-> (forall x. Rep (AsIx ix it) x -> AsIx ix it)
-> Generic (AsIx ix it)
forall x. Rep (AsIx ix it) x -> AsIx ix it
forall x. AsIx ix it -> Rep (AsIx ix it) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ix it x. Generic ix => Rep (AsIx ix it) x -> AsIx ix it
forall ix it x. Generic ix => AsIx ix it -> Rep (AsIx ix it) x
$cfrom :: forall ix it x. Generic ix => AsIx ix it -> Rep (AsIx ix it) x
from :: forall x. AsIx ix it -> Rep (AsIx ix it) x
$cto :: forall ix it x. Generic ix => Rep (AsIx ix it) x -> AsIx ix it
to :: forall x. Rep (AsIx ix it) x -> AsIx ix it
Generic)

newtype AsItem ix it = AsItem {forall ix it. AsItem ix it -> it
unAsItem :: it}
  deriving stock (Int -> AsItem ix it -> ShowS
[AsItem ix it] -> ShowS
AsItem ix it -> String
(Int -> AsItem ix it -> ShowS)
-> (AsItem ix it -> String)
-> ([AsItem ix it] -> ShowS)
-> Show (AsItem ix it)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ix it. Show it => Int -> AsItem ix it -> ShowS
forall ix it. Show it => [AsItem ix it] -> ShowS
forall ix it. Show it => AsItem ix it -> String
$cshowsPrec :: forall ix it. Show it => Int -> AsItem ix it -> ShowS
showsPrec :: Int -> AsItem ix it -> ShowS
$cshow :: forall ix it. Show it => AsItem ix it -> String
show :: AsItem ix it -> String
$cshowList :: forall ix it. Show it => [AsItem ix it] -> ShowS
showList :: [AsItem ix it] -> ShowS
Show)
  deriving newtype (AsItem ix it -> AsItem ix it -> Bool
(AsItem ix it -> AsItem ix it -> Bool)
-> (AsItem ix it -> AsItem ix it -> Bool) -> Eq (AsItem ix it)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ix it. Eq it => AsItem ix it -> AsItem ix it -> Bool
$c== :: forall ix it. Eq it => AsItem ix it -> AsItem ix it -> Bool
== :: AsItem ix it -> AsItem ix it -> Bool
$c/= :: forall ix it. Eq it => AsItem ix it -> AsItem ix it -> Bool
/= :: AsItem ix it -> AsItem ix it -> Bool
Eq, Eq (AsItem ix it)
Eq (AsItem ix it) =>
(AsItem ix it -> AsItem ix it -> Ordering)
-> (AsItem ix it -> AsItem ix it -> Bool)
-> (AsItem ix it -> AsItem ix it -> Bool)
-> (AsItem ix it -> AsItem ix it -> Bool)
-> (AsItem ix it -> AsItem ix it -> Bool)
-> (AsItem ix it -> AsItem ix it -> AsItem ix it)
-> (AsItem ix it -> AsItem ix it -> AsItem ix it)
-> Ord (AsItem ix it)
AsItem ix it -> AsItem ix it -> Bool
AsItem ix it -> AsItem ix it -> Ordering
AsItem ix it -> AsItem ix it -> AsItem ix it
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ix it. Ord it => Eq (AsItem ix it)
forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Bool
forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Ordering
forall ix it.
Ord it =>
AsItem ix it -> AsItem ix it -> AsItem ix it
$ccompare :: forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Ordering
compare :: AsItem ix it -> AsItem ix it -> Ordering
$c< :: forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Bool
< :: AsItem ix it -> AsItem ix it -> Bool
$c<= :: forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Bool
<= :: AsItem ix it -> AsItem ix it -> Bool
$c> :: forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Bool
> :: AsItem ix it -> AsItem ix it -> Bool
$c>= :: forall ix it. Ord it => AsItem ix it -> AsItem ix it -> Bool
>= :: AsItem ix it -> AsItem ix it -> Bool
$cmax :: forall ix it.
Ord it =>
AsItem ix it -> AsItem ix it -> AsItem ix it
max :: AsItem ix it -> AsItem ix it -> AsItem ix it
$cmin :: forall ix it.
Ord it =>
AsItem ix it -> AsItem ix it -> AsItem ix it
min :: AsItem ix it -> AsItem ix it -> AsItem ix it
Ord, AsItem ix it -> ()
(AsItem ix it -> ()) -> NFData (AsItem ix it)
forall a. (a -> ()) -> NFData a
forall ix it. NFData it => AsItem ix it -> ()
$crnf :: forall ix it. NFData it => AsItem ix it -> ()
rnf :: AsItem ix it -> ()
NFData, Context -> AsItem ix it -> IO (Maybe ThunkInfo)
Proxy (AsItem ix it) -> String
(Context -> AsItem ix it -> IO (Maybe ThunkInfo))
-> (Context -> AsItem ix it -> IO (Maybe ThunkInfo))
-> (Proxy (AsItem ix it) -> String)
-> NoThunks (AsItem ix it)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall ix it.
NoThunks it =>
Context -> AsItem ix it -> IO (Maybe ThunkInfo)
forall ix it. NoThunks it => Proxy (AsItem ix it) -> String
$cnoThunks :: forall ix it.
NoThunks it =>
Context -> AsItem ix it -> IO (Maybe ThunkInfo)
noThunks :: Context -> AsItem ix it -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall ix it.
NoThunks it =>
Context -> AsItem ix it -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> AsItem ix it -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall ix it. NoThunks it => Proxy (AsItem ix it) -> String
showTypeOf :: Proxy (AsItem ix it) -> String
NoThunks, Typeable (AsItem ix it)
Typeable (AsItem ix it) =>
(AsItem ix it -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy (AsItem ix it) -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy [AsItem ix it] -> Size)
-> EncCBOR (AsItem ix it)
AsItem ix it -> Encoding
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsItem ix it] -> Size
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsItem ix it) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> EncCBOR a
forall ix it. (Typeable ix, EncCBOR it) => Typeable (AsItem ix it)
forall ix it. (Typeable ix, EncCBOR it) => AsItem ix it -> Encoding
forall ix it.
(Typeable ix, EncCBOR it) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsItem ix it] -> Size
forall ix it.
(Typeable ix, EncCBOR it) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsItem ix it) -> Size
$cencCBOR :: forall ix it. (Typeable ix, EncCBOR it) => AsItem ix it -> Encoding
encCBOR :: AsItem ix it -> Encoding
$cencodedSizeExpr :: forall ix it.
(Typeable ix, EncCBOR it) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsItem ix it) -> Size
encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AsItem ix it) -> Size
$cencodedListSizeExpr :: forall ix it.
(Typeable ix, EncCBOR it) =>
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsItem ix it] -> Size
encodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [AsItem ix it] -> Size
EncCBOR, Typeable (AsItem ix it)
Typeable (AsItem ix it) =>
(forall s. Decoder s (AsItem ix it))
-> (forall s. Proxy (AsItem ix it) -> Decoder s ())
-> (Proxy (AsItem ix it) -> Text)
-> DecCBOR (AsItem ix it)
Proxy (AsItem ix it) -> Text
forall s. Decoder s (AsItem ix it)
forall a.
Typeable a =>
(forall s. Decoder s a)
-> (forall s. Proxy a -> Decoder s ())
-> (Proxy a -> Text)
-> DecCBOR a
forall s. Proxy (AsItem ix it) -> Decoder s ()
forall ix it. (Typeable ix, DecCBOR it) => Typeable (AsItem ix it)
forall ix it.
(Typeable ix, DecCBOR it) =>
Proxy (AsItem ix it) -> Text
forall ix it s.
(Typeable ix, DecCBOR it) =>
Decoder s (AsItem ix it)
forall ix it s.
(Typeable ix, DecCBOR it) =>
Proxy (AsItem ix it) -> Decoder s ()
$cdecCBOR :: forall ix it s.
(Typeable ix, DecCBOR it) =>
Decoder s (AsItem ix it)
decCBOR :: forall s. Decoder s (AsItem ix it)
$cdropCBOR :: forall ix it s.
(Typeable ix, DecCBOR it) =>
Proxy (AsItem ix it) -> Decoder s ()
dropCBOR :: forall s. Proxy (AsItem ix it) -> Decoder s ()
$clabel :: forall ix it.
(Typeable ix, DecCBOR it) =>
Proxy (AsItem ix it) -> Text
label :: Proxy (AsItem ix it) -> Text
DecCBOR, (forall x. AsItem ix it -> Rep (AsItem ix it) x)
-> (forall x. Rep (AsItem ix it) x -> AsItem ix it)
-> Generic (AsItem ix it)
forall x. Rep (AsItem ix it) x -> AsItem ix it
forall x. AsItem ix it -> Rep (AsItem ix it) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ix it x. Generic it => Rep (AsItem ix it) x -> AsItem ix it
forall ix it x. Generic it => AsItem ix it -> Rep (AsItem ix it) x
$cfrom :: forall ix it x. Generic it => AsItem ix it -> Rep (AsItem ix it) x
from :: forall x. AsItem ix it -> Rep (AsItem ix it) x
$cto :: forall ix it x. Generic it => Rep (AsItem ix it) x -> AsItem ix it
to :: forall x. Rep (AsItem ix it) x -> AsItem ix it
Generic)

data AsIxItem ix it = AsIxItem
  { forall ix it. AsIxItem ix it -> ix
asIndex :: !ix
  , forall ix it. AsIxItem ix it -> it
asItem :: !it
  }
  deriving (AsIxItem ix it -> AsIxItem ix it -> Bool
(AsIxItem ix it -> AsIxItem ix it -> Bool)
-> (AsIxItem ix it -> AsIxItem ix it -> Bool)
-> Eq (AsIxItem ix it)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ix it.
(Eq ix, Eq it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
$c== :: forall ix it.
(Eq ix, Eq it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
== :: AsIxItem ix it -> AsIxItem ix it -> Bool
$c/= :: forall ix it.
(Eq ix, Eq it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
/= :: AsIxItem ix it -> AsIxItem ix it -> Bool
Eq, Eq (AsIxItem ix it)
Eq (AsIxItem ix it) =>
(AsIxItem ix it -> AsIxItem ix it -> Ordering)
-> (AsIxItem ix it -> AsIxItem ix it -> Bool)
-> (AsIxItem ix it -> AsIxItem ix it -> Bool)
-> (AsIxItem ix it -> AsIxItem ix it -> Bool)
-> (AsIxItem ix it -> AsIxItem ix it -> Bool)
-> (AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it)
-> (AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it)
-> Ord (AsIxItem ix it)
AsIxItem ix it -> AsIxItem ix it -> Bool
AsIxItem ix it -> AsIxItem ix it -> Ordering
AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ix it. (Ord ix, Ord it) => Eq (AsIxItem ix it)
forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Ordering
forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
$ccompare :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Ordering
compare :: AsIxItem ix it -> AsIxItem ix it -> Ordering
$c< :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
< :: AsIxItem ix it -> AsIxItem ix it -> Bool
$c<= :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
<= :: AsIxItem ix it -> AsIxItem ix it -> Bool
$c> :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
> :: AsIxItem ix it -> AsIxItem ix it -> Bool
$c>= :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> Bool
>= :: AsIxItem ix it -> AsIxItem ix it -> Bool
$cmax :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
max :: AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
$cmin :: forall ix it.
(Ord ix, Ord it) =>
AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
min :: AsIxItem ix it -> AsIxItem ix it -> AsIxItem ix it
Ord, Int -> AsIxItem ix it -> ShowS
[AsIxItem ix it] -> ShowS
AsIxItem ix it -> String
(Int -> AsIxItem ix it -> ShowS)
-> (AsIxItem ix it -> String)
-> ([AsIxItem ix it] -> ShowS)
-> Show (AsIxItem ix it)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ix it. (Show ix, Show it) => Int -> AsIxItem ix it -> ShowS
forall ix it. (Show ix, Show it) => [AsIxItem ix it] -> ShowS
forall ix it. (Show ix, Show it) => AsIxItem ix it -> String
$cshowsPrec :: forall ix it. (Show ix, Show it) => Int -> AsIxItem ix it -> ShowS
showsPrec :: Int -> AsIxItem ix it -> ShowS
$cshow :: forall ix it. (Show ix, Show it) => AsIxItem ix it -> String
show :: AsIxItem ix it -> String
$cshowList :: forall ix it. (Show ix, Show it) => [AsIxItem ix it] -> ShowS
showList :: [AsIxItem ix it] -> ShowS
Show, (forall x. AsIxItem ix it -> Rep (AsIxItem ix it) x)
-> (forall x. Rep (AsIxItem ix it) x -> AsIxItem ix it)
-> Generic (AsIxItem ix it)
forall x. Rep (AsIxItem ix it) x -> AsIxItem ix it
forall x. AsIxItem ix it -> Rep (AsIxItem ix it) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ix it x. Rep (AsIxItem ix it) x -> AsIxItem ix it
forall ix it x. AsIxItem ix it -> Rep (AsIxItem ix it) x
$cfrom :: forall ix it x. AsIxItem ix it -> Rep (AsIxItem ix it) x
from :: forall x. AsIxItem ix it -> Rep (AsIxItem ix it) x
$cto :: forall ix it x. Rep (AsIxItem ix it) x -> AsIxItem ix it
to :: forall x. Rep (AsIxItem ix it) x -> AsIxItem ix it
Generic)

instance (NoThunks ix, NoThunks it) => NoThunks (AsIxItem ix it)

instance (NFData ix, NFData it) => NFData (AsIxItem ix it) where
  rnf :: AsIxItem ix it -> ()
rnf (AsIxItem ix
ix it
it) = ix
ix ix -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq` it -> ()
forall a. NFData a => a -> ()
rnf it
it

instance ToJSON ix => ToJSON (AsIx ix it) where
  toJSON :: AsIx ix it -> Value
toJSON (AsIx ix
i) = [Pair] -> Value
object [Key
"index" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ix -> Value
forall a. ToJSON a => a -> Value
toJSON ix
i]

instance ToJSON it => ToJSON (AsItem ix it) where
  toJSON :: AsItem ix it -> Value
toJSON (AsItem it
i) = [Pair] -> Value
object [Key
"item" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= it -> Value
forall a. ToJSON a => a -> Value
toJSON it
i]

instance (ToJSON ix, ToJSON it) => ToJSON (AsIxItem ix it) where
  toJSON :: AsIxItem ix it -> Value
toJSON (AsIxItem ix
ix it
it) =
    [Pair] -> Value
object
      [ Key
"index" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ix -> Value
forall a. ToJSON a => a -> Value
toJSON ix
ix
      , Key
"item" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= it -> Value
forall a. ToJSON a => a -> Value
toJSON it
it
      ]

toAsItem :: AsIxItem ix it -> AsItem ix it
toAsItem :: forall ix it. AsIxItem ix it -> AsItem ix it
toAsItem (AsIxItem ix
_ it
it) = it -> AsItem ix it
forall ix it. it -> AsItem ix it
AsItem it
it

toAsIx :: AsIxItem ix it -> AsIx ix it
toAsIx :: forall ix it. AsIxItem ix it -> AsIx ix it
toAsIx (AsIxItem ix
ix it
_) = ix -> AsIx ix it
forall ix it. ix -> AsIx ix it
AsIx ix
ix

data AlonzoPlutusPurpose f era
  = AlonzoSpending !(f Word32 TxIn)
  | AlonzoMinting !(f Word32 PolicyID)
  | AlonzoCertifying !(f Word32 (TxCert era))
  | AlonzoRewarding !(f Word32 RewardAccount)
  deriving ((forall x.
 AlonzoPlutusPurpose f era -> Rep (AlonzoPlutusPurpose f era) x)
-> (forall x.
    Rep (AlonzoPlutusPurpose f era) x -> AlonzoPlutusPurpose f era)
-> Generic (AlonzoPlutusPurpose f era)
forall x.
Rep (AlonzoPlutusPurpose f era) x -> AlonzoPlutusPurpose f era
forall x.
AlonzoPlutusPurpose f era -> Rep (AlonzoPlutusPurpose f era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (f :: * -> * -> *) era x.
Rep (AlonzoPlutusPurpose f era) x -> AlonzoPlutusPurpose f era
forall (f :: * -> * -> *) era x.
AlonzoPlutusPurpose f era -> Rep (AlonzoPlutusPurpose f era) x
$cfrom :: forall (f :: * -> * -> *) era x.
AlonzoPlutusPurpose f era -> Rep (AlonzoPlutusPurpose f era) x
from :: forall x.
AlonzoPlutusPurpose f era -> Rep (AlonzoPlutusPurpose f era) x
$cto :: forall (f :: * -> * -> *) era x.
Rep (AlonzoPlutusPurpose f era) x -> AlonzoPlutusPurpose f era
to :: forall x.
Rep (AlonzoPlutusPurpose f era) x -> AlonzoPlutusPurpose f era
Generic)

deriving instance Eq (AlonzoPlutusPurpose AsIx era)

deriving instance Ord (AlonzoPlutusPurpose AsIx era)

deriving instance Show (AlonzoPlutusPurpose AsIx era)

instance NoThunks (AlonzoPlutusPurpose AsIx era)

deriving instance Eq (TxCert era) => Eq (AlonzoPlutusPurpose AsItem era)

deriving instance Show (TxCert era) => Show (AlonzoPlutusPurpose AsItem era)

instance NoThunks (TxCert era) => NoThunks (AlonzoPlutusPurpose AsItem era)

deriving instance Eq (TxCert era) => Eq (AlonzoPlutusPurpose AsIxItem era)

deriving instance Show (TxCert era) => Show (AlonzoPlutusPurpose AsIxItem era)

instance NoThunks (TxCert era) => NoThunks (AlonzoPlutusPurpose AsIxItem era)

instance
  (forall a b. (NFData a, NFData b) => NFData (f a b), NFData (TxCert era), Era era) =>
  NFData (AlonzoPlutusPurpose f era)
  where
  rnf :: AlonzoPlutusPurpose f era -> ()
rnf = \case
    AlonzoSpending f Word32 TxIn
x -> f Word32 TxIn -> ()
forall a. NFData a => a -> ()
rnf f Word32 TxIn
x
    AlonzoMinting f Word32 PolicyID
x -> f Word32 PolicyID -> ()
forall a. NFData a => a -> ()
rnf f Word32 PolicyID
x
    AlonzoCertifying f Word32 (TxCert era)
x -> f Word32 (TxCert era) -> ()
forall a. NFData a => a -> ()
rnf f Word32 (TxCert era)
x
    AlonzoRewarding f Word32 RewardAccount
x -> f Word32 RewardAccount -> ()
forall a. NFData a => a -> ()
rnf f Word32 RewardAccount
x

instance Era era => EncCBORGroup (AlonzoPlutusPurpose AsIx era) where
  listLen :: AlonzoPlutusPurpose AsIx era -> Word
listLen AlonzoPlutusPurpose AsIx era
_ = Word
2
  listLenBound :: Proxy (AlonzoPlutusPurpose AsIx era) -> Word
listLenBound Proxy (AlonzoPlutusPurpose AsIx era)
_ = Word
2
  encCBORGroup :: AlonzoPlutusPurpose AsIx era -> Encoding
encCBORGroup = \case
    AlonzoSpending (AsIx Word32
redeemerIx) -> Word8 -> Encoding
encodeWord8 Word8
0 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Word32
redeemerIx
    AlonzoMinting (AsIx Word32
redeemerIx) -> Word8 -> Encoding
encodeWord8 Word8
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Word32
redeemerIx
    AlonzoCertifying (AsIx Word32
redeemerIx) -> Word8 -> Encoding
encodeWord8 Word8
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Word32
redeemerIx
    AlonzoRewarding (AsIx Word32
redeemerIx) -> Word8 -> Encoding
encodeWord8 Word8
3 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Word32
redeemerIx
  encodedGroupSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (AlonzoPlutusPurpose AsIx era) -> Size
encodedGroupSizeExpr forall t. EncCBOR t => Proxy t -> Size
size_ Proxy (AlonzoPlutusPurpose AsIx era)
_proxy =
    (forall t. EncCBOR t => Proxy t -> Size) -> Proxy Word8 -> Size
forall a.
EncCBOR a =>
(forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size
encodedSizeExpr Proxy t -> Size
forall t. EncCBOR t => Proxy t -> Size
size_ (Proxy Word8
forall {k} (t :: k). Proxy t
Proxy :: Proxy Word8)
      Size -> Size -> Size
forall a. Num a => a -> a -> a
+ (forall t. EncCBOR t => Proxy t -> Size) -> Proxy Word16 -> Size
forall a.
EncCBOR a =>
(forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size
encodedSizeExpr Proxy t -> Size
forall t. EncCBOR t => Proxy t -> Size
size_ (Proxy Word16
forall {k} (t :: k). Proxy t
Proxy :: Proxy Word16)

instance Era era => DecCBORGroup (AlonzoPlutusPurpose AsIx era) where
  decCBORGroup :: forall s. Decoder s (AlonzoPlutusPurpose AsIx era)
decCBORGroup =
    Decoder s Word8
forall s. Decoder s Word8
decodeWord8 Decoder s Word8
-> (Word8 -> Decoder s (AlonzoPlutusPurpose AsIx era))
-> Decoder s (AlonzoPlutusPurpose AsIx era)
forall a b. Decoder s a -> (a -> Decoder s b) -> Decoder s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Word8
0 -> AsIx Word32 TxIn -> AlonzoPlutusPurpose AsIx era
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending (AsIx Word32 TxIn -> AlonzoPlutusPurpose AsIx era)
-> (Word32 -> AsIx Word32 TxIn)
-> Word32
-> AlonzoPlutusPurpose AsIx era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
AsIx (Word32 -> AlonzoPlutusPurpose AsIx era)
-> Decoder s Word32 -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Word32
forall s. Decoder s Word32
forall a s. DecCBOR a => Decoder s a
decCBOR
      Word8
1 -> AsIx Word32 PolicyID -> AlonzoPlutusPurpose AsIx era
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting (AsIx Word32 PolicyID -> AlonzoPlutusPurpose AsIx era)
-> (Word32 -> AsIx Word32 PolicyID)
-> Word32
-> AlonzoPlutusPurpose AsIx era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> AsIx Word32 PolicyID
forall ix it. ix -> AsIx ix it
AsIx (Word32 -> AlonzoPlutusPurpose AsIx era)
-> Decoder s Word32 -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Word32
forall s. Decoder s Word32
forall a s. DecCBOR a => Decoder s a
decCBOR
      Word8
2 -> AsIx Word32 (TxCert era) -> AlonzoPlutusPurpose AsIx era
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (AsIx Word32 (TxCert era) -> AlonzoPlutusPurpose AsIx era)
-> (Word32 -> AsIx Word32 (TxCert era))
-> Word32
-> AlonzoPlutusPurpose AsIx era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> AsIx Word32 (TxCert era)
forall ix it. ix -> AsIx ix it
AsIx (Word32 -> AlonzoPlutusPurpose AsIx era)
-> Decoder s Word32 -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Word32
forall s. Decoder s Word32
forall a s. DecCBOR a => Decoder s a
decCBOR
      Word8
3 -> AsIx Word32 RewardAccount -> AlonzoPlutusPurpose AsIx era
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding (AsIx Word32 RewardAccount -> AlonzoPlutusPurpose AsIx era)
-> (Word32 -> AsIx Word32 RewardAccount)
-> Word32
-> AlonzoPlutusPurpose AsIx era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> AsIx Word32 RewardAccount
forall ix it. ix -> AsIx ix it
AsIx (Word32 -> AlonzoPlutusPurpose AsIx era)
-> Decoder s Word32 -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Word32
forall s. Decoder s Word32
forall a s. DecCBOR a => Decoder s a
decCBOR
      Word8
n -> String -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Decoder s (AlonzoPlutusPurpose AsIx era))
-> String -> Decoder s (AlonzoPlutusPurpose AsIx era)
forall a b. (a -> b) -> a -> b
$ String
"Unexpected tag for AlonzoPlutusPurpose: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word8 -> String
forall a. Show a => a -> String
show Word8
n

-- | Incorrect CBOR implementation. Missing length encoding. Must keep it for backwards
-- compatibility
instance Era era => EncCBOR (AlonzoPlutusPurpose AsIx era) where
  encCBOR :: AlonzoPlutusPurpose AsIx era -> Encoding
encCBOR = AlonzoPlutusPurpose AsIx era -> Encoding
forall a. EncCBORGroup a => a -> Encoding
encCBORGroup

-- | Incorrect CBOR implementation. Missing length encoding. Must keep it for backwards
-- compatibility
instance Era era => DecCBOR (AlonzoPlutusPurpose AsIx era) where
  decCBOR :: forall s. Decoder s (AlonzoPlutusPurpose AsIx era)
decCBOR = Decoder s (AlonzoPlutusPurpose AsIx era)
forall s. Decoder s (AlonzoPlutusPurpose AsIx era)
forall a s. DecCBORGroup a => Decoder s a
decCBORGroup

instance
  ( forall a b. (ToJSON a, ToJSON b) => ToJSON (f a b)
  , ToJSON (TxCert era)
  , Era era
  ) =>
  ToJSON (AlonzoPlutusPurpose f era)
  where
  toJSON :: AlonzoPlutusPurpose f era -> Value
toJSON = \case
    AlonzoSpending f Word32 TxIn
n -> Text -> f Word32 TxIn -> Value
forall {v}. ToJSON v => Text -> v -> Value
kindObjectWithValue Text
"AlonzoSpending" f Word32 TxIn
n
    AlonzoMinting f Word32 PolicyID
n -> Text -> f Word32 PolicyID -> Value
forall {v}. ToJSON v => Text -> v -> Value
kindObjectWithValue Text
"AlonzoMinting" f Word32 PolicyID
n
    AlonzoCertifying f Word32 (TxCert era)
n -> Text -> f Word32 (TxCert era) -> Value
forall {v}. ToJSON v => Text -> v -> Value
kindObjectWithValue Text
"AlonzoCertifying" f Word32 (TxCert era)
n
    AlonzoRewarding f Word32 RewardAccount
n -> Text -> f Word32 RewardAccount -> Value
forall {v}. ToJSON v => Text -> v -> Value
kindObjectWithValue Text
"AlonzoRewarding" f Word32 RewardAccount
n
    where
      kindObjectWithValue :: Text -> v -> Value
kindObjectWithValue Text
name v
n = Text -> [Pair] -> Value
kindObject Text
name [Key
"value" Key -> v -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= v
n]

-- | /Note/ - serialization of `AlonzoPlutusPurpose` `AsItem`
--
-- * Tags do not match the `AlonzoPlutusPurpose` `AsIx`. Unfortunate inconsistency
--
-- * It is only used for predicate failures. Thus we can change it after Conway to be
--   consistent with `AlonzoPlutusPurpose` `AsIx`
instance (Era era, EncCBOR (TxCert era)) => EncCBOR (AlonzoPlutusPurpose AsItem era) where
  encCBOR :: AlonzoPlutusPurpose AsItem era -> Encoding
encCBOR = \case
    AlonzoSpending (AsItem TxIn
x) -> Encode 'Open (AlonzoPlutusPurpose AsItem era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode ((TxIn -> AlonzoPlutusPurpose AsItem era)
-> Word -> Encode 'Open (TxIn -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Word -> Encode 'Open t
Sum (forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending @_ @era (AsItem Word32 TxIn -> AlonzoPlutusPurpose AsItem era)
-> (TxIn -> AsItem Word32 TxIn)
-> TxIn
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
AsItem) Word
1 Encode 'Open (TxIn -> AlonzoPlutusPurpose AsItem era)
-> Encode ('Closed 'Dense) TxIn
-> Encode 'Open (AlonzoPlutusPurpose AsItem era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> TxIn -> Encode ('Closed 'Dense) TxIn
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To TxIn
x)
    AlonzoMinting (AsItem PolicyID
x) -> Encode 'Open (AlonzoPlutusPurpose AsItem era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode ((PolicyID -> AlonzoPlutusPurpose AsItem era)
-> Word
-> Encode 'Open (PolicyID -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Word -> Encode 'Open t
Sum (forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting @_ @era (AsItem Word32 PolicyID -> AlonzoPlutusPurpose AsItem era)
-> (PolicyID -> AsItem Word32 PolicyID)
-> PolicyID
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PolicyID -> AsItem Word32 PolicyID
forall ix it. it -> AsItem ix it
AsItem) Word
0 Encode 'Open (PolicyID -> AlonzoPlutusPurpose AsItem era)
-> Encode ('Closed 'Dense) PolicyID
-> Encode 'Open (AlonzoPlutusPurpose AsItem era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> PolicyID -> Encode ('Closed 'Dense) PolicyID
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To PolicyID
x)
    AlonzoCertifying (AsItem TxCert era
x) -> Encode 'Open (AlonzoPlutusPurpose AsItem era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode ((TxCert era -> AlonzoPlutusPurpose AsItem era)
-> Word
-> Encode 'Open (TxCert era -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Word -> Encode 'Open t
Sum (AsItem Word32 (TxCert era) -> AlonzoPlutusPurpose AsItem era
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (AsItem Word32 (TxCert era) -> AlonzoPlutusPurpose AsItem era)
-> (TxCert era -> AsItem Word32 (TxCert era))
-> TxCert era
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxCert era -> AsItem Word32 (TxCert era)
forall ix it. it -> AsItem ix it
AsItem) Word
3 Encode 'Open (TxCert era -> AlonzoPlutusPurpose AsItem era)
-> Encode ('Closed 'Dense) (TxCert era)
-> Encode 'Open (AlonzoPlutusPurpose AsItem era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> TxCert era -> Encode ('Closed 'Dense) (TxCert era)
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To TxCert era
x)
    AlonzoRewarding (AsItem RewardAccount
x) -> Encode 'Open (AlonzoPlutusPurpose AsItem era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode ((RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> Word
-> Encode 'Open (RewardAccount -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Word -> Encode 'Open t
Sum (forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding @_ @era (AsItem Word32 RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> (RewardAccount -> AsItem Word32 RewardAccount)
-> RewardAccount
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RewardAccount -> AsItem Word32 RewardAccount
forall ix it. it -> AsItem ix it
AsItem) Word
2 Encode 'Open (RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> Encode ('Closed 'Dense) RewardAccount
-> Encode 'Open (AlonzoPlutusPurpose AsItem era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> RewardAccount -> Encode ('Closed 'Dense) RewardAccount
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To RewardAccount
x)

-- | See note on the `EncCBOR` instace.
instance (Era era, DecCBOR (TxCert era)) => DecCBOR (AlonzoPlutusPurpose AsItem era) where
  decCBOR :: forall s. Decoder s (AlonzoPlutusPurpose AsItem era)
decCBOR = Decode ('Closed 'Dense) (AlonzoPlutusPurpose AsItem era)
-> Decoder s (AlonzoPlutusPurpose AsItem era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Text
-> (Word -> Decode 'Open (AlonzoPlutusPurpose AsItem era))
-> Decode ('Closed 'Dense) (AlonzoPlutusPurpose AsItem era)
forall t.
Text -> (Word -> Decode 'Open t) -> Decode ('Closed 'Dense) t
Summands Text
"AlonzoPlutusPurpose" Word -> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall {era}.
DecCBOR (TxCert era) =>
Word -> Decode 'Open (AlonzoPlutusPurpose AsItem era)
dec)
    where
      dec :: Word -> Decode 'Open (AlonzoPlutusPurpose AsItem era)
dec Word
1 = (TxIn -> AlonzoPlutusPurpose AsItem era)
-> Decode 'Open (TxIn -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Decode 'Open t
SumD (AsItem Word32 TxIn -> AlonzoPlutusPurpose AsItem era
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending (AsItem Word32 TxIn -> AlonzoPlutusPurpose AsItem era)
-> (TxIn -> AsItem Word32 TxIn)
-> TxIn
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
AsItem) Decode 'Open (TxIn -> AlonzoPlutusPurpose AsItem era)
-> Decode ('Closed Any) TxIn
-> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) TxIn
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      dec Word
0 = (PolicyID -> AlonzoPlutusPurpose AsItem era)
-> Decode 'Open (PolicyID -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Decode 'Open t
SumD (AsItem Word32 PolicyID -> AlonzoPlutusPurpose AsItem era
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting (AsItem Word32 PolicyID -> AlonzoPlutusPurpose AsItem era)
-> (PolicyID -> AsItem Word32 PolicyID)
-> PolicyID
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PolicyID -> AsItem Word32 PolicyID
forall ix it. it -> AsItem ix it
AsItem) Decode 'Open (PolicyID -> AlonzoPlutusPurpose AsItem era)
-> Decode ('Closed Any) PolicyID
-> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) PolicyID
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      dec Word
3 = (TxCert era -> AlonzoPlutusPurpose AsItem era)
-> Decode 'Open (TxCert era -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Decode 'Open t
SumD (AsItem Word32 (TxCert era) -> AlonzoPlutusPurpose AsItem era
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (AsItem Word32 (TxCert era) -> AlonzoPlutusPurpose AsItem era)
-> (TxCert era -> AsItem Word32 (TxCert era))
-> TxCert era
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxCert era -> AsItem Word32 (TxCert era)
forall ix it. it -> AsItem ix it
AsItem) Decode 'Open (TxCert era -> AlonzoPlutusPurpose AsItem era)
-> Decode ('Closed Any) (TxCert era)
-> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (TxCert era)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      dec Word
2 = (RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> Decode 'Open (RewardAccount -> AlonzoPlutusPurpose AsItem era)
forall t. t -> Decode 'Open t
SumD (AsItem Word32 RewardAccount -> AlonzoPlutusPurpose AsItem era
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding (AsItem Word32 RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> (RewardAccount -> AsItem Word32 RewardAccount)
-> RewardAccount
-> AlonzoPlutusPurpose AsItem era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RewardAccount -> AsItem Word32 RewardAccount
forall ix it. it -> AsItem ix it
AsItem) Decode 'Open (RewardAccount -> AlonzoPlutusPurpose AsItem era)
-> Decode ('Closed Any) RewardAccount
-> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) RewardAccount
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      dec Word
n = Word -> Decode 'Open (AlonzoPlutusPurpose AsItem era)
forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
n

pattern SpendingPurpose ::
  AlonzoEraScript era => f Word32 TxIn -> PlutusPurpose f era
pattern $mSpendingPurpose :: forall {r} {era} {f :: * -> * -> *}.
AlonzoEraScript era =>
PlutusPurpose f era -> (f Word32 TxIn -> r) -> ((# #) -> r) -> r
$bSpendingPurpose :: forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 TxIn -> PlutusPurpose f era
SpendingPurpose c <- (toSpendingPurpose -> Just c)
  where
    SpendingPurpose f Word32 TxIn
c = f Word32 TxIn -> PlutusPurpose f era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 TxIn -> PlutusPurpose f era
forall (f :: * -> * -> *). f Word32 TxIn -> PlutusPurpose f era
mkSpendingPurpose f Word32 TxIn
c

pattern MintingPurpose ::
  AlonzoEraScript era => f Word32 PolicyID -> PlutusPurpose f era
pattern $mMintingPurpose :: forall {r} {era} {f :: * -> * -> *}.
AlonzoEraScript era =>
PlutusPurpose f era
-> (f Word32 PolicyID -> r) -> ((# #) -> r) -> r
$bMintingPurpose :: forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 PolicyID -> PlutusPurpose f era
MintingPurpose c <- (toMintingPurpose -> Just c)
  where
    MintingPurpose f Word32 PolicyID
c = f Word32 PolicyID -> PlutusPurpose f era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 PolicyID -> PlutusPurpose f era
forall (f :: * -> * -> *). f Word32 PolicyID -> PlutusPurpose f era
mkMintingPurpose f Word32 PolicyID
c

pattern CertifyingPurpose ::
  AlonzoEraScript era => f Word32 (TxCert era) -> PlutusPurpose f era
pattern $mCertifyingPurpose :: forall {r} {era} {f :: * -> * -> *}.
AlonzoEraScript era =>
PlutusPurpose f era
-> (f Word32 (TxCert era) -> r) -> ((# #) -> r) -> r
$bCertifyingPurpose :: forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 (TxCert era) -> PlutusPurpose f era
CertifyingPurpose c <- (toCertifyingPurpose -> Just c)
  where
    CertifyingPurpose f Word32 (TxCert era)
c = f Word32 (TxCert era) -> PlutusPurpose f era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 (TxCert era) -> PlutusPurpose f era
forall (f :: * -> * -> *).
f Word32 (TxCert era) -> PlutusPurpose f era
mkCertifyingPurpose f Word32 (TxCert era)
c

pattern RewardingPurpose ::
  AlonzoEraScript era => f Word32 RewardAccount -> PlutusPurpose f era
pattern $mRewardingPurpose :: forall {r} {era} {f :: * -> * -> *}.
AlonzoEraScript era =>
PlutusPurpose f era
-> (f Word32 RewardAccount -> r) -> ((# #) -> r) -> r
$bRewardingPurpose :: forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 RewardAccount -> PlutusPurpose f era
RewardingPurpose c <- (toRewardingPurpose -> Just c)
  where
    RewardingPurpose f Word32 RewardAccount
c = f Word32 RewardAccount -> PlutusPurpose f era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 RewardAccount -> PlutusPurpose f era
forall (f :: * -> * -> *).
f Word32 RewardAccount -> PlutusPurpose f era
mkRewardingPurpose f Word32 RewardAccount
c

-- Alonzo Script ===============================================================

-- | Scripts in the Alonzo Era, Either a Timelock script or a Plutus script.
data AlonzoScript era
  = TimelockScript !(Timelock era)
  | PlutusScript !(PlutusScript era)
  deriving ((forall x. AlonzoScript era -> Rep (AlonzoScript era) x)
-> (forall x. Rep (AlonzoScript era) x -> AlonzoScript era)
-> Generic (AlonzoScript era)
forall x. Rep (AlonzoScript era) x -> AlonzoScript era
forall x. AlonzoScript era -> Rep (AlonzoScript era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (AlonzoScript era) x -> AlonzoScript era
forall era x. AlonzoScript era -> Rep (AlonzoScript era) x
$cfrom :: forall era x. AlonzoScript era -> Rep (AlonzoScript era) x
from :: forall x. AlonzoScript era -> Rep (AlonzoScript era) x
$cto :: forall era x. Rep (AlonzoScript era) x -> AlonzoScript era
to :: forall x. Rep (AlonzoScript era) x -> AlonzoScript era
Generic)

instance (Era era, MemPack (PlutusScript era)) => MemPack (AlonzoScript era) where
  packedByteCount :: AlonzoScript era -> Int
packedByteCount = \case
    TimelockScript Timelock era
script -> Int
packedTagByteCount Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Timelock era -> Int
forall a. MemPack a => a -> Int
packedByteCount Timelock era
script
    PlutusScript PlutusScript era
script -> Int
packedTagByteCount Int -> Int -> Int
forall a. Num a => a -> a -> a
+ PlutusScript era -> Int
forall a. MemPack a => a -> Int
packedByteCount PlutusScript era
script
  packM :: forall s. AlonzoScript era -> Pack s ()
packM = \case
    TimelockScript Timelock era
script -> Tag -> Pack s ()
forall s. Tag -> Pack s ()
packTagM Tag
0 Pack s () -> Pack s () -> Pack s ()
forall a b. Pack s a -> Pack s b -> Pack s b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Timelock era -> Pack s ()
forall s. Timelock era -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
packM Timelock era
script
    PlutusScript PlutusScript era
script -> Tag -> Pack s ()
forall s. Tag -> Pack s ()
packTagM Tag
1 Pack s () -> Pack s () -> Pack s ()
forall a b. Pack s a -> Pack s b -> Pack s b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PlutusScript era -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
forall s. PlutusScript era -> Pack s ()
packM PlutusScript era
script
  {-# INLINE packM #-}
  unpackM :: forall b. Buffer b => Unpack b (AlonzoScript era)
unpackM =
    Unpack b Tag
forall b. Buffer b => Unpack b Tag
unpackTagM Unpack b Tag
-> (Tag -> Unpack b (AlonzoScript era))
-> Unpack b (AlonzoScript era)
forall a b. Unpack b a -> (a -> Unpack b b) -> Unpack b b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Tag
0 -> Timelock era -> AlonzoScript era
forall era. Timelock era -> AlonzoScript era
TimelockScript (Timelock era -> AlonzoScript era)
-> Unpack b (Timelock era) -> Unpack b (AlonzoScript era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Unpack b (Timelock era)
forall a b. (MemPack a, Buffer b) => Unpack b a
forall b. Buffer b => Unpack b (Timelock era)
unpackM
      Tag
1 -> PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript (PlutusScript era -> AlonzoScript era)
-> Unpack b (PlutusScript era) -> Unpack b (AlonzoScript era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Unpack b (PlutusScript era)
forall a b. (MemPack a, Buffer b) => Unpack b a
forall b. Buffer b => Unpack b (PlutusScript era)
unpackM
      Tag
n -> forall a (m :: * -> *) b. (MemPack a, MonadFail m) => Tag -> m b
unknownTagM @(AlonzoScript era) Tag
n
  {-# INLINE unpackM #-}

deriving instance Eq (PlutusScript era) => Eq (AlonzoScript era)

instance (Era era, NoThunks (PlutusScript era)) => NoThunks (AlonzoScript era)

instance NFData (PlutusScript era) => NFData (AlonzoScript era) where
  rnf :: AlonzoScript era -> ()
rnf = \case
    TimelockScript Timelock era
ts -> Timelock era -> ()
forall a. NFData a => a -> ()
rnf Timelock era
ts
    PlutusScript PlutusScript era
ps -> PlutusScript era -> ()
forall a. NFData a => a -> ()
rnf PlutusScript era
ps

instance (AlonzoEraScript era, Script era ~ AlonzoScript era) => Show (AlonzoScript era) where
  show :: AlonzoScript era -> String
show (TimelockScript Timelock era
x) = String
"TimelockScript " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Timelock era -> String
forall a. Show a => a -> String
show Timelock era
x
  show s :: AlonzoScript era
s@(PlutusScript PlutusScript era
plutus) =
    String
"PlutusScript " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Language -> String
forall a. Show a => a -> String
show (PlutusScript era -> Language
forall era. AlonzoEraScript era => PlutusScript era -> Language
plutusScriptLanguage PlutusScript era
plutus) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ScriptHash -> String
forall a. Show a => a -> String
show (forall era. EraScript era => Script era -> ScriptHash
hashScript @era Script era
AlonzoScript era
s)

-- | Both constructors know their original bytes
instance SafeToHash (PlutusScript era) => SafeToHash (AlonzoScript era) where
  originalBytes :: AlonzoScript era -> ByteString
originalBytes (TimelockScript Timelock era
t) = Timelock era -> ByteString
forall t. SafeToHash t => t -> ByteString
originalBytes Timelock era
t
  originalBytes (PlutusScript PlutusScript era
plutus) = PlutusScript era -> ByteString
forall t. SafeToHash t => t -> ByteString
originalBytes PlutusScript era
plutus

isPlutusScript :: AlonzoEraScript era => Script era -> Bool
isPlutusScript :: forall era. AlonzoEraScript era => Script era -> Bool
isPlutusScript = Maybe (PlutusScript era) -> Bool
forall a. Maybe a -> Bool
isJust (Maybe (PlutusScript era) -> Bool)
-> (Script era -> Maybe (PlutusScript era)) -> Script era -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Script era -> Maybe (PlutusScript era)
forall era.
AlonzoEraScript era =>
Script era -> Maybe (PlutusScript era)
toPlutusScript

instance EraScript AlonzoEra where
  type Script AlonzoEra = AlonzoScript AlonzoEra
  type NativeScript AlonzoEra = Timelock AlonzoEra

  upgradeScript :: EraScript (PreviousEra AlonzoEra) =>
Script (PreviousEra AlonzoEra) -> Script AlonzoEra
upgradeScript = Timelock AlonzoEra -> AlonzoScript AlonzoEra
forall era. Timelock era -> AlonzoScript era
TimelockScript (Timelock AlonzoEra -> AlonzoScript AlonzoEra)
-> (Timelock MaryEra -> Timelock AlonzoEra)
-> Timelock MaryEra
-> AlonzoScript AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Timelock MaryEra -> Timelock AlonzoEra
forall era1 era2.
(Era era1, Era era2) =>
Timelock era1 -> Timelock era2
translateTimelock

  scriptPrefixTag :: Script AlonzoEra -> ByteString
scriptPrefixTag = Script AlonzoEra -> ByteString
forall era.
(AlonzoEraScript era, AlonzoScript era ~ Script era) =>
Script era -> ByteString
alonzoScriptPrefixTag

  getNativeScript :: Script AlonzoEra -> Maybe (NativeScript AlonzoEra)
getNativeScript = \case
    TimelockScript Timelock AlonzoEra
ts -> Timelock AlonzoEra -> Maybe (Timelock AlonzoEra)
forall a. a -> Maybe a
Just Timelock AlonzoEra
ts
    Script AlonzoEra
_ -> Maybe (Timelock AlonzoEra)
Maybe (NativeScript AlonzoEra)
forall a. Maybe a
Nothing

  fromNativeScript :: NativeScript AlonzoEra -> Script AlonzoEra
fromNativeScript = Timelock AlonzoEra -> AlonzoScript AlonzoEra
NativeScript AlonzoEra -> Script AlonzoEra
forall era. Timelock era -> AlonzoScript era
TimelockScript

alonzoScriptPrefixTag ::
  (AlonzoEraScript era, AlonzoScript era ~ Script era) =>
  Script era ->
  BS.ByteString
alonzoScriptPrefixTag :: forall era.
(AlonzoEraScript era, AlonzoScript era ~ Script era) =>
Script era -> ByteString
alonzoScriptPrefixTag = \case
  TimelockScript Timelock era
_ -> ByteString
nativeMultiSigTag -- "\x00"
  PlutusScript PlutusScript era
plutusScript -> Word8 -> ByteString
BS.singleton (PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> Word8)
-> Word8
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
plutusScript Plutus l -> Word8
forall (l :: Language). PlutusLanguage l => Plutus l -> Word8
plutusLanguageTag)

instance ShelleyEraScript AlonzoEra where
  mkRequireSignature :: KeyHash 'Witness -> NativeScript AlonzoEra
mkRequireSignature = KeyHash 'Witness -> Timelock AlonzoEra
KeyHash 'Witness -> NativeScript AlonzoEra
forall era. Era era => KeyHash 'Witness -> Timelock era
mkRequireSignatureTimelock
  getRequireSignature :: NativeScript AlonzoEra -> Maybe (KeyHash 'Witness)
getRequireSignature = Timelock AlonzoEra -> Maybe (KeyHash 'Witness)
NativeScript AlonzoEra -> Maybe (KeyHash 'Witness)
forall {k} (era :: k). Timelock era -> Maybe (KeyHash 'Witness)
getRequireSignatureTimelock

  mkRequireAllOf :: StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
mkRequireAllOf = StrictSeq (Timelock AlonzoEra) -> Timelock AlonzoEra
StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
forall era. Era era => StrictSeq (Timelock era) -> Timelock era
mkRequireAllOfTimelock
  getRequireAllOf :: NativeScript AlonzoEra
-> Maybe (StrictSeq (NativeScript AlonzoEra))
getRequireAllOf = Timelock AlonzoEra -> Maybe (StrictSeq (Timelock AlonzoEra))
NativeScript AlonzoEra
-> Maybe (StrictSeq (NativeScript AlonzoEra))
forall {k} (era :: k).
Timelock era -> Maybe (StrictSeq (Timelock era))
getRequireAllOfTimelock

  mkRequireAnyOf :: StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
mkRequireAnyOf = StrictSeq (Timelock AlonzoEra) -> Timelock AlonzoEra
StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
forall era. Era era => StrictSeq (Timelock era) -> Timelock era
mkRequireAnyOfTimelock
  getRequireAnyOf :: NativeScript AlonzoEra
-> Maybe (StrictSeq (NativeScript AlonzoEra))
getRequireAnyOf = Timelock AlonzoEra -> Maybe (StrictSeq (Timelock AlonzoEra))
NativeScript AlonzoEra
-> Maybe (StrictSeq (NativeScript AlonzoEra))
forall {k} (era :: k).
Timelock era -> Maybe (StrictSeq (Timelock era))
getRequireAnyOfTimelock

  mkRequireMOf :: Int -> StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
mkRequireMOf = Int -> StrictSeq (Timelock AlonzoEra) -> Timelock AlonzoEra
Int -> StrictSeq (NativeScript AlonzoEra) -> NativeScript AlonzoEra
forall era.
Era era =>
Int -> StrictSeq (Timelock era) -> Timelock era
mkRequireMOfTimelock
  getRequireMOf :: NativeScript AlonzoEra
-> Maybe (Int, StrictSeq (NativeScript AlonzoEra))
getRequireMOf = Timelock AlonzoEra -> Maybe (Int, StrictSeq (Timelock AlonzoEra))
NativeScript AlonzoEra
-> Maybe (Int, StrictSeq (NativeScript AlonzoEra))
forall {k} (era :: k).
Timelock era -> Maybe (Int, StrictSeq (Timelock era))
getRequireMOfTimelock

instance AllegraEraScript AlonzoEra where
  mkTimeStart :: SlotNo -> NativeScript AlonzoEra
mkTimeStart = SlotNo -> Timelock AlonzoEra
SlotNo -> NativeScript AlonzoEra
forall era. Era era => SlotNo -> Timelock era
mkTimeStartTimelock
  getTimeStart :: NativeScript AlonzoEra -> Maybe SlotNo
getTimeStart = Timelock AlonzoEra -> Maybe SlotNo
NativeScript AlonzoEra -> Maybe SlotNo
forall {k} (era :: k). Timelock era -> Maybe SlotNo
getTimeStartTimelock

  mkTimeExpire :: SlotNo -> NativeScript AlonzoEra
mkTimeExpire = SlotNo -> Timelock AlonzoEra
SlotNo -> NativeScript AlonzoEra
forall era. Era era => SlotNo -> Timelock era
mkTimeExpireTimelock
  getTimeExpire :: NativeScript AlonzoEra -> Maybe SlotNo
getTimeExpire = Timelock AlonzoEra -> Maybe SlotNo
NativeScript AlonzoEra -> Maybe SlotNo
forall {k} (era :: k). Timelock era -> Maybe SlotNo
getTimeExpireTimelock

instance AlonzoEraScript AlonzoEra where
  newtype PlutusScript AlonzoEra = AlonzoPlutusV1 (Plutus 'PlutusV1)
    deriving newtype (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
(PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> Eq (PlutusScript AlonzoEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
== :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
$c/= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
/= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
Eq, Eq (PlutusScript AlonzoEra)
Eq (PlutusScript AlonzoEra) =>
(PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Ordering)
-> (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> (PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool)
-> (PlutusScript AlonzoEra
    -> PlutusScript AlonzoEra -> PlutusScript AlonzoEra)
-> (PlutusScript AlonzoEra
    -> PlutusScript AlonzoEra -> PlutusScript AlonzoEra)
-> Ord (PlutusScript AlonzoEra)
PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Ordering
PlutusScript AlonzoEra
-> PlutusScript AlonzoEra -> PlutusScript AlonzoEra
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Ordering
compare :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Ordering
$c< :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
< :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
$c<= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
<= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
$c> :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
> :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
$c>= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
>= :: PlutusScript AlonzoEra -> PlutusScript AlonzoEra -> Bool
$cmax :: PlutusScript AlonzoEra
-> PlutusScript AlonzoEra -> PlutusScript AlonzoEra
max :: PlutusScript AlonzoEra
-> PlutusScript AlonzoEra -> PlutusScript AlonzoEra
$cmin :: PlutusScript AlonzoEra
-> PlutusScript AlonzoEra -> PlutusScript AlonzoEra
min :: PlutusScript AlonzoEra
-> PlutusScript AlonzoEra -> PlutusScript AlonzoEra
Ord, Int -> PlutusScript AlonzoEra -> ShowS
[PlutusScript AlonzoEra] -> ShowS
PlutusScript AlonzoEra -> String
(Int -> PlutusScript AlonzoEra -> ShowS)
-> (PlutusScript AlonzoEra -> String)
-> ([PlutusScript AlonzoEra] -> ShowS)
-> Show (PlutusScript AlonzoEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PlutusScript AlonzoEra -> ShowS
showsPrec :: Int -> PlutusScript AlonzoEra -> ShowS
$cshow :: PlutusScript AlonzoEra -> String
show :: PlutusScript AlonzoEra -> String
$cshowList :: [PlutusScript AlonzoEra] -> ShowS
showList :: [PlutusScript AlonzoEra] -> ShowS
Show, PlutusScript AlonzoEra -> ()
(PlutusScript AlonzoEra -> ()) -> NFData (PlutusScript AlonzoEra)
forall a. (a -> ()) -> NFData a
$crnf :: PlutusScript AlonzoEra -> ()
rnf :: PlutusScript AlonzoEra -> ()
NFData, Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo)
Proxy (PlutusScript AlonzoEra) -> String
(Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo))
-> (Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo))
-> (Proxy (PlutusScript AlonzoEra) -> String)
-> NoThunks (PlutusScript AlonzoEra)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> PlutusScript AlonzoEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy (PlutusScript AlonzoEra) -> String
showTypeOf :: Proxy (PlutusScript AlonzoEra) -> String
NoThunks, PlutusScript AlonzoEra -> Int
PlutusScript AlonzoEra -> ByteString
(PlutusScript AlonzoEra -> ByteString)
-> (PlutusScript AlonzoEra -> Int)
-> (forall i. Proxy i -> PlutusScript AlonzoEra -> SafeHash i)
-> SafeToHash (PlutusScript AlonzoEra)
forall i. Proxy i -> PlutusScript AlonzoEra -> SafeHash i
forall t.
(t -> ByteString)
-> (t -> Int)
-> (forall i. Proxy i -> t -> SafeHash i)
-> SafeToHash t
$coriginalBytes :: PlutusScript AlonzoEra -> ByteString
originalBytes :: PlutusScript AlonzoEra -> ByteString
$coriginalBytesSize :: PlutusScript AlonzoEra -> Int
originalBytesSize :: PlutusScript AlonzoEra -> Int
$cmakeHashWithExplicitProxys :: forall i. Proxy i -> PlutusScript AlonzoEra -> SafeHash i
makeHashWithExplicitProxys :: forall i. Proxy i -> PlutusScript AlonzoEra -> SafeHash i
SafeToHash, (forall x.
 PlutusScript AlonzoEra -> Rep (PlutusScript AlonzoEra) x)
-> (forall x.
    Rep (PlutusScript AlonzoEra) x -> PlutusScript AlonzoEra)
-> Generic (PlutusScript AlonzoEra)
forall x. Rep (PlutusScript AlonzoEra) x -> PlutusScript AlonzoEra
forall x. PlutusScript AlonzoEra -> Rep (PlutusScript AlonzoEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PlutusScript AlonzoEra -> Rep (PlutusScript AlonzoEra) x
from :: forall x. PlutusScript AlonzoEra -> Rep (PlutusScript AlonzoEra) x
$cto :: forall x. Rep (PlutusScript AlonzoEra) x -> PlutusScript AlonzoEra
to :: forall x. Rep (PlutusScript AlonzoEra) x -> PlutusScript AlonzoEra
Generic)

  type PlutusPurpose f AlonzoEra = AlonzoPlutusPurpose f AlonzoEra

  eraMaxLanguage :: Language
eraMaxLanguage = Language
PlutusV1

  mkPlutusScript :: forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript AlonzoEra)
mkPlutusScript Plutus l
plutus =
    case Plutus l -> SLanguage l
forall (l :: Language) (proxy :: Language -> *).
PlutusLanguage l =>
proxy l -> SLanguage l
plutusSLanguage Plutus l
plutus of
      SLanguage l
SPlutusV1 -> PlutusScript AlonzoEra -> Maybe (PlutusScript AlonzoEra)
forall a. a -> Maybe a
Just (PlutusScript AlonzoEra -> Maybe (PlutusScript AlonzoEra))
-> PlutusScript AlonzoEra -> Maybe (PlutusScript AlonzoEra)
forall a b. (a -> b) -> a -> b
$ Plutus 'PlutusV1 -> PlutusScript AlonzoEra
AlonzoPlutusV1 Plutus l
Plutus 'PlutusV1
plutus
      SLanguage l
_ -> Maybe (PlutusScript AlonzoEra)
forall a. Maybe a
Nothing

  withPlutusScript :: forall a.
PlutusScript AlonzoEra
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript (AlonzoPlutusV1 Plutus 'PlutusV1
plutus) forall (l :: Language). PlutusLanguage l => Plutus l -> a
f = Plutus 'PlutusV1 -> a
forall (l :: Language). PlutusLanguage l => Plutus l -> a
f Plutus 'PlutusV1
plutus

  hoistPlutusPurpose :: forall (g :: * -> * -> *) (f :: * -> * -> *).
(forall ix it. g ix it -> f ix it)
-> PlutusPurpose g AlonzoEra -> PlutusPurpose f AlonzoEra
hoistPlutusPurpose forall ix it. g ix it -> f ix it
f = \case
    AlonzoSpending g Word32 TxIn
x -> f Word32 TxIn -> AlonzoPlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending (f Word32 TxIn -> AlonzoPlutusPurpose f AlonzoEra)
-> f Word32 TxIn -> AlonzoPlutusPurpose f AlonzoEra
forall a b. (a -> b) -> a -> b
$ g Word32 TxIn -> f Word32 TxIn
forall ix it. g ix it -> f ix it
f g Word32 TxIn
x
    AlonzoMinting g Word32 PolicyID
x -> f Word32 PolicyID -> AlonzoPlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting (f Word32 PolicyID -> AlonzoPlutusPurpose f AlonzoEra)
-> f Word32 PolicyID -> AlonzoPlutusPurpose f AlonzoEra
forall a b. (a -> b) -> a -> b
$ g Word32 PolicyID -> f Word32 PolicyID
forall ix it. g ix it -> f ix it
f g Word32 PolicyID
x
    AlonzoCertifying g Word32 (TxCert AlonzoEra)
x -> f Word32 (TxCert AlonzoEra) -> AlonzoPlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (f Word32 (TxCert AlonzoEra) -> AlonzoPlutusPurpose f AlonzoEra)
-> f Word32 (TxCert AlonzoEra) -> AlonzoPlutusPurpose f AlonzoEra
forall a b. (a -> b) -> a -> b
$ g Word32 (ShelleyTxCert AlonzoEra)
-> f Word32 (ShelleyTxCert AlonzoEra)
forall ix it. g ix it -> f ix it
f g Word32 (TxCert AlonzoEra)
g Word32 (ShelleyTxCert AlonzoEra)
x
    AlonzoRewarding g Word32 RewardAccount
x -> f Word32 RewardAccount -> AlonzoPlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding (f Word32 RewardAccount -> AlonzoPlutusPurpose f AlonzoEra)
-> f Word32 RewardAccount -> AlonzoPlutusPurpose f AlonzoEra
forall a b. (a -> b) -> a -> b
$ g Word32 RewardAccount -> f Word32 RewardAccount
forall ix it. g ix it -> f ix it
f g Word32 RewardAccount
x

  mkSpendingPurpose :: forall (f :: * -> * -> *).
f Word32 TxIn -> PlutusPurpose f AlonzoEra
mkSpendingPurpose = f Word32 TxIn -> AlonzoPlutusPurpose f AlonzoEra
f Word32 TxIn -> PlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending

  toSpendingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f AlonzoEra -> Maybe (f Word32 TxIn)
toSpendingPurpose (AlonzoSpending f Word32 TxIn
i) = f Word32 TxIn -> Maybe (f Word32 TxIn)
forall a. a -> Maybe a
Just f Word32 TxIn
i
  toSpendingPurpose PlutusPurpose f AlonzoEra
_ = Maybe (f Word32 TxIn)
forall a. Maybe a
Nothing

  mkMintingPurpose :: forall (f :: * -> * -> *).
f Word32 PolicyID -> PlutusPurpose f AlonzoEra
mkMintingPurpose = f Word32 PolicyID -> AlonzoPlutusPurpose f AlonzoEra
f Word32 PolicyID -> PlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting

  toMintingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f AlonzoEra -> Maybe (f Word32 PolicyID)
toMintingPurpose (AlonzoMinting f Word32 PolicyID
i) = f Word32 PolicyID -> Maybe (f Word32 PolicyID)
forall a. a -> Maybe a
Just f Word32 PolicyID
i
  toMintingPurpose PlutusPurpose f AlonzoEra
_ = Maybe (f Word32 PolicyID)
forall a. Maybe a
Nothing

  mkCertifyingPurpose :: forall (f :: * -> * -> *).
f Word32 (TxCert AlonzoEra) -> PlutusPurpose f AlonzoEra
mkCertifyingPurpose = f Word32 (TxCert AlonzoEra) -> AlonzoPlutusPurpose f AlonzoEra
f Word32 (TxCert AlonzoEra) -> PlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying

  toCertifyingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f AlonzoEra -> Maybe (f Word32 (TxCert AlonzoEra))
toCertifyingPurpose (AlonzoCertifying f Word32 (TxCert AlonzoEra)
i) = f Word32 (ShelleyTxCert AlonzoEra)
-> Maybe (f Word32 (ShelleyTxCert AlonzoEra))
forall a. a -> Maybe a
Just f Word32 (TxCert AlonzoEra)
f Word32 (ShelleyTxCert AlonzoEra)
i
  toCertifyingPurpose PlutusPurpose f AlonzoEra
_ = Maybe (f Word32 (TxCert AlonzoEra))
Maybe (f Word32 (ShelleyTxCert AlonzoEra))
forall a. Maybe a
Nothing

  mkRewardingPurpose :: forall (f :: * -> * -> *).
f Word32 RewardAccount -> PlutusPurpose f AlonzoEra
mkRewardingPurpose = f Word32 RewardAccount -> AlonzoPlutusPurpose f AlonzoEra
f Word32 RewardAccount -> PlutusPurpose f AlonzoEra
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding

  toRewardingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f AlonzoEra -> Maybe (f Word32 RewardAccount)
toRewardingPurpose (AlonzoRewarding f Word32 RewardAccount
i) = f Word32 RewardAccount -> Maybe (f Word32 RewardAccount)
forall a. a -> Maybe a
Just f Word32 RewardAccount
i
  toRewardingPurpose PlutusPurpose f AlonzoEra
_ = Maybe (f Word32 RewardAccount)
forall a. Maybe a
Nothing

  upgradePlutusPurposeAsIx :: AlonzoEraScript (PreviousEra AlonzoEra) =>
PlutusPurpose AsIx (PreviousEra AlonzoEra)
-> PlutusPurpose AsIx AlonzoEra
upgradePlutusPurposeAsIx =
    String
-> PlutusPurpose AsIx MaryEra -> AlonzoPlutusPurpose AsIx AlonzoEra
forall a. HasCallStack => String -> a
error String
"Impossible: No `PlutusScript` and `AlonzoEraScript` instances in the previous era"

instance Eq (PlutusScript era) => EqRaw (AlonzoScript era) where
  eqRaw :: AlonzoScript era -> AlonzoScript era -> Bool
eqRaw = AlonzoScript era -> AlonzoScript era -> Bool
forall era.
Eq (PlutusScript era) =>
AlonzoScript era -> AlonzoScript era -> Bool
eqAlonzoScriptRaw

instance AlonzoEraScript era => ToJSON (AlonzoScript era) where
  toJSON :: AlonzoScript era -> Value
toJSON = Text -> Value
String (Text -> Value)
-> (AlonzoScript era -> Text) -> AlonzoScript era -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AlonzoScript era -> Text
forall a. ToCBOR a => a -> Text
serializeAsHexText

-- | It might seem that this instance unnecessarily utilizes a zero Tag, but it is needed for
-- forward compatibility with plutus scripts from future eras.
--
-- That being said, currently this instance is not used at all, since reference scripts where
-- introduced in Babbage era and `MemPack` for now is only used for `TxOut`s
instance MemPack (PlutusScript AlonzoEra) where
  packedByteCount :: PlutusScript AlonzoEra -> Int
packedByteCount = \case
    AlonzoPlutusV1 Plutus 'PlutusV1
script -> Int
packedTagByteCount Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Plutus 'PlutusV1 -> Int
forall a. MemPack a => a -> Int
packedByteCount Plutus 'PlutusV1
script
  packM :: forall s. PlutusScript AlonzoEra -> Pack s ()
packM = \case
    AlonzoPlutusV1 Plutus 'PlutusV1
script -> Tag -> Pack s ()
forall s. Tag -> Pack s ()
packTagM Tag
0 Pack s () -> Pack s () -> Pack s ()
forall a b. Pack s a -> Pack s b -> Pack s b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Plutus 'PlutusV1 -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
forall s. Plutus 'PlutusV1 -> Pack s ()
packM Plutus 'PlutusV1
script
  {-# INLINE packM #-}
  unpackM :: forall b. Buffer b => Unpack b (PlutusScript AlonzoEra)
unpackM =
    Unpack b Tag
forall b. Buffer b => Unpack b Tag
unpackTagM Unpack b Tag
-> (Tag -> Unpack b (PlutusScript AlonzoEra))
-> Unpack b (PlutusScript AlonzoEra)
forall a b. Unpack b a -> (a -> Unpack b b) -> Unpack b b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Tag
0 -> Plutus 'PlutusV1 -> PlutusScript AlonzoEra
AlonzoPlutusV1 (Plutus 'PlutusV1 -> PlutusScript AlonzoEra)
-> Unpack b (Plutus 'PlutusV1) -> Unpack b (PlutusScript AlonzoEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Unpack b (Plutus 'PlutusV1)
forall a b. (MemPack a, Buffer b) => Unpack b a
forall b. Buffer b => Unpack b (Plutus 'PlutusV1)
unpackM
      Tag
n -> forall a (m :: * -> *) b. (MemPack a, MonadFail m) => Tag -> m b
unknownTagM @(PlutusScript AlonzoEra) Tag
n
  {-# INLINE unpackM #-}

--------------------------------------------------------------------------------
-- Serialisation
--------------------------------------------------------------------------------

decodePlutusScript ::
  forall era l s.
  (AlonzoEraScript era, PlutusLanguage l) =>
  SLanguage l ->
  Decoder s (PlutusScript era)
decodePlutusScript :: forall era (l :: Language) s.
(AlonzoEraScript era, PlutusLanguage l) =>
SLanguage l -> Decoder s (PlutusScript era)
decodePlutusScript SLanguage l
slang = do
  PlutusBinary
pb <- Decoder s PlutusBinary
forall s. Decoder s PlutusBinary
forall a s. DecCBOR a => Decoder s a
decCBOR
  case Plutus l -> Maybe (PlutusScript era)
forall era (l :: Language).
(AlonzoEraScript era, PlutusLanguage l) =>
Plutus l -> Maybe (PlutusScript era)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript era)
mkPlutusScript (Plutus l -> Maybe (PlutusScript era))
-> Plutus l -> Maybe (PlutusScript era)
forall a b. (a -> b) -> a -> b
$ SLanguage l -> Plutus l -> Plutus l
forall (l :: Language) (proxy :: Language -> *).
SLanguage l -> proxy l -> proxy l
asSLanguage SLanguage l
slang (Plutus l -> Plutus l) -> Plutus l -> Plutus l
forall a b. (a -> b) -> a -> b
$ PlutusBinary -> Plutus l
forall (l :: Language). PlutusBinary -> Plutus l
Plutus PlutusBinary
pb of
    Maybe (PlutusScript era)
Nothing ->
      String -> Decoder s (PlutusScript era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Decoder s (PlutusScript era))
-> String -> Decoder s (PlutusScript era)
forall a b. (a -> b) -> a -> b
$ Language -> String
forall a. Show a => a -> String
show (SLanguage l -> Language
forall (l :: Language) (proxy :: Language -> *).
PlutusLanguage l =>
proxy l -> Language
plutusLanguage SLanguage l
slang) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" is not supported in " String -> ShowS
forall a. [a] -> [a] -> [a]
++ forall era. Era era => String
eraName @era String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" era."
    Just PlutusScript era
plutusScript -> PlutusScript era -> Decoder s (PlutusScript era)
forall a. a -> Decoder s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PlutusScript era
plutusScript

instance AlonzoEraScript era => EncCBOR (AlonzoScript era)

instance AlonzoEraScript era => ToCBOR (AlonzoScript era) where
  toCBOR :: AlonzoScript era -> Encoding
toCBOR = forall era t. (Era era, EncCBOR t) => t -> Encoding
toEraCBOR @era (Encoding -> Encoding)
-> (AlonzoScript era -> Encoding) -> AlonzoScript era -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Encode 'Open (AlonzoScript era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode 'Open (AlonzoScript era) -> Encoding)
-> (AlonzoScript era -> Encode 'Open (AlonzoScript era))
-> AlonzoScript era
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AlonzoScript era -> Encode 'Open (AlonzoScript era)
forall era.
AlonzoEraScript era =>
AlonzoScript era -> Encode 'Open (AlonzoScript era)
encodeScript

encodeScript :: AlonzoEraScript era => AlonzoScript era -> Encode 'Open (AlonzoScript era)
encodeScript :: forall era.
AlonzoEraScript era =>
AlonzoScript era -> Encode 'Open (AlonzoScript era)
encodeScript = \case
  TimelockScript Timelock era
i -> (Timelock era -> AlonzoScript era)
-> Word -> Encode 'Open (Timelock era -> AlonzoScript era)
forall t. t -> Word -> Encode 'Open t
Sum Timelock era -> AlonzoScript era
forall era. Timelock era -> AlonzoScript era
TimelockScript Word
0 Encode 'Open (Timelock era -> AlonzoScript era)
-> Encode ('Closed 'Dense) (Timelock era)
-> Encode 'Open (AlonzoScript era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> Timelock era -> Encode ('Closed 'Dense) (Timelock era)
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Timelock era
i
  PlutusScript PlutusScript era
plutusScript -> PlutusScript era
-> (forall {l :: Language}.
    PlutusLanguage l =>
    Plutus l -> Encode 'Open (AlonzoScript era))
-> Encode 'Open (AlonzoScript era)
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript era
plutusScript ((forall {l :: Language}.
  PlutusLanguage l =>
  Plutus l -> Encode 'Open (AlonzoScript era))
 -> Encode 'Open (AlonzoScript era))
-> (forall {l :: Language}.
    PlutusLanguage l =>
    Plutus l -> Encode 'Open (AlonzoScript era))
-> Encode 'Open (AlonzoScript era)
forall a b. (a -> b) -> a -> b
$ \plutus :: Plutus l
plutus@(Plutus PlutusBinary
pb) ->
    case Plutus l -> SLanguage l
forall (l :: Language) (proxy :: Language -> *).
PlutusLanguage l =>
proxy l -> SLanguage l
plutusSLanguage Plutus l
plutus of
      SLanguage l
SPlutusV1 -> (PlutusBinary -> AlonzoScript era)
-> Word -> Encode 'Open (PlutusBinary -> AlonzoScript era)
forall t. t -> Word -> Encode 'Open t
Sum (PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript (PlutusScript era -> AlonzoScript era)
-> (PlutusBinary -> PlutusScript era)
-> PlutusBinary
-> AlonzoScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (PlutusScript era) -> PlutusScript era
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (PlutusScript era) -> PlutusScript era)
-> (PlutusBinary -> Maybe (PlutusScript era))
-> PlutusBinary
-> PlutusScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Plutus 'PlutusV1 -> Maybe (PlutusScript era)
forall era (l :: Language).
(AlonzoEraScript era, PlutusLanguage l) =>
Plutus l -> Maybe (PlutusScript era)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript era)
mkPlutusScript (Plutus 'PlutusV1 -> Maybe (PlutusScript era))
-> (PlutusBinary -> Plutus 'PlutusV1)
-> PlutusBinary
-> Maybe (PlutusScript era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (l :: Language). PlutusBinary -> Plutus l
Plutus @'PlutusV1) Word
1 Encode 'Open (PlutusBinary -> AlonzoScript era)
-> Encode ('Closed 'Dense) PlutusBinary
-> Encode 'Open (AlonzoScript era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> PlutusBinary -> Encode ('Closed 'Dense) PlutusBinary
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To PlutusBinary
pb
      SLanguage l
SPlutusV2 -> (PlutusBinary -> AlonzoScript era)
-> Word -> Encode 'Open (PlutusBinary -> AlonzoScript era)
forall t. t -> Word -> Encode 'Open t
Sum (PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript (PlutusScript era -> AlonzoScript era)
-> (PlutusBinary -> PlutusScript era)
-> PlutusBinary
-> AlonzoScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (PlutusScript era) -> PlutusScript era
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (PlutusScript era) -> PlutusScript era)
-> (PlutusBinary -> Maybe (PlutusScript era))
-> PlutusBinary
-> PlutusScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Plutus 'PlutusV2 -> Maybe (PlutusScript era)
forall era (l :: Language).
(AlonzoEraScript era, PlutusLanguage l) =>
Plutus l -> Maybe (PlutusScript era)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript era)
mkPlutusScript (Plutus 'PlutusV2 -> Maybe (PlutusScript era))
-> (PlutusBinary -> Plutus 'PlutusV2)
-> PlutusBinary
-> Maybe (PlutusScript era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (l :: Language). PlutusBinary -> Plutus l
Plutus @'PlutusV2) Word
2 Encode 'Open (PlutusBinary -> AlonzoScript era)
-> Encode ('Closed 'Dense) PlutusBinary
-> Encode 'Open (AlonzoScript era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> PlutusBinary -> Encode ('Closed 'Dense) PlutusBinary
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To PlutusBinary
pb
      SLanguage l
SPlutusV3 -> (PlutusBinary -> AlonzoScript era)
-> Word -> Encode 'Open (PlutusBinary -> AlonzoScript era)
forall t. t -> Word -> Encode 'Open t
Sum (PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript (PlutusScript era -> AlonzoScript era)
-> (PlutusBinary -> PlutusScript era)
-> PlutusBinary
-> AlonzoScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (PlutusScript era) -> PlutusScript era
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (PlutusScript era) -> PlutusScript era)
-> (PlutusBinary -> Maybe (PlutusScript era))
-> PlutusBinary
-> PlutusScript era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Plutus 'PlutusV3 -> Maybe (PlutusScript era)
forall era (l :: Language).
(AlonzoEraScript era, PlutusLanguage l) =>
Plutus l -> Maybe (PlutusScript era)
forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript era)
mkPlutusScript (Plutus 'PlutusV3 -> Maybe (PlutusScript era))
-> (PlutusBinary -> Plutus 'PlutusV3)
-> PlutusBinary
-> Maybe (PlutusScript era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (l :: Language). PlutusBinary -> Plutus l
Plutus @'PlutusV3) Word
3 Encode 'Open (PlutusBinary -> AlonzoScript era)
-> Encode ('Closed 'Dense) PlutusBinary
-> Encode 'Open (AlonzoScript era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> PlutusBinary -> Encode ('Closed 'Dense) PlutusBinary
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To PlutusBinary
pb

instance AlonzoEraScript era => DecCBOR (AlonzoScript era) where
  decCBOR :: forall s. Decoder s (AlonzoScript era)
decCBOR = Decode ('Closed 'Dense) (AlonzoScript era)
-> Decoder s (AlonzoScript era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Text
-> (Word -> Decode 'Open (AlonzoScript era))
-> Decode ('Closed 'Dense) (AlonzoScript era)
forall t.
Text -> (Word -> Decode 'Open t) -> Decode ('Closed 'Dense) t
Summands Text
"AlonzoScript" Word -> Decode 'Open (AlonzoScript era)
decodeScript)
    where
      decodeScript :: Word -> Decode 'Open (AlonzoScript era)
decodeScript = \case
        Word
0 -> (Timelock era -> AlonzoScript era)
-> Decode 'Open (Timelock era -> AlonzoScript era)
forall t. t -> Decode 'Open t
SumD Timelock era -> AlonzoScript era
forall era. Timelock era -> AlonzoScript era
TimelockScript Decode 'Open (Timelock era -> AlonzoScript era)
-> Decode ('Closed Any) (Timelock era)
-> Decode 'Open (AlonzoScript era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (Timelock era)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        Word
1 -> SLanguage 'PlutusV1 -> Decode 'Open (AlonzoScript era)
forall {era} {l :: Language}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 AlonzoEraScript era, PlutusLanguage l) =>
SLanguage l -> Decode 'Open (AlonzoScript era)
decodePlutus SLanguage 'PlutusV1
SPlutusV1
        Word
2 -> SLanguage 'PlutusV2 -> Decode 'Open (AlonzoScript era)
forall {era} {l :: Language}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 AlonzoEraScript era, PlutusLanguage l) =>
SLanguage l -> Decode 'Open (AlonzoScript era)
decodePlutus SLanguage 'PlutusV2
SPlutusV2
        Word
3 -> SLanguage 'PlutusV3 -> Decode 'Open (AlonzoScript era)
forall {era} {l :: Language}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat MinVersion (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 AlonzoEraScript era, PlutusLanguage l) =>
SLanguage l -> Decode 'Open (AlonzoScript era)
decodePlutus SLanguage 'PlutusV3
SPlutusV3
        Word
n -> Word -> Decode 'Open (AlonzoScript era)
forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
n
      decodePlutus :: SLanguage l -> Decode 'Open (AlonzoScript era)
decodePlutus SLanguage l
slang =
        (PlutusScript era -> AlonzoScript era)
-> Decode 'Open (PlutusScript era -> AlonzoScript era)
forall t. t -> Decode 'Open t
SumD PlutusScript era -> AlonzoScript era
forall era. PlutusScript era -> AlonzoScript era
PlutusScript Decode 'Open (PlutusScript era -> AlonzoScript era)
-> Decode ('Closed 'Dense) (PlutusScript era)
-> Decode 'Open (AlonzoScript era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! (forall s. Decoder s (PlutusScript era))
-> Decode ('Closed 'Dense) (PlutusScript era)
forall t. (forall s. Decoder s t) -> Decode ('Closed 'Dense) t
D (SLanguage l -> Decoder s (PlutusScript era)
forall era (l :: Language) s.
(AlonzoEraScript era, PlutusLanguage l) =>
SLanguage l -> Decoder s (PlutusScript era)
decodePlutusScript SLanguage l
slang)

-- | Verify that every `Script` represents a valid script. Force native scripts to Normal
-- Form, to ensure that there are no bottoms and deserialize `Plutus` scripts into a
-- `Cardano.Ledger.Plutus.Language.PlutusRunnable`.
validScript :: (HasCallStack, AlonzoEraScript era) => ProtVer -> Script era -> Bool
validScript :: forall era.
(HasCallStack, AlonzoEraScript era) =>
ProtVer -> Script era -> Bool
validScript ProtVer
pv Script era
script =
  case Script era -> Maybe (PlutusScript era)
forall era.
AlonzoEraScript era =>
Script era -> Maybe (PlutusScript era)
toPlutusScript Script era
script of
    Just PlutusScript era
plutusScript -> Version -> PlutusScript era -> Bool
forall era.
AlonzoEraScript era =>
Version -> PlutusScript era -> Bool
isValidPlutusScript (ProtVer -> Version
pvMajor ProtVer
pv) PlutusScript era
plutusScript
    Maybe (PlutusScript era)
Nothing ->
      case Script era -> Maybe (NativeScript era)
forall era. EraScript era => Script era -> Maybe (NativeScript era)
getNativeScript Script era
script of
        Just NativeScript era
timelockScript -> NativeScript era -> Bool -> Bool
forall a b. NFData a => a -> b -> b
deepseq NativeScript era
timelockScript Bool
True
        Maybe (NativeScript era)
Nothing -> String -> Bool
forall a. HasCallStack => String -> a
error String
"Impossible: There are only Native and Plutus scripts available"

-- | Check the equality of two underlying types, while ignoring their binary
-- representation, which `Eq` instance normally does. This is used for testing.
eqAlonzoScriptRaw :: Eq (PlutusScript era) => AlonzoScript era -> AlonzoScript era -> Bool
eqAlonzoScriptRaw :: forall era.
Eq (PlutusScript era) =>
AlonzoScript era -> AlonzoScript era -> Bool
eqAlonzoScriptRaw (TimelockScript Timelock era
t1) (TimelockScript Timelock era
t2) = Timelock era -> Timelock era -> Bool
forall {k} (era :: k). Timelock era -> Timelock era -> Bool
eqTimelockRaw Timelock era
t1 Timelock era
t2
eqAlonzoScriptRaw (PlutusScript PlutusScript era
ps1) (PlutusScript PlutusScript era
ps2) = PlutusScript era
ps1 PlutusScript era -> PlutusScript era -> Bool
forall a. Eq a => a -> a -> Bool
== PlutusScript era
ps2
eqAlonzoScriptRaw AlonzoScript era
_ AlonzoScript era
_ = Bool
False

eraLanguages :: forall era. AlonzoEraScript era => [Language]
eraLanguages :: forall era. AlonzoEraScript era => [Language]
eraLanguages = [Language
forall a. Bounded a => a
minBound .. forall era. AlonzoEraScript era => Language
eraMaxLanguage @era]

-- | Having a Map with scripts and a script hash, lookup the plutus script. Returns
-- Nothing when script is missing or it is not a PlutusScript
lookupPlutusScript ::
  AlonzoEraScript era =>
  ScriptHash ->
  Map.Map ScriptHash (Script era) ->
  Maybe (PlutusScript era)
lookupPlutusScript :: forall era.
AlonzoEraScript era =>
ScriptHash
-> Map ScriptHash (Script era) -> Maybe (PlutusScript era)
lookupPlutusScript ScriptHash
scriptHash = ScriptHash -> Map ScriptHash (Script era) -> Maybe (Script era)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup ScriptHash
scriptHash (Map ScriptHash (Script era) -> Maybe (Script era))
-> (Script era -> Maybe (PlutusScript era))
-> Map ScriptHash (Script era)
-> Maybe (PlutusScript era)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Script era -> Maybe (PlutusScript era)
forall era.
AlonzoEraScript era =>
Script era -> Maybe (PlutusScript era)
toPlutusScript