Skip to content

Commit 2935352

Browse files
committed
Introduce pots/v0 namespace for canonical ledger state
New namespace, that follows the same patterns as utxo and blocks namespace.
1 parent e8a0358 commit 2935352

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

libs/cardano-ledger-canonical-state/cardano-ledger-canonical-state.cabal

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ library
3737
exposed-modules:
3838
Cardano.Ledger.CanonicalState.BasicTypes
3939
Cardano.Ledger.CanonicalState.Namespace.Blocks.V0
40+
Cardano.Ledger.CanonicalState.Namespace.Pots.V0
4041
Cardano.Ledger.CanonicalState.Namespace.UTxO.V0
4142

4243
hs-source-dirs: src
@@ -50,6 +51,7 @@ library
5051
scls-cardano,
5152
scls-cbor,
5253
scls-core,
54+
text,
5355

5456
library conway
5557
import: warnings
@@ -78,6 +80,7 @@ library testlib
7880
cardano-ledger-canonical-state:{cardano-ledger-canonical-state, conway},
7981
cardano-ledger-core,
8082
cardano-ledger-conway:{testlib},
83+
generic-random,
8184

8285
test-suite tests
8386
import: warnings

libs/cardano-ledger-canonical-state/src/Cardano/Ledger/CanonicalState/BasicTypes.hs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@
66
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
77
{-# LANGUAGE KindSignatures #-}
88
{-# LANGUAGE MultiParamTypeClasses #-}
9+
{-# LANGUAGE RecordWildCards #-}
910
{-# LANGUAGE ScopedTypeVariables #-}
1011
{-# LANGUAGE TypeApplications #-}
1112

1213
module Cardano.Ledger.CanonicalState.BasicTypes (
1314
OnChain (..),
1415
DecodeOnChain (..),
16+
CanonicalCoin (..),
17+
IsCanonicalCoin (..),
1518
) where
1619

20+
import Cardano.Ledger.Coin (Coin (..), CompactForm (..))
1721
import Cardano.SCLS.CBOR.Canonical (CanonicalDecoder)
1822
import Cardano.SCLS.CBOR.Canonical.Decoder (FromCanonicalCBOR (..))
1923
import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..))
@@ -55,3 +59,34 @@ instance DecodeOnChain v a => FromCanonicalCBOR v (OnChain a) where
5559
-- `toPlainDecoder`.
5660
class DecodeOnChain (v :: Symbol) (a :: Type) where
5761
decodeOnChain :: BS.ByteString -> CanonicalDecoder s a
62+
63+
-- | Wrapper for the coin type
64+
newtype CanonicalCoin = CanonicalCoin {unCoin :: Integer}
65+
deriving (Eq, Ord, Show, Generic)
66+
67+
-- | We introduce type class here because Coin can be created from multiple types.
68+
class IsCanonicalCoin a where
69+
mkCanonicalCoin :: a -> CanonicalCoin
70+
fromCanonicalCoin :: CanonicalCoin -> a
71+
72+
instance IsCanonicalCoin CanonicalCoin where
73+
mkCanonicalCoin = id
74+
fromCanonicalCoin = id
75+
76+
instance IsCanonicalCoin Coin where
77+
mkCanonicalCoin Coin {..} = CanonicalCoin {..}
78+
fromCanonicalCoin (CanonicalCoin i) = Coin i
79+
80+
instance IsCanonicalCoin (CompactForm Coin) where
81+
mkCanonicalCoin (CompactCoin ci) = CanonicalCoin (fromIntegral ci)
82+
fromCanonicalCoin (CanonicalCoin ci) = CompactCoin (fromIntegral ci)
83+
84+
instance IsCanonicalCoin Integer where
85+
mkCanonicalCoin = CanonicalCoin
86+
fromCanonicalCoin (CanonicalCoin ci) = ci
87+
88+
instance ToCanonicalCBOR v CanonicalCoin where
89+
toCanonicalCBOR v (CanonicalCoin ci) = toCanonicalCBOR v ci
90+
91+
instance FromCanonicalCBOR v CanonicalCoin where
92+
fromCanonicalCBOR = fmap CanonicalCoin <$> fromCanonicalCBOR
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE DeriveGeneric #-}
3+
{-# LANGUAGE DerivingStrategies #-}
4+
{-# LANGUAGE MultiParamTypeClasses #-}
5+
{-# LANGUAGE OverloadedStrings #-}
6+
{-# LANGUAGE RecordWildCards #-}
7+
{-# LANGUAGE ScopedTypeVariables #-}
8+
{-# LANGUAGE TypeApplications #-}
9+
{-# LANGUAGE TypeFamilies #-}
10+
{-# OPTIONS_GHC -Wno-orphans #-}
11+
12+
module Cardano.Ledger.CanonicalState.Namespace.Pots.V0 (
13+
PotsIn (..),
14+
PotsOut (..),
15+
) where
16+
17+
import Cardano.Ledger.BaseTypes (EpochNo (..))
18+
import Cardano.Ledger.CanonicalState.BasicTypes (CanonicalCoin (..))
19+
import Cardano.SCLS.CBOR.Canonical.Decoder (FromCanonicalCBOR (..), decodeMapLenCanonicalOf)
20+
import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..), encodeAsMap, mkEncodablePair)
21+
import Cardano.SCLS.Entry.IsKey (IsKey (..))
22+
import Cardano.SCLS.NamespaceCodec (
23+
CanonicalCBOREntryDecoder (..),
24+
CanonicalCBOREntryEncoder (..),
25+
KnownNamespace (..),
26+
namespaceKeySize,
27+
)
28+
import Cardano.SCLS.Versioned (Versioned (..))
29+
import Data.MemPack.ByteOrdered (packWord64beM, unpackBigEndianM)
30+
import Data.Proxy (Proxy (..))
31+
import Data.Text (Text)
32+
import GHC.Generics (Generic)
33+
34+
instance KnownNamespace "pots/v0" where
35+
type NamespaceKey "pots/v0" = PotsIn
36+
type NamespaceEntry "pots/v0" = PotsOut
37+
38+
newtype PotsIn = PotsIn EpochNo
39+
deriving (Eq, Ord, Show)
40+
41+
instance IsKey PotsIn where
42+
keySize = namespaceKeySize @"pots/v0"
43+
packKeyM (PotsIn (EpochNo epochNo)) = do
44+
packWord64beM epochNo
45+
unpackKeyM = do
46+
epochNo <- unpackBigEndianM
47+
return $ PotsIn (EpochNo epochNo)
48+
49+
data PotsOut = PotsOut
50+
{ poFee :: !CanonicalCoin
51+
, poDeposit :: !CanonicalCoin
52+
, poDonation :: !CanonicalCoin
53+
, poReserves :: !CanonicalCoin
54+
, poTreasury :: !CanonicalCoin
55+
}
56+
deriving (Eq, Show)
57+
deriving (Generic)
58+
59+
instance ToCanonicalCBOR "pots/v0" PotsOut where
60+
toCanonicalCBOR v PotsOut {..} =
61+
encodeAsMap
62+
[ mkEncodablePair v ("fee" :: Text) poFee
63+
, mkEncodablePair v ("deposit" :: Text) poDeposit
64+
, mkEncodablePair v ("donation" :: Text) poDonation
65+
, mkEncodablePair v ("reserves" :: Text) poReserves
66+
, mkEncodablePair v ("treasury" :: Text) poTreasury
67+
]
68+
69+
instance FromCanonicalCBOR "pots/v0" PotsOut where
70+
fromCanonicalCBOR = do
71+
decodeMapLenCanonicalOf 5
72+
Versioned ("fee" :: Text) <- fromCanonicalCBOR
73+
Versioned poFee <- fromCanonicalCBOR
74+
Versioned ("deposit" :: Text) <- fromCanonicalCBOR
75+
Versioned poDeposit <- fromCanonicalCBOR
76+
Versioned ("donation" :: Text) <- fromCanonicalCBOR
77+
Versioned poDonation <- fromCanonicalCBOR
78+
Versioned ("reserves" :: Text) <- fromCanonicalCBOR
79+
Versioned poReserves <- fromCanonicalCBOR
80+
Versioned ("treasury" :: Text) <- fromCanonicalCBOR
81+
Versioned poTreasury <- fromCanonicalCBOR
82+
pure (Versioned PotsOut {..})
83+
84+
instance CanonicalCBOREntryEncoder "pots/v0" PotsOut where
85+
encodeEntry n = toCanonicalCBOR (Proxy @"pots/v0") n
86+
87+
instance CanonicalCBOREntryDecoder "pots/v0" PotsOut where
88+
decodeEntry = fromCanonicalCBOR

libs/cardano-ledger-canonical-state/test/Test/Cardano/Ledger/CanonicalState/Spec.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module Test.Cardano.Ledger.CanonicalState.Spec (spec) where
99

1010
import Cardano.Ledger.CanonicalState.Conway ()
1111
import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 as Blocks.V0
12+
import qualified Cardano.Ledger.CanonicalState.Namespace.Pots.V0 as Pots.V0
1213
import qualified Cardano.Ledger.CanonicalState.Namespace.UTxO.V0 as UTxO.V0
1314
import Cardano.Ledger.Conway (ConwayEra)
1415
import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..))
@@ -24,11 +25,15 @@ spec = do
2425
describe "blocks/v0" $ do
2526
isCanonical @"blocks/v0" @Blocks.V0.BlockOut
2627
validateType @"blocks/v0" @Blocks.V0.BlockOut "record_entry"
28+
describe "pots/v0" $ do
29+
isCanonical @"pots/v0" @Pots.V0.PotsOut
30+
validateType @"pots/v0" @Pots.V0.PotsOut "record_entry"
2731
describe "utxo/v0" $ do
2832
isCanonical @"utxo/v0" @(UTxO.V0.UtxoOut ConwayEra)
2933
validateType @"utxo/v0" @(UTxO.V0.UtxoOut ConwayEra) "record_entry"
3034
describe "namespaces" $ do
3135
testNS @"blocks/v0"
36+
testNS @"pots/v0"
3237
testNS @"utxo/v0"
3338

3439
isCanonical ::

libs/cardano-ledger-canonical-state/testlib/Test/Cardano/Ledger/CanonicalState/Arbitrary.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77

88
module Test.Cardano.Ledger.CanonicalState.Arbitrary () where
99

10+
import Cardano.Ledger.CanonicalState.BasicTypes (CanonicalCoin (..))
1011
import Cardano.Ledger.CanonicalState.Conway ()
1112
import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 as Blocks.V0
13+
import qualified Cardano.Ledger.CanonicalState.Namespace.Pots.V0 as Pots.V0
14+
import Generic.Random (genericArbitraryU)
1215
import qualified Cardano.Ledger.CanonicalState.Namespace.UTxO.V0 as UtxoOut.V0
1316
import Cardano.Ledger.Core (Era, EraTxOut, TxOut)
1417
import Test.Cardano.Ledger.Conway.Arbitrary ()
@@ -21,3 +24,9 @@ instance Arbitrary Blocks.V0.BlockOut where
2124

2225
instance (EraTxOut era, Arbitrary (TxOut era), Era era) => Arbitrary (UtxoOut.V0.UtxoOut era) where
2326
arbitrary = UtxoOut.V0.mkUtxo <$> arbitrary
27+
28+
instance Arbitrary CanonicalCoin where
29+
arbitrary = CanonicalCoin . fromIntegral . getPositive @Integer <$> arbitrary
30+
31+
instance Arbitrary Pots.V0.PotsOut where
32+
arbitrary = genericArbitraryU

0 commit comments

Comments
 (0)