Skip to content

Commit c084a4e

Browse files
committed
Refactor witnesses indexing functions to have the indexing logic in one place
1 parent e6912ab commit c084a4e

File tree

3 files changed

+147
-125
lines changed

3 files changed

+147
-125
lines changed

cardano-api/internal/Cardano/Api/Fees.hs

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import Control.Monad
8787
import Data.Bifunctor (bimap, first, second)
8888
import Data.ByteString.Short (ShortByteString)
8989
import Data.Function ((&))
90+
import Data.Functor
9091
import qualified Data.List as List
9192
import Data.Map.Strict (Map)
9293
import qualified Data.Map.Strict as Map
@@ -1449,6 +1450,13 @@ substituteExecutionUnits
14491450
redeemer
14501451
exunits
14511452

1453+
adjustWitness
1454+
:: (ScriptWitness witctx era -> Either (TxBodyErrorAutoBalance era) (ScriptWitness witctx era))
1455+
-> Witness witctx era
1456+
-> Either (TxBodyErrorAutoBalance era) (Witness witctx era)
1457+
adjustWitness _ (KeyWitness ctx) = Right $ KeyWitness ctx
1458+
adjustWitness g (ScriptWitness ctx witness') = ScriptWitness ctx <$> g witness'
1459+
14521460
mapScriptWitnessesTxIns
14531461
:: [(TxIn, BuildTxWith BuildTx (Witness WitCtxTxIn era))]
14541462
-> Either (TxBodyErrorAutoBalance era) [(TxIn, BuildTxWith BuildTx (Witness WitCtxTxIn era))]
@@ -1460,27 +1468,18 @@ substituteExecutionUnits
14601468
]
14611469
mappedScriptWitnesses =
14621470
[ (txin, BuildTxWith <$> wit')
1463-
| -- The tx ins are indexed in the map order by txid
1464-
(ix, (txin, BuildTxWith wit)) <- zip [0 ..] (orderTxIns txins)
1465-
, let wit' = case wit of
1466-
KeyWitness{} -> Right wit
1467-
ScriptWitness ctx witness -> ScriptWitness ctx <$> witness'
1468-
where
1469-
witness' = substituteExecUnits (ScriptWitnessIndexTxIn ix) witness
1471+
| (ix, txin, wit) <- txInsToIndexed txins
1472+
, let wit' = adjustWitness (substituteExecUnits ix) wit
14701473
]
14711474
in traverse
1472-
( \(txIn, eWitness) ->
1473-
case eWitness of
1474-
Left e -> Left e
1475-
Right wit -> Right (txIn, wit)
1476-
)
1475+
(\(txIn, eWitness) -> (txIn,) <$> eWitness)
14771476
mappedScriptWitnesses
14781477

14791478
mapScriptWitnessesWithdrawals
14801479
:: TxWithdrawals BuildTx era
14811480
-> Either (TxBodyErrorAutoBalance era) (TxWithdrawals BuildTx era)
14821481
mapScriptWitnessesWithdrawals TxWithdrawalsNone = Right TxWithdrawalsNone
1483-
mapScriptWitnessesWithdrawals (TxWithdrawals supported withdrawals) =
1482+
mapScriptWitnessesWithdrawals txWithdrawals'@(TxWithdrawals supported _) =
14841483
let mappedWithdrawals
14851484
:: [ ( StakeAddress
14861485
, L.Coin
@@ -1489,55 +1488,30 @@ substituteExecutionUnits
14891488
]
14901489
mappedWithdrawals =
14911490
[ (addr, withdrawal, BuildTxWith <$> mappedWitness)
1492-
| -- The withdrawals are indexed in the map order by stake credential
1493-
(ix, (addr, withdrawal, BuildTxWith wit)) <- zip [0 ..] (orderStakeAddrs withdrawals)
1494-
, let mappedWitness = adjustWitness (substituteExecUnits (ScriptWitnessIndexWithdrawal ix)) wit
1491+
| (ix, addr, withdrawal, wit) <- txWithdrawalsToIndexed txWithdrawals'
1492+
, let mappedWitness = adjustWitness (substituteExecUnits ix) wit
14951493
]
14961494
in TxWithdrawals supported
14971495
<$> traverse
1498-
( \(sAddr, ll, eWitness) ->
1499-
case eWitness of
1500-
Left e -> Left e
1501-
Right wit -> Right (sAddr, ll, wit)
1502-
)
1496+
(\(sAddr, ll, eWitness) -> (sAddr,ll,) <$> eWitness)
15031497
mappedWithdrawals
1504-
where
1505-
adjustWitness
1506-
:: (ScriptWitness witctx era -> Either (TxBodyErrorAutoBalance era) (ScriptWitness witctx era))
1507-
-> Witness witctx era
1508-
-> Either (TxBodyErrorAutoBalance era) (Witness witctx era)
1509-
adjustWitness _ (KeyWitness ctx) = Right $ KeyWitness ctx
1510-
adjustWitness g (ScriptWitness ctx witness') = ScriptWitness ctx <$> g witness'
15111498

15121499
mapScriptWitnessesCertificates
15131500
:: TxCertificates BuildTx era
15141501
-> Either (TxBodyErrorAutoBalance era) (TxCertificates BuildTx era)
15151502
mapScriptWitnessesCertificates TxCertificatesNone = Right TxCertificatesNone
1516-
mapScriptWitnessesCertificates
1517-
( TxCertificates
1518-
supported
1519-
certs
1520-
(BuildTxWith witnesses)
1521-
) =
1522-
let mappedScriptWitnesses
1523-
:: [(StakeCredential, Either (TxBodyErrorAutoBalance era) (Witness WitCtxStake era))]
1524-
mappedScriptWitnesses =
1525-
[ (stakecred, ScriptWitness ctx <$> witness')
1526-
| -- The certs are indexed in list order
1527-
(ix, cert) <- zip [0 ..] certs
1528-
, stakecred <- maybeToList (selectStakeCredentialWitness cert)
1529-
, ScriptWitness ctx witness <-
1530-
maybeToList (List.lookup stakecred witnesses)
1531-
, let witness' = substituteExecUnits (ScriptWitnessIndexCertificate ix) witness
1532-
]
1533-
in TxCertificates supported certs . BuildTxWith
1534-
<$> traverse
1535-
( \(sCred, eScriptWitness) ->
1536-
case eScriptWitness of
1537-
Left e -> Left e
1538-
Right wit -> Right (sCred, wit)
1539-
)
1540-
mappedScriptWitnesses
1503+
mapScriptWitnessesCertificates txCertificates'@(TxCertificates supported certs _) =
1504+
let mappedScriptWitnesses
1505+
:: [(StakeCredential, Either (TxBodyErrorAutoBalance era) (Witness WitCtxStake era))]
1506+
mappedScriptWitnesses =
1507+
[ (stakeCred, witness')
1508+
| (ix, _, stakeCred, witness) <- txCertificatesToIndexed txCertificates'
1509+
, let witness' = adjustWitness (substituteExecUnits ix) witness
1510+
]
1511+
in TxCertificates supported certs . BuildTxWith
1512+
<$> traverse
1513+
(\(sCred, eScriptWitness) -> (sCred,) <$> eScriptWitness)
1514+
mappedScriptWitnesses
15411515

15421516
mapScriptWitnessesVotes
15431517
:: Maybe (Featured ConwayEraOnwards era (TxVotingProcedures build era))
@@ -1547,13 +1521,11 @@ substituteExecutionUnits
15471521
mapScriptWitnessesVotes Nothing = return Nothing
15481522
mapScriptWitnessesVotes (Just (Featured _ TxVotingProceduresNone)) = return Nothing
15491523
mapScriptWitnessesVotes (Just (Featured _ (TxVotingProcedures _ ViewTx))) = return Nothing
1550-
mapScriptWitnessesVotes (Just (Featured era (TxVotingProcedures vProcedures (BuildTxWith sWitMap)))) = do
1524+
mapScriptWitnessesVotes (Just (Featured era txVotingProcedures'@(TxVotingProcedures vProcedures (BuildTxWith _)))) = do
15511525
let eSubstitutedExecutionUnits =
15521526
[ (vote, updatedWitness)
1553-
| let allVoteMap = L.unVotingProcedures vProcedures
1554-
, (vote, scriptWitness) <- toList sWitMap
1555-
, index <- maybeToList $ Map.lookupIndex vote allVoteMap
1556-
, let updatedWitness = substituteExecUnits (ScriptWitnessIndexVoting $ fromIntegral index) scriptWitness
1527+
| (ix, vote, witness) <- txVotingProceduresToIndexed txVotingProcedures'
1528+
, let updatedWitness = substituteExecUnits ix witness
15571529
]
15581530

15591531
substitutedExecutionUnits <- traverseScriptWitnesses eSubstitutedExecutionUnits
@@ -1570,13 +1542,11 @@ substituteExecutionUnits
15701542
mapScriptWitnessesProposals Nothing = return Nothing
15711543
mapScriptWitnessesProposals (Just (Featured _ TxProposalProceduresNone)) = return Nothing
15721544
mapScriptWitnessesProposals (Just (Featured _ (TxProposalProcedures _ ViewTx))) = return Nothing
1573-
mapScriptWitnessesProposals (Just (Featured era txpp@(TxProposalProcedures osetProposalProcedures (BuildTxWith sWitMap)))) = do
1574-
let allProposalsList = toList $ convProposalProcedures txpp
1575-
eSubstitutedExecutionUnits =
1545+
mapScriptWitnessesProposals (Just (Featured era txpp@(TxProposalProcedures osetProposalProcedures (BuildTxWith _)))) = do
1546+
let eSubstitutedExecutionUnits =
15761547
[ (proposal, updatedWitness)
1577-
| (proposal, scriptWitness) <- toList sWitMap
1578-
, index <- maybeToList $ List.elemIndex proposal allProposalsList
1579-
, let updatedWitness = substituteExecUnits (ScriptWitnessIndexProposing $ fromIntegral index) scriptWitness
1548+
| (ix, proposal, scriptWitness) <- txProposalProceduresToIndexed txpp
1549+
, let updatedWitness = substituteExecUnits ix scriptWitness
15801550
]
15811551

15821552
substitutedExecutionUnits <- traverseScriptWitnesses eSubstitutedExecutionUnits

cardano-api/internal/Cardano/Api/Script.hs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,23 @@ data SimpleScriptOrReferenceInput lang
696696
| SReferenceScript TxIn
697697
deriving (Eq, Show)
698698

699+
-- ----------------------------------------------------------------------------
700+
-- The kind of witness to use, key (signature) or script
701+
--
702+
703+
data Witness witctx era where
704+
KeyWitness
705+
:: KeyWitnessInCtx witctx
706+
-> Witness witctx era
707+
ScriptWitness
708+
:: ScriptWitnessInCtx witctx
709+
-> ScriptWitness witctx era
710+
-> Witness witctx era
711+
712+
deriving instance Eq (Witness witctx era)
713+
714+
deriving instance Show (Witness witctx era)
715+
699716
-- | A /use/ of a script within a transaction body to witness that something is
700717
-- being used in an authorised manner. That can be
701718
--
@@ -797,23 +814,6 @@ getScriptWitnessReferenceInputOrScript = \case
797814
PlutusScriptWitness _ _ (PReferenceScript txIn) _ _ _ ->
798815
Right txIn
799816

800-
-- ----------------------------------------------------------------------------
801-
-- The kind of witness to use, key (signature) or script
802-
--
803-
804-
data Witness witctx era where
805-
KeyWitness
806-
:: KeyWitnessInCtx witctx
807-
-> Witness witctx era
808-
ScriptWitness
809-
:: ScriptWitnessInCtx witctx
810-
-> ScriptWitness witctx era
811-
-> Witness witctx era
812-
813-
deriving instance Eq (Witness witctx era)
814-
815-
deriving instance Show (Witness witctx era)
816-
817817
data KeyWitnessInCtx witctx where
818818
KeyWitnessForSpending :: KeyWitnessInCtx WitCtxTxIn
819819
KeyWitnessForStakeAddr :: KeyWitnessInCtx WitCtxStake

0 commit comments

Comments
 (0)