Skip to content

Commit

Permalink
Merge pull request #728 from IntersectMBO/jordan/add-build-cmd-estimate
Browse files Browse the repository at this point in the history
Introduce new `cardano-cli latest transaction build-estimate` command
  • Loading branch information
Jimbo4350 authored Apr 26, 2024
2 parents fb5f940 + b43bdbe commit d63cfe5
Show file tree
Hide file tree
Showing 21 changed files with 3,371 additions and 122 deletions.
53 changes: 52 additions & 1 deletion cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module Cardano.CLI.EraBased.Commands.Transaction
( TransactionCmds (..)
, TransactionBuildRawCmdArgs(..)
, TransactionBuildCmdArgs(..)
, TransactionBuildEstimateCmdArgs(..)
, TransactionSignCmdArgs(..)
, TransactionWitnessCmdArgs(..)
, TransactionSignWitnessCmdArgs(..)
Expand All @@ -31,6 +32,7 @@ import Data.Text (Text)
data TransactionCmds era
= TransactionBuildRawCmd !(TransactionBuildRawCmdArgs era)
| TransactionBuildCmd !(TransactionBuildCmdArgs era)
| TransactionBuildEstimateCmd !(TransactionBuildEstimateCmdArgs era)
| TransactionSignCmd !TransactionSignCmdArgs
| TransactionWitnessCmd !TransactionWitnessCmdArgs
| TransactionSignWitnessCmd !TransactionSignWitnessCmdArgs
Expand Down Expand Up @@ -121,12 +123,60 @@ data TransactionBuildCmdArgs era = TransactionBuildCmdArgs
, scriptFiles :: ![ScriptFile]
-- ^ Auxiliary scripts
, metadataFiles :: ![MetadataFile]
, mfUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
, mUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
, voteFiles :: ![(VoteFile In, Maybe (ScriptWitnessFiles WitCtxStake))]
, proposalFiles :: ![(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))]
, buildOutputOptions :: !TxBuildOutputOptions
} deriving Show

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

data TransactionSignCmdArgs = TransactionSignCmdArgs
{ txOrTxBodyFile :: !InputTxBodyOrTxFile
, witnessSigningData :: ![WitnessSigningData]
Expand Down Expand Up @@ -190,6 +240,7 @@ data TransactionViewCmdArgs = TransactionViewCmdArgs
renderTransactionCmds :: TransactionCmds era -> Text
renderTransactionCmds = \case
TransactionBuildCmd {} -> "transaction build"
TransactionBuildEstimateCmd {} -> "transaction build-estimate"
TransactionBuildRawCmd {} -> "transaction build-raw"
TransactionSignCmd {} -> "transaction sign"
TransactionWitnessCmd {} -> "transaction witness"
Expand Down
36 changes: 36 additions & 0 deletions cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1953,6 +1953,28 @@ pWitnessOverride = Opt.option Opt.auto $ mconcat
, Opt.help "Specify and override the number of witnesses the transaction requires."
]

pNumberOfShelleyKeyWitnesses :: Parser Int
pNumberOfShelleyKeyWitnesses = Opt.option Opt.auto $ mconcat
[ Opt.long "shelley-key-witnesses"
, Opt.metavar "INT"
, Opt.help "Specify the number of Shelley key witnesses the transaction requires."
]

pNumberOfByronKeyWitnesses :: Parser Int
pNumberOfByronKeyWitnesses = Opt.option Opt.auto $ mconcat
[ Opt.long "byron-key-witnesses"
, Opt.metavar "Int"
, Opt.help "Specify the number of Byron key witnesses the transaction requires."
]

pTotalUTxOValue :: Parser Value
pTotalUTxOValue =
Opt.option (readerFromParsecParser parseValue) $ mconcat
[ Opt.long "total-utxo-value"
, Opt.metavar "VALUE"
, Opt.help "The total value of the UTxO that exists at the tx inputs being spent."
]


pTxOut :: Parser TxOutAnyEra
pTxOut =
Expand Down Expand Up @@ -3174,6 +3196,20 @@ pAlwaysNoConfidence =
, Opt.help "Always vote no confidence"
]

pDrepRefund :: Parser (DRepHashSource, L.Coin)
pDrepRefund =
(,) <$> pDRepHashSource
<*> pDepositRefund

pDepositRefund :: Parser L.Coin
pDepositRefund =
Opt.option (readerFromParsecParser parseLovelace) $ mconcat
[ Opt.long "deposit-refund"
, Opt.metavar "LOVELACE"
, Opt.help "Deposit refund amount."
]


pDRepHashSource :: Parser DRepHashSource
pDRepHashSource =
asum
Expand Down
55 changes: 55 additions & 0 deletions cardano-cli/src/Cardano/CLI/EraBased/Options/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ pTransactionCmds era envCli =
]
]
, pTransactionBuildCmd era envCli
, forShelleyBasedEraInEon era Nothing (`pTransactionBuildEstimateCmd` envCli)
, Just
$ subParser "sign"
$ Opt.info (pTransactionSign envCli)
Expand Down Expand Up @@ -184,6 +185,60 @@ pTransactionBuildCmd era envCli = do
<*> pProposalFiles sbe AutoBalance
<*> (OutputTxBodyOnly <$> pTxBodyFileOut <|> pCalculatePlutusScriptCost)

-- | Estimate the transaction fees without access to a live node.
pTransactionBuildEstimateCmd :: MaryEraOnwards era -> EnvCli -> Maybe (Parser (TransactionCmds era))
pTransactionBuildEstimateCmd era _envCli = do
pure
$ subParser "build-estimate"
$ Opt.info (pCmd era)
$ Opt.progDescDoc
$ Just $ mconcat
[ pretty @String "Build a balanced transaction without access to a live node (automatically estimates fees)"
, line
, line
, H.yellow $ mconcat
[ "Please note "
, H.underline "the order"
, " of some cmd options is crucial. If used incorrectly may produce "
, "undesired tx body. See nested [] notation above for details."
]
]
where
pCmd :: MaryEraOnwards era -> Parser (TransactionCmds era)
pCmd w = do
let sbe = maryEraOnwardsToShelleyBasedEra w
fmap TransactionBuildEstimateCmd $
TransactionBuildEstimateCmdArgs w
<$> optional pScriptValidity
<*> pNumberOfShelleyKeyWitnesses
<*> optional pNumberOfByronKeyWitnesses
<*> pProtocolParamsFile
<*> pTotalUTxOValue
<*> some (pTxIn ManualBalance)
<*> many pReadOnlyReferenceTxIn
<*> many pRequiredSigner
<*> many pTxInCollateral
<*> optional pReturnCollateral
<*> many pTxOut
<*> pChangeAddress
<*> optional (pMintMultiAsset ManualBalance)
<*> optional pInvalidBefore
<*> pInvalidHereafter sbe
<*> many (pCertificateFile ManualBalance)
<*> many (pWithdrawal ManualBalance)
<*> optional pTotalCollateral
<*> optional pReferenceScriptSize
<*> pTxMetadataJsonSchema
<*> many (pScriptFor
"auxiliary-script-file"
Nothing
"Filepath of auxiliary script(s)")
<*> many pMetadataFile
<*> pFeatured (shelleyBasedToCardanoEra sbe) (optional pUpdateProposalFile)
<*> pVoteFiles sbe AutoBalance
<*> pProposalFiles sbe AutoBalance
<*> pTxBodyFileOut

pChangeAddress :: Parser TxOutChangeAddress
pChangeAddress =
fmap TxOutChangeAddress $ Opt.option (readerFromParsecParser parseAddressAny) $ mconcat
Expand Down
Loading

0 comments on commit d63cfe5

Please sign in to comment.