3
3
{-# LANGUAGE EmptyCase #-}
4
4
{-# LANGUAGE FlexibleContexts #-}
5
5
{-# LANGUAGE GADTs #-}
6
+ {-# LANGUAGE KindSignatures #-}
6
7
{-# LANGUAGE LambdaCase #-}
7
8
{-# LANGUAGE NamedFieldPuns #-}
8
9
{-# LANGUAGE RankNTypes #-}
@@ -73,6 +74,7 @@ import qualified Data.List as List
73
74
import Data.Map.Strict (Map )
74
75
import qualified Data.Map.Strict as Map
75
76
import Data.Maybe (catMaybes , fromMaybe , mapMaybe , maybeToList )
77
+ import Data.Proxy
76
78
import Data.Set (Set )
77
79
import qualified Data.Set as Set
78
80
import qualified Data.Text as Text
@@ -169,7 +171,7 @@ runTransactionBuildCmd
169
171
txMetadata <-
170
172
firstExceptT TxCmdMetadataError . newExceptT $
171
173
readTxMetadata eon metadataSchema metadataFiles
172
- valuesWithScriptWits <- readValueScriptWitnesses eon $ fromMaybe mempty mValue
174
+ valuesWithScriptWits <- readMintScriptWitnesses eon ( const undefined ) $ fromMaybe mempty mValue
173
175
scripts <-
174
176
firstExceptT TxCmdScriptFileError $
175
177
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -205,7 +207,7 @@ runTransactionBuildCmd
205
207
let allReferenceInputs =
206
208
getAllReferenceInputs
207
209
inputsAndMaybeScriptWits
208
- (snd <$> snd valuesWithScriptWits)
210
+ (snd valuesWithScriptWits)
209
211
certsAndMaybeScriptWits
210
212
withdrawalsAndMaybeScriptWits
211
213
votingProceduresAndMaybeScriptWits
@@ -360,7 +362,7 @@ runTransactionBuildEstimateCmd -- TODO change type
360
362
firstExceptT TxCmdMetadataError
361
363
. newExceptT
362
364
$ readTxMetadata sbe metadataSchema metadataFiles
363
- valuesWithScriptWits <- readValueScriptWitnesses sbe $ fromMaybe mempty mValue
365
+ valuesWithScriptWits <- readMintScriptWitnesses sbe ( const undefined ) $ fromMaybe mempty mValue
364
366
scripts <-
365
367
firstExceptT TxCmdScriptFileError $
366
368
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -594,7 +596,7 @@ runTransactionBuildRawCmd
594
596
firstExceptT TxCmdMetadataError
595
597
. newExceptT
596
598
$ readTxMetadata eon metadataSchema metadataFiles
597
- valuesWithScriptWits <- readValueScriptWitnesses eon $ fromMaybe mempty mValue
599
+ valuesWithScriptWits <- readMintScriptWitnesses eon ( const undefined ) $ fromMaybe mempty mValue
598
600
scripts <-
599
601
firstExceptT TxCmdScriptFileError $
600
602
mapM (readFileScriptInAnyLang . unFile) scriptFiles
@@ -698,7 +700,7 @@ runTxBuildRaw
698
700
-- ^ Tx upper bound
699
701
-> Lovelace
700
702
-- ^ Tx fee
701
- -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
703
+ -> (Value , [UpdatedReferenceScriptWitness era ])
702
704
-- ^ Multi-Asset value(s)
703
705
-> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
704
706
-- ^ Certificate with potential script witness
@@ -784,7 +786,7 @@ constructTxBodyContent
784
786
-- ^ Tx lower bound
785
787
-> TxValidityUpperBound era
786
788
-- ^ Tx upper bound
787
- -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
789
+ -> (Value , [UpdatedReferenceScriptWitness era ])
788
790
-- ^ Multi-Asset value(s)
789
791
-> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
790
792
-- ^ Certificate with potential script witness
@@ -831,7 +833,7 @@ constructTxBodyContent
831
833
let allReferenceInputs =
832
834
getAllReferenceInputs
833
835
inputsAndMaybeScriptWits
834
- (snd <$> snd valuesWithScriptWits)
836
+ (snd valuesWithScriptWits)
835
837
certsAndMaybeScriptWits
836
838
withdrawals
837
839
votingProcedures
@@ -924,7 +926,7 @@ runTxBuild
924
926
-- ^ Normal outputs
925
927
-> TxOutChangeAddress
926
928
-- ^ A change output
927
- -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
929
+ -> (Value , [UpdatedReferenceScriptWitness era ])
928
930
-- ^ Multi-Asset value(s)
929
931
-> Maybe SlotNo
930
932
-- ^ Tx lower bound
@@ -978,7 +980,7 @@ runTxBuild
978
980
let allReferenceInputs =
979
981
getAllReferenceInputs
980
982
inputsAndMaybeScriptWits
981
- (snd <$> snd valuesWithScriptWits)
983
+ (snd valuesWithScriptWits)
982
984
certsAndMaybeScriptWits
983
985
withdrawals
984
986
votingProcedures
@@ -1145,7 +1147,7 @@ validateTxInsReference sbe allRefIns = do
1145
1147
1146
1148
getAllReferenceInputs
1147
1149
:: [(TxIn , Maybe (ScriptWitness WitCtxTxIn era ))]
1148
- -> [ScriptWitness WitCtxMint era ]
1150
+ -> [UpdatedReferenceScriptWitness era ]
1149
1151
-> [(Certificate era , Maybe (ScriptWitness WitCtxStake era ))]
1150
1152
-> [(StakeAddress , Lovelace , Maybe (ScriptWitness WitCtxStake era ))]
1151
1153
-> [(VotingProcedures era , Maybe (ScriptWitness WitCtxStake era ))]
@@ -1162,7 +1164,7 @@ getAllReferenceInputs
1162
1164
propProceduresAnMaybeScriptWits
1163
1165
readOnlyRefIns = do
1164
1166
let txinsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- txins]
1165
- mintingRefInputs = map getReferenceInput mintWitnesses
1167
+ mintingRefInputs = [ getReferenceInput sWit | UpdatedReferenceScriptWitness _ sWit <- mintWitnesses]
1166
1168
certsWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- certFiles]
1167
1169
withdrawalsWitByRefInputs = [getReferenceInput sWit | (_, _, Just sWit) <- withdrawals]
1168
1170
votesWitByRefInputs = [getReferenceInput sWit | (_, Just sWit) <- votingProceduresAndMaybeScriptWits]
@@ -1329,7 +1331,7 @@ toTxAlonzoDatum supp cliDatum =
1329
1331
createTxMintValue
1330
1332
:: forall era
1331
1333
. ShelleyBasedEra era
1332
- -> (Value , [( Maybe PolicyId , ScriptWitness WitCtxMint era ) ])
1334
+ -> (Value , [UpdatedReferenceScriptWitness era ])
1333
1335
-> Either TxCmdError (TxMintValue BuildTx era )
1334
1336
createTxMintValue era (val, scriptWitnesses) =
1335
1337
if List. null (toList val) && List. null scriptWitnesses
@@ -1346,7 +1348,9 @@ createTxMintValue era (val, scriptWitnesses) =
1346
1348
witnessesNeededSet = fromList [pid | (pid, _, _) <- policiesWithAssets]
1347
1349
1348
1350
witnessesProvidedMap :: Map PolicyId (ScriptWitness WitCtxMint era )
1349
- witnessesProvidedMap = fromList $ gatherMintingWitnesses scriptWitnesses
1351
+ witnessesProvidedMap =
1352
+ fromList
1353
+ [(policyId', sWit) | UpdatedReferenceScriptWitness (Just policyId') sWit <- scriptWitnesses]
1350
1354
witnessesProvidedSet = Map. keysSet witnessesProvidedMap
1351
1355
1352
1356
policiesWithWitnesses =
@@ -1363,15 +1367,6 @@ createTxMintValue era (val, scriptWitnesses) =
1363
1367
)
1364
1368
era
1365
1369
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
-
1375
1370
validateAllWitnessesProvided witnessesNeeded witnessesProvided
1376
1371
| null witnessesMissing = return ()
1377
1372
| otherwise = Left (TxCmdPolicyIdsMissing witnessesMissing (toList witnessesProvided))
@@ -1384,23 +1379,56 @@ createTxMintValue era (val, scriptWitnesses) =
1384
1379
where
1385
1380
witnessesExtra = Set. elems (witnessesProvided Set. \\ witnessesNeeded)
1386
1381
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
1398
1385
:: 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
1404
1432
1405
1433
-- ----------------------------------------------------------------------------
1406
1434
-- Transaction signing
0 commit comments