{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE LambdaCase #-}

module Cardano.CLI.EraBased.Transaction.Command
  ( MustExtendSafeZone (..)
  , NodeContextInfoSource (..)
  , SystemStartOrGenesisFileSource (..)
  , TransactionBuildCmdArgs (..)
  , TransactionBuildEstimateCmdArgs (..)
  , TransactionBuildRawCmdArgs (..)
  , TransactionCalculateMinFeeCmdArgs (..)
  , TransactionCalculateMinValueCmdArgs (..)
  , TransactionCalculatePlutusScriptCostCmdArgs (..)
  , TransactionCmds (..)
  , TransactionContext (..)
  , TransactionHashScriptDataCmdArgs (..)
  , TransactionPolicyIdCmdArgs (..)
  , TransactionSignCmdArgs (..)
  , TransactionSignWitnessCmdArgs (..)
  , TransactionSubmitCmdArgs (..)
  , TransactionTxIdCmdArgs (..)
  , TransactionViewCmdArgs (..)
  , TransactionWitnessCmdArgs (..)
  , TxCborFormat (..)
  , renderTransactionCmds
  )
where

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

import Cardano.CLI.EraBased.Script.Type
import Cardano.CLI.Orphan ()
import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Governance

import Data.Universe (Some)
import Vary (Vary)

data TransactionCmds era
  = TransactionBuildRawCmd !(TransactionBuildRawCmdArgs era)
  | TransactionBuildCmd !(TransactionBuildCmdArgs era)
  | TransactionBuildEstimateCmd !(TransactionBuildEstimateCmdArgs era)
  | TransactionSignCmd !TransactionSignCmdArgs
  | TransactionWitnessCmd !TransactionWitnessCmdArgs
  | TransactionSignWitnessCmd !TransactionSignWitnessCmdArgs
  | TransactionSubmitCmd !TransactionSubmitCmdArgs
  | TransactionPolicyIdCmd !TransactionPolicyIdCmdArgs
  | TransactionCalculateMinFeeCmd !TransactionCalculateMinFeeCmdArgs
  | TransactionCalculateMinValueCmd !(TransactionCalculateMinValueCmdArgs era)
  | TransactionCalculatePlutusScriptCostCmd !(TransactionCalculatePlutusScriptCostCmdArgs era)
  | TransactionHashScriptDataCmd !TransactionHashScriptDataCmdArgs
  | TransactionTxIdCmd !TransactionTxIdCmdArgs

data TransactionBuildRawCmdArgs era = TransactionBuildRawCmdArgs
  { forall era. TransactionBuildRawCmdArgs era -> Era era
eon :: !(Exp.Era era)
  , forall era. TransactionBuildRawCmdArgs era -> Maybe ScriptValidity
mScriptValidity :: !(Maybe ScriptValidity)
  -- ^ Mark script as expected to pass or fail validation
  , forall era.
TransactionBuildRawCmdArgs era
-> [(TxIn, Maybe (ScriptRequirements 'TxInItem))]
txIns :: ![(TxIn, Maybe (ScriptRequirements Exp.TxInItem))]
  -- ^ Transaction inputs with optional spending scripts
  , forall era. TransactionBuildRawCmdArgs era -> [TxIn]
readOnlyRefIns :: ![TxIn]
  -- ^ Read only reference inputs
  , forall era. TransactionBuildRawCmdArgs era -> [TxIn]
txInsCollateral :: ![TxIn]
  -- ^ Transaction inputs for collateral, only key witnesses, no scripts.
  , forall era.
TransactionBuildRawCmdArgs era -> Maybe TxOutShelleyBasedEra
mReturnCollateral :: !(Maybe TxOutShelleyBasedEra)
  -- ^ Return collateral
  , forall era. TransactionBuildRawCmdArgs era -> Maybe Coin
mTotalCollateral :: !(Maybe Coin)
  -- ^ Total collateral
  , forall era. TransactionBuildRawCmdArgs era -> [RequiredSigner]
requiredSigners :: ![RequiredSigner]
  -- ^ Required signers
  , forall era. TransactionBuildRawCmdArgs era -> [TxOutAnyEra]
txouts :: ![TxOutAnyEra]
  , forall era.
TransactionBuildRawCmdArgs era
-> Maybe (MultiAsset, [ScriptRequirements 'MintItem])
mMintedAssets :: !(Maybe (L.MultiAsset, [ScriptRequirements Exp.MintItem]))
  -- ^ Multi-Asset minted value with script witness
  , forall era. TransactionBuildRawCmdArgs era -> Maybe SlotNo
mValidityLowerBound :: !(Maybe SlotNo)
  -- ^ Transaction validity lower bound
  , forall era.
TransactionBuildRawCmdArgs era -> TxValidityUpperBound era
mValidityUpperBound :: !(TxValidityUpperBound era)
  -- ^ Transaction validity upper bound
  , forall era. TransactionBuildRawCmdArgs era -> Coin
fee :: !Coin
  -- ^ Transaction fee
  , forall era.
TransactionBuildRawCmdArgs era
-> [(CertificateFile, Maybe (ScriptRequirements 'CertItem))]
certificates :: ![(CertificateFile, Maybe (ScriptRequirements Exp.CertItem))]
  -- ^ Certificates with potential script witness
  , forall era.
TransactionBuildRawCmdArgs era
-> [(StakeAddress, Coin,
     Maybe (ScriptRequirements 'WithdrawalItem))]
withdrawals :: ![(StakeAddress, Coin, Maybe (ScriptRequirements Exp.WithdrawalItem))]
  , forall era. TransactionBuildRawCmdArgs era -> TxMetadataJsonSchema
metadataSchema :: !TxMetadataJsonSchema
  , forall era. TransactionBuildRawCmdArgs era -> [ScriptFile]
scriptFiles :: ![ScriptFile]
  -- ^ Auxiliary scripts
  , forall era. TransactionBuildRawCmdArgs era -> [MetadataFile]
metadataFiles :: ![MetadataFile]
  , forall era.
TransactionBuildRawCmdArgs era -> Maybe ProtocolParamsFile
mProtocolParamsFile :: !(Maybe ProtocolParamsFile)
  , forall era.
TransactionBuildRawCmdArgs era
-> Maybe
     (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))
mUpdateProprosalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
  , forall era.
TransactionBuildRawCmdArgs era
-> [(VoteFile 'In, Maybe (ScriptRequirements 'VoterItem))]
voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
  , forall era.
TransactionBuildRawCmdArgs era
-> [(ProposalFile 'In, Maybe (ScriptRequirements 'ProposalItem))]
proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
  , forall era.
TransactionBuildRawCmdArgs era
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation))
  , forall era. TransactionBuildRawCmdArgs era -> TxCborFormat
isCborOutCanonical :: !TxCborFormat
  , forall era. TransactionBuildRawCmdArgs era -> TxBodyFile 'Out
txBodyOutFile :: !(TxBodyFile Out)
  }
  deriving Int -> TransactionBuildRawCmdArgs era -> ShowS
[TransactionBuildRawCmdArgs era] -> ShowS
TransactionBuildRawCmdArgs era -> String
(Int -> TransactionBuildRawCmdArgs era -> ShowS)
-> (TransactionBuildRawCmdArgs era -> String)
-> ([TransactionBuildRawCmdArgs era] -> ShowS)
-> Show (TransactionBuildRawCmdArgs era)
forall era. Int -> TransactionBuildRawCmdArgs era -> ShowS
forall era. [TransactionBuildRawCmdArgs era] -> ShowS
forall era. TransactionBuildRawCmdArgs era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> TransactionBuildRawCmdArgs era -> ShowS
showsPrec :: Int -> TransactionBuildRawCmdArgs era -> ShowS
$cshow :: forall era. TransactionBuildRawCmdArgs era -> String
show :: TransactionBuildRawCmdArgs era -> String
$cshowList :: forall era. [TransactionBuildRawCmdArgs era] -> ShowS
showList :: [TransactionBuildRawCmdArgs era] -> ShowS
Show

-- | Whether output transaction is in CBOR canonical format according to RFC7049 section 3.9.
--
-- 1. https://datatracker.ietf.org/doc/html/rfc7049#section-3.9
-- 2. https://github.com/cardano-foundation/CIPs/blob/master/CIP-0021/README.md#canonical-cbor-serialization-format
data TxCborFormat
  = TxCborCanonical
  | TxCborNotCanonical
  deriving (TxCborFormat -> TxCborFormat -> Bool
(TxCborFormat -> TxCborFormat -> Bool)
-> (TxCborFormat -> TxCborFormat -> Bool) -> Eq TxCborFormat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TxCborFormat -> TxCborFormat -> Bool
== :: TxCborFormat -> TxCborFormat -> Bool
$c/= :: TxCborFormat -> TxCborFormat -> Bool
/= :: TxCborFormat -> TxCborFormat -> Bool
Eq, Int -> TxCborFormat -> ShowS
[TxCborFormat] -> ShowS
TxCborFormat -> String
(Int -> TxCborFormat -> ShowS)
-> (TxCborFormat -> String)
-> ([TxCborFormat] -> ShowS)
-> Show TxCborFormat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxCborFormat -> ShowS
showsPrec :: Int -> TxCborFormat -> ShowS
$cshow :: TxCborFormat -> String
show :: TxCborFormat -> String
$cshowList :: [TxCborFormat] -> ShowS
showList :: [TxCborFormat] -> ShowS
Show)

-- | Like 'TransactionBuildRaw' but without the fee, and with a change output.
data TransactionBuildCmdArgs era = TransactionBuildCmdArgs
  { forall era. TransactionBuildCmdArgs era -> Era era
currentEra :: !(Exp.Era era)
  , forall era. TransactionBuildCmdArgs era -> LocalNodeConnectInfo
nodeConnInfo :: !LocalNodeConnectInfo
  , forall era. TransactionBuildCmdArgs era -> Maybe ScriptValidity
mScriptValidity :: !(Maybe ScriptValidity)
  -- ^ Mark script as expected to pass or fail validation
  , forall era. TransactionBuildCmdArgs era -> Maybe Word
mOverrideWitnesses :: !(Maybe Word)
  -- ^ Override the required number of tx witnesses
  , forall era.
TransactionBuildCmdArgs era
-> [(TxIn, Maybe (ScriptRequirements 'TxInItem))]
txins :: ![(TxIn, Maybe (ScriptRequirements Exp.TxInItem))]
  -- ^ Transaction inputs with optional spending scripts
  , forall era. TransactionBuildCmdArgs era -> [TxIn]
readOnlyReferenceInputs :: ![TxIn]
  -- ^ Read only reference inputs
  , forall era. TransactionBuildCmdArgs era -> [RequiredSigner]
requiredSigners :: ![RequiredSigner]
  -- ^ Required signers
  , forall era. TransactionBuildCmdArgs era -> [TxIn]
txinsc :: ![TxIn]
  -- ^ Transaction inputs for collateral, only key witnesses, no scripts.
  , forall era.
TransactionBuildCmdArgs era -> Maybe TxOutShelleyBasedEra
mReturnCollateral :: !(Maybe TxOutShelleyBasedEra)
  -- ^ Return collateral
  , forall era. TransactionBuildCmdArgs era -> Maybe Coin
mTotalCollateral :: !(Maybe Coin)
  -- ^ Total collateral
  , forall era. TransactionBuildCmdArgs era -> [TxOutAnyEra]
txouts :: ![TxOutAnyEra]
  -- ^ Normal outputs
  , forall era. TransactionBuildCmdArgs era -> TxOutChangeAddress
changeAddresses :: !TxOutChangeAddress
  -- ^ A change output
  , forall era.
TransactionBuildCmdArgs era
-> Maybe (MultiAsset, [ScriptRequirements 'MintItem])
mMintedAssets :: !(Maybe (L.MultiAsset, [ScriptRequirements Exp.MintItem]))
  -- ^ Multi-Asset minted value with script witness
  , forall era. TransactionBuildCmdArgs era -> Maybe SlotNo
mValidityLowerBound :: !(Maybe SlotNo)
  -- ^ Transaction validity lower bound
  , forall era. TransactionBuildCmdArgs era -> TxValidityUpperBound era
mValidityUpperBound :: !(TxValidityUpperBound era)
  -- ^ Transaction validity upper bound
  , forall era.
TransactionBuildCmdArgs era
-> [(CertificateFile, Maybe (ScriptRequirements 'CertItem))]
certificates :: ![(CertificateFile, Maybe (ScriptRequirements Exp.CertItem))]
  -- ^ Certificates with potential script witness
  , forall era.
TransactionBuildCmdArgs era
-> [(StakeAddress, Coin,
     Maybe (ScriptRequirements 'WithdrawalItem))]
withdrawals :: ![(StakeAddress, Coin, Maybe (ScriptRequirements Exp.WithdrawalItem))]
  -- ^ Withdrawals with potential script witness
  , forall era. TransactionBuildCmdArgs era -> TxMetadataJsonSchema
metadataSchema :: !TxMetadataJsonSchema
  , forall era. TransactionBuildCmdArgs era -> [ScriptFile]
scriptFiles :: ![ScriptFile]
  -- ^ Auxiliary scripts
  , forall era. TransactionBuildCmdArgs era -> [MetadataFile]
metadataFiles :: ![MetadataFile]
  , forall era.
TransactionBuildCmdArgs era
-> Maybe
     (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))
mUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
  , forall era.
TransactionBuildCmdArgs era
-> [(VoteFile 'In, Maybe (ScriptRequirements 'VoterItem))]
voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
  , forall era.
TransactionBuildCmdArgs era
-> [(ProposalFile 'In, Maybe (ScriptRequirements 'ProposalItem))]
proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
  , forall era. TransactionBuildCmdArgs era -> Maybe TxTreasuryDonation
treasuryDonation :: !(Maybe TxTreasuryDonation)
  , forall era. TransactionBuildCmdArgs era -> TxCborFormat
isCborOutCanonical :: !TxCborFormat
  , forall era. TransactionBuildCmdArgs era -> TxBuildOutputOptions
buildOutputOptions :: !TxBuildOutputOptions
  }
  deriving Int -> TransactionBuildCmdArgs era -> ShowS
[TransactionBuildCmdArgs era] -> ShowS
TransactionBuildCmdArgs era -> String
(Int -> TransactionBuildCmdArgs era -> ShowS)
-> (TransactionBuildCmdArgs era -> String)
-> ([TransactionBuildCmdArgs era] -> ShowS)
-> Show (TransactionBuildCmdArgs era)
forall era. Int -> TransactionBuildCmdArgs era -> ShowS
forall era. [TransactionBuildCmdArgs era] -> ShowS
forall era. TransactionBuildCmdArgs era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> TransactionBuildCmdArgs era -> ShowS
showsPrec :: Int -> TransactionBuildCmdArgs era -> ShowS
$cshow :: forall era. TransactionBuildCmdArgs era -> String
show :: TransactionBuildCmdArgs era -> String
$cshowList :: forall era. [TransactionBuildCmdArgs era] -> ShowS
showList :: [TransactionBuildCmdArgs era] -> ShowS
Show

-- | Like 'TransactionBuildCmd' but does not require explicit access to a running node
data TransactionBuildEstimateCmdArgs era = TransactionBuildEstimateCmdArgs
  { forall era. TransactionBuildEstimateCmdArgs era -> Era era
currentEra :: !(Exp.Era era)
  , forall era.
TransactionBuildEstimateCmdArgs era -> Maybe ScriptValidity
mScriptValidity :: !(Maybe ScriptValidity)
  -- ^ Mark script as expected to pass or fail validation
  , forall era. TransactionBuildEstimateCmdArgs era -> Int
shelleyWitnesses :: !Int
  -- ^ Number of shelley witnesses to be added
  , forall era. TransactionBuildEstimateCmdArgs era -> Maybe Int
mByronWitnesses :: !(Maybe Int)
  , forall era.
TransactionBuildEstimateCmdArgs era -> ProtocolParamsFile
protocolParamsFile :: !ProtocolParamsFile
  , forall era. TransactionBuildEstimateCmdArgs era -> Value
totalUTxOValue :: !Value
  , forall era.
TransactionBuildEstimateCmdArgs era
-> [(TxIn, Maybe (ScriptRequirements 'TxInItem))]
txins :: ![(TxIn, Maybe (ScriptRequirements Exp.TxInItem))]
  -- ^ Transaction inputs with optional spending scripts
  , forall era. TransactionBuildEstimateCmdArgs era -> [TxIn]
readOnlyReferenceInputs :: ![TxIn]
  -- ^ Read only reference inputs
  , forall era. TransactionBuildEstimateCmdArgs era -> [RequiredSigner]
requiredSigners :: ![RequiredSigner]
  -- ^ Required signers
  , forall era. TransactionBuildEstimateCmdArgs era -> [TxIn]
txinsc :: ![TxIn]
  -- ^ Transaction inputs for collateral, only key witnesses, no scripts.
  , forall era.
TransactionBuildEstimateCmdArgs era -> Maybe TxOutShelleyBasedEra
mReturnCollateral :: !(Maybe TxOutShelleyBasedEra)
  -- ^ Return collateral
  , forall era. TransactionBuildEstimateCmdArgs era -> [TxOutAnyEra]
txouts :: ![TxOutAnyEra]
  -- ^ Normal outputs
  , forall era.
TransactionBuildEstimateCmdArgs era -> TxOutChangeAddress
changeAddress :: !TxOutChangeAddress
  -- ^ A change output
  , forall era.
TransactionBuildEstimateCmdArgs era
-> Maybe (MultiAsset, [ScriptRequirements 'MintItem])
mMintedAssets :: !(Maybe (L.MultiAsset, [ScriptRequirements Exp.MintItem]))
  -- ^ Multi-Asset value with script witness
  , forall era. TransactionBuildEstimateCmdArgs era -> Maybe SlotNo
mValidityLowerBound :: !(Maybe SlotNo)
  -- ^ Transaction validity lower bound
  , forall era.
TransactionBuildEstimateCmdArgs era -> TxValidityUpperBound era
mValidityUpperBound :: !(TxValidityUpperBound era)
  -- ^ Transaction validity upper bound
  , forall era.
TransactionBuildEstimateCmdArgs era
-> [(CertificateFile, Maybe (ScriptRequirements 'CertItem))]
certificates :: ![(CertificateFile, Maybe (ScriptRequirements Exp.CertItem))]
  -- ^ Certificates with potential script witness
  , forall era.
TransactionBuildEstimateCmdArgs era
-> [(StakeAddress, Coin,
     Maybe (ScriptRequirements 'WithdrawalItem))]
withdrawals :: ![(StakeAddress, Coin, Maybe (ScriptRequirements Exp.WithdrawalItem))]
  -- ^ Withdrawals with potential script witness
  , forall era. TransactionBuildEstimateCmdArgs era -> Maybe Coin
plutusCollateral :: !(Maybe Coin)
  -- ^ Total collateral
  , forall era.
TransactionBuildEstimateCmdArgs era -> Maybe ReferenceScriptSize
totalReferenceScriptSize :: !(Maybe ReferenceScriptSize)
  -- ^ Size of all reference scripts in bytes
  , forall era.
TransactionBuildEstimateCmdArgs era -> TxMetadataJsonSchema
metadataSchema :: !TxMetadataJsonSchema
  , forall era. TransactionBuildEstimateCmdArgs era -> [ScriptFile]
scriptFiles :: ![ScriptFile]
  -- ^ Auxiliary scripts
  , forall era. TransactionBuildEstimateCmdArgs era -> [MetadataFile]
metadataFiles :: ![MetadataFile]
  , forall era.
TransactionBuildEstimateCmdArgs era
-> [(VoteFile 'In, Maybe (ScriptRequirements 'VoterItem))]
voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
  , forall era.
TransactionBuildEstimateCmdArgs era
-> [(ProposalFile 'In, Maybe (ScriptRequirements 'ProposalItem))]
proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
  , forall era.
TransactionBuildEstimateCmdArgs era
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation))
  , forall era. TransactionBuildEstimateCmdArgs era -> TxCborFormat
isCborOutCanonical :: !TxCborFormat
  , forall era. TransactionBuildEstimateCmdArgs era -> TxBodyFile 'Out
txBodyOutFile :: !(TxBodyFile Out)
  }

data TransactionSignCmdArgs = TransactionSignCmdArgs
  { TransactionSignCmdArgs -> InputTxBodyOrTxFile
txOrTxBodyFile :: !InputTxBodyOrTxFile
  , TransactionSignCmdArgs -> [WitnessSigningData]
witnessSigningData :: ![WitnessSigningData]
  , TransactionSignCmdArgs -> Maybe NetworkId
mNetworkId :: !(Maybe NetworkId)
  , TransactionSignCmdArgs -> TxCborFormat
isCborOutCanonical :: !TxCborFormat
  , TransactionSignCmdArgs -> TxFile 'Out
outTxFile :: !(TxFile Out)
  }
  deriving Int -> TransactionSignCmdArgs -> ShowS
[TransactionSignCmdArgs] -> ShowS
TransactionSignCmdArgs -> String
(Int -> TransactionSignCmdArgs -> ShowS)
-> (TransactionSignCmdArgs -> String)
-> ([TransactionSignCmdArgs] -> ShowS)
-> Show TransactionSignCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionSignCmdArgs -> ShowS
showsPrec :: Int -> TransactionSignCmdArgs -> ShowS
$cshow :: TransactionSignCmdArgs -> String
show :: TransactionSignCmdArgs -> String
$cshowList :: [TransactionSignCmdArgs] -> ShowS
showList :: [TransactionSignCmdArgs] -> ShowS
Show

data TransactionWitnessCmdArgs = TransactionWitnessCmdArgs
  { TransactionWitnessCmdArgs -> TxBodyFile 'In
txBodyFile :: !(TxBodyFile In)
  , TransactionWitnessCmdArgs -> WitnessSigningData
witnessSigningData :: !WitnessSigningData
  , TransactionWitnessCmdArgs -> Maybe NetworkId
mNetworkId :: !(Maybe NetworkId)
  , TransactionWitnessCmdArgs -> File () 'Out
outFile :: !(File () Out)
  }
  deriving Int -> TransactionWitnessCmdArgs -> ShowS
[TransactionWitnessCmdArgs] -> ShowS
TransactionWitnessCmdArgs -> String
(Int -> TransactionWitnessCmdArgs -> ShowS)
-> (TransactionWitnessCmdArgs -> String)
-> ([TransactionWitnessCmdArgs] -> ShowS)
-> Show TransactionWitnessCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionWitnessCmdArgs -> ShowS
showsPrec :: Int -> TransactionWitnessCmdArgs -> ShowS
$cshow :: TransactionWitnessCmdArgs -> String
show :: TransactionWitnessCmdArgs -> String
$cshowList :: [TransactionWitnessCmdArgs] -> ShowS
showList :: [TransactionWitnessCmdArgs] -> ShowS
Show

data TransactionSignWitnessCmdArgs = TransactionSignWitnessCmdArgs
  { TransactionSignWitnessCmdArgs -> TxBodyFile 'In
txBodyFile :: !(TxBodyFile In)
  , TransactionSignWitnessCmdArgs -> [WitnessFile]
witnessFiles :: ![WitnessFile]
  , TransactionSignWitnessCmdArgs -> TxCborFormat
isCborOutCanonical :: !TxCborFormat
  , TransactionSignWitnessCmdArgs -> File () 'Out
outFile :: !(File () Out)
  }
  deriving Int -> TransactionSignWitnessCmdArgs -> ShowS
[TransactionSignWitnessCmdArgs] -> ShowS
TransactionSignWitnessCmdArgs -> String
(Int -> TransactionSignWitnessCmdArgs -> ShowS)
-> (TransactionSignWitnessCmdArgs -> String)
-> ([TransactionSignWitnessCmdArgs] -> ShowS)
-> Show TransactionSignWitnessCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionSignWitnessCmdArgs -> ShowS
showsPrec :: Int -> TransactionSignWitnessCmdArgs -> ShowS
$cshow :: TransactionSignWitnessCmdArgs -> String
show :: TransactionSignWitnessCmdArgs -> String
$cshowList :: [TransactionSignWitnessCmdArgs] -> ShowS
showList :: [TransactionSignWitnessCmdArgs] -> ShowS
Show

data TransactionSubmitCmdArgs = TransactionSubmitCmdArgs
  { TransactionSubmitCmdArgs -> LocalNodeConnectInfo
nodeConnInfo :: !LocalNodeConnectInfo
  , TransactionSubmitCmdArgs -> String
txFile :: !FilePath
  }
  deriving Int -> TransactionSubmitCmdArgs -> ShowS
[TransactionSubmitCmdArgs] -> ShowS
TransactionSubmitCmdArgs -> String
(Int -> TransactionSubmitCmdArgs -> ShowS)
-> (TransactionSubmitCmdArgs -> String)
-> ([TransactionSubmitCmdArgs] -> ShowS)
-> Show TransactionSubmitCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionSubmitCmdArgs -> ShowS
showsPrec :: Int -> TransactionSubmitCmdArgs -> ShowS
$cshow :: TransactionSubmitCmdArgs -> String
show :: TransactionSubmitCmdArgs -> String
$cshowList :: [TransactionSubmitCmdArgs] -> ShowS
showList :: [TransactionSubmitCmdArgs] -> ShowS
Show

newtype TransactionPolicyIdCmdArgs = TransactionPolicyIdCmdArgs
  { TransactionPolicyIdCmdArgs -> ScriptFile
scriptFile :: ScriptFile
  }
  deriving Int -> TransactionPolicyIdCmdArgs -> ShowS
[TransactionPolicyIdCmdArgs] -> ShowS
TransactionPolicyIdCmdArgs -> String
(Int -> TransactionPolicyIdCmdArgs -> ShowS)
-> (TransactionPolicyIdCmdArgs -> String)
-> ([TransactionPolicyIdCmdArgs] -> ShowS)
-> Show TransactionPolicyIdCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionPolicyIdCmdArgs -> ShowS
showsPrec :: Int -> TransactionPolicyIdCmdArgs -> ShowS
$cshow :: TransactionPolicyIdCmdArgs -> String
show :: TransactionPolicyIdCmdArgs -> String
$cshowList :: [TransactionPolicyIdCmdArgs] -> ShowS
showList :: [TransactionPolicyIdCmdArgs] -> ShowS
Show

data TransactionCalculateMinFeeCmdArgs = TransactionCalculateMinFeeCmdArgs
  { TransactionCalculateMinFeeCmdArgs -> TxBodyFile 'In
txBodyFile :: !(TxBodyFile In)
  , TransactionCalculateMinFeeCmdArgs -> ProtocolParamsFile
protocolParamsFile :: !ProtocolParamsFile
  , TransactionCalculateMinFeeCmdArgs -> TxShelleyWitnessCount
txShelleyWitnessCount :: !TxShelleyWitnessCount
  , TransactionCalculateMinFeeCmdArgs -> TxByronWitnessCount
txByronWitnessCount :: !TxByronWitnessCount
  , TransactionCalculateMinFeeCmdArgs -> ReferenceScriptSize
referenceScriptSize :: !ReferenceScriptSize
  -- ^ The total size in bytes of the transaction reference scripts.
  , TransactionCalculateMinFeeCmdArgs
-> Vary '[FormatJson, FormatText, FormatYaml]
outputFormat :: !(Vary [FormatJson, FormatText, FormatYaml])
  , TransactionCalculateMinFeeCmdArgs -> Maybe (File () 'Out)
outFile :: !(Maybe (File () Out))
  }
  deriving Int -> TransactionCalculateMinFeeCmdArgs -> ShowS
[TransactionCalculateMinFeeCmdArgs] -> ShowS
TransactionCalculateMinFeeCmdArgs -> String
(Int -> TransactionCalculateMinFeeCmdArgs -> ShowS)
-> (TransactionCalculateMinFeeCmdArgs -> String)
-> ([TransactionCalculateMinFeeCmdArgs] -> ShowS)
-> Show TransactionCalculateMinFeeCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionCalculateMinFeeCmdArgs -> ShowS
showsPrec :: Int -> TransactionCalculateMinFeeCmdArgs -> ShowS
$cshow :: TransactionCalculateMinFeeCmdArgs -> String
show :: TransactionCalculateMinFeeCmdArgs -> String
$cshowList :: [TransactionCalculateMinFeeCmdArgs] -> ShowS
showList :: [TransactionCalculateMinFeeCmdArgs] -> ShowS
Show

data TransactionCalculateMinValueCmdArgs era = TransactionCalculateMinValueCmdArgs
  { forall era. TransactionCalculateMinValueCmdArgs era -> Era era
era :: !(Exp.Era era)
  , forall era.
TransactionCalculateMinValueCmdArgs era -> ProtocolParamsFile
protocolParamsFile :: !ProtocolParamsFile
  , forall era.
TransactionCalculateMinValueCmdArgs era -> TxOutShelleyBasedEra
txOut :: !TxOutShelleyBasedEra
  }
  deriving Int -> TransactionCalculateMinValueCmdArgs era -> ShowS
[TransactionCalculateMinValueCmdArgs era] -> ShowS
TransactionCalculateMinValueCmdArgs era -> String
(Int -> TransactionCalculateMinValueCmdArgs era -> ShowS)
-> (TransactionCalculateMinValueCmdArgs era -> String)
-> ([TransactionCalculateMinValueCmdArgs era] -> ShowS)
-> Show (TransactionCalculateMinValueCmdArgs era)
forall era. Int -> TransactionCalculateMinValueCmdArgs era -> ShowS
forall era. [TransactionCalculateMinValueCmdArgs era] -> ShowS
forall era. TransactionCalculateMinValueCmdArgs era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> TransactionCalculateMinValueCmdArgs era -> ShowS
showsPrec :: Int -> TransactionCalculateMinValueCmdArgs era -> ShowS
$cshow :: forall era. TransactionCalculateMinValueCmdArgs era -> String
show :: TransactionCalculateMinValueCmdArgs era -> String
$cshowList :: forall era. [TransactionCalculateMinValueCmdArgs era] -> ShowS
showList :: [TransactionCalculateMinValueCmdArgs era] -> ShowS
Show

data TransactionCalculatePlutusScriptCostCmdArgs era = TransactionCalculatePlutusScriptCostCmdArgs
  { forall era.
TransactionCalculatePlutusScriptCostCmdArgs era
-> NodeContextInfoSource era
nodeContextInfoSource :: !(NodeContextInfoSource era)
  , forall era.
TransactionCalculatePlutusScriptCostCmdArgs era -> String
txFileIn :: FilePath
  , forall era.
TransactionCalculatePlutusScriptCostCmdArgs era
-> Maybe (File () 'Out)
outputFile :: !(Maybe (File () Out))
  }

-- | Either information about the context in which the transaction command
-- is run, or information required to obtain it (information to connect to the node).
data NodeContextInfoSource era
  = NodeConnectionInfo !LocalNodeConnectInfo
  | ProvidedTransactionContextInfo !(TransactionContext era)

-- | Transaction context, required to evaluate the execution
-- costs of the plutus scripts in the transaction.
data TransactionContext era = TransactionContext
  { forall era.
TransactionContext era -> SystemStartOrGenesisFileSource
systemStartSource :: SystemStartOrGenesisFileSource
  , forall era. TransactionContext era -> MustExtendSafeZone
mustExtendSafeZone :: MustExtendSafeZone
  , forall era. TransactionContext era -> File EraHistory 'In
eraHistoryFile :: File EraHistory In
  , forall era. TransactionContext era -> File (Some UTxO) 'In
utxoFile :: File (Some UTxO) In
  , forall era. TransactionContext era -> ProtocolParamsFile
protocolParamsFile :: ProtocolParamsFile
  }

-- | The system start time or the genesis file from which to get it
data SystemStartOrGenesisFileSource
  = SystemStartLiteral !SystemStart
  | SystemStartFromGenesisFile !GenesisFile

-- | Allow overriding the validity of the era history past the safe zone. The
-- safe zone is a period of time during which we are sure there won't be any
-- era transition (hard fork), and we are confident that the slot duration
-- will not change, thus the conversion from slot numbers to POSIX times
-- using the era history will be correct.
--
-- This safe zone is conservative. Even if we are past the safe zone, if
-- there hasn't been any era transition (hard fork) since we obtained it, we can
-- continue safely using the era history.
--
-- 'MustExtendSafeZone' essentially disables the safe zone check. This allows the user to
-- use the era history past the safe zone, at the user's discretion.
data MustExtendSafeZone
  = MustExtendSafeZone
  | DoNotExtendSafeZone

newtype TransactionHashScriptDataCmdArgs = TransactionHashScriptDataCmdArgs
  { TransactionHashScriptDataCmdArgs -> ScriptDataOrFile
scriptDataOrFile :: ScriptDataOrFile
  }
  deriving Int -> TransactionHashScriptDataCmdArgs -> ShowS
[TransactionHashScriptDataCmdArgs] -> ShowS
TransactionHashScriptDataCmdArgs -> String
(Int -> TransactionHashScriptDataCmdArgs -> ShowS)
-> (TransactionHashScriptDataCmdArgs -> String)
-> ([TransactionHashScriptDataCmdArgs] -> ShowS)
-> Show TransactionHashScriptDataCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionHashScriptDataCmdArgs -> ShowS
showsPrec :: Int -> TransactionHashScriptDataCmdArgs -> ShowS
$cshow :: TransactionHashScriptDataCmdArgs -> String
show :: TransactionHashScriptDataCmdArgs -> String
$cshowList :: [TransactionHashScriptDataCmdArgs] -> ShowS
showList :: [TransactionHashScriptDataCmdArgs] -> ShowS
Show

data TransactionTxIdCmdArgs = TransactionTxIdCmdArgs
  { TransactionTxIdCmdArgs -> InputTxBodyOrTxFile
inputTxBodyOrTxFile :: InputTxBodyOrTxFile
  , TransactionTxIdCmdArgs
-> Vary '[FormatJson, FormatText, FormatYaml]
outputFormat :: !(Vary [FormatJson, FormatText, FormatYaml])
  }
  deriving Int -> TransactionTxIdCmdArgs -> ShowS
[TransactionTxIdCmdArgs] -> ShowS
TransactionTxIdCmdArgs -> String
(Int -> TransactionTxIdCmdArgs -> ShowS)
-> (TransactionTxIdCmdArgs -> String)
-> ([TransactionTxIdCmdArgs] -> ShowS)
-> Show TransactionTxIdCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionTxIdCmdArgs -> ShowS
showsPrec :: Int -> TransactionTxIdCmdArgs -> ShowS
$cshow :: TransactionTxIdCmdArgs -> String
show :: TransactionTxIdCmdArgs -> String
$cshowList :: [TransactionTxIdCmdArgs] -> ShowS
showList :: [TransactionTxIdCmdArgs] -> ShowS
Show

data TransactionViewCmdArgs = TransactionViewCmdArgs
  deriving Int -> TransactionViewCmdArgs -> ShowS
[TransactionViewCmdArgs] -> ShowS
TransactionViewCmdArgs -> String
(Int -> TransactionViewCmdArgs -> ShowS)
-> (TransactionViewCmdArgs -> String)
-> ([TransactionViewCmdArgs] -> ShowS)
-> Show TransactionViewCmdArgs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransactionViewCmdArgs -> ShowS
showsPrec :: Int -> TransactionViewCmdArgs -> ShowS
$cshow :: TransactionViewCmdArgs -> String
show :: TransactionViewCmdArgs -> String
$cshowList :: [TransactionViewCmdArgs] -> ShowS
showList :: [TransactionViewCmdArgs] -> ShowS
Show

renderTransactionCmds :: TransactionCmds era -> Text
renderTransactionCmds :: forall era. TransactionCmds era -> Text
renderTransactionCmds = \case
  TransactionBuildCmd{} -> Text
"transaction build"
  TransactionBuildEstimateCmd{} -> Text
"transaction build-estimate"
  TransactionBuildRawCmd{} -> Text
"transaction build-raw"
  TransactionSignCmd{} -> Text
"transaction sign"
  TransactionWitnessCmd{} -> Text
"transaction witness"
  TransactionSignWitnessCmd{} -> Text
"transaction sign-witness"
  TransactionSubmitCmd{} -> Text
"transaction submit"
  TransactionPolicyIdCmd{} -> Text
"transaction policyid"
  TransactionCalculateMinFeeCmd{} -> Text
"transaction calculate-min-fee"
  TransactionCalculateMinValueCmd{} -> Text
"transaction calculate-min-value"
  TransactionCalculatePlutusScriptCostCmd{} -> Text
"transaction calculate-plutus-script-cost"
  TransactionHashScriptDataCmd{} -> Text
"transaction hash-script-data"
  TransactionTxIdCmd{} -> Text
"transaction txid"