1010{-# LANGUAGE StandaloneDeriving #-}
1111{-# LANGUAGE TypeApplications #-}
1212{-# LANGUAGE TypeFamilies #-}
13+ {-# LANGUAGE TypeOperators #-}
1314
1415-- | Certificates embedded in transactions
1516module Cardano.Api.Internal.Certificate
@@ -71,6 +72,7 @@ module Cardano.Api.Internal.Certificate
7172 , AsType (.. )
7273
7374 -- * Internal functions
75+ , certificateToTxCert
7476 , filterUnRegCreds
7577 , filterUnRegDRepCreds
7678 , isDRepRegOrUpdateCert
@@ -99,6 +101,7 @@ import Cardano.Api.Internal.StakePoolMetadata
99101import Cardano.Api.Internal.Utils (noInlineMaybeToStrictMaybe )
100102import Cardano.Api.Internal.Value
101103
104+ import Cardano.Ledger.Api qualified as L
102105import Cardano.Ledger.BaseTypes (strictMaybe )
103106import Cardano.Ledger.Coin qualified as L
104107import Cardano.Ledger.Keys qualified as Ledger
@@ -111,6 +114,7 @@ import Data.Maybe
111114import Data.Text (Text )
112115import Data.Text qualified as Text
113116import Data.Text.Encoding qualified as Text
117+ import Data.Type.Equality (TestEquality (.. ))
114118import Data.Typeable
115119import GHC.Exts (IsList (.. ), fromString )
116120import Network.Socket (PortNumber )
@@ -129,13 +133,15 @@ data Certificate era where
129133 -- 6. Genesis delegation
130134 -- 7. MIR certificates
131135 ShelleyRelatedCertificate
132- :: ShelleyToBabbageEra era
136+ :: Typeable era
137+ => ShelleyToBabbageEra era
133138 -> Ledger. ShelleyTxCert (ShelleyLedgerEra era )
134139 -> Certificate era
135140 -- Conway onwards
136141 -- TODO: Add comments about the new types of certificates
137142 ConwayCertificate
138- :: ConwayEraOnwards era
143+ :: Typeable era
144+ => ConwayEraOnwards era
139145 -> Ledger. ConwayTxCert (ShelleyLedgerEra era )
140146 -> Certificate era
141147 deriving anyclass SerialiseAsCBOR
@@ -146,6 +152,28 @@ deriving instance Ord (Certificate era)
146152
147153deriving instance Show (Certificate era )
148154
155+ instance TestEquality Certificate where
156+ testEquality (ShelleyRelatedCertificate _ c) (ShelleyRelatedCertificate _ c') =
157+ shelleyCertTypeEquality c c'
158+ testEquality (ConwayCertificate _ c) (ConwayCertificate _ c') =
159+ conwayCertTypeEquality c c'
160+ testEquality ShelleyRelatedCertificate {} ConwayCertificate {} = Nothing
161+ testEquality ConwayCertificate {} ShelleyRelatedCertificate {} = Nothing
162+
163+ conwayCertTypeEquality
164+ :: (Typeable eraA , Typeable eraB )
165+ => Ledger. ConwayTxCert (ShelleyLedgerEra eraA )
166+ -> Ledger. ConwayTxCert (ShelleyLedgerEra eraB )
167+ -> Maybe (eraA :~: eraB )
168+ conwayCertTypeEquality _ _ = eqT
169+
170+ shelleyCertTypeEquality
171+ :: (Typeable eraA , Typeable eraB )
172+ => Ledger. ShelleyTxCert (ShelleyLedgerEra eraA )
173+ -> Ledger. ShelleyTxCert (ShelleyLedgerEra eraB )
174+ -> Maybe (eraA :~: eraB )
175+ shelleyCertTypeEquality _ _ = eqT
176+
149177instance Typeable era => HasTypeProxy (Certificate era ) where
150178 data AsType (Certificate era ) = AsCertificate
151179 proxyToAsType _ = AsCertificate
@@ -198,6 +226,20 @@ instance
198226 ConwayCertificate _ (Ledger. ConwayTxCertPool Ledger. RegPool {}) -> " Pool registration"
199227 ConwayCertificate _ (Ledger. ConwayTxCertPool Ledger. RetirePool {}) -> " Pool retirement"
200228
229+ certificateToTxCert :: Certificate era -> L. TxCert (ShelleyLedgerEra era )
230+ certificateToTxCert c =
231+ case c of
232+ ShelleyRelatedCertificate eon cert ->
233+ case eon of
234+ ShelleyToBabbageEraShelley -> cert
235+ ShelleyToBabbageEraAllegra -> cert
236+ ShelleyToBabbageEraMary -> cert
237+ ShelleyToBabbageEraAlonzo -> cert
238+ ShelleyToBabbageEraBabbage -> cert
239+ ConwayCertificate eon cert ->
240+ case eon of
241+ ConwayEraOnwardsConway -> cert
242+
201243-- ----------------------------------------------------------------------------
202244-- Stake pool parameters
203245--
@@ -373,7 +415,8 @@ data GenesisKeyDelegationRequirements era where
373415 -> Hash VrfKey
374416 -> GenesisKeyDelegationRequirements era
375417
376- makeGenesisKeyDelegationCertificate :: GenesisKeyDelegationRequirements era -> Certificate era
418+ makeGenesisKeyDelegationCertificate
419+ :: Typeable era => GenesisKeyDelegationRequirements era -> Certificate era
377420makeGenesisKeyDelegationCertificate
378421 ( GenesisKeyDelegationRequirements
379422 atMostEra
@@ -394,7 +437,7 @@ data MirCertificateRequirements era where
394437 -> MirCertificateRequirements era
395438
396439makeMIRCertificate
397- :: ()
440+ :: Typeable era
398441 => MirCertificateRequirements era
399442 -> Certificate era
400443makeMIRCertificate (MirCertificateRequirements atMostEra mirPot mirTarget) =
@@ -410,7 +453,7 @@ data DRepRegistrationRequirements era where
410453 -> DRepRegistrationRequirements era
411454
412455makeDrepRegistrationCertificate
413- :: ()
456+ :: Typeable era
414457 => DRepRegistrationRequirements era
415458 -> Maybe (Ledger. Anchor (EraCrypto (ShelleyLedgerEra era )))
416459 -> Certificate era
@@ -427,7 +470,7 @@ data CommitteeHotKeyAuthorizationRequirements era where
427470 -> CommitteeHotKeyAuthorizationRequirements era
428471
429472makeCommitteeHotKeyAuthorizationCertificate
430- :: ()
473+ :: Typeable era
431474 => CommitteeHotKeyAuthorizationRequirements era
432475 -> Certificate era
433476makeCommitteeHotKeyAuthorizationCertificate (CommitteeHotKeyAuthorizationRequirements cOnwards coldKeyCredential hotKeyCredential) =
@@ -443,7 +486,7 @@ data CommitteeColdkeyResignationRequirements era where
443486 -> CommitteeColdkeyResignationRequirements era
444487
445488makeCommitteeColdkeyResignationCertificate
446- :: ()
489+ :: Typeable era
447490 => CommitteeColdkeyResignationRequirements era
448491 -> Certificate era
449492makeCommitteeColdkeyResignationCertificate (CommitteeColdkeyResignationRequirements cOnwards coldKeyCred anchor) =
@@ -461,7 +504,7 @@ data DRepUnregistrationRequirements era where
461504 -> DRepUnregistrationRequirements era
462505
463506makeDrepUnregistrationCertificate
464- :: ()
507+ :: Typeable era
465508 => DRepUnregistrationRequirements era
466509 -> Certificate era
467510makeDrepUnregistrationCertificate (DRepUnregistrationRequirements conwayOnwards vcred deposit) =
@@ -488,7 +531,8 @@ data DRepUpdateRequirements era where
488531 -> DRepUpdateRequirements era
489532
490533makeDrepUpdateCertificate
491- :: DRepUpdateRequirements era
534+ :: Typeable era
535+ => DRepUpdateRequirements era
492536 -> Maybe (Ledger. Anchor (EraCrypto (ShelleyLedgerEra era )))
493537 -> Certificate era
494538makeDrepUpdateCertificate (DRepUpdateRequirements conwayOnwards vcred) mAnchor =
0 commit comments