|
| 1 | +{-# LANGUAGE DataKinds #-} |
1 | 2 | {-# LANGUAGE ExistentialQuantification #-} |
2 | 3 | {-# LANGUAGE FlexibleContexts #-} |
3 | 4 | {-# LANGUAGE GADTs #-} |
@@ -36,14 +37,19 @@ import Cardano.Api.Experimental (Era (..), obtainCommonConstraints) |
36 | 37 | import Cardano.Api.Experimental qualified as Exp |
37 | 38 | import Cardano.Api.Experimental.Certificate (Certificate (..)) |
38 | 39 | 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 |
43 | 49 | ) |
44 | 50 | import Cardano.Api.Serialise.Raw qualified as Api |
45 | 51 |
|
46 | | -import Cardano.Ledger.Api (Delegatee (..)) |
| 52 | +import Cardano.Ledger.Api (ConwayEraTxCert, Delegatee (..), EraTxCert (..)) |
47 | 53 | import Cardano.Wasm.ExceptionHandling (rightOrError, throwError, toMonadFail) |
48 | 54 |
|
49 | 55 | import Control.Monad.Catch (MonadThrow) |
@@ -102,7 +108,7 @@ instance FromJSON StakeCertificateObject where |
102 | 108 | "UnregisterStake" -> return UnregisterStake |
103 | 109 | "DelegateOnly" -> return DelegateOnly |
104 | 110 | _ -> toMonadFail $ throwError ("Invalid action for StakeCertificateObject: " ++ show actionStr) |
105 | | - delegateStakeText :: Maybe Text <- o .:? "delegateStake" |
| 111 | + delegateStakeText :: Maybe Text <- o .: "delegateStake" |
106 | 112 | delegateStake :: Maybe PoolId <- |
107 | 113 | traverse |
108 | 114 | ( toMonadFail |
@@ -205,30 +211,52 @@ toCardanoApiCertificate |
205 | 211 | -> StakeCertificateAction |
206 | 212 | -> Maybe PoolId |
207 | 213 | -> m (Certificate (Exp.LedgerEra era)) |
208 | | -toCardanoApiCertificate era stakeCredential deposit action delegateStake = |
| 214 | +toCardanoApiCertificate era stakeCredential mDeposit action delegateStake = |
209 | 215 | Exp.obtainCommonConstraints era $ |
210 | 216 | conwayEraOnwardsConstraints (convert era) $ |
211 | | - Certificate . ConwayTxCertDeleg |
| 217 | + Certificate |
212 | 218 | <$> ( case (action, delegateStake) of |
213 | 219 | (DelegateOnly, Nothing) -> |
214 | 220 | throwError |
215 | 221 | "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 |
220 | 224 | (DelegateOnly, Just poolId) -> |
221 | 225 | return $ |
222 | | - ConwayDelegCert |
| 226 | + mkDelegTxCert |
223 | 227 | (KeyHashObj $ unStakeKeyHash stakeCredential) |
224 | 228 | (DelegStake $ unStakePoolKeyHash poolId) |
225 | 229 | (RegisterStake, Just poolId) -> |
226 | | - ConwayRegDelegCert |
| 230 | + mkRegDepositDelegTxCert |
227 | 231 | (KeyHashObj $ unStakeKeyHash stakeCredential) |
228 | 232 | (DelegStake $ unStakePoolKeyHash poolId) |
229 | | - <$> case deposit of |
| 233 | + <$> case mDeposit of |
230 | 234 | Just dep -> return dep |
231 | 235 | Nothing -> throwError "Deposit must be specified for stake registration and delegation certificate" |
232 | 236 | (UnregisterStake, Just _) -> |
233 | 237 | throwError "Cannot unregister and delegate in the same certificate" |
234 | 238 | ) |
| 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