Skip to content

Commit 3c83b92

Browse files
committed
Use patterns and functions to create certificates
1 parent cf59699 commit 3c83b92

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

cardano-wasm/src-lib/Cardano/Wasm/Api/Certificate/StakeCertificate.hs

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DataKinds #-}
12
{-# LANGUAGE ExistentialQuantification #-}
23
{-# LANGUAGE FlexibleContexts #-}
34
{-# LANGUAGE GADTs #-}
@@ -36,14 +37,19 @@ import Cardano.Api.Experimental (Era (..), obtainCommonConstraints)
3637
import Cardano.Api.Experimental qualified as Exp
3738
import Cardano.Api.Experimental.Certificate (Certificate (..))
3839
import Cardano.Api.Ledger
39-
( ConwayDelegCert (..)
40-
, ConwayTxCert (..)
41-
, Credential (..)
42-
, maybeToStrictMaybe
40+
( Credential (..)
41+
, KeyRole (Staking)
42+
, ShelleyEraTxCert (mkUnRegTxCert)
43+
, mkDelegTxCert
44+
, mkRegDepositDelegTxCert
45+
, mkRegDepositTxCert
46+
, mkRegTxCert
47+
, mkUnRegDepositTxCert
48+
, mkUnRegTxCert
4349
)
4450
import Cardano.Api.Serialise.Raw qualified as Api
4551

46-
import Cardano.Ledger.Api (Delegatee (..))
52+
import Cardano.Ledger.Api (ConwayEraTxCert, Delegatee (..), EraTxCert (..))
4753
import Cardano.Wasm.ExceptionHandling (rightOrError, throwError, toMonadFail)
4854

4955
import Control.Monad.Catch (MonadThrow)
@@ -102,7 +108,7 @@ instance FromJSON StakeCertificateObject where
102108
"UnregisterStake" -> return UnregisterStake
103109
"DelegateOnly" -> return DelegateOnly
104110
_ -> toMonadFail $ throwError ("Invalid action for StakeCertificateObject: " ++ show actionStr)
105-
delegateStakeText :: Maybe Text <- o .:? "delegateStake"
111+
delegateStakeText :: Maybe Text <- o .: "delegateStake"
106112
delegateStake :: Maybe PoolId <-
107113
traverse
108114
( toMonadFail
@@ -205,30 +211,52 @@ toCardanoApiCertificate
205211
-> StakeCertificateAction
206212
-> Maybe PoolId
207213
-> m (Certificate (Exp.LedgerEra era))
208-
toCardanoApiCertificate era stakeCredential deposit action delegateStake =
214+
toCardanoApiCertificate era stakeCredential mDeposit action delegateStake =
209215
Exp.obtainCommonConstraints era $
210216
conwayEraOnwardsConstraints (convert era) $
211-
Certificate . ConwayTxCertDeleg
217+
Certificate
212218
<$> ( case (action, delegateStake) of
213219
(DelegateOnly, Nothing) ->
214220
throwError
215221
"Certificate must at least either: register, unregister, or delegate"
216-
(RegisterStake, Nothing) ->
217-
return $ ConwayRegCert (KeyHashObj $ unStakeKeyHash stakeCredential) (maybeToStrictMaybe deposit)
218-
(UnregisterStake, Nothing) ->
219-
return $ ConwayUnRegCert (KeyHashObj $ unStakeKeyHash stakeCredential) (maybeToStrictMaybe deposit)
222+
(RegisterStake, Nothing) -> makeRegUnregCertWithMaybeDeposit era mkRegDepositTxCert mkRegTxCert stakeCredential mDeposit
223+
(UnregisterStake, Nothing) -> makeRegUnregCertWithMaybeDeposit era mkUnRegDepositTxCert mkUnRegTxCert stakeCredential mDeposit
220224
(DelegateOnly, Just poolId) ->
221225
return $
222-
ConwayDelegCert
226+
mkDelegTxCert
223227
(KeyHashObj $ unStakeKeyHash stakeCredential)
224228
(DelegStake $ unStakePoolKeyHash poolId)
225229
(RegisterStake, Just poolId) ->
226-
ConwayRegDelegCert
230+
mkRegDepositDelegTxCert
227231
(KeyHashObj $ unStakeKeyHash stakeCredential)
228232
(DelegStake $ unStakePoolKeyHash poolId)
229-
<$> case deposit of
233+
<$> case mDeposit of
230234
Just dep -> return dep
231235
Nothing -> throwError "Deposit must be specified for stake registration and delegation certificate"
232236
(UnregisterStake, Just _) ->
233237
throwError "Cannot unregister and delegate in the same certificate"
234238
)
239+
where
240+
makeRegUnregCertWithMaybeDeposit
241+
:: (Exp.EraCommonConstraints era, MonadThrow m)
242+
=> Era era
243+
-> ( forall era2
244+
. ConwayEraTxCert era2
245+
=> Credential Staking -> Coin -> TxCert era2
246+
)
247+
-> ( forall era2
248+
. ShelleyEraTxCert era2
249+
=> Credential Staking -> TxCert era2
250+
)
251+
-> Hash StakeKey
252+
-> Maybe Coin
253+
-> m (TxCert (Exp.LedgerEra era))
254+
makeRegUnregCertWithMaybeDeposit _era' makeRegUnregDeposit _makeRegUnregNoDeposit stakeCredential' (Just deposit) =
255+
return $
256+
makeRegUnregDeposit (KeyHashObj $ unStakeKeyHash stakeCredential') deposit
257+
makeRegUnregCertWithMaybeDeposit era' _makeRegUnregDeposit makeRegUnregNoDeposit stakeCredential' Nothing =
258+
case era' of
259+
Exp.ConwayEra ->
260+
return $
261+
makeRegUnregNoDeposit (KeyHashObj $ unStakeKeyHash stakeCredential')
262+
Exp.DijkstraEra -> throwError "Deposit must be specified for stake registration/unregistration in Dijkstra era"

0 commit comments

Comments
 (0)