22{-# LANGUAGE ExistentialQuantification #-}
33{-# LANGUAGE GADTs #-}
44{-# LANGUAGE LambdaCase #-}
5+ {-# LANGUAGE ScopedTypeVariables #-}
56{-# LANGUAGE TupleSections #-}
67
78module Cardano.CLI.Compatible.Transaction
@@ -27,10 +28,14 @@ import Cardano.CLI.Types.Common
2728import Cardano.CLI.Types.Errors.BootstrapWitnessError
2829import Cardano.CLI.Types.Errors.TxCmdError
2930import Cardano.CLI.Types.Governance
31+ import Cardano.CLI.Types.TxFeature
3032
33+ import Data.Bifunctor (first )
3134import Data.Foldable
3235import Data.Function
36+ import Data.Maybe
3337import Data.Text (Text )
38+ import GHC.Exts (IsList (.. ))
3439import Options.Applicative
3540import qualified Options.Applicative as Opt
3641
@@ -64,6 +69,7 @@ pCompatibleSignedTransaction env sbe =
6469 <*> many pWitnessSigningData
6570 <*> optional (pNetworkId env)
6671 <*> pTxFee
72+ <*> many (pCertificateFile sbe ManualBalance )
6773 <*> pOutputFile
6874
6975pTxInOnly :: Parser TxIn
@@ -178,13 +184,15 @@ data CompatibleTransactionCmds era
178184 (Maybe NetworkId )
179185 ! Coin
180186 -- ^ Tx fee
187+ ! [(CertificateFile , Maybe (ScriptWitnessFiles WitCtxStake ))]
188+ -- ^ stake registering certs
181189 ! (File () Out )
182190
183191renderCompatibleTransactionCmd :: CompatibleTransactionCmds era -> Text
184192renderCompatibleTransactionCmd _ = " "
185193
186194data CompatibleTransactionError
187- = CompatibleTxOutError ! TxCmdError
195+ = CompatibleTxCmdError ! TxCmdError
188196 | CompatibleWitnessError ! ReadWitnessSigningDataError
189197 | CompatiblePParamsConversionError ! ProtocolParametersConversionError
190198 | CompatibleBootstrapWitnessError ! BootstrapWitnessError
@@ -193,10 +201,11 @@ data CompatibleTransactionError
193201 | CompatibleProposalError ! ProposalError
194202 | CompatibleVoteError ! VoteError
195203 | forall era . CompatibleVoteMergeError ! (VotesMergingConflict era )
204+ | CompatibleScriptWitnessError ! ScriptWitnessError
196205
197206instance Error CompatibleTransactionError where
198207 prettyError = \ case
199- CompatibleTxOutError e -> renderTxCmdError e
208+ CompatibleTxCmdError e -> renderTxCmdError e
200209 CompatibleWitnessError e -> renderReadWitnessSigningDataError e
201210 CompatiblePParamsConversionError e -> prettyError e
202211 CompatibleBootstrapWitnessError e -> renderBootstrapWitnessError e
@@ -205,9 +214,12 @@ instance Error CompatibleTransactionError where
205214 CompatibleProposalError e -> pshow e
206215 CompatibleVoteError e -> pshow e
207216 CompatibleVoteMergeError e -> pshow e
217+ CompatibleScriptWitnessError e -> renderScriptWitnessError e
208218
209219runCompatibleTransactionCmd
210- :: CompatibleTransactionCmds era -> ExceptT CompatibleTransactionError IO ()
220+ :: forall era
221+ . CompatibleTransactionCmds era
222+ -> ExceptT CompatibleTransactionError IO ()
211223runCompatibleTransactionCmd
212224 ( CreateCompatibleSignedTransaction
213225 sbe
@@ -219,11 +231,35 @@ runCompatibleTransactionCmd
219231 witnesses
220232 mNetworkId
221233 fee
234+ certificates
222235 outputFp
223236 ) = do
224237 sks <- firstExceptT CompatibleWitnessError $ mapM (newExceptT . readWitnessSigningData) witnesses
225238
226- allOuts <- firstExceptT CompatibleTxOutError $ mapM (toTxOutInAnyEra sbe) outs
239+ allOuts <- firstExceptT CompatibleTxCmdError $ mapM (toTxOutInAnyEra sbe) outs
240+
241+ certFilesAndMaybeScriptWits <-
242+ firstExceptT CompatibleScriptWitnessError $
243+ readScriptWitnessFiles sbe certificates
244+
245+ certsAndMaybeScriptWits :: [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))] <-
246+ shelleyBasedEraConstraints sbe $
247+ sequence
248+ [ fmap
249+ (,mSwit)
250+ ( firstExceptT CompatibleFileError . newExceptT $
251+ readFileTextEnvelope AsCertificate (File certFile)
252+ )
253+ | (CertificateFile certFile, mSwit) <- certFilesAndMaybeScriptWits
254+ ]
255+
256+ let refInputs =
257+ [ refInput
258+ | (_, Just sWit) <- certsAndMaybeScriptWits
259+ , refInput <- maybeToList $ getScriptWitnessReferenceInput sWit
260+ ]
261+ -- TODO is this missing something? see EraBased.Run.Transaction L907
262+ validatedRefInputs <- liftEither . first CompatibleTxCmdError $ validateTxInsReference refInputs
227263
228264 apiTxBody <-
229265 firstExceptT CompatibleTxBodyError $
@@ -233,6 +269,8 @@ runCompatibleTransactionCmd
233269 & setTxIns (map (,BuildTxWith (KeyWitness KeyWitnessForSpending )) ins)
234270 & setTxOuts allOuts
235271 & setTxFee (TxFeeExplicit sbe fee)
272+ & setTxCertificates (convertCertificates certsAndMaybeScriptWits)
273+ & setTxInsReference validatedRefInputs
236274
237275 let (sksByron, sksShelley) = partitionSomeWitnesses $ map categoriseSomeSigningWitness sks
238276
@@ -265,6 +303,41 @@ runCompatibleTransactionCmd
265303 firstExceptT CompatibleFileError $
266304 newExceptT $
267305 writeTxFileTextEnvelopeCddl sbe outputFp signedTx
306+ where
307+ -- TODO it's copied from EraBased/Run/Transaction
308+ convertCertificates
309+ :: [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
310+ -> TxCertificates BuildTx era
311+ convertCertificates certsAndScriptWitnesses =
312+ TxCertificates sbe certs $ BuildTxWith reqWits
313+ where
314+ certs = map fst certsAndScriptWitnesses
315+ reqWits = fromList $ mapMaybe convert' certsAndScriptWitnesses
316+ convert'
317+ :: (Certificate era , Maybe (ScriptWitness WitCtxStake era ))
318+ -> Maybe (StakeCredential , Witness WitCtxStake era )
319+ convert' (cert, mScriptWitnessFiles) = do
320+ sCred <- selectStakeCredentialWitness cert
321+ Just $ case mScriptWitnessFiles of
322+ Just sWit -> (sCred, ScriptWitness ScriptWitnessForStakeAddr sWit)
323+ Nothing -> (sCred, KeyWitness KeyWitnessForStakeAddr )
324+
325+ -- TODO it's copied from EraBased.Run.Transaction.
326+ validateTxInsReference
327+ :: [TxIn ]
328+ -> Either TxCmdError (TxInsReference era )
329+ validateTxInsReference [] = return TxInsReferenceNone
330+ validateTxInsReference allRefIns = do
331+ forShelleyBasedEraInEonMaybe sbe (`TxInsReference ` allRefIns)
332+ & maybe (txFeatureMismatchPure (toCardanoEra sbe) TxFeatureReferenceInputs ) Right
333+
334+ -- TODO it's copied from EraBased.Run.Transaction
335+ txFeatureMismatchPure
336+ :: CardanoEra era
337+ -> TxFeature
338+ -> Either TxCmdError a
339+ txFeatureMismatchPure era feature =
340+ Left (TxCmdTxFeatureMismatch (anyCardanoEra era) feature)
268341
269342readUpdateProposalFile
270343 :: Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile )
0 commit comments