@@ -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 )
7677import Cardano.Api.Experimental.Tx.Internal.Type
78+ import Cardano.Api.Governance.Internal.Action.VotingProcedure
79+ ( VotesMergingConflict (.. )
80+ , mergeVotingProcedures
81+ )
7782import Cardano.Api.Key.Internal
7883import Cardano.Api.Ledger.Internal.Reexport (StrictMaybe (.. ))
7984import 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+
427471data TxBodyContent era
428472 = TxBodyContent
429473 { txIns :: [(TxIn , AnyWitness era )]
0 commit comments