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

instance EncCBOR HotCredAuthStatus where
  encCBOR :: HotCredAuthStatus -> 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
cred -> forall t. t -> Word -> Encode 'Open t
Sum Credential 'HotCommitteeRole -> HotCredAuthStatus
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
cred
      HotCredAuthStatus
MemberNotAuthorized -> forall t. t -> Word -> Encode 'Open t
Sum HotCredAuthStatus
MemberNotAuthorized Word
1
      MemberResigned Maybe Anchor
anchor -> forall t. t -> Word -> Encode 'Open t
Sum Maybe Anchor -> HotCredAuthStatus
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
anchor

instance DecCBOR HotCredAuthStatus where
  decCBOR :: forall s. Decoder s HotCredAuthStatus
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 Credential 'HotCommitteeRole -> HotCredAuthStatus
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 HotCredAuthStatus
MemberNotAuthorized
      Word
2 -> forall t. t -> Decode 'Open t
SumD Maybe Anchor -> HotCredAuthStatus
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 = CommitteeMemberState
  { CommitteeMemberState -> HotCredAuthStatus
cmsHotCredAuthStatus :: !HotCredAuthStatus
  , CommitteeMemberState -> MemberStatus
cmsStatus :: !MemberStatus
  , CommitteeMemberState -> Maybe EpochNo
cmsExpiration :: !(Maybe EpochNo)
  -- ^ Absolute epoch number when the member expires
  , CommitteeMemberState -> NextEpochChange
cmsNextEpochChange :: !NextEpochChange
  -- ^ Changes to the member at the next epoch
  }
  deriving (Int -> CommitteeMemberState -> ShowS
[CommitteeMemberState] -> ShowS
CommitteeMemberState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommitteeMemberState] -> ShowS
$cshowList :: [CommitteeMemberState] -> ShowS
show :: CommitteeMemberState -> String
$cshow :: CommitteeMemberState -> String
showsPrec :: Int -> CommitteeMemberState -> ShowS
$cshowsPrec :: Int -> CommitteeMemberState -> ShowS
Show, CommitteeMemberState -> CommitteeMemberState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CommitteeMemberState -> CommitteeMemberState -> Bool
$c/= :: CommitteeMemberState -> CommitteeMemberState -> Bool
== :: CommitteeMemberState -> CommitteeMemberState -> Bool
$c== :: CommitteeMemberState -> CommitteeMemberState -> Bool
Eq, forall x. Rep CommitteeMemberState x -> CommitteeMemberState
forall x. CommitteeMemberState -> Rep CommitteeMemberState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CommitteeMemberState x -> CommitteeMemberState
$cfrom :: forall x. CommitteeMemberState -> Rep CommitteeMemberState x
Generic)

deriving instance Ord CommitteeMemberState

instance EncCBOR CommitteeMemberState where
  encCBOR :: CommitteeMemberState -> Encoding
encCBOR (CommitteeMemberState HotCredAuthStatus
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 HotCredAuthStatus
-> MemberStatus
-> Maybe EpochNo
-> NextEpochChange
-> CommitteeMemberState
CommitteeMemberState
        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
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 DecCBOR CommitteeMemberState where
  decCBOR :: forall s. Decoder s CommitteeMemberState
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 HotCredAuthStatus
-> MemberStatus
-> Maybe EpochNo
-> NextEpochChange
-> CommitteeMemberState
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 ToJSON CommitteeMemberState where
  toJSON :: CommitteeMemberState -> Value
toJSON = [Pair] -> Value
object forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a. KeyValue e a => CommitteeMemberState -> [a]
toCommitteeMemberStatePairs
  toEncoding :: CommitteeMemberState -> 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. KeyValue e a => CommitteeMemberState -> [a]
toCommitteeMemberStatePairs

toCommitteeMemberStatePairs :: KeyValue e a => CommitteeMemberState -> [a]
toCommitteeMemberStatePairs :: forall e a. KeyValue e a => CommitteeMemberState -> [a]
toCommitteeMemberStatePairs c :: CommitteeMemberState
c@(CommitteeMemberState HotCredAuthStatus
_ MemberStatus
_ Maybe EpochNo
_ NextEpochChange
_) =
  let CommitteeMemberState {Maybe EpochNo
NextEpochChange
HotCredAuthStatus
MemberStatus
cmsNextEpochChange :: NextEpochChange
cmsExpiration :: Maybe EpochNo
cmsStatus :: MemberStatus
cmsHotCredAuthStatus :: HotCredAuthStatus
cmsNextEpochChange :: CommitteeMemberState -> NextEpochChange
cmsExpiration :: CommitteeMemberState -> Maybe EpochNo
cmsStatus :: CommitteeMemberState -> MemberStatus
cmsHotCredAuthStatus :: CommitteeMemberState -> HotCredAuthStatus
..} = CommitteeMemberState
c
   in [ Key
"hotCredsAuthStatus" forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= HotCredAuthStatus
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 = CommitteeMembersState
  { CommitteeMembersState
-> Map (Credential 'ColdCommitteeRole) CommitteeMemberState
csCommittee :: !(Map (Credential 'ColdCommitteeRole) CommitteeMemberState)
  , CommitteeMembersState -> Maybe UnitInterval
csThreshold :: !(Maybe UnitInterval)
  , CommitteeMembersState -> EpochNo
csEpochNo :: !EpochNo
  -- ^ Current epoch number. This is necessary to interpret committee member states
  }
  deriving (CommitteeMembersState -> CommitteeMembersState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CommitteeMembersState -> CommitteeMembersState -> Bool
$c/= :: CommitteeMembersState -> CommitteeMembersState -> Bool
== :: CommitteeMembersState -> CommitteeMembersState -> Bool
$c== :: CommitteeMembersState -> CommitteeMembersState -> Bool
Eq, Int -> CommitteeMembersState -> ShowS
[CommitteeMembersState] -> ShowS
CommitteeMembersState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommitteeMembersState] -> ShowS
$cshowList :: [CommitteeMembersState] -> ShowS
show :: CommitteeMembersState -> String
$cshow :: CommitteeMembersState -> String
showsPrec :: Int -> CommitteeMembersState -> ShowS
$cshowsPrec :: Int -> CommitteeMembersState -> ShowS
Show, forall x. Rep CommitteeMembersState x -> CommitteeMembersState
forall x. CommitteeMembersState -> Rep CommitteeMembersState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CommitteeMembersState x -> CommitteeMembersState
$cfrom :: forall x. CommitteeMembersState -> Rep CommitteeMembersState x
Generic)

deriving instance Ord CommitteeMembersState

instance EncCBOR CommitteeMembersState where
  encCBOR :: CommitteeMembersState -> Encoding
encCBOR c :: CommitteeMembersState
c@(CommitteeMembersState Map (Credential 'ColdCommitteeRole) CommitteeMemberState
_ Maybe UnitInterval
_ EpochNo
_) =
    let CommitteeMembersState {Maybe UnitInterval
Map (Credential 'ColdCommitteeRole) CommitteeMemberState
EpochNo
csEpochNo :: EpochNo
csThreshold :: Maybe UnitInterval
csCommittee :: Map (Credential 'ColdCommitteeRole) CommitteeMemberState
csEpochNo :: CommitteeMembersState -> EpochNo
csThreshold :: CommitteeMembersState -> Maybe UnitInterval
csCommittee :: CommitteeMembersState
-> Map (Credential 'ColdCommitteeRole) CommitteeMemberState
..} = CommitteeMembersState
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 Map (Credential 'ColdCommitteeRole) CommitteeMemberState
-> Maybe UnitInterval -> EpochNo -> CommitteeMembersState
CommitteeMembersState
            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) CommitteeMemberState
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 DecCBOR CommitteeMembersState where
  decCBOR :: forall s. Decoder s CommitteeMembersState
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 Map (Credential 'ColdCommitteeRole) CommitteeMemberState
-> Maybe UnitInterval -> EpochNo -> CommitteeMembersState
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 ToJSON CommitteeMembersState where
  toJSON :: CommitteeMembersState -> Value
toJSON = [Pair] -> Value
object forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a. KeyValue e a => CommitteeMembersState -> [a]
toCommitteeMembersStatePairs
  toEncoding :: CommitteeMembersState -> 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. KeyValue e a => CommitteeMembersState -> [a]
toCommitteeMembersStatePairs

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