Skip to content

Commit bf1b3d9

Browse files
authored
Merge pull request #1322 from IntersectMBO/1149-remove-requirement-of-current-treasury-withdrawal-for-transaction-in-build-raw-command
Remove requirement of "current treasury value" for transactions
2 parents 19370a4 + 12fcb4c commit bf1b3d9

14 files changed

Lines changed: 173 additions & 106 deletions

File tree

cardano-cli/src/Cardano/CLI/EraBased/Common/Option.hs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import Cardano.CLI.EraBased.Script.Type
2424
import Cardano.CLI.EraBased.Script.Type qualified as PlutusSpend
2525
import Cardano.CLI.EraBased.Script.Vote.Type qualified as Voting
2626
import Cardano.CLI.EraBased.Script.Withdrawal.Type qualified as Withdrawal
27+
import Cardano.CLI.EraBased.Transaction.Command (IncludeCurrentTreasuryValue (..))
2728
import Cardano.CLI.Option.Flag
2829
import Cardano.CLI.Option.Flag.Type qualified as Z
2930
import Cardano.CLI.Orphan ()
@@ -1191,21 +1192,30 @@ pProposalReferencePlutusScriptWitness prefix autoBalanceExecUnits =
11911192
ManualBalance -> pExecutionUnits $ appendedPrefix ++ "reference-tx-in"
11921193
)
11931194

1194-
pCurrentTreasuryValueAndDonation
1195-
:: Parser (Maybe (TxCurrentTreasuryValue, TxTreasuryDonation))
1196-
pCurrentTreasuryValueAndDonation =
1197-
optional ((,) <$> pCurrentTreasuryValue' <*> pTreasuryDonation')
1195+
pCurrentTreasuryValue :: Parser (Maybe TxCurrentTreasuryValue)
1196+
pCurrentTreasuryValue =
1197+
optional $
1198+
TxCurrentTreasuryValue
1199+
<$> ( Opt.option (readerFromParsecParser parseLovelace) $
1200+
mconcat
1201+
[ Opt.long "current-treasury-value"
1202+
, Opt.metavar "LOVELACE"
1203+
, Opt.help "The current treasury value."
1204+
]
1205+
)
11981206

1199-
pCurrentTreasuryValue' :: Parser TxCurrentTreasuryValue
1200-
pCurrentTreasuryValue' =
1201-
TxCurrentTreasuryValue
1202-
<$> ( Opt.option (readerFromParsecParser parseLovelace) $
1203-
mconcat
1204-
[ Opt.long "current-treasury-value"
1205-
, Opt.metavar "LOVELACE"
1206-
, Opt.help "The current treasury value."
1207-
]
1208-
)
1207+
pIncludeCurrentTreasuryValue :: Parser IncludeCurrentTreasuryValue
1208+
pIncludeCurrentTreasuryValue =
1209+
asum
1210+
[ Opt.flag' IncludeCurrentTreasuryValue $
1211+
mconcat
1212+
[ Opt.long "current-treasury-value"
1213+
, Opt.help
1214+
"Include the current treasury value in the transaction. \
1215+
\The value is obtained from the node."
1216+
]
1217+
, pure ExcludeCurrentTreasuryValue
1218+
]
12091219

12101220
pTreasuryDonation :: Parser (Maybe TxTreasuryDonation)
12111221
pTreasuryDonation =

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module Cardano.CLI.EraBased.Transaction.Command
2424
, TransactionViewCmdArgs (..)
2525
, TransactionWitnessCmdArgs (..)
2626
, TxCborFormat (..)
27+
, IncludeCurrentTreasuryValue (..)
2728
, renderTransactionCmds
2829
)
2930
where
@@ -91,7 +92,8 @@ data TransactionBuildRawCmdArgs era = TransactionBuildRawCmdArgs
9192
, mUpdateProprosalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
9293
, voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
9394
, proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
94-
, currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation))
95+
, mCurrentTreasuryValue :: !(Maybe TxCurrentTreasuryValue)
96+
, mTreasuryDonation :: !(Maybe TxTreasuryDonation)
9597
, isCborOutCanonical :: !TxCborFormat
9698
, txBodyOutFile :: !(TxBodyFile Out)
9799
}
@@ -106,6 +108,22 @@ data TxCborFormat
106108
| TxCborNotCanonical
107109
deriving (Eq, Show)
108110

111+
-- | Whether to include the current treasury value in the transaction body.
112+
--
113+
-- If included, the current treasury value will be obtained from the node.
114+
--
115+
-- The current treasury value serves as a precondition to executing Plutus
116+
-- scripts that access the value of the treasury.
117+
--
118+
-- See: https://intersectmbo.github.io/formal-ledger-specifications/site/Ledger.Conway.Specification.Transaction.html#sec:transactions
119+
--
120+
-- If a transaction contains any votes, proposals, a treasury donation or
121+
-- asserts the treasury amount, it is only allowed to contain Plutus V3 scripts.
122+
--
123+
-- See: https://intersectmbo.github.io/formal-ledger-specifications/site/Ledger.Conway.Specification.Utxow.html#sec:witnessing-functions
124+
data IncludeCurrentTreasuryValue = IncludeCurrentTreasuryValue | ExcludeCurrentTreasuryValue
125+
deriving (Eq, Show)
126+
109127
-- | Like 'TransactionBuildRaw' but without the fee, and with a change output.
110128
data TransactionBuildCmdArgs era = TransactionBuildCmdArgs
111129
{ currentEra :: !(Exp.Era era)
@@ -147,7 +165,8 @@ data TransactionBuildCmdArgs era = TransactionBuildCmdArgs
147165
, mUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile)))
148166
, voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
149167
, proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
150-
, treasuryDonation :: !(Maybe TxTreasuryDonation)
168+
, includeCurrentTreasuryValue :: !IncludeCurrentTreasuryValue
169+
, mTreasuryDonation :: !(Maybe TxTreasuryDonation)
151170
, isCborOutCanonical :: !TxCborFormat
152171
, buildOutputOptions :: !TxBuildOutputOptions
153172
}
@@ -197,7 +216,8 @@ data TransactionBuildEstimateCmdArgs era = TransactionBuildEstimateCmdArgs
197216
, metadataFiles :: ![MetadataFile]
198217
, voteFiles :: ![(VoteFile In, Maybe (ScriptRequirements Exp.VoterItem))]
199218
, proposalFiles :: ![(ProposalFile In, Maybe (ScriptRequirements Exp.ProposalItem))]
200-
, currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation))
219+
, currentTreasuryValue :: !(Maybe TxCurrentTreasuryValue)
220+
, treasuryDonation :: !(Maybe TxTreasuryDonation)
201221
, isCborOutCanonical :: !TxCborFormat
202222
, txBodyOutFile :: !(TxBodyFile Out)
203223
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ pTransactionBuildCmd envCli = do
222222
<*> pFeatured era' (optional pUpdateProposalFile)
223223
<*> pVoteFiles AutoBalance
224224
<*> pProposalFiles AutoBalance
225+
<*> pIncludeCurrentTreasuryValue
225226
<*> pTreasuryDonation
226227
<*> pIsCborOutCanonical
227228
<*> pTxBuildOutputOptions
@@ -285,7 +286,8 @@ pTransactionBuildEstimateCmd _envCli = do
285286
<*> many pMetadataFile
286287
<*> pVoteFiles ManualBalance
287288
<*> pProposalFiles ManualBalance
288-
<*> pCurrentTreasuryValueAndDonation
289+
<*> pCurrentTreasuryValue
290+
<*> pTreasuryDonation
289291
<*> pIsCborOutCanonical
290292
<*> pTxBodyFileOut
291293

@@ -324,7 +326,8 @@ pTransactionBuildRaw =
324326
<*> pFeatured Exp.useEra (optional pUpdateProposalFile)
325327
<*> pVoteFiles ManualBalance
326328
<*> pProposalFiles ManualBalance
327-
<*> pCurrentTreasuryValueAndDonation
329+
<*> pCurrentTreasuryValue
330+
<*> pTreasuryDonation
328331
<*> pIsCborOutCanonical
329332
<*> pTxBodyFileOut
330333

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

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ runTransactionBuildCmd
156156
, mUpdateProposalFile
157157
, voteFiles
158158
, proposalFiles
159-
, treasuryDonation -- Maybe TxTreasuryDonation
159+
, includeCurrentTreasuryValue
160+
, mTreasuryDonation
160161
, isCborOutCanonical
161162
, buildOutputOptions
162163
} = do
@@ -290,11 +291,9 @@ runTransactionBuildCmd
290291
)
291292
& fromEitherCIOCli
292293

293-
let currentTreasuryValueAndDonation =
294-
case (treasuryDonation, unFeatured <$> featuredCurrentTreasuryValueM) of
295-
(Nothing, _) -> Nothing -- We shouldn't specify the treasury value when no donation is being done
296-
(Just _td, Nothing) -> Nothing -- TODO: Current treasury value couldn't be obtained but is required: we should fail suggesting that the node's version is too old
297-
(Just td, Just ctv) -> Just (ctv, td)
294+
let mCurrenTreasuryValue = case includeCurrentTreasuryValue of
295+
IncludeCurrentTreasuryValue -> unFeatured <$> featuredCurrentTreasuryValueM
296+
ExcludeCurrentTreasuryValue -> Nothing
298297

299298
-- We need to construct the txBodycontent outside of runTxBuild
300299
(balancedTxBody@(Exp.UnsignedTx tx), txBodyContent) <-
@@ -322,7 +321,8 @@ runTransactionBuildCmd
322321
mOverrideWitnesses
323322
votingProceduresAndMaybeScriptWits
324323
proposals
325-
currentTreasuryValueAndDonation
324+
mCurrenTreasuryValue
325+
mTreasuryDonation
326326
supplementalDatums
327327

328328
-- TODO: Calculating the script cost should live as a different command.
@@ -415,7 +415,8 @@ runTransactionBuildEstimateCmd -- TODO change type
415415
, proposalFiles
416416
, plutusCollateral
417417
, totalReferenceScriptSize
418-
, currentTreasuryValueAndDonation
418+
, currentTreasuryValue
419+
, treasuryDonation
419420
, isCborOutCanonical
420421
, txBodyOutFile
421422
} = do
@@ -504,7 +505,8 @@ runTransactionBuildEstimateCmd -- TODO change type
504505
txMetadata
505506
votingProceduresAndMaybeScriptWits
506507
proposals
507-
currentTreasuryValueAndDonation
508+
currentTreasuryValue
509+
treasuryDonation
508510
supplementalDatums
509511

510512
let stakeCredentialsToDeregisterMap = fromList $ catMaybes [getStakeDeregistrationInfo cert | (cert, _) <- certsAndMaybeScriptWits]
@@ -621,7 +623,8 @@ runTransactionBuildRawCmd
621623
, mUpdateProprosalFile
622624
, voteFiles
623625
, proposalFiles
624-
, currentTreasuryValueAndDonation
626+
, mCurrentTreasuryValue
627+
, mTreasuryDonation
625628
, isCborOutCanonical
626629
, txBodyOutFile
627630
} = Exp.obtainCommonConstraints eon $ do
@@ -711,7 +714,8 @@ runTransactionBuildRawCmd
711714
mLedgerPParams
712715
votingProceduresAndMaybeScriptWits
713716
proposals
714-
currentTreasuryValueAndDonation
717+
mCurrentTreasuryValue
718+
mTreasuryDonation
715719
supplementalDatums
716720
let Exp.UnsignedTx lTx = txBody
717721
noWitTx = ShelleyTx (convert eon) lTx
@@ -753,7 +757,8 @@ runTxBuildRaw
753757
-> Maybe (LedgerProtocolParameters era)
754758
-> [(VotingProcedures era, Exp.AnyWitness (Exp.LedgerEra era))]
755759
-> [(Proposal era, Exp.AnyWitness (Exp.LedgerEra era))]
756-
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
760+
-> Maybe TxCurrentTreasuryValue
761+
-> Maybe TxTreasuryDonation
757762
-> Map.Map DataHash (L.Data (Exp.LedgerEra era))
758763
-- ^ Supplemental datums
759764
-> Either TxCmdError (Exp.UnsignedTx (Exp.LedgerEra era))
@@ -777,7 +782,8 @@ runTxBuildRaw
777782
mpparams
778783
votingProcedures
779784
proposals
780-
mCurrentTreasuryValueAndDonation
785+
mCurrentTreasury
786+
mTreasuryDonation
781787
suppDatums = do
782788
txBodyContent <-
783789
constructTxBodyContent
@@ -800,7 +806,8 @@ runTxBuildRaw
800806
txMetadata
801807
votingProcedures
802808
proposals
803-
mCurrentTreasuryValueAndDonation
809+
mCurrentTreasury
810+
mTreasuryDonation
804811
suppDatums
805812

806813
return $ Exp.makeUnsignedTx Exp.useEra txBodyContent
@@ -840,7 +847,8 @@ constructTxBodyContent
840847
-> TxMetadataInEra era
841848
-> [(VotingProcedures era, Exp.AnyWitness (Exp.LedgerEra era))]
842849
-> [(Proposal era, Exp.AnyWitness (Exp.LedgerEra era))]
843-
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
850+
-> Maybe TxCurrentTreasuryValue
851+
-> Maybe TxTreasuryDonation
844852
-- ^ The current treasury value and the donation. This is a stop gap as the
845853
-- semantics of the donation and treasury value depend on the script languages
846854
-- being used.
@@ -867,7 +875,8 @@ constructTxBodyContent
867875
txMetadata
868876
votingProcedures
869877
proposals
870-
mCurrentTreasuryValueAndDonation
878+
mCurrentTreasury
879+
mTreasuryDonation
871880
suppDatums =
872881
do
873882
let allReferenceInputs =
@@ -905,8 +914,8 @@ constructTxBodyContent
905914
let txProposals = [(obtainCommonConstraints (Exp.useEra @era) p, w) | (Proposal p, w) <- proposals]
906915
let validatedTxProposals =
907916
Exp.mkTxProposalProcedures txProposals
908-
let validatedCurrentTreasuryValue = unTxCurrentTreasuryValue . fst <$> mCurrentTreasuryValueAndDonation
909-
validatedTreasuryDonation = unTxTreasuryDonation . snd <$> mCurrentTreasuryValueAndDonation
917+
let validatedCurrentTreasuryValue = unTxCurrentTreasuryValue <$> mCurrentTreasury
918+
validatedTreasuryDonation = unTxTreasuryDonation <$> mTreasuryDonation
910919
let validatedWithdrawals = convertWithdrawals withdrawals
911920
return
912921
( Exp.defaultTxBodyContent
@@ -997,7 +1006,8 @@ runTxBuild
9971006
-> Maybe Word
9981007
-> [(VotingProcedures era, Exp.AnyWitness (Exp.LedgerEra era))]
9991008
-> [(Proposal era, Exp.AnyWitness (Exp.LedgerEra era))]
1000-
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
1009+
-> Maybe TxCurrentTreasuryValue
1010+
-> Maybe TxTreasuryDonation
10011011
-- ^ The current treasury value and the donation.
10021012
-> Map.Map DataHash (L.Data (Exp.LedgerEra era))
10031013
-- ^ Supplemental datums
@@ -1025,7 +1035,8 @@ runTxBuild
10251035
mOverrideWits
10261036
votingProcedures
10271037
proposals
1028-
mCurrentTreasuryValueAndDonation
1038+
mCurrentTreasury
1039+
mTreasuryDonation
10291040
suppDatums = do
10301041
let sbe = convert (Exp.useEra @era)
10311042
shelleyBasedEraConstraints sbe $ do
@@ -1091,7 +1102,8 @@ runTxBuild
10911102
txMetadata
10921103
votingProcedures
10931104
proposals
1094-
mCurrentTreasuryValueAndDonation
1105+
mCurrentTreasury
1106+
mTreasuryDonation
10951107
suppDatums
10961108

10971109
firstExceptT TxCmdTxInsDoNotExist

0 commit comments

Comments
 (0)