Skip to content

Commit a1a40fa

Browse files
authored
Merge pull request #697 from IntersectMBO/mgalazyn/refactor/move-wit-indexing-logic-into-one-place
Refactor witnesses indexing functions to have the indexing logic in one place
2 parents e65c441 + c18d177 commit a1a40fa

File tree

4 files changed

+187
-140
lines changed

4 files changed

+187
-140
lines changed

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

Lines changed: 34 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,13 @@ substituteExecutionUnits
14501450
redeemer
14511451
exunits
14521452

1453+
adjustScriptWitness
1454+
:: (ScriptWitness witctx era -> Either (TxBodyErrorAutoBalance era) (ScriptWitness witctx era))
1455+
-> Witness witctx era
1456+
-> Either (TxBodyErrorAutoBalance era) (Witness witctx era)
1457+
adjustScriptWitness _ (KeyWitness ctx) = Right $ KeyWitness ctx
1458+
adjustScriptWitness g (ScriptWitness ctx witness') = ScriptWitness ctx <$> g witness'
1459+
14531460
mapScriptWitnessesTxIns
14541461
:: [(TxIn, BuildTxWith BuildTx (Witness WitCtxTxIn era))]
14551462
-> Either (TxBodyErrorAutoBalance era) [(TxIn, BuildTxWith BuildTx (Witness WitCtxTxIn era))]
@@ -1461,27 +1468,18 @@ substituteExecutionUnits
14611468
]
14621469
mappedScriptWitnesses =
14631470
[ (txin, BuildTxWith <$> wit')
1464-
| -- The tx ins are indexed in the map order by txid
1465-
(ix, (txin, BuildTxWith wit)) <- zip [0 ..] (orderTxIns txins)
1466-
, let wit' = case wit of
1467-
KeyWitness{} -> Right wit
1468-
ScriptWitness ctx witness -> ScriptWitness ctx <$> witness'
1469-
where
1470-
witness' = substituteExecUnits (ScriptWitnessIndexTxIn ix) witness
1471+
| (ix, txin, wit) <- indexTxIns txins
1472+
, let wit' = adjustScriptWitness (substituteExecUnits ix) wit
14711473
]
14721474
in traverse
1473-
( \(txIn, eWitness) ->
1474-
case eWitness of
1475-
Left e -> Left e
1476-
Right wit -> Right (txIn, wit)
1477-
)
1475+
(\(txIn, eWitness) -> (txIn,) <$> eWitness)
14781476
mappedScriptWitnesses
14791477

14801478
mapScriptWitnessesWithdrawals
14811479
:: TxWithdrawals BuildTx era
14821480
-> Either (TxBodyErrorAutoBalance era) (TxWithdrawals BuildTx era)
14831481
mapScriptWitnessesWithdrawals TxWithdrawalsNone = Right TxWithdrawalsNone
1484-
mapScriptWitnessesWithdrawals (TxWithdrawals supported withdrawals) =
1482+
mapScriptWitnessesWithdrawals txWithdrawals'@(TxWithdrawals supported _) =
14851483
let mappedWithdrawals
14861484
:: [ ( StakeAddress
14871485
, L.Coin
@@ -1490,55 +1488,30 @@ substituteExecutionUnits
14901488
]
14911489
mappedWithdrawals =
14921490
[ (addr, withdrawal, BuildTxWith <$> mappedWitness)
1493-
| -- The withdrawals are indexed in the map order by stake credential
1494-
(ix, (addr, withdrawal, BuildTxWith wit)) <- zip [0 ..] (orderStakeAddrs withdrawals)
1495-
, let mappedWitness = adjustWitness (substituteExecUnits (ScriptWitnessIndexWithdrawal ix)) wit
1491+
| (ix, addr, withdrawal, wit) <- indexTxWithdrawals txWithdrawals'
1492+
, let mappedWitness = adjustScriptWitness (substituteExecUnits ix) wit
14961493
]
14971494
in TxWithdrawals supported
14981495
<$> traverse
1499-
( \(sAddr, ll, eWitness) ->
1500-
case eWitness of
1501-
Left e -> Left e
1502-
Right wit -> Right (sAddr, ll, wit)
1503-
)
1496+
(\(sAddr, ll, eWitness) -> (sAddr,ll,) <$> eWitness)
15041497
mappedWithdrawals
1505-
where
1506-
adjustWitness
1507-
:: (ScriptWitness witctx era -> Either (TxBodyErrorAutoBalance era) (ScriptWitness witctx era))
1508-
-> Witness witctx era
1509-
-> Either (TxBodyErrorAutoBalance era) (Witness witctx era)
1510-
adjustWitness _ (KeyWitness ctx) = Right $ KeyWitness ctx
1511-
adjustWitness g (ScriptWitness ctx witness') = ScriptWitness ctx <$> g witness'
15121498

15131499
mapScriptWitnessesCertificates
15141500
:: TxCertificates BuildTx era
15151501
-> Either (TxBodyErrorAutoBalance era) (TxCertificates BuildTx era)
15161502
mapScriptWitnessesCertificates TxCertificatesNone = Right TxCertificatesNone
1517-
mapScriptWitnessesCertificates
1518-
( TxCertificates
1519-
supported
1520-
certs
1521-
(BuildTxWith witnesses)
1522-
) =
1523-
let mappedScriptWitnesses
1524-
:: [(StakeCredential, Either (TxBodyErrorAutoBalance era) (Witness WitCtxStake era))]
1525-
mappedScriptWitnesses =
1526-
[ (stakecred, ScriptWitness ctx <$> witness')
1527-
| -- The certs are indexed in list order
1528-
(ix, cert) <- zip [0 ..] certs
1529-
, stakecred <- maybeToList (selectStakeCredentialWitness cert)
1530-
, ScriptWitness ctx witness <-
1531-
maybeToList (List.lookup stakecred witnesses)
1532-
, let witness' = substituteExecUnits (ScriptWitnessIndexCertificate ix) witness
1533-
]
1534-
in TxCertificates supported certs . BuildTxWith
1535-
<$> traverse
1536-
( \(sCred, eScriptWitness) ->
1537-
case eScriptWitness of
1538-
Left e -> Left e
1539-
Right wit -> Right (sCred, wit)
1540-
)
1541-
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) <- indexTxCertificates txCertificates'
1509+
, let witness' = adjustScriptWitness (substituteExecUnits ix) witness
1510+
]
1511+
in TxCertificates supported certs . BuildTxWith
1512+
<$> traverse
1513+
(\(sCred, eScriptWitness) -> (sCred,) <$> eScriptWitness)
1514+
mappedScriptWitnesses
15421515

15431516
mapScriptWitnessesVotes
15441517
:: Maybe (Featured ConwayEraOnwards era (TxVotingProcedures build era))
@@ -1548,13 +1521,11 @@ substituteExecutionUnits
15481521
mapScriptWitnessesVotes Nothing = return Nothing
15491522
mapScriptWitnessesVotes (Just (Featured _ TxVotingProceduresNone)) = return Nothing
15501523
mapScriptWitnessesVotes (Just (Featured _ (TxVotingProcedures _ ViewTx))) = return Nothing
1551-
mapScriptWitnessesVotes (Just (Featured era (TxVotingProcedures vProcedures (BuildTxWith sWitMap)))) = do
1524+
mapScriptWitnessesVotes (Just (Featured era txVotingProcedures'@(TxVotingProcedures vProcedures (BuildTxWith _)))) = do
15521525
let eSubstitutedExecutionUnits =
15531526
[ (vote, updatedWitness)
1554-
| let allVoteMap = L.unVotingProcedures vProcedures
1555-
, (vote, scriptWitness) <- toList sWitMap
1556-
, index <- maybeToList $ Map.lookupIndex vote allVoteMap
1557-
, let updatedWitness = substituteExecUnits (ScriptWitnessIndexVoting $ fromIntegral index) scriptWitness
1527+
| (ix, vote, witness) <- indexTxVotingProcedures txVotingProcedures'
1528+
, let updatedWitness = substituteExecUnits ix witness
15581529
]
15591530

15601531
substitutedExecutionUnits <- traverseScriptWitnesses eSubstitutedExecutionUnits
@@ -1571,13 +1542,11 @@ substituteExecutionUnits
15711542
mapScriptWitnessesProposals Nothing = return Nothing
15721543
mapScriptWitnessesProposals (Just (Featured _ TxProposalProceduresNone)) = return Nothing
15731544
mapScriptWitnessesProposals (Just (Featured _ (TxProposalProcedures _ ViewTx))) = return Nothing
1574-
mapScriptWitnessesProposals (Just (Featured era txpp@(TxProposalProcedures osetProposalProcedures (BuildTxWith sWitMap)))) = do
1575-
let allProposalsList = toList $ convProposalProcedures txpp
1576-
eSubstitutedExecutionUnits =
1545+
mapScriptWitnessesProposals (Just (Featured era txpp@(TxProposalProcedures osetProposalProcedures (BuildTxWith _)))) = do
1546+
let eSubstitutedExecutionUnits =
15771547
[ (proposal, updatedWitness)
1578-
| (proposal, scriptWitness) <- toList sWitMap
1579-
, index <- maybeToList $ List.elemIndex proposal allProposalsList
1580-
, let updatedWitness = substituteExecUnits (ScriptWitnessIndexProposing $ fromIntegral index) scriptWitness
1548+
| (ix, proposal, scriptWitness) <- indexTxProposalProcedures txpp
1549+
, let updatedWitness = substituteExecUnits ix scriptWitness
15811550
]
15821551

15831552
substitutedExecutionUnits <- traverseScriptWitnesses eSubstitutedExecutionUnits
@@ -1596,7 +1565,7 @@ substituteExecutionUnits
15961565
mapScriptWitnessesMinting txMintValue'@(TxMintValue w _) = do
15971566
let mappedScriptWitnesses =
15981567
[ (policyId, pure . (assetName',quantity,) <$> substitutedWitness)
1599-
| (ix, policyId, assetName', quantity, BuildTxWith witness) <- txMintValueToIndexed txMintValue'
1568+
| (ix, policyId, assetName', quantity, BuildTxWith witness) <- indexTxMintValue txMintValue'
16001569
, let substitutedWitness = BuildTxWith <$> substituteExecUnits ix witness
16011570
]
16021571
final <- Map.fromListWith (<>) <$> traverseScriptWitnesses mappedScriptWitnesses

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)