|
| 1 | +{-# LANGUAGE DataKinds #-} |
| 2 | +{-# LANGUAGE DeriveGeneric #-} |
| 3 | +{-# LANGUAGE DerivingVia #-} |
| 4 | +{-# LANGUAGE FlexibleContexts #-} |
| 5 | +{-# LANGUAGE FlexibleInstances #-} |
| 6 | +{-# LANGUAGE GeneralizedNewtypeDeriving #-} |
| 7 | +{-# LANGUAGE MultiParamTypeClasses #-} |
| 8 | +{-# LANGUAGE OverloadedStrings #-} |
| 9 | +{-# LANGUAGE RecordWildCards #-} |
| 10 | +{-# LANGUAGE StandaloneDeriving #-} |
| 11 | +{-# LANGUAGE TypeApplications #-} |
| 12 | +{-# LANGUAGE TypeFamilies #-} |
| 13 | +{-# LANGUAGE TypeOperators #-} |
| 14 | +{-# LANGUAGE UndecidableInstances #-} |
| 15 | +{-# OPTIONS_GHC -Wno-orphans #-} |
| 16 | + |
| 17 | +module Cardano.Ledger.CanonicalState.Namespace.EntitiesAccounts.V0 ( |
| 18 | + EntitiesAccountsIn (..), |
| 19 | + EntitiesAccountsOut (..), |
| 20 | + CanonicalAccountState (..), |
| 21 | +) where |
| 22 | + |
| 23 | +import Cardano.Ledger.CanonicalState.BasicTypes (CanonicalCoin, decodeNamespacedField) |
| 24 | +import Cardano.Ledger.CanonicalState.LedgerCBOR (LedgerCBOR (LedgerCBOR)) |
| 25 | +import Cardano.Ledger.CanonicalState.Namespace (Era, NamespaceEra) |
| 26 | +import Cardano.Ledger.Core (KeyHash, KeyRole (StakePool), Staking) |
| 27 | +import Cardano.Ledger.Credential (Credential) |
| 28 | +import Cardano.Ledger.State (DRep) |
| 29 | +import Cardano.SCLS.CBOR.Canonical.Decoder (FromCanonicalCBOR (..), decodeMapLenCanonicalOf) |
| 30 | +import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..), encodeAsMap, mkEncodablePair) |
| 31 | +import Cardano.SCLS.Entry.IsKey (IsKey (..)) |
| 32 | +import Cardano.SCLS.NamespaceCodec ( |
| 33 | + CanonicalCBOREntryDecoder (..), |
| 34 | + CanonicalCBOREntryEncoder (..), |
| 35 | + KnownNamespace (..), |
| 36 | + NamespaceKeySize, |
| 37 | + namespaceKeySize, |
| 38 | + ) |
| 39 | +import Cardano.SCLS.Versioned (Versioned (..)) |
| 40 | +import Data.MemPack (MemPack (packM, unpackM)) |
| 41 | +import Data.Proxy (Proxy (..)) |
| 42 | +import Data.Text (Text) |
| 43 | +import GHC.Generics (Generic) |
| 44 | + |
| 45 | +instance (Era era, NamespaceEra "entities/accounts/v0" ~ era) => KnownNamespace "entities/accounts/v0" where |
| 46 | + type NamespaceKey "entities/accounts/v0" = EntitiesAccountsIn |
| 47 | + type NamespaceEntry "entities/accounts/v0" = EntitiesAccountsOut |
| 48 | + |
| 49 | +instance |
| 50 | + (Era era, NamespaceEra "entities/accounts/v0" ~ era) => |
| 51 | + CanonicalCBOREntryEncoder "entities/accounts/v0" EntitiesAccountsOut |
| 52 | + where |
| 53 | + encodeEntry (EntitiesAccountsOut n) = toCanonicalCBOR (Proxy @"entities/accounts/v0") n |
| 54 | + |
| 55 | +instance |
| 56 | + (Era era, NamespaceEra "entities/accounts/v0" ~ era) => |
| 57 | + CanonicalCBOREntryDecoder "entities/accounts/v0" EntitiesAccountsOut |
| 58 | + where |
| 59 | + decodeEntry = fmap EntitiesAccountsOut <$> fromCanonicalCBOR |
| 60 | + |
| 61 | +newtype EntitiesAccountsIn = EntitiesAccountsIn (Credential Staking) |
| 62 | + deriving (Eq, Ord, Show) |
| 63 | + |
| 64 | +type instance NamespaceKeySize "entities/accounts/v0" = 29 |
| 65 | + |
| 66 | +instance IsKey EntitiesAccountsIn where |
| 67 | + keySize = namespaceKeySize @"entities/accounts/v0" |
| 68 | + packKeyM (EntitiesAccountsIn accountCredential) = |
| 69 | + packM accountCredential |
| 70 | + unpackKeyM = |
| 71 | + EntitiesAccountsIn <$> unpackM |
| 72 | + |
| 73 | +newtype EntitiesAccountsOut |
| 74 | + = EntitiesAccountsOut CanonicalAccountState |
| 75 | + deriving (Eq, Show, Generic) |
| 76 | + |
| 77 | +deriving newtype instance |
| 78 | + ToCanonicalCBOR "entities/accounts/v0" CanonicalAccountState => |
| 79 | + ToCanonicalCBOR "entities/accounts/v0" EntitiesAccountsOut |
| 80 | + |
| 81 | +deriving instance |
| 82 | + FromCanonicalCBOR "entities/accounts/v0" CanonicalAccountState => |
| 83 | + FromCanonicalCBOR "entities/accounts/v0" EntitiesAccountsOut |
| 84 | + |
| 85 | +data CanonicalAccountState = CanonicalAccountState |
| 86 | + { casBalance :: CanonicalCoin |
| 87 | + , casDeposit :: CanonicalCoin |
| 88 | + , casDRepDelegation :: Maybe DRep |
| 89 | + , casStakePoolDelegation :: Maybe (KeyHash StakePool) |
| 90 | + } |
| 91 | + deriving (Eq, Show, Generic) |
| 92 | + |
| 93 | +instance |
| 94 | + (Era era, NamespaceEra "entities/accounts/v0" ~ era) => |
| 95 | + ToCanonicalCBOR "entities/accounts/v0" CanonicalAccountState |
| 96 | + where |
| 97 | + toCanonicalCBOR v CanonicalAccountState {..} = |
| 98 | + encodeAsMap |
| 99 | + [ mkEncodablePair v ("balance" :: Text) casBalance |
| 100 | + , mkEncodablePair v ("deposit" :: Text) casDeposit |
| 101 | + , mkEncodablePair v ("drep_delegation" :: Text) casDRepDelegation |
| 102 | + , mkEncodablePair v ("stake_pool_delegation" :: Text) casStakePoolDelegation |
| 103 | + ] |
| 104 | + |
| 105 | +instance (Era era, NamespaceEra "entities/accounts/v0" ~ era) => FromCanonicalCBOR v CanonicalAccountState where |
| 106 | + fromCanonicalCBOR = do |
| 107 | + decodeMapLenCanonicalOf 4 |
| 108 | + Versioned casBalance <- decodeNamespacedField @"entities/accounts/v0" ("balance" :: Text) |
| 109 | + Versioned casDeposit <- decodeNamespacedField @"entities/accounts/v0" ("deposit" :: Text) |
| 110 | + Versioned casDRepDelegation <- |
| 111 | + decodeNamespacedField @"entities/accounts/v0" ("drep_delegation" :: Text) |
| 112 | + Versioned casStakePoolDelegation <- |
| 113 | + decodeNamespacedField @"entities/accounts/v0" ("stake_pool_delegation" :: Text) |
| 114 | + |
| 115 | + pure $ Versioned $ CanonicalAccountState {..} |
| 116 | + |
| 117 | +deriving via |
| 118 | + LedgerCBOR v DRep |
| 119 | + instance |
| 120 | + (Era era, NamespaceEra v ~ era) => FromCanonicalCBOR v DRep |
| 121 | + |
| 122 | +deriving via |
| 123 | + LedgerCBOR v DRep |
| 124 | + instance |
| 125 | + (Era era, NamespaceEra v ~ era) => ToCanonicalCBOR v DRep |
0 commit comments