{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.Ledger.Api.State.Query.CommitteeMembersState (
  CommitteeMemberState (..),
  CommitteeMembersState (..),
  HotCredAuthStatus (..),
  MemberStatus (..),
  NextEpochChange (..),
) where

import Cardano.Ledger.BaseTypes (Anchor, UnitInterval)
import Cardano.Ledger.Binary (
  DecCBOR (decCBOR),
  EncCBOR (encCBOR),
  decodeEnumBounded,
  encodeEnum,
 )
import Cardano.Ledger.Binary.Coders (Decode (..), Encode (..), decode, encode, (!>), (<!))
import Cardano.Ledger.Credential (Credential (..))
import Cardano.Ledger.Crypto (Crypto)
import Cardano.Ledger.Keys (
  KeyRole (..),
 )
import Cardano.Ledger.Slot (
  EpochNo (..),
 )
import Data.Aeson (KeyValue, ToJSON (..), object, pairs, (.=))
import Data.Map.Strict (Map)
import GHC.Generics (Generic)

data MemberStatus
  = -- Votes of this member will count during ratification
    Active
  | Expired
  | -- | This can happen when a hot credential for an unknown cold credential exists.
    -- Such Committee member will be either removed from the state at the next
    -- epoch boundary or enacted as a new member.
    Unrecognized
  deriving (Int -> MemberStatus -> ShowS
[MemberStatus] -> ShowS
MemberStatus -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MemberStatus] -> ShowS
$cshowList :: [MemberStatus] -> ShowS
show :: MemberStatus -> String
$cshow :: MemberStatus -> String
showsPrec :: Int -> MemberStatus -> ShowS
$cshowsPrec :: Int -> MemberStatus -> ShowS
Show, MemberStatus -> MemberStatus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MemberStatus -> MemberStatus -> Bool
$c/= :: MemberStatus -> MemberStatus -> Bool
== :: MemberStatus -> MemberStatus -> Bool
$c== :: MemberStatus -> MemberStatus -> Bool
Eq, Int -> MemberStatus
MemberStatus -> Int
MemberStatus -> [MemberStatus]
MemberStatus -> MemberStatus
MemberStatus -> MemberStatus -> [MemberStatus]
MemberStatus -> MemberStatus -> MemberStatus -> [MemberStatus]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: MemberStatus -> MemberStatus -> MemberStatus -> [MemberStatus]
$cenumFromThenTo :: MemberStatus -> MemberStatus -> MemberStatus -> [MemberStatus]
enumFromTo :: MemberStatus -> MemberStatus -> [MemberStatus]
$cenumFromTo :: MemberStatus -> MemberStatus -> [MemberStatus]
enumFromThen :: MemberStatus -> MemberStatus -> [MemberStatus]
$cenumFromThen :: MemberStatus -> MemberStatus -> [MemberStatus]
enumFrom :: MemberStatus -> [MemberStatus]
$cenumFrom :: MemberStatus -> [MemberStatus]
fromEnum :: MemberStatus -> Int
$cfromEnum :: MemberStatus -> Int
toEnum :: Int -> MemberStatus
$ctoEnum :: Int -> MemberStatus
pred :: MemberStatus -> MemberStatus
$cpred :: MemberStatus -> MemberStatus
succ :: MemberStatus -> MemberStatus
$csucc :: MemberStatus -> MemberStatus
Enum, MemberStatus
forall a. a -> a -> Bounded a
maxBound :: MemberStatus
$cmaxBound :: MemberStatus
minBound :: MemberStatus
$cminBound :: MemberStatus
Bounded, forall x. Rep MemberStatus x -> MemberStatus
forall x. MemberStatus -> Rep MemberStatus x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MemberStatus x -> MemberStatus
$cfrom :: forall x. MemberStatus -> Rep MemberStatus x
Generic, Eq MemberStatus
MemberStatus -> MemberStatus -> Bool
MemberStatus -> MemberStatus -> Ordering
MemberStatus -> MemberStatus -> MemberStatus
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MemberStatus -> MemberStatus -> MemberStatus
$cmin :: MemberStatus -> MemberStatus -> MemberStatus
max :: MemberStatus -> MemberStatus -> MemberStatus
$cmax :: MemberStatus -> MemberStatus -> MemberStatus
>= :: MemberStatus -> MemberStatus -> Bool
$c>= :: MemberStatus -> MemberStatus -> Bool
> :: MemberStatus -> MemberStatus -> Bool
$c> :: MemberStatus -> MemberStatus -> Bool
<= :: MemberStatus -> MemberStatus -> Bool
$c<= :: MemberStatus -> MemberStatus -> Bool
< :: MemberStatus -> MemberStatus -> Bool
$c< :: MemberStatus -> MemberStatus -> Bool
compare :: MemberStatus -> MemberStatus -> Ordering
$ccompare :: MemberStatus -> MemberStatus -> Ordering
Ord, [MemberStatus] -> Encoding
[MemberStatus] -> Value
MemberStatus -> Bool
MemberStatus -> Encoding
MemberStatus -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
omitField :: MemberStatus -> Bool
$comitField :: MemberStatus -> Bool
toEncodingList :: [MemberStatus] -> Encoding
$ctoEncodingList :: [MemberStatus] -> Encoding
toJSONList :: [MemberStatus] -> Value
$ctoJSONList :: [MemberStatus] -> Value
toEncoding :: MemberStatus -> Encoding
$ctoEncoding :: MemberStatus -> Encoding
toJSON :: MemberStatus -> Value
$ctoJSON :: MemberStatus -> Value
ToJSON)

instance EncCBOR MemberStatus where
  encCBOR :: MemberStatus -> Encoding
encCBOR = forall a. Enum a => a -> Encoding
encodeEnum

instance DecCBOR MemberStatus where
  decCBOR :: forall s. Decoder s MemberStatus
decCBOR = forall a s. (Enum a, Bounded a, Typeable a) => Decoder s a
decodeEnumBounded

data HotCredAuthStatus c
  = MemberAuthorized (Credential 'HotCommitteeRole c)
  | -- | Member enacted, but no hot credential for voting has been registered
    MemberNotAuthorized
  | MemberResigned (Maybe (Anchor c))
  deriving (Int -> HotCredAuthStatus c -> ShowS
forall c. Int -> HotCredAuthStatus c -> ShowS
forall c. [HotCredAuthStatus c] -> ShowS
forall c. HotCredAuthStatus c -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HotCredAuthStatus c] -> ShowS
$cshowList :: forall c. [HotCredAuthStatus c] -> ShowS
show :: HotCredAuthStatus c -> String
$cshow :: forall c. HotCredAuthStatus c -> String
showsPrec :: Int -> HotCredAuthStatus c -> ShowS
$cshowsPrec :: forall c. Int -> HotCredAuthStatus c -> ShowS
Show, HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c/= :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
== :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c== :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
Eq, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall c x. Rep (HotCredAuthStatus c) x -> HotCredAuthStatus c
forall c x. HotCredAuthStatus c -> Rep (HotCredAuthStatus c) x
$cto :: forall c x. Rep (HotCredAuthStatus c) x -> HotCredAuthStatus c
$cfrom :: forall c x. HotCredAuthStatus c -> Rep (HotCredAuthStatus c) x
Generic, HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
HotCredAuthStatus c -> HotCredAuthStatus c -> Ordering
forall c. Eq (HotCredAuthStatus c)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Ordering
forall c.
HotCredAuthStatus c -> HotCredAuthStatus c -> HotCredAuthStatus c
min :: HotCredAuthStatus c -> HotCredAuthStatus c -> HotCredAuthStatus c
$cmin :: forall c.
HotCredAuthStatus c -> HotCredAuthStatus c -> HotCredAuthStatus c
max :: HotCredAuthStatus c -> HotCredAuthStatus c -> HotCredAuthStatus c
$cmax :: forall c.
HotCredAuthStatus c -> HotCredAuthStatus c -> HotCredAuthStatus c
>= :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c>= :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
> :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c> :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
<= :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c<= :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
< :: HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
$c< :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Bool
compare :: HotCredAuthStatus c -> HotCredAuthStatus c -> Ordering
$ccompare :: forall c. HotCredAuthStatus c -> HotCredAuthStatus c -> Ordering
Ord, forall c. Crypto c => [HotCredAuthStatus c] -> Encoding
forall c. Crypto c => [HotCredAuthStatus c] -> Value
forall c. Crypto c => HotCredAuthStatus c -> Bool
forall c. Crypto c => HotCredAuthStatus c -> Encoding
forall c. Crypto c => HotCredAuthStatus c -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
omitField :: HotCredAuthStatus c -> Bool
$comitField :: forall c. Crypto c => HotCredAuthStatus c -> Bool
toEncodingList :: [HotCredAuthStatus c] -> Encoding
$ctoEncodingList :: forall c. Crypto c => [HotCredAuthStatus c] -> Encoding
toJSONList :: [HotCredAuthStatus c] -> Value
$ctoJSONList :: forall c. Crypto c => [HotCredAuthStatus c] -> Value
toEncoding :: HotCredAuthStatus c -> Encoding
$ctoEncoding :: forall c. Crypto c => HotCredAuthStatus c -> Encoding
toJSON :: HotCredAuthStatus c -> Value
$ctoJSON :: forall c. Crypto c => HotCredAuthStatus c -> Value
ToJSON)

instance Crypto c => EncCBOR (HotCredAuthStatus c) where
  encCBOR :: HotCredAuthStatus c -> Encoding
encCBOR =
    forall (w :: Wrapped) t. Encode w t -> Encoding
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
      MemberAuthorized Credential 'HotCommitteeRole c
cred -> forall t. t -> Word -> Encode 'Open t
Sum forall c. Credential 'HotCommitteeRole c -> HotCredAuthStatus c
MemberAuthorized Word
0 forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Credential 'HotCommitteeRole c
cred
      HotCredAuthStatus c
MemberNotAuthorized -> forall t. t -> Word -> Encode 'Open t
Sum forall c. HotCredAuthStatus c
MemberNotAuthorized Word
1
      MemberResigned Maybe (Anchor c)
anchor -> forall t. t -> Word -> Encode 'Open t
Sum forall c. Maybe (Anchor c) -> HotCredAuthStatus c
MemberResigned Word
2 forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Maybe (Anchor c)
anchor

instance Crypto c => DecCBOR (HotCredAuthStatus c) where
  decCBOR :: forall s. Decoder s (HotCredAuthStatus c)
decCBOR =
    forall (w :: Wrapped) t s. Decode w t -> Decoder s t
decode forall a b. (a -> b) -> a -> b
$ forall t.
Text -> (Word -> Decode 'Open t) -> Decode ('Closed 'Dense) t
Summands Text
"HotCredAuthStatus" forall a b. (a -> b) -> a -> b
$ \case
      Word
0 -> forall t. t -> Decode 'Open t
SumD forall c. Credential 'HotCommitteeRole c -> HotCredAuthStatus c
MemberAuthorized forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      Word
1 -> forall t. t -> Decode 'Open t
SumD forall c. HotCredAuthStatus c
MemberNotAuthorized
      Word
2 -> forall t. t -> Decode 'Open t
SumD forall c. Maybe (Anchor c) -> HotCredAuthStatus c
MemberResigned forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      Word
k -> forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
k

data NextEpochChange
  = --- | Member not enacted yet, but will be at the next epoch
    ToBeEnacted
  | -- | Member will be removed
    ToBeRemoved
  | NoChangeExpected
  | ToBeExpired
  | TermAdjusted EpochNo
  deriving (Int -> NextEpochChange -> ShowS
[NextEpochChange] -> ShowS
NextEpochChange -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NextEpochChange] -> ShowS
$cshowList :: [NextEpochChange] -> ShowS
show :: NextEpochChange -> String
$cshow :: NextEpochChange -> String
showsPrec :: Int -> NextEpochChange -> ShowS
$cshowsPrec :: Int -> NextEpochChange -> ShowS
Show, NextEpochChange -> NextEpochChange -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NextEpochChange -> NextEpochChange -> Bool
$c/= :: NextEpochChange -> NextEpochChange -> Bool
== :: NextEpochChange -> NextEpochChange -> Bool
$c== :: NextEpochChange -> NextEpochChange -> Bool
Eq, forall x. Rep NextEpochChange x -> NextEpochChange
forall x. NextEpochChange -> Rep NextEpochChange x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NextEpochChange x -> NextEpochChange
$cfrom :: forall x. NextEpochChange -> Rep NextEpochChange x
Generic, Eq NextEpochChange
NextEpochChange -> NextEpochChange -> Bool
NextEpochChange -> NextEpochChange -> Ordering
NextEpochChange -> NextEpochChange -> NextEpochChange
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NextEpochChange -> NextEpochChange -> NextEpochChange
$cmin :: NextEpochChange -> NextEpochChange -> NextEpochChange
max :: NextEpochChange -> NextEpochChange -> NextEpochChange
$cmax :: NextEpochChange -> NextEpochChange -> NextEpochChange
>= :: NextEpochChange -> NextEpochChange -> Bool
$c>= :: NextEpochChange -> NextEpochChange -> Bool
> :: NextEpochChange -> NextEpochChange -> Bool
$c> :: NextEpochChange -> NextEpochChange -> Bool
<= :: NextEpochChange -> NextEpochChange -> Bool
$c<= :: NextEpochChange -> NextEpochChange -> Bool
< :: NextEpochChange -> NextEpochChange -> Bool
$c< :: NextEpochChange -> NextEpochChange -> Bool
compare :: NextEpochChange -> NextEpochChange -> Ordering
$ccompare :: NextEpochChange -> NextEpochChange -> Ordering
Ord, [NextEpochChange] -> Encoding
[NextEpochChange] -> Value
NextEpochChange -> Bool
NextEpochChange -> Encoding
NextEpochChange -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
omitField :: NextEpochChange -> Bool
$comitField :: NextEpochChange -> Bool
toEncodingList :: [NextEpochChange] -> Encoding
$ctoEncodingList :: [NextEpochChange] -> Encoding
toJSONList :: [NextEpochChange] -> Value
$ctoJSONList :: [NextEpochChange] -> Value
toEncoding :: NextEpochChange -> Encoding
$ctoEncoding :: NextEpochChange -> Encoding
toJSON :: NextEpochChange -> Value
$ctoJSON :: NextEpochChange -> Value
ToJSON)

instance EncCBOR NextEpochChange where
  encCBOR :: NextEpochChange -> Encoding
encCBOR =
    forall (w :: Wrapped) t. Encode w t -> Encoding
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
      NextEpochChange
ToBeEnacted -> forall t. t -> Word -> Encode 'Open t
Sum NextEpochChange
ToBeEnacted Word
0
      NextEpochChange
ToBeRemoved -> forall t. t -> Word -> Encode 'Open t
Sum NextEpochChange
ToBeRemoved Word
1
      NextEpochChange
NoChangeExpected -> forall t. t -> Word -> Encode 'Open t
Sum NextEpochChange
NoChangeExpected Word
2
      NextEpochChange
ToBeExpired -> forall t. t -> Word -> Encode 'Open t
Sum NextEpochChange
ToBeExpired Word
3
      TermAdjusted EpochNo
e -> forall t. t -> Word -> Encode 'Open t
Sum EpochNo -> NextEpochChange
TermAdjusted Word
4 forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To EpochNo
e

instance DecCBOR NextEpochChange where
  decCBOR :: forall s. Decoder s NextEpochChange
decCBOR =
    forall (w :: Wrapped) t s. Decode w t -> Decoder s t
decode forall a b. (a -> b) -> a -> b
$ forall t.
Text -> (Word -> Decode 'Open t) -> Decode ('Closed 'Dense) t
Summands Text
"NextEpochChange" forall a b. (a -> b) -> a -> b
$ \case
      Word
0 -> forall t. t -> Decode 'Open t
SumD NextEpochChange
ToBeEnacted
      Word
1 -> forall t. t -> Decode 'Open t
SumD NextEpochChange
ToBeRemoved
      Word
2 -> forall t. t -> Decode 'Open t
SumD NextEpochChange
NoChangeExpected
      Word
3 -> forall t. t -> Decode 'Open t
SumD NextEpochChange
ToBeExpired
      Word
4 -> forall t. t -> Decode 'Open t
SumD EpochNo -> NextEpochChange
TermAdjusted forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
      Word
k -> forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
k

data CommitteeMemberState c = CommitteeMemberState
  { forall c. CommitteeMemberState c -> HotCredAuthStatus c
cmsHotCredAuthStatus :: !(HotCredAuthStatus c)
  , forall c. CommitteeMemberState c -> MemberStatus
cmsStatus :: !MemberStatus
  , forall c. CommitteeMemberState c -> Maybe EpochNo
cmsExpiration :: !(Maybe EpochNo)
  -- ^ Absolute epoch number when the member expires
  , forall c. CommitteeMemberState c -> NextEpochChange
cmsNextEpochChange :: !NextEpochChange
  -- ^ Changes to the member at the next epoch
  }
  deriving (Int -> CommitteeMemberState c -> ShowS
forall c. Int -> CommitteeMemberState c -> ShowS
forall c. [CommitteeMemberState c] -> ShowS
forall c. CommitteeMemberState c -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommitteeMemberState c] -> ShowS
$cshowList :: forall c. [CommitteeMemberState c] -> ShowS
show :: CommitteeMemberState c -> String
$cshow :: forall c. CommitteeMemberState c -> String
showsPrec :: Int -> CommitteeMemberState c -> ShowS
$cshowsPrec :: forall c. Int -> CommitteeMemberState c -> ShowS
Show, CommitteeMemberState c -> CommitteeMemberState c -> Bool
forall c. CommitteeMemberState c -> CommitteeMemberState c -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CommitteeMemberState c -> CommitteeMemberState c -> Bool
$c/= :: forall c. CommitteeMemberState c -> CommitteeMemberState c -> Bool
== :: CommitteeMemberState c -> CommitteeMemberState c -> Bool
$c== :: forall c. CommitteeMemberState c -> CommitteeMemberState c -> Bool
Eq, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall c x.
Rep (CommitteeMemberState c) x -> CommitteeMemberState c
forall c x.
CommitteeMemberState c -> Rep (CommitteeMemberState c) x
$cto :: forall c x.
Rep (CommitteeMemberState c) x -> CommitteeMemberState c
$cfrom :: forall c x.
CommitteeMemberState c -> Rep (CommitteeMemberState c) x
Generic)

deriving instance Ord (CommitteeMemberState c)

instance Crypto c => EncCBOR (CommitteeMemberState c) where
  encCBOR :: CommitteeMemberState c -> Encoding
encCBOR (CommitteeMemberState HotCredAuthStatus c
cStatus MemberStatus
mStatus Maybe EpochNo
ex NextEpochChange
nec) =
    forall (w :: Wrapped) t. Encode w t -> Encoding
encode forall a b. (a -> b) -> a -> b
$
      forall t. t -> Encode ('Closed 'Dense) t
Rec (forall c.
HotCredAuthStatus c
-> MemberStatus
-> Maybe EpochNo
-> NextEpochChange
-> CommitteeMemberState c
CommitteeMemberState @c)
        forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To HotCredAuthStatus c
cStatus
        forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To MemberStatus
mStatus
        forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Maybe EpochNo
ex
        forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To NextEpochChange
nec

instance Crypto c => DecCBOR (CommitteeMemberState c) where
  decCBOR :: forall s. Decoder s (CommitteeMemberState c)
decCBOR =
    forall (w :: Wrapped) t s. Decode w t -> Decoder s t
decode forall a b. (a -> b) -> a -> b
$
      forall t. t -> Decode ('Closed 'Dense) t
RecD forall c.
HotCredAuthStatus c
-> MemberStatus
-> Maybe EpochNo
-> NextEpochChange
-> CommitteeMemberState c
CommitteeMemberState
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From

instance Crypto c => ToJSON (CommitteeMemberState c) where
  toJSON :: CommitteeMemberState c -> Value
toJSON = [Pair] -> Value
object forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c e a.
(Crypto c, KeyValue e a) =>
CommitteeMemberState c -> [a]
toCommitteeMemberStatePairs
  toEncoding :: CommitteeMemberState c -> Encoding
toEncoding = Series -> Encoding
pairs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c e a.
(Crypto c, KeyValue e a) =>
CommitteeMemberState c -> [a]
toCommitteeMemberStatePairs

toCommitteeMemberStatePairs :: (Crypto c, KeyValue e a) => CommitteeMemberState c -> [a]
toCommitteeMemberStatePairs :: forall c e a.
(Crypto c, KeyValue e a) =>
CommitteeMemberState c -> [a]
toCommitteeMemberStatePairs c :: CommitteeMemberState c
c@(CommitteeMemberState HotCredAuthStatus c
_ MemberStatus
_ Maybe EpochNo
_ NextEpochChange
_) =
  let CommitteeMemberState {Maybe EpochNo
NextEpochChange
HotCredAuthStatus c
MemberStatus
cmsNextEpochChange :: NextEpochChange
cmsExpiration :: Maybe EpochNo
cmsStatus :: MemberStatus
cmsHotCredAuthStatus :: HotCredAuthStatus c
cmsNextEpochChange :: forall c. CommitteeMemberState c -> NextEpochChange
cmsExpiration :: forall c. CommitteeMemberState c -> Maybe EpochNo
cmsStatus :: forall c. CommitteeMemberState c -> MemberStatus
cmsHotCredAuthStatus :: forall c. CommitteeMemberState c -> HotCredAuthStatus c
..} = CommitteeMemberState c
c
   in [ Key
"hotCredsAuthStatus" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= HotCredAuthStatus c
cmsHotCredAuthStatus
      , Key
"status" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= MemberStatus
cmsStatus
      , Key
"expiration" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe EpochNo
cmsExpiration
      , Key
"nextEpochChange" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= NextEpochChange
cmsNextEpochChange
      ]

data CommitteeMembersState c = CommitteeMembersState
  { forall c.
CommitteeMembersState c
-> Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
csCommittee :: !(Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c))
  , forall c. CommitteeMembersState c -> Maybe UnitInterval
csThreshold :: !(Maybe UnitInterval)
  , forall c. CommitteeMembersState c -> EpochNo
csEpochNo :: !EpochNo
  -- ^ Current epoch number. This is necessary to interpret committee member states
  }
  deriving (CommitteeMembersState c -> CommitteeMembersState c -> Bool
forall c.
CommitteeMembersState c -> CommitteeMembersState c -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CommitteeMembersState c -> CommitteeMembersState c -> Bool
$c/= :: forall c.
CommitteeMembersState c -> CommitteeMembersState c -> Bool
== :: CommitteeMembersState c -> CommitteeMembersState c -> Bool
$c== :: forall c.
CommitteeMembersState c -> CommitteeMembersState c -> Bool
Eq, Int -> CommitteeMembersState c -> ShowS
forall c. Int -> CommitteeMembersState c -> ShowS
forall c. [CommitteeMembersState c] -> ShowS
forall c. CommitteeMembersState c -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommitteeMembersState c] -> ShowS
$cshowList :: forall c. [CommitteeMembersState c] -> ShowS
show :: CommitteeMembersState c -> String
$cshow :: forall c. CommitteeMembersState c -> String
showsPrec :: Int -> CommitteeMembersState c -> ShowS
$cshowsPrec :: forall c. Int -> CommitteeMembersState c -> ShowS
Show, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall c x.
Rep (CommitteeMembersState c) x -> CommitteeMembersState c
forall c x.
CommitteeMembersState c -> Rep (CommitteeMembersState c) x
$cto :: forall c x.
Rep (CommitteeMembersState c) x -> CommitteeMembersState c
$cfrom :: forall c x.
CommitteeMembersState c -> Rep (CommitteeMembersState c) x
Generic)

deriving instance Ord (CommitteeMembersState c)

instance Crypto c => EncCBOR (CommitteeMembersState c) where
  encCBOR :: CommitteeMembersState c -> Encoding
encCBOR c :: CommitteeMembersState c
c@(CommitteeMembersState Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
_ Maybe UnitInterval
_ EpochNo
_) =
    let CommitteeMembersState {Maybe UnitInterval
Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
EpochNo
csEpochNo :: EpochNo
csThreshold :: Maybe UnitInterval
csCommittee :: Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
csEpochNo :: forall c. CommitteeMembersState c -> EpochNo
csThreshold :: forall c. CommitteeMembersState c -> Maybe UnitInterval
csCommittee :: forall c.
CommitteeMembersState c
-> Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
..} = CommitteeMembersState c
c
     in forall (w :: Wrapped) t. Encode w t -> Encoding
encode forall a b. (a -> b) -> a -> b
$
          forall t. t -> Encode ('Closed 'Dense) t
Rec (forall c.
Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
-> Maybe UnitInterval -> EpochNo -> CommitteeMembersState c
CommitteeMembersState @c)
            forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
csCommittee
            forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Maybe UnitInterval
csThreshold
            forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To EpochNo
csEpochNo

instance Crypto c => DecCBOR (CommitteeMembersState c) where
  decCBOR :: forall s. Decoder s (CommitteeMembersState c)
decCBOR =
    forall (w :: Wrapped) t s. Decode w t -> Decoder s t
decode forall a b. (a -> b) -> a -> b
$
      forall t. t -> Decode ('Closed 'Dense) t
RecD forall c.
Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
-> Maybe UnitInterval -> EpochNo -> CommitteeMembersState c
CommitteeMembersState
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        forall (w1 :: Wrapped) a t (w :: Density).
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! forall t (w :: Wrapped). DecCBOR t => Decode w t
From

instance Crypto c => ToJSON (CommitteeMembersState c) where
  toJSON :: CommitteeMembersState c -> Value
toJSON = [Pair] -> Value
object forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a c.
(KeyValue e a, Crypto c) =>
CommitteeMembersState c -> [a]
toCommitteeMembersStatePairs
  toEncoding :: CommitteeMembersState c -> Encoding
toEncoding = Series -> Encoding
pairs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a c.
(KeyValue e a, Crypto c) =>
CommitteeMembersState c -> [a]
toCommitteeMembersStatePairs

toCommitteeMembersStatePairs :: (KeyValue e a, Crypto c) => CommitteeMembersState c -> [a]
toCommitteeMembersStatePairs :: forall e a c.
(KeyValue e a, Crypto c) =>
CommitteeMembersState c -> [a]
toCommitteeMembersStatePairs c :: CommitteeMembersState c
c@(CommitteeMembersState Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
_ Maybe UnitInterval
_ EpochNo
_) =
  let CommitteeMembersState {Maybe UnitInterval
Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
EpochNo
csEpochNo :: EpochNo
csThreshold :: Maybe UnitInterval
csCommittee :: Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
csEpochNo :: forall c. CommitteeMembersState c -> EpochNo
csThreshold :: forall c. CommitteeMembersState c -> Maybe UnitInterval
csCommittee :: forall c.
CommitteeMembersState c
-> Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
..} = CommitteeMembersState c
c
   in [ Key
"committee" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map (Credential 'ColdCommitteeRole c) (CommitteeMemberState c)
csCommittee
      , Key
"threshold" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe UnitInterval
csThreshold
      , Key
"epoch" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= EpochNo
csEpochNo
      ]