{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.Generic.Updaters where

import Cardano.Crypto.DSIGN.Class ()
import Cardano.Ledger.Alonzo.Core (AlonzoEraPParams, AlonzoEraScript, PParams)
import qualified Cardano.Ledger.Alonzo.Core as Alonzo
import Cardano.Ledger.Alonzo.Tx (ScriptIntegrity (..), hashScriptIntegrity)
import qualified Cardano.Ledger.Alonzo.Tx as Alonzo
import Cardano.Ledger.Alonzo.TxWits (Redeemers (..), TxDats (..))
import Cardano.Ledger.BaseTypes (StrictMaybe (..))
import Cardano.Ledger.Plutus.Language (Language (..))
import qualified Data.Set as Set
import Test.Cardano.Ledger.Generic.Proof

alonzoNewScriptIntegrityHash ::
  forall era.
  ( AlonzoEraScript era
  , AlonzoEraPParams era
  ) =>
  PParams era ->
  [Language] ->
  Redeemers era ->
  TxDats era ->
  StrictMaybe Alonzo.ScriptIntegrityHash
alonzoNewScriptIntegrityHash :: forall era.
(AlonzoEraScript era, AlonzoEraPParams era) =>
PParams era
-> [Language]
-> Redeemers era
-> TxDats era
-> StrictMaybe ScriptIntegrityHash
alonzoNewScriptIntegrityHash PParams era
pp [Language]
ls redeemers :: Redeemers era
redeemers@(Redeemers Map (PlutusPurpose AsIx era) (Data era, ExUnits)
r) dats :: TxDats era
dats@(TxDats Map DataHash (Data era)
d)
  | Map DataHash (Data era) -> Bool
forall a. Map DataHash a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Map DataHash (Data era)
d
  , Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Bool
forall a. Map (PlutusPurpose AsIx era) a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Map (PlutusPurpose AsIx era) (Data era, ExUnits)
r
  , [Language] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Language]
ls =
      StrictMaybe ScriptIntegrityHash
forall a. StrictMaybe a
SNothing
  | Bool
otherwise =
      ScriptIntegrityHash -> StrictMaybe ScriptIntegrityHash
forall a. a -> StrictMaybe a
SJust (ScriptIntegrityHash -> StrictMaybe ScriptIntegrityHash)
-> (ScriptIntegrity era -> ScriptIntegrityHash)
-> ScriptIntegrity era
-> StrictMaybe ScriptIntegrityHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era. Era era => ScriptIntegrity era -> ScriptIntegrityHash
hashScriptIntegrity @era (ScriptIntegrity era -> StrictMaybe ScriptIntegrityHash)
-> ScriptIntegrity era -> StrictMaybe ScriptIntegrityHash
forall a b. (a -> b) -> a -> b
$
        Redeemers era
-> TxDats era -> Set LangDepView -> ScriptIntegrity era
forall era.
Redeemers era
-> TxDats era -> Set LangDepView -> ScriptIntegrity era
ScriptIntegrity Redeemers era
redeemers TxDats era
dats ((Language -> LangDepView) -> Set Language -> Set LangDepView
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (PParams era -> Language -> LangDepView
forall era.
AlonzoEraPParams era =>
PParams era -> Language -> LangDepView
Alonzo.getLanguageView PParams era
pp) (Set Language -> Set LangDepView)
-> Set Language -> Set LangDepView
forall a b. (a -> b) -> a -> b
$ [Language] -> Set Language
forall a. Ord a => [a] -> Set a
Set.fromList [Language]
ls)

languages :: Proof era -> [Language]
languages :: forall era. Proof era -> [Language]
languages Proof era
Shelley = []
languages Proof era
Allegra = []
languages Proof era
Mary = []
languages Proof era
Alonzo = [Language
PlutusV1]
languages Proof era
Babbage = [Language
PlutusV1, Language
PlutusV2]
languages Proof era
Conway = [Language
PlutusV1, Language
PlutusV2]