{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Cardano.CLI.EraBased.Script.Withdrawal.Read ( readWithdrawalScriptWitness ) where import Cardano.Api import Cardano.Api.Experimental ( AnyWitness (..) , IsEra (..) , LedgerEra ) import Cardano.Api.Experimental qualified as Exp import Cardano.Api.Experimental.AnyScriptWitness import Cardano.Api.Experimental.Plutus qualified as Exp.Plutus import Cardano.CLI.Compatible.Exception import Cardano.CLI.EraBased.Script.Read.Common import Cardano.CLI.EraBased.Script.Type import Cardano.CLI.Read import Cardano.CLI.Type.Common (AnySLanguage (..)) readWithdrawalScriptWitness :: forall e era . IsEra era => (StakeAddress, Coin, Maybe AnyNonAssetScript) -> CIO e (StakeAddress, Coin, AnyWitness (LedgerEra era)) readWithdrawalScriptWitness :: forall e era. IsEra era => (StakeAddress, Coin, Maybe AnyNonAssetScript) -> CIO e (StakeAddress, Coin, AnyWitness (LedgerEra era)) readWithdrawalScriptWitness (StakeAddress stakeAddr, Coin withdrawalAmt, Maybe AnyNonAssetScript Nothing) = (StakeAddress, Coin, AnyWitness (LedgerEra era)) -> RIO e (StakeAddress, Coin, AnyWitness (LedgerEra era)) forall a. a -> RIO e a forall (m :: * -> *) a. Monad m => a -> m a return (StakeAddress stakeAddr, Coin withdrawalAmt, AnyWitness (LedgerEra era) forall era. AnyWitness era Exp.AnyKeyWitnessPlaceholder) readWithdrawalScriptWitness (StakeAddress stakeAddr, Coin withdrawalAmt, Just AnyNonAssetScript certScriptReq) = case AnyNonAssetScript certScriptReq of AnyNonAssetScriptSimple SimpleScriptRequirements simpleReq -> case SimpleScriptRequirements simpleReq of 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 sWit <- SimpleScriptOrReferenceInput (LedgerEra era) -> AnyWitness (LedgerEra era) forall era. SimpleScriptOrReferenceInput era -> AnyWitness era AnySimpleScriptWitness (SimpleScriptOrReferenceInput (LedgerEra era) -> AnyWitness (LedgerEra era)) -> (SimpleScript (LedgerEra era) -> SimpleScriptOrReferenceInput (LedgerEra era)) -> SimpleScript (LedgerEra era) -> AnyWitness (LedgerEra era) forall b c a. (b -> c) -> (a -> b) -> a -> c . SimpleScript (LedgerEra era) -> SimpleScriptOrReferenceInput (LedgerEra era) forall era. SimpleScript era -> SimpleScriptOrReferenceInput era Exp.SScript (SimpleScript (LedgerEra era) -> AnyWitness (LedgerEra era)) -> RIO e (SimpleScript (LedgerEra era)) -> RIO e (AnyWitness (LedgerEra era)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> FilePath -> Era era -> CIO e (SimpleScript (LedgerEra era)) forall era e. FilePath -> Era era -> CIO e (SimpleScript (LedgerEra era)) readFileSimpleScript FilePath sFp (forall era. IsEra era => Era era Exp.useEra @era) return (stakeAddr, withdrawalAmt, sWit) ReferenceSimpleScript TxIn refTxIn -> (StakeAddress, Coin, AnyWitness (LedgerEra era)) -> RIO e (StakeAddress, Coin, AnyWitness (LedgerEra era)) forall a. a -> RIO e a forall (m :: * -> *) a. Monad m => a -> m a return ( StakeAddress stakeAddr , Coin withdrawalAmt , SimpleScriptOrReferenceInput (LedgerEra era) -> AnyWitness (LedgerEra era) forall era. SimpleScriptOrReferenceInput era -> AnyWitness era AnySimpleScriptWitness (SimpleScriptOrReferenceInput (LedgerEra era) -> AnyWitness (LedgerEra era)) -> SimpleScriptOrReferenceInput (LedgerEra era) -> AnyWitness (LedgerEra era) forall a b. (a -> b) -> a -> b $ TxIn -> SimpleScriptOrReferenceInput (LedgerEra era) forall era. TxIn -> SimpleScriptOrReferenceInput era Exp.SReferenceScript TxIn refTxIn ) AnyNonAssetScriptPlutus PlutusNonAssetScriptRequirements plutusReq -> case PlutusNonAssetScriptRequirements plutusReq of OnDiskPlutusNonAssetScript File ScriptInAnyLang 'In scriptFp 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 Exp.Plutus.AnyPlutusScript script <- forall e era. IsEra era => FilePath -> CIO e (AnyPlutusScript (LedgerEra era)) readFilePlutusScript @_ @era FilePath plutusScriptFp redeemer <- fromExceptTCli $ readScriptDataOrFile redeemerFile let lang = PlutusScriptInEra lang (LedgerEra era) -> SLanguage lang forall (lang :: Language) era. PlutusLanguage lang => PlutusScriptInEra lang era -> SLanguage lang Exp.Plutus.plutusScriptInEraSLanguage PlutusScriptInEra lang (LedgerEra era) script pScript = PlutusScriptInEra lang (LedgerEra era) -> PlutusScriptOrReferenceInput lang (LedgerEra era) forall (lang :: Language) era. PlutusScriptInEra lang era -> PlutusScriptOrReferenceInput lang era Exp.Plutus.PScript PlutusScriptInEra lang (LedgerEra era) script sw = SLanguage lang -> PlutusScriptOrReferenceInput lang (LedgerEra era) -> PlutusScriptDatum lang purpose -> HashableScriptData -> ExecutionUnits -> PlutusScriptWitness lang purpose (LedgerEra era) forall (lang :: Language) era (purpose :: PlutusScriptPurpose). SLanguage lang -> PlutusScriptOrReferenceInput lang era -> PlutusScriptDatum lang purpose -> HashableScriptData -> ExecutionUnits -> PlutusScriptWitness lang purpose era Exp.Plutus.PlutusScriptWitness SLanguage lang lang PlutusScriptOrReferenceInput lang (LedgerEra era) pScript PlutusScriptDatum lang purpose forall (lang :: Language) (purpose :: PlutusScriptPurpose). PlutusScriptDatum lang purpose Exp.Plutus.NoScriptDatum HashableScriptData redeemer ExecutionUnits execUnits return ( stakeAddr , withdrawalAmt , AnyPlutusScriptWitness $ AnyPlutusCertifyingScriptWitness sw ) ReferencePlutusNonAssetScript TxIn refTxIn (AnySLanguage SLanguage lang lang) ScriptDataOrFile redeemerFile ExecutionUnits execUnits -> do 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 let sWit = AnyPlutusScriptWitness lang 'CertifyingScript era -> AnyWitness era forall (lang :: Language) (purpose :: PlutusScriptPurpose) era. AnyPlutusScriptWitness lang purpose era -> AnyWitness era Exp.AnyPlutusScriptWitness (AnyPlutusScriptWitness lang 'CertifyingScript era -> AnyWitness era) -> AnyPlutusScriptWitness lang 'CertifyingScript era -> AnyWitness era forall a b. (a -> b) -> a -> b $ PlutusScriptWitness lang 'CertifyingScript era -> AnyPlutusScriptWitness lang 'CertifyingScript era forall (lang :: Language) era. Typeable lang => PlutusScriptWitness lang 'CertifyingScript era -> AnyPlutusScriptWitness lang 'CertifyingScript era AnyPlutusCertifyingScriptWitness (PlutusScriptWitness lang 'CertifyingScript era -> AnyPlutusScriptWitness lang 'CertifyingScript era) -> PlutusScriptWitness lang 'CertifyingScript era -> AnyPlutusScriptWitness lang 'CertifyingScript era forall a b. (a -> b) -> a -> b $ SLanguage lang -> PlutusScriptOrReferenceInput lang era -> PlutusScriptDatum lang 'CertifyingScript -> HashableScriptData -> ExecutionUnits -> PlutusScriptWitness lang 'CertifyingScript era forall (lang :: Language) era (purpose :: PlutusScriptPurpose). SLanguage lang -> PlutusScriptOrReferenceInput lang era -> PlutusScriptDatum lang purpose -> HashableScriptData -> ExecutionUnits -> PlutusScriptWitness lang purpose era Exp.Plutus.PlutusScriptWitness SLanguage lang lang (TxIn -> PlutusScriptOrReferenceInput lang era forall (lang :: Language) era. TxIn -> PlutusScriptOrReferenceInput lang era Exp.Plutus.PReferenceScript TxIn refTxIn) PlutusScriptDatum lang 'CertifyingScript forall (lang :: Language) (purpose :: PlutusScriptPurpose). PlutusScriptDatum lang purpose Exp.Plutus.NoScriptDatum HashableScriptData redeemer ExecutionUnits execUnits return ( stakeAddr , withdrawalAmt , sWit )