{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

-- | Figure 3: Functions related to scripts
--   Babbage Specification
module Cardano.Ledger.Babbage.Scripts (
  AlonzoScript (..),
  isPlutusScript,
  PlutusScript (..),
) where

import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Alonzo.Core
import Cardano.Ledger.Alonzo.Scripts (
  AlonzoPlutusPurpose (..),
  AlonzoScript (..),
  PlutusScript (..),
  alonzoScriptPrefixTag,
  isPlutusScript,
 )
import Cardano.Ledger.Babbage.Era
import Cardano.Ledger.Babbage.TxCert ()
import Cardano.Ledger.Plutus.Language
import Cardano.Ledger.Shelley.Scripts (ShelleyEraScript (..))
import Control.DeepSeq (NFData (..), rwhnf)
import Data.MemPack
import GHC.Generics
import NoThunks.Class (NoThunks (..))

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

  upgradeScript :: EraScript (PreviousEra BabbageEra) =>
Script (PreviousEra BabbageEra) -> Script BabbageEra
upgradeScript = \case
    TimelockScript Timelock AlonzoEra
ts -> Timelock BabbageEra -> AlonzoScript BabbageEra
forall era. Timelock era -> AlonzoScript era
TimelockScript (Timelock BabbageEra -> AlonzoScript BabbageEra)
-> Timelock BabbageEra -> AlonzoScript BabbageEra
forall a b. (a -> b) -> a -> b
$ Timelock AlonzoEra -> Timelock BabbageEra
forall era1 era2.
(Era era1, Era era2) =>
Timelock era1 -> Timelock era2
translateTimelock Timelock AlonzoEra
ts
    PlutusScript (AlonzoPlutusV1 Plutus 'PlutusV1
ps) -> PlutusScript BabbageEra -> AlonzoScript BabbageEra
forall era. PlutusScript era -> AlonzoScript era
PlutusScript (PlutusScript BabbageEra -> AlonzoScript BabbageEra)
-> PlutusScript BabbageEra -> AlonzoScript BabbageEra
forall a b. (a -> b) -> a -> b
$ Plutus 'PlutusV1 -> PlutusScript BabbageEra
BabbagePlutusV1 Plutus 'PlutusV1
ps

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

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

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

instance AlonzoEraScript BabbageEra where
  data PlutusScript BabbageEra
    = BabbagePlutusV1 !(Plutus 'PlutusV1)
    | BabbagePlutusV2 !(Plutus 'PlutusV2)
    deriving (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
(PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> Eq (PlutusScript BabbageEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
== :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
$c/= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
/= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
Eq, Eq (PlutusScript BabbageEra)
Eq (PlutusScript BabbageEra) =>
(PlutusScript BabbageEra -> PlutusScript BabbageEra -> Ordering)
-> (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> (PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool)
-> (PlutusScript BabbageEra
    -> PlutusScript BabbageEra -> PlutusScript BabbageEra)
-> (PlutusScript BabbageEra
    -> PlutusScript BabbageEra -> PlutusScript BabbageEra)
-> Ord (PlutusScript BabbageEra)
PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
PlutusScript BabbageEra -> PlutusScript BabbageEra -> Ordering
PlutusScript BabbageEra
-> PlutusScript BabbageEra -> PlutusScript BabbageEra
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 BabbageEra -> PlutusScript BabbageEra -> Ordering
compare :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Ordering
$c< :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
< :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
$c<= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
<= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
$c> :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
> :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
$c>= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
>= :: PlutusScript BabbageEra -> PlutusScript BabbageEra -> Bool
$cmax :: PlutusScript BabbageEra
-> PlutusScript BabbageEra -> PlutusScript BabbageEra
max :: PlutusScript BabbageEra
-> PlutusScript BabbageEra -> PlutusScript BabbageEra
$cmin :: PlutusScript BabbageEra
-> PlutusScript BabbageEra -> PlutusScript BabbageEra
min :: PlutusScript BabbageEra
-> PlutusScript BabbageEra -> PlutusScript BabbageEra
Ord, Int -> PlutusScript BabbageEra -> ShowS
[PlutusScript BabbageEra] -> ShowS
PlutusScript BabbageEra -> String
(Int -> PlutusScript BabbageEra -> ShowS)
-> (PlutusScript BabbageEra -> String)
-> ([PlutusScript BabbageEra] -> ShowS)
-> Show (PlutusScript BabbageEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PlutusScript BabbageEra -> ShowS
showsPrec :: Int -> PlutusScript BabbageEra -> ShowS
$cshow :: PlutusScript BabbageEra -> String
show :: PlutusScript BabbageEra -> String
$cshowList :: [PlutusScript BabbageEra] -> ShowS
showList :: [PlutusScript BabbageEra] -> ShowS
Show, (forall x.
 PlutusScript BabbageEra -> Rep (PlutusScript BabbageEra) x)
-> (forall x.
    Rep (PlutusScript BabbageEra) x -> PlutusScript BabbageEra)
-> Generic (PlutusScript BabbageEra)
forall x.
Rep (PlutusScript BabbageEra) x -> PlutusScript BabbageEra
forall x.
PlutusScript BabbageEra -> Rep (PlutusScript BabbageEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
PlutusScript BabbageEra -> Rep (PlutusScript BabbageEra) x
from :: forall x.
PlutusScript BabbageEra -> Rep (PlutusScript BabbageEra) x
$cto :: forall x.
Rep (PlutusScript BabbageEra) x -> PlutusScript BabbageEra
to :: forall x.
Rep (PlutusScript BabbageEra) x -> PlutusScript BabbageEra
Generic)
  type PlutusPurpose f BabbageEra = AlonzoPlutusPurpose f BabbageEra

  eraMaxLanguage :: Language
eraMaxLanguage = Language
PlutusV2

  mkPlutusScript :: forall (l :: Language).
PlutusLanguage l =>
Plutus l -> Maybe (PlutusScript BabbageEra)
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 BabbageEra -> Maybe (PlutusScript BabbageEra)
forall a. a -> Maybe a
Just (PlutusScript BabbageEra -> Maybe (PlutusScript BabbageEra))
-> PlutusScript BabbageEra -> Maybe (PlutusScript BabbageEra)
forall a b. (a -> b) -> a -> b
$ Plutus 'PlutusV1 -> PlutusScript BabbageEra
BabbagePlutusV1 Plutus l
Plutus 'PlutusV1
plutus
      SLanguage l
SPlutusV2 -> PlutusScript BabbageEra -> Maybe (PlutusScript BabbageEra)
forall a. a -> Maybe a
Just (PlutusScript BabbageEra -> Maybe (PlutusScript BabbageEra))
-> PlutusScript BabbageEra -> Maybe (PlutusScript BabbageEra)
forall a b. (a -> b) -> a -> b
$ Plutus 'PlutusV2 -> PlutusScript BabbageEra
BabbagePlutusV2 Plutus l
Plutus 'PlutusV2
plutus
      SLanguage l
_ -> Maybe (PlutusScript BabbageEra)
forall a. Maybe a
Nothing

  withPlutusScript :: forall a.
PlutusScript BabbageEra
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript (BabbagePlutusV1 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
  withPlutusScript (BabbagePlutusV2 Plutus 'PlutusV2
plutus) forall (l :: Language). PlutusLanguage l => Plutus l -> a
f = Plutus 'PlutusV2 -> a
forall (l :: Language). PlutusLanguage l => Plutus l -> a
f Plutus 'PlutusV2
plutus

  hoistPlutusPurpose :: forall (g :: * -> * -> *) (f :: * -> * -> *).
(forall ix it. g ix it -> f ix it)
-> PlutusPurpose g BabbageEra -> PlutusPurpose f BabbageEra
hoistPlutusPurpose forall ix it. g ix it -> f ix it
f = \case
    AlonzoSpending g Word32 TxIn
x -> f Word32 TxIn -> AlonzoPlutusPurpose f BabbageEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending (f Word32 TxIn -> AlonzoPlutusPurpose f BabbageEra)
-> f Word32 TxIn -> AlonzoPlutusPurpose f BabbageEra
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 BabbageEra
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting (f Word32 PolicyID -> AlonzoPlutusPurpose f BabbageEra)
-> f Word32 PolicyID -> AlonzoPlutusPurpose f BabbageEra
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 BabbageEra)
x -> f Word32 (TxCert BabbageEra) -> AlonzoPlutusPurpose f BabbageEra
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (f Word32 (TxCert BabbageEra) -> AlonzoPlutusPurpose f BabbageEra)
-> f Word32 (TxCert BabbageEra) -> AlonzoPlutusPurpose f BabbageEra
forall a b. (a -> b) -> a -> b
$ g Word32 (ShelleyTxCert BabbageEra)
-> f Word32 (ShelleyTxCert BabbageEra)
forall ix it. g ix it -> f ix it
f g Word32 (TxCert BabbageEra)
g Word32 (ShelleyTxCert BabbageEra)
x
    AlonzoRewarding g Word32 RewardAccount
x -> f Word32 RewardAccount -> AlonzoPlutusPurpose f BabbageEra
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding (f Word32 RewardAccount -> AlonzoPlutusPurpose f BabbageEra)
-> f Word32 RewardAccount -> AlonzoPlutusPurpose f BabbageEra
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 BabbageEra
mkSpendingPurpose = f Word32 TxIn -> AlonzoPlutusPurpose f BabbageEra
f Word32 TxIn -> PlutusPurpose f BabbageEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending

  toSpendingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f BabbageEra -> 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 BabbageEra
_ = Maybe (f Word32 TxIn)
forall a. Maybe a
Nothing

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

  toMintingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f BabbageEra -> 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 BabbageEra
_ = Maybe (f Word32 PolicyID)
forall a. Maybe a
Nothing

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

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

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

  toRewardingPurpose :: forall (f :: * -> * -> *).
PlutusPurpose f BabbageEra -> 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 BabbageEra
_ = Maybe (f Word32 RewardAccount)
forall a. Maybe a
Nothing

  upgradePlutusPurposeAsIx :: AlonzoEraScript (PreviousEra BabbageEra) =>
PlutusPurpose AsIx (PreviousEra BabbageEra)
-> PlutusPurpose AsIx BabbageEra
upgradePlutusPurposeAsIx = \case
    AlonzoMinting (AsIx Word32
ix) -> AsIx Word32 PolicyID -> AlonzoPlutusPurpose AsIx BabbageEra
forall (f :: * -> * -> *) era.
f Word32 PolicyID -> AlonzoPlutusPurpose f era
AlonzoMinting (Word32 -> AsIx Word32 PolicyID
forall ix it. ix -> AsIx ix it
AsIx Word32
ix)
    AlonzoSpending (AsIx Word32
ix) -> AsIx Word32 TxIn -> AlonzoPlutusPurpose AsIx BabbageEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> AlonzoPlutusPurpose f era
AlonzoSpending (Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
AsIx Word32
ix)
    AlonzoRewarding (AsIx Word32
ix) -> AsIx Word32 RewardAccount -> AlonzoPlutusPurpose AsIx BabbageEra
forall (f :: * -> * -> *) era.
f Word32 RewardAccount -> AlonzoPlutusPurpose f era
AlonzoRewarding (Word32 -> AsIx Word32 RewardAccount
forall ix it. ix -> AsIx ix it
AsIx Word32
ix)
    AlonzoCertifying (AsIx Word32
ix) -> AsIx Word32 (TxCert BabbageEra)
-> AlonzoPlutusPurpose AsIx BabbageEra
forall (f :: * -> * -> *) era.
f Word32 (TxCert era) -> AlonzoPlutusPurpose f era
AlonzoCertifying (Word32 -> AsIx Word32 (ShelleyTxCert BabbageEra)
forall ix it. ix -> AsIx ix it
AsIx Word32
ix)

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

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

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

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

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

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

instance NFData (PlutusScript BabbageEra) where
  rnf :: PlutusScript BabbageEra -> ()
rnf = PlutusScript BabbageEra -> ()
forall a. a -> ()
rwhnf

instance NoThunks (PlutusScript BabbageEra)

instance SafeToHash (PlutusScript BabbageEra) where
  originalBytes :: PlutusScript BabbageEra -> ByteString
originalBytes PlutusScript BabbageEra
ps = PlutusScript BabbageEra
-> (forall (l :: Language).
    PlutusLanguage l =>
    Plutus l -> ByteString)
-> ByteString
forall era a.
AlonzoEraScript era =>
PlutusScript era
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
forall a.
PlutusScript BabbageEra
-> (forall (l :: Language). PlutusLanguage l => Plutus l -> a) -> a
withPlutusScript PlutusScript BabbageEra
ps Plutus l -> ByteString
forall t. SafeToHash t => t -> ByteString
forall (l :: Language). PlutusLanguage l => Plutus l -> ByteString
originalBytes

instance MemPack (PlutusScript BabbageEra) where
  packedByteCount :: PlutusScript BabbageEra -> Int
packedByteCount = \case
    BabbagePlutusV1 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
    BabbagePlutusV2 Plutus 'PlutusV2
script -> Int
packedTagByteCount Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Plutus 'PlutusV2 -> Int
forall a. MemPack a => a -> Int
packedByteCount Plutus 'PlutusV2
script
  packM :: forall s. PlutusScript BabbageEra -> Pack s ()
packM = \case
    BabbagePlutusV1 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 s. Plutus 'PlutusV1 -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
packM Plutus 'PlutusV1
script
    BabbagePlutusV2 Plutus 'PlutusV2
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
>> Plutus 'PlutusV2 -> Pack s ()
forall s. Plutus 'PlutusV2 -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
packM Plutus 'PlutusV2
script
  {-# INLINE packM #-}
  unpackM :: forall b. Buffer b => Unpack b (PlutusScript BabbageEra)
unpackM =
    Unpack b Tag
forall b. Buffer b => Unpack b Tag
unpackTagM Unpack b Tag
-> (Tag -> Unpack b (PlutusScript BabbageEra))
-> Unpack b (PlutusScript BabbageEra)
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 BabbageEra
BabbagePlutusV1 (Plutus 'PlutusV1 -> PlutusScript BabbageEra)
-> Unpack b (Plutus 'PlutusV1)
-> Unpack b (PlutusScript BabbageEra)
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
1 -> Plutus 'PlutusV2 -> PlutusScript BabbageEra
BabbagePlutusV2 (Plutus 'PlutusV2 -> PlutusScript BabbageEra)
-> Unpack b (Plutus 'PlutusV2)
-> Unpack b (PlutusScript BabbageEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Unpack b (Plutus 'PlutusV2)
forall a b. (MemPack a, Buffer b) => Unpack b a
forall b. Buffer b => Unpack b (Plutus 'PlutusV2)
unpackM
      Tag
n -> forall a (m :: * -> *) b. (MemPack a, MonadFail m) => Tag -> m b
unknownTagM @(PlutusScript BabbageEra) Tag
n
  {-# INLINE unpackM #-}