@@ -56,6 +56,7 @@ import Cardano.CLI.Types.TxFeature
5656import qualified Ouroboros.Network.Protocol.LocalStateQuery.Type as Consensus
5757import qualified Ouroboros.Network.Protocol.LocalTxSubmission.Client as Net.Tx
5858
59+ import Control.Applicative
5960import Control.Monad (forM )
6061import Data.Aeson ((.=) )
6162import qualified Data.Aeson as Aeson
@@ -71,7 +72,7 @@ import Data.Function ((&))
7172import qualified Data.List as List
7273import Data.Map.Strict (Map )
7374import qualified Data.Map.Strict as Map
74- import Data.Maybe (catMaybes , fromMaybe , mapMaybe )
75+ import Data.Maybe (catMaybes , fromMaybe , mapMaybe , maybeToList )
7576import Data.Set (Set )
7677import qualified Data.Set as Set
7778import qualified Data.Text as Text
@@ -204,7 +205,7 @@ runTransactionBuildCmd
204205 let allReferenceInputs =
205206 getAllReferenceInputs
206207 inputsAndMaybeScriptWits
207- (snd valuesWithScriptWits)
208+ (snd <$> snd valuesWithScriptWits)
208209 certsAndMaybeScriptWits
209210 withdrawalsAndMaybeScriptWits
210211 votingProceduresAndMaybeScriptWits
@@ -697,7 +698,7 @@ runTxBuildRaw
697698 -- ^ Tx upper bound
698699 -> Lovelace
699700 -- ^ Tx fee
700- -> (Value , [ScriptWitness WitCtxMint era ])
701+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
701702 -- ^ Multi-Asset value(s)
702703 -> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
703704 -- ^ Certificate with potential script witness
@@ -783,7 +784,7 @@ constructTxBodyContent
783784 -- ^ Tx lower bound
784785 -> TxValidityUpperBound era
785786 -- ^ Tx upper bound
786- -> (Value , [ScriptWitness WitCtxMint era ])
787+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
787788 -- ^ Multi-Asset value(s)
788789 -> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
789790 -- ^ Certificate with potential script witness
@@ -830,7 +831,7 @@ constructTxBodyContent
830831 let allReferenceInputs =
831832 getAllReferenceInputs
832833 inputsAndMaybeScriptWits
833- (snd valuesWithScriptWits)
834+ (snd <$> snd valuesWithScriptWits)
834835 certsAndMaybeScriptWits
835836 withdrawals
836837 votingProcedures
@@ -923,7 +924,7 @@ runTxBuild
923924 -- ^ Normal outputs
924925 -> TxOutChangeAddress
925926 -- ^ A change output
926- -> (Value , [ScriptWitness WitCtxMint era ])
927+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
927928 -- ^ Multi-Asset value(s)
928929 -> Maybe SlotNo
929930 -- ^ Tx lower bound
@@ -977,7 +978,7 @@ runTxBuild
977978 let allReferenceInputs =
978979 getAllReferenceInputs
979980 inputsAndMaybeScriptWits
980- (snd valuesWithScriptWits)
981+ (snd <$> snd valuesWithScriptWits)
981982 certsAndMaybeScriptWits
982983 withdrawals
983984 votingProcedures
@@ -1182,9 +1183,9 @@ getAllReferenceInputs
11821183 :: ScriptWitness witctx era -> Maybe TxIn
11831184 getReferenceInput sWit =
11841185 case sWit of
1185- PlutusScriptWitness _ _ (PReferenceScript refIn _ ) _ _ _ -> Just refIn
1186+ PlutusScriptWitness _ _ (PReferenceScript refIn) _ _ _ -> Just refIn
11861187 PlutusScriptWitness _ _ PScript {} _ _ _ -> Nothing
1187- SimpleScriptWitness _ (SReferenceScript refIn _ ) -> Just refIn
1188+ SimpleScriptWitness _ (SReferenceScript refIn) -> Just refIn
11881189 SimpleScriptWitness _ SScript {} -> Nothing
11891190
11901191toAddressInAnyEra
@@ -1328,7 +1329,7 @@ toTxAlonzoDatum supp cliDatum =
13281329createTxMintValue
13291330 :: forall era
13301331 . ShelleyBasedEra era
1331- -> (Value , [ScriptWitness WitCtxMint era ])
1332+ -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
13321333 -> Either TxCmdError (TxMintValue BuildTx era )
13331334createTxMintValue era (val, scriptWitnesses) =
13341335 if List. null (toList val) && List. null scriptWitnesses
@@ -1337,28 +1338,37 @@ createTxMintValue era (val, scriptWitnesses) =
13371338 caseShelleyToAllegraOrMaryEraOnwards
13381339 (const (txFeatureMismatchPure (toCardanoEra era) TxFeatureMintValue ))
13391340 ( \ 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]
13441343
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 )
13461349 witnessesProvidedMap = fromList $ gatherMintingWitnesses scriptWitnesses
13471350 witnessesProvidedSet = Map. keysSet witnessesProvidedMap
13481351
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+
13501360 validateAllWitnessesProvided witnessesNeededSet witnessesProvidedSet
13511361 validateNoUnnecessaryWitnesses witnessesNeededSet witnessesProvidedSet
1352- return ( TxMintValue w val ( BuildTxWith witnessesProvidedMap))
1362+ pure $ TxMintValue w policiesWithWitnesses
13531363 )
13541364 era
13551365 where
13561366 gatherMintingWitnesses
1357- :: [ScriptWitness WitCtxMint era ]
1367+ :: [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ]
13581368 -> [(PolicyId , ScriptWitness WitCtxMint era )]
13591369 gatherMintingWitnesses [] = []
1360- gatherMintingWitnesses (sWit : rest) =
1361- case scriptWitnessPolicyId sWit of
1370+ gatherMintingWitnesses ((mPid, sWit) : rest) =
1371+ case scriptWitnessPolicyId sWit <|> mPid of
13621372 Nothing -> gatherMintingWitnesses rest
13631373 Just pid -> (pid, sWit) : gatherMintingWitnesses rest
13641374
@@ -1377,17 +1387,17 @@ createTxMintValue era (val, scriptWitnesses) =
13771387scriptWitnessPolicyId :: ScriptWitness witctx era -> Maybe PolicyId
13781388scriptWitnessPolicyId (SimpleScriptWitness _ (SScript script)) =
13791389 Just . scriptPolicyId $ SimpleScript script
1380- scriptWitnessPolicyId (SimpleScriptWitness _ (SReferenceScript _ mPid )) =
1381- PolicyId <$> mPid
1390+ scriptWitnessPolicyId (SimpleScriptWitness _ (SReferenceScript _)) =
1391+ Nothing
13821392scriptWitnessPolicyId (PlutusScriptWitness _ version (PScript script) _ _ _) =
13831393 Just . scriptPolicyId $ PlutusScript version script
1384- scriptWitnessPolicyId (PlutusScriptWitness _ _ (PReferenceScript _ mPid ) _ _ _) =
1385- PolicyId <$> mPid
1394+ scriptWitnessPolicyId (PlutusScriptWitness _ _ (PReferenceScript _) _ _ _) =
1395+ Nothing
13861396
13871397readValueScriptWitnesses
13881398 :: ShelleyBasedEra era
13891399 -> (Value , [ScriptWitnessFiles WitCtxMint ])
1390- -> ExceptT TxCmdError IO (Value , [ScriptWitness WitCtxMint era ])
1400+ -> ExceptT TxCmdError IO (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
13911401readValueScriptWitnesses era (v, sWitFiles) = do
13921402 sWits <- mapM (firstExceptT TxCmdScriptWitnessError . readScriptWitness era) sWitFiles
13931403 return (v, sWits)
0 commit comments