Skip to content

Commit 1450d80

Browse files
committed
more wip
1 parent c461679 commit 1450d80

File tree

4 files changed

+112
-63
lines changed

4 files changed

+112
-63
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,7 @@ pPlutusStakeReferenceScriptWitnessFilesVotingProposing prefix autoBalanceExecUni
15161516
AutoBalance -> pure (ExecutionUnits 0 0)
15171517
ManualBalance -> pExecutionUnits $ prefix ++ "reference-tx-in"
15181518
)
1519-
<*> pure Nothing
1519+
<*> pure NoPolicyIdSource
15201520

15211521
pPlutusStakeReferenceScriptWitnessFiles
15221522
:: String
@@ -1533,7 +1533,7 @@ pPlutusStakeReferenceScriptWitnessFiles prefix autoBalanceExecUnits =
15331533
AutoBalance -> pure (ExecutionUnits 0 0)
15341534
ManualBalance -> pExecutionUnits $ prefix ++ "reference-tx-in"
15351535
)
1536-
<*> pure Nothing
1536+
<*> pure NoPolicyIdSource
15371537

15381538
pPlutusScriptLanguage :: String -> Parser AnyScriptLanguage
15391539
pPlutusScriptLanguage prefix = plutusP prefix PlutusScriptV2 "v2" <|> plutusP prefix PlutusScriptV3 "v3"
@@ -1922,7 +1922,7 @@ pTxIn sbe balance =
19221922
-> ScriptWitnessFiles WitCtxTxIn
19231923
createSimpleReferenceScriptWitnessFiles refTxIn =
19241924
let simpleLang = AnyScriptLanguage SimpleScriptLanguage
1925-
in SimpleReferenceScriptWitnessFiles refTxIn simpleLang Nothing
1925+
in SimpleReferenceScriptWitnessFiles refTxIn simpleLang NoPolicyIdSource
19261926

19271927
pPlutusReferenceScriptWitness
19281928
:: ShelleyBasedEra era -> BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxTxIn)
@@ -1960,7 +1960,7 @@ pTxIn sbe balance =
19601960
-> ExecutionUnits
19611961
-> ScriptWitnessFiles WitCtxTxIn
19621962
createPlutusReferenceScriptWitnessFiles refIn sLang sDatum sRedeemer execUnits =
1963-
PlutusReferenceScriptWitnessFiles refIn sLang sDatum sRedeemer execUnits Nothing
1963+
PlutusReferenceScriptWitnessFiles refIn sLang sDatum sRedeemer execUnits NoPolicyIdSource
19641964

19651965
pEmbeddedPlutusScriptWitness :: Parser (ScriptWitnessFiles WitCtxTxIn)
19661966
pEmbeddedPlutusScriptWitness =
@@ -2170,7 +2170,7 @@ pMintMultiAsset sbe balanceExecUnits =
21702170
-> ScriptWitnessFiles WitCtxMint
21712171
createSimpleMintingReferenceScriptWitnessFiles refTxIn pid =
21722172
let simpleLang = AnyScriptLanguage SimpleScriptLanguage
2173-
in SimpleReferenceScriptWitnessFiles refTxIn simpleLang (Just pid)
2173+
in SimpleReferenceScriptWitnessFiles refTxIn simpleLang (ConcretePolicyId pid)
21742174

21752175
pPlutusMintReferenceScriptWitnessFiles
21762176
:: BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxMint)
@@ -2184,7 +2184,7 @@ pMintMultiAsset sbe balanceExecUnits =
21842184
AutoBalance -> pure (ExecutionUnits 0 0)
21852185
ManualBalance -> pExecutionUnits "mint-reference-tx-in"
21862186
)
2187-
<*> (Just <$> pPolicyId)
2187+
<*> (ConcretePolicyId <$> pPolicyId)
21882188

21892189
helpText =
21902190
mconcat

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

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
{-# LANGUAGE EmptyCase #-}
44
{-# LANGUAGE FlexibleContexts #-}
55
{-# LANGUAGE GADTs #-}
6+
{-# LANGUAGE KindSignatures #-}
67
{-# LANGUAGE LambdaCase #-}
78
{-# LANGUAGE NamedFieldPuns #-}
89
{-# LANGUAGE RankNTypes #-}
@@ -73,6 +74,7 @@ import qualified Data.List as List
7374
import Data.Map.Strict (Map)
7475
import qualified Data.Map.Strict as Map
7576
import Data.Maybe (catMaybes, fromMaybe, mapMaybe, maybeToList)
77+
import Data.Proxy
7678
import Data.Set (Set)
7779
import qualified Data.Set as Set
7880
import qualified Data.Text as Text
@@ -169,7 +171,7 @@ runTransactionBuildCmd
169171
txMetadata <-
170172
firstExceptT TxCmdMetadataError . newExceptT $
171173
readTxMetadata eon metadataSchema metadataFiles
172-
valuesWithScriptWits <- readValueScriptWitnesses eon $ fromMaybe mempty mValue
174+
valuesWithScriptWits <- readMintScriptWitnesses eon (const undefined) $ fromMaybe mempty mValue
173175
scripts <-
174176
firstExceptT TxCmdScriptFileError $
175177
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -205,7 +207,7 @@ runTransactionBuildCmd
205207
let allReferenceInputs =
206208
getAllReferenceInputs
207209
inputsAndMaybeScriptWits
208-
(snd <$> snd valuesWithScriptWits)
210+
(snd valuesWithScriptWits)
209211
certsAndMaybeScriptWits
210212
withdrawalsAndMaybeScriptWits
211213
votingProceduresAndMaybeScriptWits
@@ -360,7 +362,7 @@ runTransactionBuildEstimateCmd -- TODO change type
360362
firstExceptT TxCmdMetadataError
361363
. newExceptT
362364
$ readTxMetadata sbe metadataSchema metadataFiles
363-
valuesWithScriptWits <- readValueScriptWitnesses sbe $ fromMaybe mempty mValue
365+
valuesWithScriptWits <- readMintScriptWitnesses sbe (const undefined) $ fromMaybe mempty mValue
364366
scripts <-
365367
firstExceptT TxCmdScriptFileError $
366368
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -594,7 +596,7 @@ runTransactionBuildRawCmd
594596
firstExceptT TxCmdMetadataError
595597
. newExceptT
596598
$ readTxMetadata eon metadataSchema metadataFiles
597-
valuesWithScriptWits <- readValueScriptWitnesses eon $ fromMaybe mempty mValue
599+
valuesWithScriptWits <- readMintScriptWitnesses eon (const undefined) $ fromMaybe mempty mValue
598600
scripts <-
599601
firstExceptT TxCmdScriptFileError $
600602
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -698,7 +700,7 @@ runTxBuildRaw
698700
-- ^ Tx upper bound
699701
-> Lovelace
700702
-- ^ Tx fee
701-
-> (Value, [(Maybe PolicyId, ScriptWitness WitCtxMint era)])
703+
-> (Value, [UpdatedReferenceScriptWitness era])
702704
-- ^ Multi-Asset value(s)
703705
-> [(Certificate era, Maybe (ScriptWitness WitCtxStake era))]
704706
-- ^ Certificate with potential script witness
@@ -784,7 +786,7 @@ constructTxBodyContent
784786
-- ^ Tx lower bound
785787
-> TxValidityUpperBound era
786788
-- ^ Tx upper bound
787-
-> (Value, [(Maybe PolicyId, ScriptWitness WitCtxMint era)])
789+
-> (Value, [UpdatedReferenceScriptWitness era])
788790
-- ^ Multi-Asset value(s)
789791
-> [(Certificate era, Maybe (ScriptWitness WitCtxStake era))]
790792
-- ^ Certificate with potential script witness
@@ -831,7 +833,7 @@ constructTxBodyContent
831833
let allReferenceInputs =
832834
getAllReferenceInputs
833835
inputsAndMaybeScriptWits
834-
(snd <$> snd valuesWithScriptWits)
836+
(snd valuesWithScriptWits)
835837
certsAndMaybeScriptWits
836838
withdrawals
837839
votingProcedures
@@ -924,7 +926,7 @@ runTxBuild
924926
-- ^ Normal outputs
925927
-> TxOutChangeAddress
926928
-- ^ A change output
927-
-> (Value, [(Maybe PolicyId, ScriptWitness WitCtxMint era)])
929+
-> (Value, [UpdatedReferenceScriptWitness era])
928930
-- ^ Multi-Asset value(s)
929931
-> Maybe SlotNo
930932
-- ^ Tx lower bound
@@ -978,7 +980,7 @@ runTxBuild
978980
let allReferenceInputs =
979981
getAllReferenceInputs
980982
inputsAndMaybeScriptWits
981-
(snd <$> snd valuesWithScriptWits)
983+
(snd valuesWithScriptWits)
982984
certsAndMaybeScriptWits
983985
withdrawals
984986
votingProcedures
@@ -1145,7 +1147,7 @@ validateTxInsReference sbe allRefIns = do
11451147

11461148
getAllReferenceInputs
11471149
:: [(TxIn, Maybe (ScriptWitness WitCtxTxIn era))]
1148-
-> [ScriptWitness WitCtxMint era]
1150+
-> [UpdatedReferenceScriptWitness era]
11491151
-> [(Certificate era, Maybe (ScriptWitness WitCtxStake era))]
11501152
-> [(StakeAddress, Lovelace, Maybe (ScriptWitness WitCtxStake era))]
11511153
-> [(VotingProcedures era, Maybe (ScriptWitness WitCtxStake era))]
@@ -1162,7 +1164,7 @@ getAllReferenceInputs
11621164
propProceduresAnMaybeScriptWits
11631165
readOnlyRefIns = do
11641166
let txinsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- txins]
1165-
mintingRefInputs = map getReferenceInput mintWitnesses
1167+
mintingRefInputs = [getReferenceInput sWit | UpdatedReferenceScriptWitness _ sWit <- mintWitnesses]
11661168
certsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- certFiles]
11671169
withdrawalsWitByRefInputs = [getReferenceInput sWit | (_, _, Just sWit) <- withdrawals]
11681170
votesWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- votingProceduresAndMaybeScriptWits]
@@ -1329,7 +1331,7 @@ toTxAlonzoDatum supp cliDatum =
13291331
createTxMintValue
13301332
:: forall era
13311333
. ShelleyBasedEra era
1332-
-> (Value, [(Maybe PolicyId, ScriptWitness WitCtxMint era)])
1334+
-> (Value, [UpdatedReferenceScriptWitness era])
13331335
-> Either TxCmdError (TxMintValue BuildTx era)
13341336
createTxMintValue era (val, scriptWitnesses) =
13351337
if List.null (toList val) && List.null scriptWitnesses
@@ -1346,7 +1348,9 @@ createTxMintValue era (val, scriptWitnesses) =
13461348
witnessesNeededSet = fromList [pid | (pid, _, _) <- policiesWithAssets]
13471349

13481350
witnessesProvidedMap :: Map PolicyId (ScriptWitness WitCtxMint era)
1349-
witnessesProvidedMap = fromList $ gatherMintingWitnesses scriptWitnesses
1351+
witnessesProvidedMap =
1352+
fromList
1353+
[(policyId', sWit) | UpdatedReferenceScriptWitness (Just policyId') sWit <- scriptWitnesses]
13501354
witnessesProvidedSet = Map.keysSet witnessesProvidedMap
13511355

13521356
policiesWithWitnesses =
@@ -1363,15 +1367,6 @@ createTxMintValue era (val, scriptWitnesses) =
13631367
)
13641368
era
13651369
where
1366-
gatherMintingWitnesses
1367-
:: [(Maybe PolicyId, ScriptWitness WitCtxMint era)]
1368-
-> [(PolicyId, ScriptWitness WitCtxMint era)]
1369-
gatherMintingWitnesses [] = []
1370-
gatherMintingWitnesses ((mPid, sWit) : rest) =
1371-
case scriptWitnessPolicyId sWit <|> mPid of
1372-
Nothing -> gatherMintingWitnesses rest
1373-
Just pid -> (pid, sWit) : gatherMintingWitnesses rest
1374-
13751370
validateAllWitnessesProvided witnessesNeeded witnessesProvided
13761371
| null witnessesMissing = return ()
13771372
| otherwise = Left (TxCmdPolicyIdsMissing witnessesMissing (toList witnessesProvided))
@@ -1384,23 +1379,56 @@ createTxMintValue era (val, scriptWitnesses) =
13841379
where
13851380
witnessesExtra = Set.elems (witnessesProvided Set.\\ witnessesNeeded)
13861381

1387-
scriptWitnessPolicyId :: ScriptWitness witctx era -> Maybe PolicyId
1388-
scriptWitnessPolicyId (SimpleScriptWitness _ (SScript script)) =
1389-
Just . scriptPolicyId $ SimpleScript script
1390-
scriptWitnessPolicyId (SimpleScriptWitness _ (SReferenceScript _)) =
1391-
Nothing
1392-
scriptWitnessPolicyId (PlutusScriptWitness _ version (PScript script) _ _ _) =
1393-
Just . scriptPolicyId $ PlutusScript version script
1394-
scriptWitnessPolicyId (PlutusScriptWitness _ _ (PReferenceScript _) _ _ _) =
1395-
Nothing
1396-
1397-
readValueScriptWitnesses
1382+
-- TOOD remove
1383+
1384+
readMintScriptWitnesses
13981385
:: ShelleyBasedEra era
1399-
-> (Value, [ScriptWitnessFiles WitCtxMint])
1400-
-> ExceptT TxCmdError IO (Value, [(Maybe PolicyId, ScriptWitness WitCtxMint era)])
1401-
readValueScriptWitnesses era (v, sWitFiles) = do
1402-
sWits <- mapM (firstExceptT TxCmdScriptWitnessError . readScriptWitness era) sWitFiles
1403-
return (v, sWits)
1386+
-> ( TxIn
1387+
-> ExceptT
1388+
QueryConvenienceError
1389+
IO
1390+
(Maybe (TxOut CtxUTxO era))
1391+
)
1392+
-> (a, [ScriptWitnessFiles WitCtxMint])
1393+
-> ExceptT
1394+
TxCmdError
1395+
IO
1396+
(a, [UpdatedReferenceScriptWitness era])
1397+
readMintScriptWitnesses era getUtxo (v, sWitFiles) =
1398+
fmap (v,) . forM sWitFiles $ \witFile -> do
1399+
wit <- firstExceptT TxCmdScriptWitnessError $ readScriptWitness era witFile
1400+
let mFilePid = getScriptWitnessPolicyId wit
1401+
mPid <- getPolicyIdFromWitnessOrCliArg witFile
1402+
pure $ UpdatedReferenceScriptWitness (mPid <|> mFilePid) wit
1403+
where
1404+
-- get policy id from the script
1405+
getScriptWitnessPolicyId :: ScriptWitness WitCtxMint era -> Maybe PolicyId
1406+
getScriptWitnessPolicyId = \case
1407+
SimpleScriptWitness _ (SScript script) -> Just . scriptPolicyId $ SimpleScript script
1408+
SimpleScriptWitness _ (SReferenceScript _) -> Nothing
1409+
PlutusScriptWitness _ version (PScript script) _ _ _ -> Just . scriptPolicyId $ PlutusScript version script
1410+
PlutusScriptWitness _ _ (PReferenceScript _) _ _ _ -> Nothing
1411+
1412+
-- get policy id using TxIn reference, getting script from UTXO, or using the provided one on the CLI
1413+
getPolicyIdFromWitnessOrCliArg
1414+
:: ScriptWitnessFiles WitCtxMint -> ExceptT TxCmdError IO (Maybe PolicyId)
1415+
getPolicyIdFromWitnessOrCliArg = \case
1416+
SimpleScriptWitnessFile{} -> pure Nothing
1417+
PlutusScriptWitnessFiles{} -> pure Nothing
1418+
PlutusReferenceScriptWitnessFiles _ _ _ _ _ (ConcretePolicyId pid) -> pure $ Just pid
1419+
PlutusReferenceScriptWitnessFiles txIn _ _ _ _ QueryUtxoPolicyId -> getPolicyIdFromTxOut txIn
1420+
SimpleReferenceScriptWitnessFiles _ _ (ConcretePolicyId pid) -> pure $ Just pid
1421+
SimpleReferenceScriptWitnessFiles txIn _ QueryUtxoPolicyId -> getPolicyIdFromTxOut txIn
1422+
1423+
-- get policy id from the UTXO
1424+
getPolicyIdFromTxOut :: TxIn -> ExceptT TxCmdError IO (Maybe PolicyId)
1425+
getPolicyIdFromTxOut txIn = do
1426+
txout <- firstExceptT TxCmdQueryConvenienceError $ getUtxo txIn
1427+
pure $
1428+
txout >>= \(TxOut _ _ _ refScript) ->
1429+
case refScript of
1430+
ReferenceScriptNone -> Nothing
1431+
ReferenceScript _ (ScriptInAnyLang _ script) -> Just $ scriptPolicyId script
14041432

14051433
-- ----------------------------------------------------------------------------
14061434
-- Transaction signing

cardano-cli/src/Cardano/CLI/Read.hs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ readScriptWitnessFiles
272272
readScriptWitnessFiles era = mapM readSwitFile
273273
where
274274
readSwitFile (tIn, Just switFile) = do
275-
sWit <- snd <$> readScriptWitness era switFile
275+
sWit <- readScriptWitness era switFile
276276
return (tIn, Just sWit)
277277
readSwitFile (tIn, Nothing) = return (tIn, Nothing)
278278

@@ -283,22 +283,25 @@ readScriptWitnessFilesTuple
283283
readScriptWitnessFilesTuple era = mapM readSwitFile
284284
where
285285
readSwitFile (tIn, b, Just switFile) = do
286-
sWit <- snd <$> readScriptWitness era switFile
286+
sWit <- readScriptWitness era switFile
287287
return (tIn, b, Just sWit)
288288
readSwitFile (tIn, b, Nothing) = return (tIn, b, Nothing)
289289

290290
readScriptWitness
291291
:: ShelleyBasedEra era
292292
-> ScriptWitnessFiles witctx
293-
-> ExceptT ScriptWitnessError IO (Maybe PolicyId, ScriptWitness witctx era)
293+
-> ExceptT
294+
ScriptWitnessError
295+
IO
296+
(ScriptWitness witctx era)
294297
readScriptWitness era (SimpleScriptWitnessFile (File scriptFile)) = do
295298
script@(ScriptInAnyLang lang _) <-
296299
firstExceptT ScriptWitnessErrorFile $
297300
readFileScriptInAnyLang scriptFile
298301
ScriptInEra langInEra script' <- validateScriptSupportedInEra era script
299302
case script' of
300303
SimpleScript sscript ->
301-
return . (Nothing,) . SimpleScriptWitness langInEra $ SScript sscript
304+
return . SimpleScriptWitness langInEra $ SScript sscript
302305
-- If the supplied cli flags were for a simple script (i.e. the user did
303306
-- not supply the datum, redeemer or ex units), but the script file turns
304307
-- out to be a valid plutus script, then we must fail.
@@ -327,7 +330,7 @@ readScriptWitness
327330
redeemer <-
328331
firstExceptT ScriptWitnessErrorScriptData $
329332
readScriptRedeemerOrFile redeemerOrFile
330-
pure . (Nothing,) $
333+
pure $
331334
PlutusScriptWitness
332335
langInEra
333336
version
@@ -352,7 +355,7 @@ readScriptWitness
352355
datumOrFile
353356
redeemerOrFile
354357
execUnits
355-
mPid
358+
_
356359
) = do
357360
caseShelleyToAlonzoOrBabbageEraOnwards
358361
( const $
@@ -375,7 +378,7 @@ readScriptWitness
375378
redeemer <-
376379
firstExceptT ScriptWitnessErrorScriptData $
377380
readScriptRedeemerOrFile redeemerOrFile
378-
return . (mPid,) $
381+
return $
379382
PlutusScriptWitness
380383
sLangInEra
381384
version
@@ -393,7 +396,7 @@ readScriptWitness
393396
( SimpleReferenceScriptWitnessFiles
394397
refTxIn
395398
anyScrLang@(AnyScriptLanguage anyScriptLanguage)
396-
mPid
399+
_pid
397400
) = do
398401
caseShelleyToAlonzoOrBabbageEraOnwards
399402
( const $
@@ -406,7 +409,7 @@ readScriptWitness
406409
Just sLangInEra ->
407410
case languageOfScriptLanguageInEra sLangInEra of
408411
SimpleScriptLanguage ->
409-
return . (mPid,) . SimpleScriptWitness sLangInEra $
412+
return . SimpleScriptWitness sLangInEra $
410413
SReferenceScript refTxIn
411414
PlutusScriptLanguage{} ->
412415
error "readScriptWitness: Should not be possible to specify a plutus script"
@@ -922,9 +925,8 @@ readSingleVote w (voteFp, mScriptWitFiles) = do
922925
let sbe = conwayEraOnwardsToShelleyBasedEra w
923926
runExceptT $ do
924927
sWits <-
925-
fmap (fmap snd) $
926-
firstExceptT VoteErrorScriptWitness $
927-
mapM (readScriptWitness sbe) sWitFile
928+
firstExceptT VoteErrorScriptWitness $
929+
mapM (readScriptWitness sbe) sWitFile
928930
hoistEither $ (,sWits) <$> votProceds
929931

930932
data ConstitutionError
@@ -969,9 +971,8 @@ readProposal w (fp, mScriptWit) = do
969971
let sbe = conwayEraOnwardsToShelleyBasedEra w
970972
runExceptT $ do
971973
sWit <-
972-
fmap (fmap snd) $
973-
firstExceptT ProposalErrorScriptWitness $
974-
mapM (readScriptWitness sbe) sWitFile
974+
firstExceptT ProposalErrorScriptWitness $
975+
mapM (readScriptWitness sbe) sWitFile
975976
hoistEither $ (,sWit) <$> prop
976977

977978
constitutionHashSourceToHash

0 commit comments

Comments
 (0)