{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TupleSections #-}

module Cardano.CLI.EraBased.Script.Spend.Read
  ( CliSpendScriptWitnessError
  , readSpendScriptWitness
  , readSpendScriptWitnesses
  )
where

import Cardano.Api
import Cardano.Api.Shelley

import Cardano.CLI.EraBased.Script.Read.Common
import Cardano.CLI.EraBased.Script.Spend.Type
import Cardano.CLI.EraBased.Script.Type
import Cardano.CLI.Read

import Control.Monad

data CliSpendScriptWitnessError
  = CliScriptWitnessError CliScriptWitnessError
  | CliSpendScriptWitnessDatumError ScriptDataError

instance Error CliSpendScriptWitnessError where
  prettyError :: forall ann. CliSpendScriptWitnessError -> Doc ann
prettyError = \case
    CliScriptWitnessError CliScriptWitnessError
e -> CliScriptWitnessError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. CliScriptWitnessError -> Doc ann
prettyError CliScriptWitnessError
e
    CliSpendScriptWitnessDatumError ScriptDataError
e -> ScriptDataError -> Doc ann
forall ann. ScriptDataError -> Doc ann
renderScriptDataError ScriptDataError
e

readSpendScriptWitnesses
  :: MonadIOTransError (FileError CliSpendScriptWitnessError) t m
  => ShelleyBasedEra era
  -> [(TxIn, Maybe CliSpendScriptRequirements)]
  -> t m [(TxIn, Maybe (SpendScriptWitness era))]
readSpendScriptWitnesses :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) era.
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ShelleyBasedEra era
-> [(TxIn, Maybe CliSpendScriptRequirements)]
-> t m [(TxIn, Maybe (SpendScriptWitness era))]
readSpendScriptWitnesses ShelleyBasedEra era
eon =
  ((TxIn, Maybe CliSpendScriptRequirements)
 -> t m (TxIn, Maybe (SpendScriptWitness era)))
-> [(TxIn, Maybe CliSpendScriptRequirements)]
-> t m [(TxIn, Maybe (SpendScriptWitness era))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM
    ( \(TxIn
txin, Maybe CliSpendScriptRequirements
mSWit) -> do
        (TxIn
txin,) (Maybe (SpendScriptWitness era)
 -> (TxIn, Maybe (SpendScriptWitness era)))
-> t m (Maybe (SpendScriptWitness era))
-> t m (TxIn, Maybe (SpendScriptWitness era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe CliSpendScriptRequirements
-> (CliSpendScriptRequirements -> t m (SpendScriptWitness era))
-> t m (Maybe (SpendScriptWitness era))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe CliSpendScriptRequirements
mSWit (ShelleyBasedEra era
-> CliSpendScriptRequirements -> t m (SpendScriptWitness era)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) era.
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ShelleyBasedEra era
-> CliSpendScriptRequirements -> t m (SpendScriptWitness era)
readSpendScriptWitness ShelleyBasedEra era
eon)
    )

readSpendScriptWitness
  :: MonadIOTransError (FileError CliSpendScriptWitnessError) t m
  => ShelleyBasedEra era -> CliSpendScriptRequirements -> t m (SpendScriptWitness era)
readSpendScriptWitness :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) era.
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ShelleyBasedEra era
-> CliSpendScriptRequirements -> t m (SpendScriptWitness era)
readSpendScriptWitness ShelleyBasedEra era
sbe CliSpendScriptRequirements
spendScriptReq =
  case CliSpendScriptRequirements
spendScriptReq of
    OnDiskSimpleOrPlutusScript (OnDiskSimpleCliArgs File ScriptInAnyLang 'In
simpleFp) -> do
      let sFp :: FilePath
sFp = File ScriptInAnyLang 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File ScriptInAnyLang 'In
simpleFp
      Script SimpleScript'
s <-
        (FileError ScriptDecodeError
 -> FileError CliSpendScriptWitnessError)
-> ExceptT (FileError ScriptDecodeError) m (Script SimpleScript')
-> t m (Script SimpleScript')
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError ((ScriptDecodeError -> CliSpendScriptWitnessError)
-> FileError ScriptDecodeError
-> FileError CliSpendScriptWitnessError
forall a b. (a -> b) -> FileError a -> FileError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> (ScriptDecodeError -> CliScriptWitnessError)
-> ScriptDecodeError
-> CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScriptDecodeError -> CliScriptWitnessError
SimpleScriptWitnessDecodeError)) (ExceptT (FileError ScriptDecodeError) m (Script SimpleScript')
 -> t m (Script SimpleScript'))
-> ExceptT (FileError ScriptDecodeError) m (Script SimpleScript')
-> t m (Script SimpleScript')
forall a b. (a -> b) -> a -> b
$
          FilePath
-> ExceptT (FileError ScriptDecodeError) m (Script SimpleScript')
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError ScriptDecodeError) t m =>
FilePath -> t m (Script SimpleScript')
readFileSimpleScript FilePath
sFp
      case Script SimpleScript'
s of
        SimpleScript SimpleScript
ss -> do
          SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a. a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return (SpendScriptWitness era -> t m (SpendScriptWitness era))
-> SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a b. (a -> b) -> a -> b
$
            ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall era. ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
SpendScriptWitness (ScriptWitness WitCtxTxIn era -> SpendScriptWitness era)
-> ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall a b. (a -> b) -> a -> b
$
              ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxTxIn era
forall era witctx.
ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness witctx era
SimpleScriptWitness (ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
forall era.
ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
sbeToSimpleScriptLanguageInEra ShelleyBasedEra era
sbe) (SimpleScriptOrReferenceInput SimpleScript'
 -> ScriptWitness WitCtxTxIn era)
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxTxIn era
forall a b. (a -> b) -> a -> b
$
                SimpleScript -> SimpleScriptOrReferenceInput SimpleScript'
forall lang. SimpleScript -> SimpleScriptOrReferenceInput lang
SScript SimpleScript
ss
    OnDiskSimpleOrPlutusScript
      (OnDiskPlutusScriptCliArgs File ScriptInAnyLang 'In
plutusScriptFp ScriptDatumOrFileSpending
mScriptDatum ScriptDataOrFile
redeemerFile ExecutionUnits
execUnits) -> do
        let sFp :: FilePath
sFp = File ScriptInAnyLang 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File ScriptInAnyLang 'In
plutusScriptFp
        AnyPlutusScript
plutusScript <-
          (FileError PlutusScriptDecodeError
 -> FileError CliSpendScriptWitnessError)
-> ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript
-> t m AnyPlutusScript
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError ((PlutusScriptDecodeError -> CliSpendScriptWitnessError)
-> FileError PlutusScriptDecodeError
-> FileError CliSpendScriptWitnessError
forall a b. (a -> b) -> FileError a -> FileError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> (PlutusScriptDecodeError -> CliScriptWitnessError)
-> PlutusScriptDecodeError
-> CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlutusScriptDecodeError -> CliScriptWitnessError
PlutusScriptWitnessDecodeError)) (ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript
 -> t m AnyPlutusScript)
-> ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript
-> t m AnyPlutusScript
forall a b. (a -> b) -> a -> b
$
            FilePath
-> ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError PlutusScriptDecodeError) t m =>
FilePath -> t m AnyPlutusScript
readFilePlutusScript (FilePath
 -> ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript)
-> FilePath
-> ExceptT (FileError PlutusScriptDecodeError) m AnyPlutusScript
forall a b. (a -> b) -> a -> b
$
              File ScriptInAnyLang 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File ScriptInAnyLang 'In
plutusScriptFp
        HashableScriptData
redeemer <-
          (ScriptDataError -> FileError CliSpendScriptWitnessError)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (FilePath
-> CliSpendScriptWitnessError
-> FileError CliSpendScriptWitnessError
forall e. FilePath -> e -> FileError e
FileError FilePath
sFp (CliSpendScriptWitnessError
 -> FileError CliSpendScriptWitnessError)
-> (ScriptDataError -> CliSpendScriptWitnessError)
-> ScriptDataError
-> FileError CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> (ScriptDataError -> CliScriptWitnessError)
-> ScriptDataError
-> CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScriptDataError -> CliScriptWitnessError
PlutusScriptWitnessRedeemerError)) (ExceptT ScriptDataError m HashableScriptData
 -> t m HashableScriptData)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall a b. (a -> b) -> a -> b
$
            ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile ScriptDataOrFile
redeemerFile
        case AnyPlutusScript
plutusScript of
          AnyPlutusScript PlutusScriptVersion lang
lang PlutusScript lang
script -> do
            let pScript :: PlutusScriptOrReferenceInput lang
pScript = PlutusScript lang -> PlutusScriptOrReferenceInput lang
forall lang. PlutusScript lang -> PlutusScriptOrReferenceInput lang
PScript PlutusScript lang
script
            ScriptLanguageInEra lang era
sLangSupported <-
              (CliSpendScriptWitnessError
 -> FileError CliSpendScriptWitnessError)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
-> t m (ScriptLanguageInEra lang era)
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (FilePath
-> CliSpendScriptWitnessError
-> FileError CliSpendScriptWitnessError
forall e. FilePath -> e -> FileError e
FileError FilePath
sFp)
                (ExceptT
   CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
 -> t m (ScriptLanguageInEra lang era))
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
-> t m (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ CliSpendScriptWitnessError
-> Maybe (ScriptLanguageInEra lang era)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
forall (m :: * -> *) x a. Monad m => x -> Maybe a -> ExceptT x m a
hoistMaybe
                  ( CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> CliScriptWitnessError -> CliSpendScriptWitnessError
forall a b. (a -> b) -> a -> b
$
                      AnyPlutusScriptVersion
-> AnyShelleyBasedEra -> CliScriptWitnessError
PlutusScriptWitnessLanguageNotSupportedInEra
                        (PlutusScriptVersion lang -> AnyPlutusScriptVersion
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> AnyPlutusScriptVersion
AnyPlutusScriptVersion PlutusScriptVersion lang
lang)
                        (ShelleyBasedEra era
-> (ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
-> AnyShelleyBasedEra
forall era a.
ShelleyBasedEra era -> (ShelleyBasedEraConstraints era => a) -> a
shelleyBasedEraConstraints ShelleyBasedEra era
sbe ((ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
 -> AnyShelleyBasedEra)
-> (ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
-> AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra era -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra era
sbe)
                  )
                (Maybe (ScriptLanguageInEra lang era)
 -> ExceptT
      CliSpendScriptWitnessError m (ScriptLanguageInEra lang era))
-> Maybe (ScriptLanguageInEra lang era)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra era
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
forall era lang.
ShelleyBasedEra era
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
scriptLanguageSupportedInEra ShelleyBasedEra era
sbe
                (ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era))
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> ScriptLanguage lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> ScriptLanguage lang
PlutusScriptLanguage PlutusScriptVersion lang
lang
            ScriptDatum WitCtxTxIn
mDatum <- ScriptDatumOrFileSpending -> t m (ScriptDatum WitCtxTxIn)
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ScriptDatumOrFileSpending -> t m (ScriptDatum WitCtxTxIn)
handlePotentialScriptDatum ScriptDatumOrFileSpending
mScriptDatum
            SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a. a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return (SpendScriptWitness era -> t m (SpendScriptWitness era))
-> SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a b. (a -> b) -> a -> b
$
              ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall era. ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
SpendScriptWitness (ScriptWitness WitCtxTxIn era -> SpendScriptWitness era)
-> ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall a b. (a -> b) -> a -> b
$
                ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum WitCtxTxIn
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness WitCtxTxIn era
forall lang era witctx.
IsPlutusScriptLanguage lang =>
ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum witctx
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness witctx era
PlutusScriptWitness
                  ScriptLanguageInEra lang era
sLangSupported
                  PlutusScriptVersion lang
lang
                  PlutusScriptOrReferenceInput lang
pScript
                  ScriptDatum WitCtxTxIn
mDatum
                  HashableScriptData
redeemer
                  ExecutionUnits
execUnits
    OnDiskSimpleRefScript (SimpleRefScriptArgs TxIn
refTxIn) ->
      SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a. a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return (SpendScriptWitness era -> t m (SpendScriptWitness era))
-> SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a b. (a -> b) -> a -> b
$
        ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall era. ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
SpendScriptWitness (ScriptWitness WitCtxTxIn era -> SpendScriptWitness era)
-> ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall a b. (a -> b) -> a -> b
$
          ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxTxIn era
forall era witctx.
ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness witctx era
SimpleScriptWitness
            (ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
forall era.
ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
sbeToSimpleScriptLanguageInEra ShelleyBasedEra era
sbe)
            (TxIn -> SimpleScriptOrReferenceInput SimpleScript'
forall lang. TxIn -> SimpleScriptOrReferenceInput lang
SReferenceScript TxIn
refTxIn)
    OnDiskPlutusRefScript
      (PlutusRefScriptCliArgs TxIn
refTxIn AnyPlutusScriptVersion
anyPlutusScriptVersion ScriptDatumOrFileSpending
mScriptDatum ScriptDataOrFile
redeemerFile ExecutionUnits
execUnits) ->
        case AnyPlutusScriptVersion
anyPlutusScriptVersion of
          AnyPlutusScriptVersion PlutusScriptVersion lang
lang -> do
            let pScript :: PlutusScriptOrReferenceInput lang
pScript = TxIn -> PlutusScriptOrReferenceInput lang
forall lang. TxIn -> PlutusScriptOrReferenceInput lang
PReferenceScript TxIn
refTxIn
            HashableScriptData
redeemer <-
              -- TODO: Implement a new error type to capture this. FileError is not representative of cases
              -- where we do not have access to the script.
              (ScriptDataError -> FileError CliSpendScriptWitnessError)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError
                ( FilePath
-> CliSpendScriptWitnessError
-> FileError CliSpendScriptWitnessError
forall e. FilePath -> e -> FileError e
FileError FilePath
"Reference script filepath not available"
                    (CliSpendScriptWitnessError
 -> FileError CliSpendScriptWitnessError)
-> (ScriptDataError -> CliSpendScriptWitnessError)
-> ScriptDataError
-> FileError CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError
                    (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> (ScriptDataError -> CliScriptWitnessError)
-> ScriptDataError
-> CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScriptDataError -> CliScriptWitnessError
PlutusScriptWitnessRedeemerError
                )
                (ExceptT ScriptDataError m HashableScriptData
 -> t m HashableScriptData)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall a b. (a -> b) -> a -> b
$ ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile ScriptDataOrFile
redeemerFile
            ScriptLanguageInEra lang era
sLangSupported <-
              -- TODO: Implement a new error type to capture this. FileError is not representative of cases
              -- where we do not have access to the script.
              (CliSpendScriptWitnessError
 -> FileError CliSpendScriptWitnessError)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
-> t m (ScriptLanguageInEra lang era)
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (FilePath
-> CliSpendScriptWitnessError
-> FileError CliSpendScriptWitnessError
forall e. FilePath -> e -> FileError e
FileError FilePath
"Reference script filepath not available")
                (ExceptT
   CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
 -> t m (ScriptLanguageInEra lang era))
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
-> t m (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ CliSpendScriptWitnessError
-> Maybe (ScriptLanguageInEra lang era)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
forall (m :: * -> *) x a. Monad m => x -> Maybe a -> ExceptT x m a
hoistMaybe
                  ( CliScriptWitnessError -> CliSpendScriptWitnessError
CliScriptWitnessError (CliScriptWitnessError -> CliSpendScriptWitnessError)
-> CliScriptWitnessError -> CliSpendScriptWitnessError
forall a b. (a -> b) -> a -> b
$
                      AnyPlutusScriptVersion
-> AnyShelleyBasedEra -> CliScriptWitnessError
PlutusScriptWitnessLanguageNotSupportedInEra
                        (PlutusScriptVersion lang -> AnyPlutusScriptVersion
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> AnyPlutusScriptVersion
AnyPlutusScriptVersion PlutusScriptVersion lang
lang)
                        (ShelleyBasedEra era
-> (ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
-> AnyShelleyBasedEra
forall era a.
ShelleyBasedEra era -> (ShelleyBasedEraConstraints era => a) -> a
shelleyBasedEraConstraints ShelleyBasedEra era
sbe ((ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
 -> AnyShelleyBasedEra)
-> (ShelleyBasedEraConstraints era => AnyShelleyBasedEra)
-> AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra era -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra era
sbe)
                  )
                (Maybe (ScriptLanguageInEra lang era)
 -> ExceptT
      CliSpendScriptWitnessError m (ScriptLanguageInEra lang era))
-> Maybe (ScriptLanguageInEra lang era)
-> ExceptT
     CliSpendScriptWitnessError m (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra era
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
forall era lang.
ShelleyBasedEra era
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
scriptLanguageSupportedInEra ShelleyBasedEra era
sbe
                (ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era))
-> ScriptLanguage lang -> Maybe (ScriptLanguageInEra lang era)
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> ScriptLanguage lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> ScriptLanguage lang
PlutusScriptLanguage PlutusScriptVersion lang
lang

            ScriptDatum WitCtxTxIn
mDatum <- ScriptDatumOrFileSpending -> t m (ScriptDatum WitCtxTxIn)
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ScriptDatumOrFileSpending -> t m (ScriptDatum WitCtxTxIn)
handlePotentialScriptDatum ScriptDatumOrFileSpending
mScriptDatum
            SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a. a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return (SpendScriptWitness era -> t m (SpendScriptWitness era))
-> SpendScriptWitness era -> t m (SpendScriptWitness era)
forall a b. (a -> b) -> a -> b
$
              ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall era. ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
SpendScriptWitness (ScriptWitness WitCtxTxIn era -> SpendScriptWitness era)
-> ScriptWitness WitCtxTxIn era -> SpendScriptWitness era
forall a b. (a -> b) -> a -> b
$
                ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum WitCtxTxIn
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness WitCtxTxIn era
forall lang era witctx.
IsPlutusScriptLanguage lang =>
ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum witctx
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness witctx era
PlutusScriptWitness
                  ScriptLanguageInEra lang era
sLangSupported
                  PlutusScriptVersion lang
lang
                  PlutusScriptOrReferenceInput lang
pScript
                  ScriptDatum WitCtxTxIn
mDatum
                  HashableScriptData
redeemer
                  ExecutionUnits
execUnits

handlePotentialScriptDatum
  :: MonadIOTransError (FileError CliSpendScriptWitnessError) t m
  => ScriptDatumOrFileSpending
  -> t m (ScriptDatum WitCtxTxIn)
handlePotentialScriptDatum :: forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError CliSpendScriptWitnessError) t m =>
ScriptDatumOrFileSpending -> t m (ScriptDatum WitCtxTxIn)
handlePotentialScriptDatum ScriptDatumOrFileSpending
InlineDatum = ScriptDatum WitCtxTxIn -> t m (ScriptDatum WitCtxTxIn)
forall a. a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptDatum WitCtxTxIn
InlineScriptDatum
handlePotentialScriptDatum (PotentialDatum Maybe ScriptDataOrFile
mDatum) =
  Maybe HashableScriptData -> ScriptDatum WitCtxTxIn
ScriptDatumForTxIn
    (Maybe HashableScriptData -> ScriptDatum WitCtxTxIn)
-> t m (Maybe HashableScriptData) -> t m (ScriptDatum WitCtxTxIn)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ScriptDataOrFile
-> (ScriptDataOrFile -> t m HashableScriptData)
-> t m (Maybe HashableScriptData)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM
      Maybe ScriptDataOrFile
mDatum
      ( \ScriptDataOrFile
datumFp ->
          (ScriptDataError -> FileError CliSpendScriptWitnessError)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (FilePath
-> CliSpendScriptWitnessError
-> FileError CliSpendScriptWitnessError
forall e. FilePath -> e -> FileError e
FileError (ScriptDataOrFile -> FilePath
forall a. Show a => a -> FilePath
show ScriptDataOrFile
datumFp) (CliSpendScriptWitnessError
 -> FileError CliSpendScriptWitnessError)
-> (ScriptDataError -> CliSpendScriptWitnessError)
-> ScriptDataError
-> FileError CliSpendScriptWitnessError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScriptDataError -> CliSpendScriptWitnessError
CliSpendScriptWitnessDatumError) (ExceptT ScriptDataError m HashableScriptData
 -> t m HashableScriptData)
-> ExceptT ScriptDataError m HashableScriptData
-> t m HashableScriptData
forall a b. (a -> b) -> a -> b
$
            ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile ScriptDataOrFile
datumFp
      )