Skip to content

Commit 2345abc

Browse files
committed
Implement mkTxVotingProcedures
1 parent 7ef8a14 commit 2345abc

File tree

4 files changed

+56
-10
lines changed

4 files changed

+56
-10
lines changed

cardano-api/src/Cardano/Api/Experimental/Tx.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ module Cardano.Api.Experimental.Tx
128128
, TxBodyContent (..)
129129
, defaultTxBodyContent
130130
, mkTxCertificates
131+
, mkTxVotingProcedures
131132
, setTxAuxScripts
132133
, setTxCertificates
133134
, setTxCollateral

cardano-api/src/Cardano/Api/Experimental/Tx/Internal/BodyContent/New.hs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module Cardano.Api.Experimental.Tx.Internal.BodyContent.New
2626
, extractAllIndexedPlutusScriptWitnesses
2727
, txMintValueToValue
2828
, mkTxCertificates
29+
, mkTxVotingProcedures
2930

3031
-- * Getters and Setters
3132
, setTxAuxScripts
@@ -74,6 +75,10 @@ import Cardano.Api.Experimental.Tx.Internal.TxScriptWitnessRequirements
7475
, getTxScriptWitnessesRequirements
7576
)
7677
import Cardano.Api.Experimental.Tx.Internal.Type
78+
import Cardano.Api.Governance.Internal.Action.VotingProcedure
79+
( VotesMergingConflict (..)
80+
, mergeVotingProcedures
81+
)
7782
import Cardano.Api.Key.Internal
7883
import Cardano.Api.Ledger.Internal.Reexport (StrictMaybe (..))
7984
import Cardano.Api.Ledger.Internal.Reexport qualified as L
@@ -424,6 +429,45 @@ data TxVotingProcedures era
424429
(Map L.Voter (AnyWitness era))
425430
deriving (Eq, Show)
426431

432+
-- | Create voting procedures from map of voting procedures and optional witnesses.
433+
-- Validates the function argument, to make sure the list of votes is legal.
434+
-- See 'mergeVotingProcedures' for validation rules.
435+
mkTxVotingProcedures
436+
:: forall era
437+
. [(L.VotingProcedures (LedgerEra era), AnyWitness (LedgerEra era))]
438+
-> Either (VotesMergingConflict (LedgerEra era)) (TxVotingProcedures (LedgerEra era))
439+
mkTxVotingProcedures votingProcedures = do
440+
procedure <-
441+
foldM f (L.VotingProcedures Map.empty) votingProcedures
442+
pure $ TxVotingProcedures procedure votingScriptWitnessMap
443+
where
444+
votingScriptWitnessMap :: Map L.Voter (AnyWitness (LedgerEra era))
445+
votingScriptWitnessMap =
446+
foldl
447+
(\acc next -> acc `Map.union` uncurry votingScriptWitnessSingleton next)
448+
Map.empty
449+
votingProcedures
450+
451+
f
452+
:: L.VotingProcedures (LedgerEra era)
453+
-> (L.VotingProcedures (LedgerEra era), AnyWitness (LedgerEra era))
454+
-> Either (VotesMergingConflict (LedgerEra era)) (L.VotingProcedures (LedgerEra era))
455+
f acc (procedure, _witness) = mergeVotingProcedures acc procedure
456+
457+
votingScriptWitnessSingleton
458+
:: L.VotingProcedures (LedgerEra era)
459+
-> AnyWitness (LedgerEra era)
460+
-> Map L.Voter (AnyWitness (LedgerEra era))
461+
votingScriptWitnessSingleton votingProcedures' scriptWitness = do
462+
let voter = fromJust $ getVotingScriptCredentials votingProcedures'
463+
Map.singleton voter scriptWitness
464+
465+
getVotingScriptCredentials
466+
:: L.VotingProcedures (LedgerEra era)
467+
-> Maybe L.Voter
468+
getVotingScriptCredentials (L.VotingProcedures m) =
469+
listToMaybe $ Map.keys m
470+
427471
data TxBodyContent era
428472
= TxBodyContent
429473
{ txIns :: [(TxIn, AnyWitness era)]

cardano-api/src/Cardano/Api/Governance/Internal/Action/VotingProcedure.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,17 @@ instance Error (VotesMergingConflict era) where
153153
-- or fails if the votes are incompatible.
154154
mergeVotingProcedures
155155
:: ()
156-
=> VotingProcedures era
156+
=> L.VotingProcedures era
157157
-- ^ Votes to merge
158-
-> VotingProcedures era
158+
-> L.VotingProcedures era
159159
-- ^ Votes to merge
160-
-> Either (VotesMergingConflict era) (VotingProcedures era)
160+
-> Either (VotesMergingConflict era) (L.VotingProcedures era)
161161
-- ^ Either the conflict found, or the merged votes
162162
mergeVotingProcedures vpsa vpsb =
163-
VotingProcedures . L.VotingProcedures <$> foldM mergeVotesOfOneVoter Map.empty allVoters
163+
L.VotingProcedures <$> foldM mergeVotesOfOneVoter Map.empty allVoters
164164
where
165-
mapa = L.unVotingProcedures (unVotingProcedures vpsa)
166-
mapb = L.unVotingProcedures (unVotingProcedures vpsb)
165+
mapa = L.unVotingProcedures vpsa
166+
mapb = L.unVotingProcedures vpsb
167167
allVoters = Set.union (Map.keysSet mapa) (Map.keysSet mapb)
168168
mergeVotesOfOneVoter acc voter =
169169
Map.union acc <$> case (Map.lookup voter mapa, Map.lookup voter mapb) of

cardano-api/src/Cardano/Api/Tx/Internal/Body.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -734,18 +734,19 @@ deriving instance Show (TxVotingProcedures build era)
734734
mkTxVotingProcedures
735735
:: Applicative (BuildTxWith build)
736736
=> [(VotingProcedures era, Maybe (ScriptWitness WitCtxStake era))]
737-
-> Either (VotesMergingConflict era) (TxVotingProcedures build era)
737+
-> Either (VotesMergingConflict (ShelleyLedgerEra era)) (TxVotingProcedures build era)
738738
mkTxVotingProcedures votingProcedures = do
739-
VotingProcedures procedure <-
740-
foldM f emptyVotingProcedures votingProcedures
739+
procedure <-
740+
foldM f (L.VotingProcedures Map.empty) votingProcedures
741741
pure $ TxVotingProcedures procedure (pure votingScriptWitnessMap)
742742
where
743743
votingScriptWitnessMap =
744744
foldl
745745
(\acc next -> acc `Map.union` uncurry votingScriptWitnessSingleton next)
746746
Map.empty
747747
votingProcedures
748-
f acc (procedure, _witness) = mergeVotingProcedures acc procedure
748+
749+
f acc (VotingProcedures procedure, _witness) = mergeVotingProcedures acc procedure
749750

750751
votingScriptWitnessSingleton
751752
:: VotingProcedures era

0 commit comments

Comments
 (0)