{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}

module Cardano.CLI.EraBased.Script.Mint.Read
  ( readMintScriptWitness
  )
where

import Cardano.Api
import Cardano.Api.Experimental qualified as Exp

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.EraBased.Script.Mint.Type (MintScriptWitnessWithPolicyId (..))
import Cardano.CLI.EraBased.Script.Read.Common
import Cardano.CLI.EraBased.Script.Type
  ( AnyPlutusScript (..)
  , CliScriptWitnessError (..)
  , OnDiskPlutusScriptCliArgs (..)
  , PlutusRefScriptCliArgs (..)
  , ScriptRequirements (..)
  , SimpleRefScriptCliArgs (..)
  )
import Cardano.CLI.Read

readMintScriptWitness
  :: Exp.IsEra era
  => ScriptRequirements Exp.MintItem -> CIO e (MintScriptWitnessWithPolicyId era)
readMintScriptWitness :: forall era e.
IsEra era =>
ScriptRequirements 'MintItem
-> CIO e (MintScriptWitnessWithPolicyId era)
readMintScriptWitness (OnDiskSimpleScript File ScriptInAnyLang 'In
scriptFp) = do
  let sFp :: FilePath
sFp = File ScriptInAnyLang 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File ScriptInAnyLang 'In
scriptFp
  Script SimpleScript'
s <-
    FilePath -> CIO e (Script SimpleScript')
forall e. FilePath -> CIO e (Script SimpleScript')
readFileSimpleScript FilePath
sFp

  case Script SimpleScript'
s of
    SimpleScript SimpleScript
ss -> do
      let polId :: PolicyId
polId = ScriptHash -> PolicyId
PolicyId (ScriptHash -> PolicyId) -> ScriptHash -> PolicyId
forall a b. (a -> b) -> a -> b
$ Script SimpleScript' -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript Script SimpleScript'
s
      MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (MintScriptWitnessWithPolicyId era
 -> RIO e (MintScriptWitnessWithPolicyId era))
-> MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a b. (a -> b) -> a -> b
$
        PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall era.
PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
MintScriptWitnessWithPolicyId PolicyId
polId (ScriptWitness WitCtxMint era -> MintScriptWitnessWithPolicyId era)
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall a b. (a -> b) -> a -> b
$
          ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxMint 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 -> ScriptLanguageInEra SimpleScript' era)
-> ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
forall a b. (a -> b) -> a -> b
$ Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra) (SimpleScriptOrReferenceInput SimpleScript'
 -> ScriptWitness WitCtxMint era)
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxMint era
forall a b. (a -> b) -> a -> b
$
            SimpleScript -> SimpleScriptOrReferenceInput SimpleScript'
forall lang. SimpleScript -> SimpleScriptOrReferenceInput lang
SScript SimpleScript
ss
readMintScriptWitness
  ( OnDiskPlutusScript
      (OnDiskPlutusScriptCliArgs File ScriptInAnyLang 'In
scriptFp NoScriptDatum
OptionalDatum 'MintItem
Exp.NoScriptDatumAllowed ScriptDataOrFile
redeemerFile ExecutionUnits
execUnits)
    ) = do
    let plutusScriptFp :: FilePath
plutusScriptFp = File ScriptInAnyLang 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File ScriptInAnyLang 'In
scriptFp
    AnyPlutusScript
plutusScript <-
      FilePath -> CIO e AnyPlutusScript
forall e. FilePath -> CIO e AnyPlutusScript
readFilePlutusScript FilePath
plutusScriptFp

    HashableScriptData
redeemer <-
      ExceptT ScriptDataError IO HashableScriptData
-> RIO e HashableScriptData
forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
ExceptT e IO a -> m a
fromExceptTCli (ExceptT ScriptDataError IO HashableScriptData
 -> RIO e HashableScriptData)
-> ExceptT ScriptDataError IO HashableScriptData
-> RIO e HashableScriptData
forall a b. (a -> b) -> a -> b
$
        ScriptDataOrFile -> ExceptT ScriptDataError IO 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
            sbe :: ShelleyBasedEra era
sbe = Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra
            polId :: PolicyId
polId = Script lang -> PolicyId
forall lang. Script lang -> PolicyId
scriptPolicyId (Script lang -> PolicyId) -> Script lang -> PolicyId
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
lang PlutusScript lang
script
        ScriptLanguageInEra lang era
sLangSupported <-
          CliScriptWitnessError
-> Maybe (ScriptLanguageInEra lang era)
-> CIO e (ScriptLanguageInEra lang era)
forall err a e.
(Show err, Typeable err, Error err) =>
err -> Maybe a -> CIO e a
fromMaybeCli
            ( 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)
 -> CIO e (ScriptLanguageInEra lang era))
-> Maybe (ScriptLanguageInEra lang era)
-> CIO e (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
        MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (MintScriptWitnessWithPolicyId era
 -> RIO e (MintScriptWitnessWithPolicyId era))
-> MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a b. (a -> b) -> a -> b
$
          PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall era.
PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
MintScriptWitnessWithPolicyId PolicyId
polId (ScriptWitness WitCtxMint era -> MintScriptWitnessWithPolicyId era)
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall a b. (a -> b) -> a -> b
$
            ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum WitCtxMint
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness WitCtxMint 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 WitCtxMint
NoScriptDatumForMint
              HashableScriptData
redeemer
              ExecutionUnits
execUnits
readMintScriptWitness
  ( PlutusReferenceScript
      ( PlutusRefScriptCliArgs
          TxIn
refTxIn
          AnyPlutusScriptVersion
anyPlutusScriptVersion
          NoScriptDatum
OptionalDatum 'MintItem
Exp.NoScriptDatumAllowed
          MintPolicyId 'MintItem
polId
          ScriptDataOrFile
redeemerFile
          ExecutionUnits
execUnits
        )
    ) = do
    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
            sbe :: ShelleyBasedEra era
sbe = Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra
        HashableScriptData
redeemer <-
          ExceptT ScriptDataError IO HashableScriptData
-> RIO e HashableScriptData
forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
ExceptT e IO a -> m a
fromExceptTCli (ExceptT ScriptDataError IO HashableScriptData
 -> RIO e HashableScriptData)
-> ExceptT ScriptDataError IO HashableScriptData
-> RIO e HashableScriptData
forall a b. (a -> b) -> a -> b
$ ScriptDataOrFile -> ExceptT ScriptDataError IO HashableScriptData
forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile ScriptDataOrFile
redeemerFile
        ScriptLanguageInEra lang era
sLangSupported <-
          CliScriptWitnessError
-> Maybe (ScriptLanguageInEra lang era)
-> CIO e (ScriptLanguageInEra lang era)
forall err a e.
(Show err, Typeable err, Error err) =>
err -> Maybe a -> CIO e a
fromMaybeCli
            ( 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)
 -> CIO e (ScriptLanguageInEra lang era))
-> Maybe (ScriptLanguageInEra lang era)
-> CIO e (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

        MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (MintScriptWitnessWithPolicyId era
 -> RIO e (MintScriptWitnessWithPolicyId era))
-> MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a b. (a -> b) -> a -> b
$
          PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall era.
PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
MintScriptWitnessWithPolicyId PolicyId
MintPolicyId 'MintItem
polId (ScriptWitness WitCtxMint era -> MintScriptWitnessWithPolicyId era)
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall a b. (a -> b) -> a -> b
$
            ScriptLanguageInEra lang era
-> PlutusScriptVersion lang
-> PlutusScriptOrReferenceInput lang
-> ScriptDatum WitCtxMint
-> HashableScriptData
-> ExecutionUnits
-> ScriptWitness WitCtxMint 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 WitCtxMint
NoScriptDatumForMint
              HashableScriptData
redeemer
              ExecutionUnits
execUnits
readMintScriptWitness (SimpleReferenceScript (SimpleRefScriptArgs TxIn
refTxIn MintPolicyId 'MintItem
polId)) =
  MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (MintScriptWitnessWithPolicyId era
 -> RIO e (MintScriptWitnessWithPolicyId era))
-> MintScriptWitnessWithPolicyId era
-> RIO e (MintScriptWitnessWithPolicyId era)
forall a b. (a -> b) -> a -> b
$
    PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall era.
PolicyId
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
MintScriptWitnessWithPolicyId PolicyId
MintPolicyId 'MintItem
polId (ScriptWitness WitCtxMint era -> MintScriptWitnessWithPolicyId era)
-> ScriptWitness WitCtxMint era
-> MintScriptWitnessWithPolicyId era
forall a b. (a -> b) -> a -> b
$
      ScriptLanguageInEra SimpleScript' era
-> SimpleScriptOrReferenceInput SimpleScript'
-> ScriptWitness WitCtxMint 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 -> ScriptLanguageInEra SimpleScript' era)
-> ShelleyBasedEra era -> ScriptLanguageInEra SimpleScript' era
forall a b. (a -> b) -> a -> b
$ Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra)
        (TxIn -> SimpleScriptOrReferenceInput SimpleScript'
forall lang. TxIn -> SimpleScriptOrReferenceInput lang
SReferenceScript TxIn
refTxIn)