Skip to content

Commit 7965ce2

Browse files
committed
Add certs to compatible transaction build command
1 parent 5649c78 commit 7965ce2

File tree

2 files changed

+83
-19
lines changed

2 files changed

+83
-19
lines changed

cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE ExistentialQuantification #-}
33
{-# LANGUAGE GADTs #-}
44
{-# LANGUAGE LambdaCase #-}
5+
{-# LANGUAGE ScopedTypeVariables #-}
56
{-# LANGUAGE TupleSections #-}
67

78
module Cardano.CLI.Compatible.Transaction
@@ -27,10 +28,14 @@ import Cardano.CLI.Types.Common
2728
import Cardano.CLI.Types.Errors.BootstrapWitnessError
2829
import Cardano.CLI.Types.Errors.TxCmdError
2930
import Cardano.CLI.Types.Governance
31+
import Cardano.CLI.Types.TxFeature
3032

33+
import Data.Bifunctor (first)
3134
import Data.Foldable
3235
import Data.Function
36+
import Data.Maybe
3337
import Data.Text (Text)
38+
import GHC.Exts (IsList (..))
3439
import Options.Applicative
3540
import 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

6975
pTxInOnly :: 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

183191
renderCompatibleTransactionCmd :: CompatibleTransactionCmds era -> Text
184192
renderCompatibleTransactionCmd _ = ""
185193

186194
data 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

197206
instance 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

209219
runCompatibleTransactionCmd
210-
:: CompatibleTransactionCmds era -> ExceptT CompatibleTransactionError IO ()
220+
:: forall era
221+
. CompatibleTransactionCmds era
222+
-> ExceptT CompatibleTransactionError IO ()
211223
runCompatibleTransactionCmd
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

269342
readUpdateProposalFile
270343
:: Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)

cardano-cli/src/Cardano/CLI/EraBased/Run/Transaction.hs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,12 +1226,12 @@ getAllReferenceInputs
12261226
votingProceduresAndMaybeScriptWits
12271227
propProceduresAnMaybeScriptWits
12281228
readOnlyRefIns = do
1229-
let txinsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- txins]
1230-
mintingRefInputs = map getReferenceInput mintWitnesses
1231-
certsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- certFiles]
1232-
withdrawalsWitByRefInputs = [getReferenceInput sWit | (_, _, Just sWit) <- withdrawals]
1233-
votesWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- votingProceduresAndMaybeScriptWits]
1234-
propsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- propProceduresAnMaybeScriptWits]
1229+
let txinsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, Just sWit) <- txins]
1230+
mintingRefInputs = map getScriptWitnessReferenceInput mintWitnesses
1231+
certsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, Just sWit) <- certFiles]
1232+
withdrawalsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, _, Just sWit) <- withdrawals]
1233+
votesWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, Just sWit) <- votingProceduresAndMaybeScriptWits]
1234+
propsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, Just sWit) <- propProceduresAnMaybeScriptWits]
12351235

12361236
concatMap
12371237
catMaybes
@@ -1243,15 +1243,6 @@ getAllReferenceInputs
12431243
, propsWitByRefInputs
12441244
, map Just readOnlyRefIns
12451245
]
1246-
where
1247-
getReferenceInput
1248-
:: ScriptWitness witctx era -> Maybe TxIn
1249-
getReferenceInput sWit =
1250-
case sWit of
1251-
PlutusScriptWitness _ _ (PReferenceScript refIn) _ _ _ -> Just refIn
1252-
PlutusScriptWitness _ _ PScript{} _ _ _ -> Nothing
1253-
SimpleScriptWitness _ (SReferenceScript refIn) -> Just refIn
1254-
SimpleScriptWitness _ SScript{} -> Nothing
12551246

12561247
toAddressInAnyEra
12571248
:: CardanoEra era

0 commit comments

Comments
 (0)