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
7374import Data.Map.Strict (Map )
7475import qualified Data.Map.Strict as Map
7576import Data.Maybe (catMaybes , fromMaybe , mapMaybe , maybeToList )
77+ import Data.Proxy
7678import Data.Set (Set )
7779import qualified Data.Set as Set
7880import 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
11461148getAllReferenceInputs
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 =
13291331createTxMintValue
13301332 :: forall era
13311333 . ShelleyBasedEra era
1332- -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
1334+ -> (Value , [UpdatedReferenceScriptWitness era ])
13331335 -> Either TxCmdError (TxMintValue BuildTx era )
13341336createTxMintValue 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
0 commit comments