@@ -56,6 +56,7 @@ import Cardano.CLI.Types.TxFeature
56
56
import qualified Ouroboros.Network.Protocol.LocalStateQuery.Type as Consensus
57
57
import qualified Ouroboros.Network.Protocol.LocalTxSubmission.Client as Net.Tx
58
58
59
+ import Control.Applicative
59
60
import Control.Monad (forM )
60
61
import Data.Aeson ((.=) )
61
62
import qualified Data.Aeson as Aeson
@@ -71,7 +72,7 @@ import Data.Function ((&))
71
72
import qualified Data.List as List
72
73
import Data.Map.Strict (Map )
73
74
import qualified Data.Map.Strict as Map
74
- import Data.Maybe (catMaybes , fromMaybe , mapMaybe )
75
+ import Data.Maybe (catMaybes , fromMaybe , mapMaybe , maybeToList )
75
76
import Data.Set (Set )
76
77
import qualified Data.Set as Set
77
78
import qualified Data.Text as Text
@@ -204,7 +205,7 @@ runTransactionBuildCmd
204
205
let allReferenceInputs =
205
206
getAllReferenceInputs
206
207
inputsAndMaybeScriptWits
207
- (snd valuesWithScriptWits)
208
+ (snd <$> snd valuesWithScriptWits)
208
209
certsAndMaybeScriptWits
209
210
withdrawalsAndMaybeScriptWits
210
211
votingProceduresAndMaybeScriptWits
@@ -697,7 +698,7 @@ runTxBuildRaw
697
698
-- ^ Tx upper bound
698
699
-> Lovelace
699
700
-- ^ Tx fee
700
- -> (Value , [ScriptWitness WitCtxMint era ])
701
+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
701
702
-- ^ Multi-Asset value(s)
702
703
-> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
703
704
-- ^ Certificate with potential script witness
@@ -783,7 +784,7 @@ constructTxBodyContent
783
784
-- ^ Tx lower bound
784
785
-> TxValidityUpperBound era
785
786
-- ^ Tx upper bound
786
- -> (Value , [ScriptWitness WitCtxMint era ])
787
+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
787
788
-- ^ Multi-Asset value(s)
788
789
-> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
789
790
-- ^ Certificate with potential script witness
@@ -830,7 +831,7 @@ constructTxBodyContent
830
831
let allReferenceInputs =
831
832
getAllReferenceInputs
832
833
inputsAndMaybeScriptWits
833
- (snd valuesWithScriptWits)
834
+ (snd <$> snd valuesWithScriptWits)
834
835
certsAndMaybeScriptWits
835
836
withdrawals
836
837
votingProcedures
@@ -923,7 +924,7 @@ runTxBuild
923
924
-- ^ Normal outputs
924
925
-> TxOutChangeAddress
925
926
-- ^ A change output
926
- -> (Value , [ScriptWitness WitCtxMint era ])
927
+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
927
928
-- ^ Multi-Asset value(s)
928
929
-> Maybe SlotNo
929
930
-- ^ Tx lower bound
@@ -977,7 +978,7 @@ runTxBuild
977
978
let allReferenceInputs =
978
979
getAllReferenceInputs
979
980
inputsAndMaybeScriptWits
980
- (snd valuesWithScriptWits)
981
+ (snd <$> snd valuesWithScriptWits)
981
982
certsAndMaybeScriptWits
982
983
withdrawals
983
984
votingProcedures
@@ -1182,9 +1183,9 @@ getAllReferenceInputs
1182
1183
:: ScriptWitness witctx era -> Maybe TxIn
1183
1184
getReferenceInput sWit =
1184
1185
case sWit of
1185
- PlutusScriptWitness _ _ (PReferenceScript refIn _ ) _ _ _ -> Just refIn
1186
+ PlutusScriptWitness _ _ (PReferenceScript refIn) _ _ _ -> Just refIn
1186
1187
PlutusScriptWitness _ _ PScript {} _ _ _ -> Nothing
1187
- SimpleScriptWitness _ (SReferenceScript refIn _ ) -> Just refIn
1188
+ SimpleScriptWitness _ (SReferenceScript refIn) -> Just refIn
1188
1189
SimpleScriptWitness _ SScript {} -> Nothing
1189
1190
1190
1191
toAddressInAnyEra
@@ -1328,7 +1329,7 @@ toTxAlonzoDatum supp cliDatum =
1328
1329
createTxMintValue
1329
1330
:: forall era
1330
1331
. ShelleyBasedEra era
1331
- -> (Value , [ScriptWitness WitCtxMint era ])
1332
+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
1332
1333
-> Either TxCmdError (TxMintValue BuildTx era )
1333
1334
createTxMintValue era (val, scriptWitnesses) =
1334
1335
if List. null (toList val) && List. null scriptWitnesses
@@ -1337,28 +1338,37 @@ createTxMintValue era (val, scriptWitnesses) =
1337
1338
caseShelleyToAllegraOrMaryEraOnwards
1338
1339
(const (txFeatureMismatchPure (toCardanoEra era) TxFeatureMintValue ))
1339
1340
( \ w -> do
1340
- -- The set of policy ids for which we need witnesses:
1341
- let witnessesNeededSet :: Set PolicyId
1342
- witnessesNeededSet =
1343
- fromList [pid | (AssetId pid _, _) <- toList val]
1341
+ let policiesWithAssets :: [(PolicyId , AssetName , Quantity )]
1342
+ policiesWithAssets = [(pid, assetName, quantity) | (AssetId pid assetName, quantity) <- toList val]
1344
1343
1345
- let witnessesProvidedMap :: Map PolicyId (ScriptWitness WitCtxMint era )
1344
+ -- The set of policy ids for which we need witnesses:
1345
+ witnessesNeededSet :: Set PolicyId
1346
+ witnessesNeededSet = fromList [pid | (pid, _, _) <- policiesWithAssets]
1347
+
1348
+ witnessesProvidedMap :: Map PolicyId (ScriptWitness WitCtxMint era )
1346
1349
witnessesProvidedMap = fromList $ gatherMintingWitnesses scriptWitnesses
1347
1350
witnessesProvidedSet = Map. keysSet witnessesProvidedMap
1348
1351
1349
- -- Check not too many, nor too few:
1352
+ policiesWithWitnesses =
1353
+ Map. fromListWith
1354
+ (<>)
1355
+ [ (pid, [(assetName, quantity, BuildTxWith witness)])
1356
+ | (pid, assetName, quantity) <- policiesWithAssets
1357
+ , witness <- maybeToList $ Map. lookup pid witnessesProvidedMap
1358
+ ]
1359
+
1350
1360
validateAllWitnessesProvided witnessesNeededSet witnessesProvidedSet
1351
1361
validateNoUnnecessaryWitnesses witnessesNeededSet witnessesProvidedSet
1352
- return ( TxMintValue w val ( BuildTxWith witnessesProvidedMap))
1362
+ pure $ TxMintValue w policiesWithWitnesses
1353
1363
)
1354
1364
era
1355
1365
where
1356
1366
gatherMintingWitnesses
1357
- :: [ScriptWitness WitCtxMint era ]
1367
+ :: [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ]
1358
1368
-> [(PolicyId , ScriptWitness WitCtxMint era )]
1359
1369
gatherMintingWitnesses [] = []
1360
- gatherMintingWitnesses (sWit : rest) =
1361
- case scriptWitnessPolicyId sWit of
1370
+ gatherMintingWitnesses ((mPid, sWit) : rest) =
1371
+ case scriptWitnessPolicyId sWit <|> mPid of
1362
1372
Nothing -> gatherMintingWitnesses rest
1363
1373
Just pid -> (pid, sWit) : gatherMintingWitnesses rest
1364
1374
@@ -1377,17 +1387,17 @@ createTxMintValue era (val, scriptWitnesses) =
1377
1387
scriptWitnessPolicyId :: ScriptWitness witctx era -> Maybe PolicyId
1378
1388
scriptWitnessPolicyId (SimpleScriptWitness _ (SScript script)) =
1379
1389
Just . scriptPolicyId $ SimpleScript script
1380
- scriptWitnessPolicyId (SimpleScriptWitness _ (SReferenceScript _ mPid )) =
1381
- PolicyId <$> mPid
1390
+ scriptWitnessPolicyId (SimpleScriptWitness _ (SReferenceScript _)) =
1391
+ Nothing
1382
1392
scriptWitnessPolicyId (PlutusScriptWitness _ version (PScript script) _ _ _) =
1383
1393
Just . scriptPolicyId $ PlutusScript version script
1384
- scriptWitnessPolicyId (PlutusScriptWitness _ _ (PReferenceScript _ mPid ) _ _ _) =
1385
- PolicyId <$> mPid
1394
+ scriptWitnessPolicyId (PlutusScriptWitness _ _ (PReferenceScript _) _ _ _) =
1395
+ Nothing
1386
1396
1387
1397
readValueScriptWitnesses
1388
1398
:: ShelleyBasedEra era
1389
1399
-> (Value , [ScriptWitnessFiles WitCtxMint ])
1390
- -> ExceptT TxCmdError IO (Value , [ScriptWitness WitCtxMint era ])
1400
+ -> ExceptT TxCmdError IO (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
1391
1401
readValueScriptWitnesses era (v, sWitFiles) = do
1392
1402
sWits <- mapM (firstExceptT TxCmdScriptWitnessError . readScriptWitness era) sWitFiles
1393
1403
return (v, sWits)
0 commit comments