{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Dijkstra.TxCert (
  DijkstraTxCertUpgradeError,
  DijkstraTxCert (..),
  DijkstraDelegCert (..),
) where

import Cardano.Ledger.BaseTypes (kindObject)
import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
  FromCBOR (..),
  ToCBOR (..),
  decodeRecordSum,
  encodeListLen,
  encodeWord8,
  invalidKey,
  toPlainEncoding,
 )
import Cardano.Ledger.Coin (Coin)
import Cardano.Ledger.Conway.Core (
  ConwayEraTxCert,
  poolCertKeyHashWitness,
  pattern AuthCommitteeHotKeyTxCert,
  pattern DelegTxCert,
  pattern RegDRepTxCert,
  pattern RegDepositDelegTxCert,
  pattern RegDepositTxCert,
  pattern RegPoolTxCert,
  pattern RegTxCert,
  pattern ResignCommitteeColdTxCert,
  pattern RetirePoolTxCert,
  pattern UnRegDRepTxCert,
  pattern UnRegDepositTxCert,
  pattern UnRegTxCert,
  pattern UpdateDRepTxCert,
 )
import Cardano.Ledger.Conway.TxCert (
  ConwayEraTxCert (..),
  ConwayGovCert (..),
  Delegatee (..),
  conwayGovCertVKeyWitness,
  conwayTotalDepositsTxCerts,
  conwayTxCertDelegDecoder,
 )
import Cardano.Ledger.Core (
  Era,
  EraTxCert (..),
  KeyHash,
  KeyRole (..),
  PoolCert (..),
  ScriptHash,
  Value,
  eraProtVerLow,
  fromEraCBOR,
 )
import Cardano.Ledger.Credential (Credential, credKeyHashWitness, credScriptHash)
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.PParams ()
import Cardano.Ledger.Shelley.TxCert (
  ShelleyDelegCert (..),
  encodePoolCert,
  encodeShelleyDelegCert,
  poolTxCertDecoder,
 )
import Cardano.Ledger.Val (Val (..))
import Control.DeepSeq (NFData)
import Data.Aeson (KeyValue ((.=)), ToJSON (..))
import Data.Foldable (Foldable (..))
import GHC.Generics (Generic)
import NoThunks.Class (NoThunks)

data DijkstraDelegCert
  = DijkstraRegCert !(Credential Staking) !Coin
  | DijkstraUnRegCert !(Credential Staking) !Coin
  | DijkstraDelegCert !(Credential Staking) !Delegatee
  | DijkstraRegDelegCert !(Credential Staking) !Delegatee !Coin
  deriving (Int -> DijkstraDelegCert -> ShowS
[DijkstraDelegCert] -> ShowS
DijkstraDelegCert -> String
(Int -> DijkstraDelegCert -> ShowS)
-> (DijkstraDelegCert -> String)
-> ([DijkstraDelegCert] -> ShowS)
-> Show DijkstraDelegCert
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DijkstraDelegCert -> ShowS
showsPrec :: Int -> DijkstraDelegCert -> ShowS
$cshow :: DijkstraDelegCert -> String
show :: DijkstraDelegCert -> String
$cshowList :: [DijkstraDelegCert] -> ShowS
showList :: [DijkstraDelegCert] -> ShowS
Show, (forall x. DijkstraDelegCert -> Rep DijkstraDelegCert x)
-> (forall x. Rep DijkstraDelegCert x -> DijkstraDelegCert)
-> Generic DijkstraDelegCert
forall x. Rep DijkstraDelegCert x -> DijkstraDelegCert
forall x. DijkstraDelegCert -> Rep DijkstraDelegCert x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DijkstraDelegCert -> Rep DijkstraDelegCert x
from :: forall x. DijkstraDelegCert -> Rep DijkstraDelegCert x
$cto :: forall x. Rep DijkstraDelegCert x -> DijkstraDelegCert
to :: forall x. Rep DijkstraDelegCert x -> DijkstraDelegCert
Generic, DijkstraDelegCert -> DijkstraDelegCert -> Bool
(DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> (DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> Eq DijkstraDelegCert
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
== :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
$c/= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
/= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
Eq, Eq DijkstraDelegCert
Eq DijkstraDelegCert =>
(DijkstraDelegCert -> DijkstraDelegCert -> Ordering)
-> (DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> (DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> (DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> (DijkstraDelegCert -> DijkstraDelegCert -> Bool)
-> (DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert)
-> (DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert)
-> Ord DijkstraDelegCert
DijkstraDelegCert -> DijkstraDelegCert -> Bool
DijkstraDelegCert -> DijkstraDelegCert -> Ordering
DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert
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
$ccompare :: DijkstraDelegCert -> DijkstraDelegCert -> Ordering
compare :: DijkstraDelegCert -> DijkstraDelegCert -> Ordering
$c< :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
< :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
$c<= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
<= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
$c> :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
> :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
$c>= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
>= :: DijkstraDelegCert -> DijkstraDelegCert -> Bool
$cmax :: DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert
max :: DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert
$cmin :: DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert
min :: DijkstraDelegCert -> DijkstraDelegCert -> DijkstraDelegCert
Ord)

instance EncCBOR DijkstraDelegCert where
  encCBOR :: DijkstraDelegCert -> Encoding
encCBOR = \case
    DijkstraRegCert Credential Staking
cred Coin
deposit ->
      Word -> Encoding
encodeListLen Word
3
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
7
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraUnRegCert Credential Staking
cred Coin
deposit ->
      Word -> Encoding
encodeListLen Word
3
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
8
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraDelegCert Credential Staking
cred (DelegStake KeyHash StakePool
poolId) -> ShelleyDelegCert -> Encoding
encodeShelleyDelegCert (ShelleyDelegCert -> Encoding) -> ShelleyDelegCert -> Encoding
forall a b. (a -> b) -> a -> b
$ Credential Staking -> KeyHash StakePool -> ShelleyDelegCert
ShelleyDelegCert Credential Staking
cred KeyHash StakePool
poolId
    DijkstraDelegCert Credential Staking
cred (DelegVote DRep
drep) ->
      Word -> Encoding
encodeListLen Word
3
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
9
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> DRep -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DRep
drep
    DijkstraDelegCert Credential Staking
cred (DelegStakeVote KeyHash StakePool
poolId DRep
dRep) ->
      Word -> Encoding
encodeListLen Word
4
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
10
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> KeyHash StakePool -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR KeyHash StakePool
poolId
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> DRep -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DRep
dRep
    DijkstraRegDelegCert Credential Staking
cred (DelegStake KeyHash StakePool
poolId) Coin
deposit ->
      Word -> Encoding
encodeListLen Word
4
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
11
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> KeyHash StakePool -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR KeyHash StakePool
poolId
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraRegDelegCert Credential Staking
cred (DelegVote DRep
drep) Coin
deposit ->
      Word -> Encoding
encodeListLen Word
4
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
12
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> DRep -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DRep
drep
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraRegDelegCert Credential Staking
cred (DelegStakeVote KeyHash StakePool
poolId DRep
dRep) Coin
deposit ->
      Word -> Encoding
encodeListLen Word
5
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word8 -> Encoding
encodeWord8 Word8
13
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Credential Staking -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Credential Staking
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> KeyHash StakePool -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR KeyHash StakePool
poolId
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> DRep -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DRep
dRep
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit

instance NFData DijkstraDelegCert

instance NoThunks DijkstraDelegCert

instance ToJSON DijkstraDelegCert where
  toJSON :: DijkstraDelegCert -> Value
toJSON = \case
    DijkstraRegCert Credential Staking
cred Coin
deposit ->
      Text -> [Pair] -> Value
kindObject
        Text
"RegCert"
        [ Key
"credential" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Credential Staking -> Value
forall a. ToJSON a => a -> Value
toJSON Credential Staking
cred
        , Key
"deposit" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Coin -> Value
forall a. ToJSON a => a -> Value
toJSON Coin
deposit
        ]
    DijkstraUnRegCert Credential Staking
cred Coin
refund ->
      Text -> [Pair] -> Value
kindObject
        Text
"UnRegCert"
        [ Key
"credential" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Credential Staking -> Value
forall a. ToJSON a => a -> Value
toJSON Credential Staking
cred
        , Key
"refund" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Coin -> Value
forall a. ToJSON a => a -> Value
toJSON Coin
refund
        ]
    DijkstraDelegCert Credential Staking
cred Delegatee
delegatee ->
      Text -> [Pair] -> Value
kindObject
        Text
"DelegCert"
        [ Key
"credential" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Credential Staking -> Value
forall a. ToJSON a => a -> Value
toJSON Credential Staking
cred
        , Key
"delegatee" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Delegatee -> Value
forall a. ToJSON a => a -> Value
toJSON Delegatee
delegatee
        ]
    DijkstraRegDelegCert Credential Staking
cred Delegatee
delegatee Coin
deposit ->
      Text -> [Pair] -> Value
kindObject
        Text
"RegDelegCert"
        [ Key
"credential" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Credential Staking -> Value
forall a. ToJSON a => a -> Value
toJSON Credential Staking
cred
        , Key
"delegatee" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Delegatee -> Value
forall a. ToJSON a => a -> Value
toJSON Delegatee
delegatee
        , Key
"deposit" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Coin -> Value
forall a. ToJSON a => a -> Value
toJSON Coin
deposit
        ]

data DijkstraTxCert era
  = DijkstraTxCertDeleg !DijkstraDelegCert
  | DijkstraTxCertPool !PoolCert
  | DijkstraTxCertGov !ConwayGovCert
  deriving (Int -> DijkstraTxCert era -> ShowS
[DijkstraTxCert era] -> ShowS
DijkstraTxCert era -> String
(Int -> DijkstraTxCert era -> ShowS)
-> (DijkstraTxCert era -> String)
-> ([DijkstraTxCert era] -> ShowS)
-> Show (DijkstraTxCert era)
forall era. Int -> DijkstraTxCert era -> ShowS
forall era. [DijkstraTxCert era] -> ShowS
forall era. DijkstraTxCert era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> DijkstraTxCert era -> ShowS
showsPrec :: Int -> DijkstraTxCert era -> ShowS
$cshow :: forall era. DijkstraTxCert era -> String
show :: DijkstraTxCert era -> String
$cshowList :: forall era. [DijkstraTxCert era] -> ShowS
showList :: [DijkstraTxCert era] -> ShowS
Show, (forall x. DijkstraTxCert era -> Rep (DijkstraTxCert era) x)
-> (forall x. Rep (DijkstraTxCert era) x -> DijkstraTxCert era)
-> Generic (DijkstraTxCert era)
forall x. Rep (DijkstraTxCert era) x -> DijkstraTxCert era
forall x. DijkstraTxCert era -> Rep (DijkstraTxCert era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (DijkstraTxCert era) x -> DijkstraTxCert era
forall era x. DijkstraTxCert era -> Rep (DijkstraTxCert era) x
$cfrom :: forall era x. DijkstraTxCert era -> Rep (DijkstraTxCert era) x
from :: forall x. DijkstraTxCert era -> Rep (DijkstraTxCert era) x
$cto :: forall era x. Rep (DijkstraTxCert era) x -> DijkstraTxCert era
to :: forall x. Rep (DijkstraTxCert era) x -> DijkstraTxCert era
Generic, DijkstraTxCert era -> DijkstraTxCert era -> Bool
(DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> (DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> Eq (DijkstraTxCert era)
forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
== :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
$c/= :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
/= :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
Eq, Eq (DijkstraTxCert era)
Eq (DijkstraTxCert era) =>
(DijkstraTxCert era -> DijkstraTxCert era -> Ordering)
-> (DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> (DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> (DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> (DijkstraTxCert era -> DijkstraTxCert era -> Bool)
-> (DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era)
-> (DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era)
-> Ord (DijkstraTxCert era)
DijkstraTxCert era -> DijkstraTxCert era -> Bool
DijkstraTxCert era -> DijkstraTxCert era -> Ordering
DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
forall era. Eq (DijkstraTxCert era)
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 era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
forall era. DijkstraTxCert era -> DijkstraTxCert era -> Ordering
forall era.
DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
$ccompare :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Ordering
compare :: DijkstraTxCert era -> DijkstraTxCert era -> Ordering
$c< :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
< :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
$c<= :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
<= :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
$c> :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
> :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
$c>= :: forall era. DijkstraTxCert era -> DijkstraTxCert era -> Bool
>= :: DijkstraTxCert era -> DijkstraTxCert era -> Bool
$cmax :: forall era.
DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
max :: DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
$cmin :: forall era.
DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
min :: DijkstraTxCert era -> DijkstraTxCert era -> DijkstraTxCert era
Ord)

data DijkstraTxCertUpgradeError
  = RegTxCertExpunged
  | UnRegTxCertExpunged
  deriving (DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool
(DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool)
-> (DijkstraTxCertUpgradeError
    -> DijkstraTxCertUpgradeError -> Bool)
-> Eq DijkstraTxCertUpgradeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool
== :: DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool
$c/= :: DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool
/= :: DijkstraTxCertUpgradeError -> DijkstraTxCertUpgradeError -> Bool
Eq, Int -> DijkstraTxCertUpgradeError -> ShowS
[DijkstraTxCertUpgradeError] -> ShowS
DijkstraTxCertUpgradeError -> String
(Int -> DijkstraTxCertUpgradeError -> ShowS)
-> (DijkstraTxCertUpgradeError -> String)
-> ([DijkstraTxCertUpgradeError] -> ShowS)
-> Show DijkstraTxCertUpgradeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DijkstraTxCertUpgradeError -> ShowS
showsPrec :: Int -> DijkstraTxCertUpgradeError -> ShowS
$cshow :: DijkstraTxCertUpgradeError -> String
show :: DijkstraTxCertUpgradeError -> String
$cshowList :: [DijkstraTxCertUpgradeError] -> ShowS
showList :: [DijkstraTxCertUpgradeError] -> ShowS
Show)

instance NFData (DijkstraTxCert era)

instance NoThunks (DijkstraTxCert era)

instance Era era => ToJSON (DijkstraTxCert era) where
  toJSON :: DijkstraTxCert era -> Value
toJSON = \case
    DijkstraTxCertDeleg DijkstraDelegCert
delegCert -> DijkstraDelegCert -> Value
forall a. ToJSON a => a -> Value
toJSON DijkstraDelegCert
delegCert
    DijkstraTxCertPool PoolCert
poolCert -> PoolCert -> Value
forall a. ToJSON a => a -> Value
toJSON PoolCert
poolCert
    DijkstraTxCertGov ConwayGovCert
govCert -> ConwayGovCert -> Value
forall a. ToJSON a => a -> Value
toJSON ConwayGovCert
govCert

instance
  ( EraTxCert era
  , TxCert era ~ DijkstraTxCert era
  ) =>
  FromCBOR (DijkstraTxCert era)
  where
  fromCBOR :: forall s. Decoder s (DijkstraTxCert era)
fromCBOR = forall era t s. (Era era, DecCBOR t) => Decoder s t
fromEraCBOR @era

instance
  ( ConwayEraTxCert era
  , TxCert era ~ DijkstraTxCert era
  ) =>
  DecCBOR (DijkstraTxCert era)
  where
  decCBOR :: forall s. Decoder s (DijkstraTxCert era)
decCBOR = Text
-> (Word -> Decoder s (Int, DijkstraTxCert era))
-> Decoder s (DijkstraTxCert era)
forall s a. Text -> (Word -> Decoder s (Int, a)) -> Decoder s a
decodeRecordSum Text
"DijkstraTxCert" ((Word -> Decoder s (Int, DijkstraTxCert era))
 -> Decoder s (DijkstraTxCert era))
-> (Word -> Decoder s (Int, DijkstraTxCert era))
-> Decoder s (DijkstraTxCert era)
forall a b. (a -> b) -> a -> b
$ \case
    Word
t
      | Word
0 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
t Bool -> Bool -> Bool
&& Word
t Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
2 -> String -> Decoder s (Int, DijkstraTxCert era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Certificates without deposits are no longer supported"
      | Word
t Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
2 -> do
          cred <- Decoder s (Credential Staking)
forall s. Decoder s (Credential Staking)
forall a s. DecCBOR a => Decoder s a
decCBOR
          stakePool <- decCBOR
          pure (3, DelegTxCert cred (DelegStake stakePool))
      | Word
3 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
t Bool -> Bool -> Bool
&& Word
t Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
5 -> Word -> Decoder s (Int, TxCert era)
forall era s. EraTxCert era => Word -> Decoder s (Int, TxCert era)
poolTxCertDecoder Word
t
      | Word
t Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
5 -> String -> Decoder s (Int, DijkstraTxCert era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Genesis delegation certificates are no longer supported"
      | Word
t Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
6 -> String -> Decoder s (Int, DijkstraTxCert era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"MIR certificates are no longer supported"
      | Word
7 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
t -> Word -> Decoder s (Int, TxCert era)
forall era s.
ConwayEraTxCert era =>
Word -> Decoder s (Int, TxCert era)
conwayTxCertDelegDecoder Word
t
    Word
t -> Word -> Decoder s (Int, DijkstraTxCert era)
forall a (m :: * -> *). (Typeable a, MonadFail m) => Word -> m a
invalidKey Word
t

instance (Era era, Val (Value era)) => ToCBOR (DijkstraTxCert era) where
  toCBOR :: DijkstraTxCert era -> Encoding
toCBOR = Version -> Encoding -> Encoding
toPlainEncoding (forall era. Era era => Version
eraProtVerLow @era) (Encoding -> Encoding)
-> (DijkstraTxCert era -> Encoding)
-> DijkstraTxCert era
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DijkstraTxCert era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR

instance Era era => EncCBOR (DijkstraTxCert era) where
  encCBOR :: DijkstraTxCert era -> Encoding
encCBOR = \case
    DijkstraTxCertDeleg DijkstraDelegCert
delegCert -> DijkstraDelegCert -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DijkstraDelegCert
delegCert
    DijkstraTxCertPool PoolCert
poolCert -> PoolCert -> Encoding
encodePoolCert PoolCert
poolCert
    DijkstraTxCertGov ConwayGovCert
govCert -> ConwayGovCert -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR ConwayGovCert
govCert

-- | Unlike previous eras, we no longer need to lookup refunds from the ledger state, since all of the certificates specify the actual refund and ledger rules will validate that they are accurate.
dijkstraTotalRefundsTxCerts ::
  ( Foldable f
  , ConwayEraTxCert era
  ) =>
  f (TxCert era) ->
  Coin
dijkstraTotalRefundsTxCerts :: forall (f :: * -> *) era.
(Foldable f, ConwayEraTxCert era) =>
f (TxCert era) -> Coin
dijkstraTotalRefundsTxCerts = (TxCert era -> Coin) -> f (TxCert era) -> Coin
forall m a. Monoid m => (a -> m) -> f a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap' ((TxCert era -> Coin) -> f (TxCert era) -> Coin)
-> (TxCert era -> Coin) -> f (TxCert era) -> Coin
forall a b. (a -> b) -> a -> b
$ \case
  UnRegDepositTxCert Credential Staking
_ Coin
deposit -> Coin
deposit
  UnRegDRepTxCert Credential DRepRole
_ Coin
deposit -> Coin
deposit
  TxCert era
_ -> Coin
forall t. Val t => t
zero

instance EraTxCert DijkstraEra where
  type TxCert DijkstraEra = DijkstraTxCert DijkstraEra

  type TxCertUpgradeError DijkstraEra = DijkstraTxCertUpgradeError

  upgradeTxCert :: EraTxCert (PreviousEra DijkstraEra) =>
TxCert (PreviousEra DijkstraEra)
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
upgradeTxCert = \case
    RegPoolTxCert StakePoolParams
poolParams -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ StakePoolParams -> TxCert DijkstraEra
forall era. EraTxCert era => StakePoolParams -> TxCert era
RegPoolTxCert StakePoolParams
poolParams
    RetirePoolTxCert KeyHash StakePool
poolId EpochNo
epochNo -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ KeyHash StakePool -> EpochNo -> TxCert DijkstraEra
forall era.
EraTxCert era =>
KeyHash StakePool -> EpochNo -> TxCert era
RetirePoolTxCert KeyHash StakePool
poolId EpochNo
epochNo
    RegDepositTxCert Credential Staking
cred Coin
c -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential Staking -> Coin -> TxCert era
RegDepositTxCert Credential Staking
cred Coin
c
    UnRegDepositTxCert Credential Staking
cred Coin
c -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential Staking -> Coin -> TxCert era
UnRegDepositTxCert Credential Staking
cred Coin
c
    DelegTxCert Credential Staking
cred Delegatee
d -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Delegatee -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential Staking -> Delegatee -> TxCert era
DelegTxCert Credential Staking
cred Delegatee
d
    RegDepositDelegTxCert Credential Staking
cred Delegatee
d Coin
c -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Delegatee -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential Staking -> Delegatee -> Coin -> TxCert era
RegDepositDelegTxCert Credential Staking
cred Delegatee
d Coin
c
    AuthCommitteeHotKeyTxCert Credential ColdCommitteeRole
ck Credential HotCommitteeRole
hk -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential ColdCommitteeRole
-> Credential HotCommitteeRole -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential ColdCommitteeRole
-> Credential HotCommitteeRole -> TxCert era
AuthCommitteeHotKeyTxCert Credential ColdCommitteeRole
ck Credential HotCommitteeRole
hk
    ResignCommitteeColdTxCert Credential ColdCommitteeRole
ck StrictMaybe Anchor
a -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential ColdCommitteeRole
-> StrictMaybe Anchor -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential ColdCommitteeRole -> StrictMaybe Anchor -> TxCert era
ResignCommitteeColdTxCert Credential ColdCommitteeRole
ck StrictMaybe Anchor
a
    RegDRepTxCert Credential DRepRole
cred Coin
deposit StrictMaybe Anchor
mAnchor -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential DRepRole
-> Coin -> StrictMaybe Anchor -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential DRepRole -> Coin -> StrictMaybe Anchor -> TxCert era
RegDRepTxCert Credential DRepRole
cred Coin
deposit StrictMaybe Anchor
mAnchor
    UnRegDRepTxCert Credential DRepRole
cred Coin
deposit -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential DRepRole -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential DRepRole -> Coin -> TxCert era
UnRegDRepTxCert Credential DRepRole
cred Coin
deposit
    UpdateDRepTxCert Credential DRepRole
cred StrictMaybe Anchor
mAnchor -> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. b -> Either a b
Right (TxCert DijkstraEra
 -> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra))
-> TxCert DijkstraEra
-> Either (TxCertUpgradeError DijkstraEra) (TxCert DijkstraEra)
forall a b. (a -> b) -> a -> b
$ Credential DRepRole -> StrictMaybe Anchor -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
Credential DRepRole -> StrictMaybe Anchor -> TxCert era
UpdateDRepTxCert Credential DRepRole
cred StrictMaybe Anchor
mAnchor
    RegTxCert {} -> DijkstraTxCertUpgradeError
-> Either DijkstraTxCertUpgradeError (DijkstraTxCert DijkstraEra)
forall a b. a -> Either a b
Left DijkstraTxCertUpgradeError
RegTxCertExpunged
    UnRegTxCert {} -> DijkstraTxCertUpgradeError
-> Either DijkstraTxCertUpgradeError (DijkstraTxCert DijkstraEra)
forall a b. a -> Either a b
Left DijkstraTxCertUpgradeError
UnRegTxCertExpunged
    -- Using wildcard here in order to workaround ghc disrespecting
    -- the completeness pragma in presence of `PreviousEra` type family.
    TxCert (PreviousEra DijkstraEra)
_ -> String
-> Either DijkstraTxCertUpgradeError (DijkstraTxCert DijkstraEra)
forall a. HasCallStack => String -> a
error String
"Impossible: all patterns have been accounted for"

  getVKeyWitnessTxCert :: TxCert DijkstraEra -> Maybe (KeyHash Witness)
getVKeyWitnessTxCert = TxCert DijkstraEra -> Maybe (KeyHash Witness)
DijkstraTxCert DijkstraEra -> Maybe (KeyHash Witness)
forall era. DijkstraTxCert era -> Maybe (KeyHash Witness)
getVKeyWitnessDijkstraTxCert

  getScriptWitnessTxCert :: TxCert DijkstraEra -> Maybe ScriptHash
getScriptWitnessTxCert = TxCert DijkstraEra -> Maybe ScriptHash
DijkstraTxCert DijkstraEra -> Maybe ScriptHash
forall era. DijkstraTxCert era -> Maybe ScriptHash
getScriptWitnessDijkstraTxCert

  mkRegPoolTxCert :: StakePoolParams -> TxCert DijkstraEra
mkRegPoolTxCert = PoolCert -> DijkstraTxCert DijkstraEra
forall era. PoolCert -> DijkstraTxCert era
DijkstraTxCertPool (PoolCert -> DijkstraTxCert DijkstraEra)
-> (StakePoolParams -> PoolCert)
-> StakePoolParams
-> DijkstraTxCert DijkstraEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StakePoolParams -> PoolCert
RegPool

  getRegPoolTxCert :: TxCert DijkstraEra -> Maybe StakePoolParams
getRegPoolTxCert (DijkstraTxCertPool (RegPool StakePoolParams
poolParams)) = StakePoolParams -> Maybe StakePoolParams
forall a. a -> Maybe a
Just StakePoolParams
poolParams
  getRegPoolTxCert TxCert DijkstraEra
_ = Maybe StakePoolParams
forall a. Maybe a
Nothing

  mkRetirePoolTxCert :: KeyHash StakePool -> EpochNo -> TxCert DijkstraEra
mkRetirePoolTxCert KeyHash StakePool
poolId EpochNo
epochNo = PoolCert -> DijkstraTxCert DijkstraEra
forall era. PoolCert -> DijkstraTxCert era
DijkstraTxCertPool (PoolCert -> DijkstraTxCert DijkstraEra)
-> PoolCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ KeyHash StakePool -> EpochNo -> PoolCert
RetirePool KeyHash StakePool
poolId EpochNo
epochNo

  getRetirePoolTxCert :: TxCert DijkstraEra -> Maybe (KeyHash StakePool, EpochNo)
getRetirePoolTxCert (DijkstraTxCertPool (RetirePool KeyHash StakePool
poolId EpochNo
epochNo)) = (KeyHash StakePool, EpochNo) -> Maybe (KeyHash StakePool, EpochNo)
forall a. a -> Maybe a
Just (KeyHash StakePool
poolId, EpochNo
epochNo)
  getRetirePoolTxCert TxCert DijkstraEra
_ = Maybe (KeyHash StakePool, EpochNo)
forall a. Maybe a
Nothing

  lookupRegStakeTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking)
lookupRegStakeTxCert = \case
    RegDepositTxCert Credential Staking
c Coin
_ -> Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
    RegDepositDelegTxCert Credential Staking
c Delegatee
_ Coin
_ -> Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
    TxCert DijkstraEra
_ -> Maybe (Credential Staking)
forall a. Maybe a
Nothing
  lookupUnRegStakeTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking)
lookupUnRegStakeTxCert = \case
    UnRegDepositTxCert Credential Staking
c Coin
_ -> Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
    TxCert DijkstraEra
_ -> Maybe (Credential Staking)
forall a. Maybe a
Nothing

  getTotalRefundsTxCerts :: forall (f :: * -> *).
Foldable f =>
PParams DijkstraEra
-> (Credential Staking -> Maybe Coin)
-> (Credential DRepRole -> Maybe Coin)
-> f (TxCert DijkstraEra)
-> Coin
getTotalRefundsTxCerts PParams DijkstraEra
_ Credential Staking -> Maybe Coin
_ Credential DRepRole -> Maybe Coin
_ = f (TxCert DijkstraEra) -> Coin
forall (f :: * -> *) era.
(Foldable f, ConwayEraTxCert era) =>
f (TxCert era) -> Coin
dijkstraTotalRefundsTxCerts

  getTotalDepositsTxCerts :: forall (f :: * -> *).
Foldable f =>
PParams DijkstraEra
-> (KeyHash StakePool -> Bool) -> f (TxCert DijkstraEra) -> Coin
getTotalDepositsTxCerts = PParams DijkstraEra
-> (KeyHash StakePool -> Bool) -> f (TxCert DijkstraEra) -> Coin
forall era (f :: * -> *).
(ConwayEraPParams era, Foldable f, ConwayEraTxCert era) =>
PParams era
-> (KeyHash StakePool -> Bool) -> f (TxCert era) -> Coin
conwayTotalDepositsTxCerts

getScriptWitnessDijkstraTxCert :: DijkstraTxCert era -> Maybe ScriptHash
getScriptWitnessDijkstraTxCert :: forall era. DijkstraTxCert era -> Maybe ScriptHash
getScriptWitnessDijkstraTxCert = \case
  DijkstraTxCertDeleg DijkstraDelegCert
delegCert ->
    case DijkstraDelegCert
delegCert of
      DijkstraRegCert Credential Staking
cred Coin
_ -> Credential Staking -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential Staking
cred
      DijkstraUnRegCert Credential Staking
cred Coin
_ -> Credential Staking -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential Staking
cred
      DijkstraDelegCert Credential Staking
cred Delegatee
_ -> Credential Staking -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential Staking
cred
      DijkstraRegDelegCert Credential Staking
cred Delegatee
_ Coin
_ -> Credential Staking -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential Staking
cred
  DijkstraTxCertPool {} -> Maybe ScriptHash
forall a. Maybe a
Nothing
  DijkstraTxCertGov ConwayGovCert
govCert -> ConwayGovCert -> Maybe ScriptHash
govWitness ConwayGovCert
govCert
  where
    govWitness :: ConwayGovCert -> Maybe ScriptHash
    govWitness :: ConwayGovCert -> Maybe ScriptHash
govWitness = \case
      ConwayAuthCommitteeHotKey Credential ColdCommitteeRole
coldCred Credential HotCommitteeRole
_hotCred -> Credential ColdCommitteeRole -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential ColdCommitteeRole
coldCred
      ConwayResignCommitteeColdKey Credential ColdCommitteeRole
coldCred StrictMaybe Anchor
_ -> Credential ColdCommitteeRole -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential ColdCommitteeRole
coldCred
      ConwayRegDRep Credential DRepRole
cred Coin
_ StrictMaybe Anchor
_ -> Credential DRepRole -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential DRepRole
cred
      ConwayUnRegDRep Credential DRepRole
cred Coin
_ -> Credential DRepRole -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential DRepRole
cred
      ConwayUpdateDRep Credential DRepRole
cred StrictMaybe Anchor
_ -> Credential DRepRole -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash Credential DRepRole
cred

getVKeyWitnessDijkstraTxCert :: DijkstraTxCert era -> Maybe (KeyHash Witness)
getVKeyWitnessDijkstraTxCert :: forall era. DijkstraTxCert era -> Maybe (KeyHash Witness)
getVKeyWitnessDijkstraTxCert = \case
  DijkstraTxCertDeleg DijkstraDelegCert
delegCert ->
    case DijkstraDelegCert
delegCert of
      DijkstraRegCert Credential Staking
cred Coin
_ -> Credential Staking -> Maybe (KeyHash Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash Witness)
credKeyHashWitness Credential Staking
cred
      DijkstraUnRegCert Credential Staking
cred Coin
_ -> Credential Staking -> Maybe (KeyHash Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash Witness)
credKeyHashWitness Credential Staking
cred
      DijkstraDelegCert Credential Staking
cred Delegatee
_ -> Credential Staking -> Maybe (KeyHash Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash Witness)
credKeyHashWitness Credential Staking
cred
      DijkstraRegDelegCert Credential Staking
cred Delegatee
_ Coin
_ -> Credential Staking -> Maybe (KeyHash Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash Witness)
credKeyHashWitness Credential Staking
cred
  DijkstraTxCertPool PoolCert
poolCert -> KeyHash Witness -> Maybe (KeyHash Witness)
forall a. a -> Maybe a
Just (KeyHash Witness -> Maybe (KeyHash Witness))
-> KeyHash Witness -> Maybe (KeyHash Witness)
forall a b. (a -> b) -> a -> b
$ PoolCert -> KeyHash Witness
poolCertKeyHashWitness PoolCert
poolCert
  DijkstraTxCertGov ConwayGovCert
govCert -> ConwayGovCert -> Maybe (KeyHash Witness)
conwayGovCertVKeyWitness ConwayGovCert
govCert

instance ConwayEraTxCert DijkstraEra where
  mkRegDepositTxCert :: Credential Staking -> Coin -> TxCert DijkstraEra
mkRegDepositTxCert Credential Staking
cred Coin
c = DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall era. DijkstraDelegCert -> DijkstraTxCert era
DijkstraTxCertDeleg (DijkstraDelegCert -> DijkstraTxCert DijkstraEra)
-> DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Coin -> DijkstraDelegCert
DijkstraRegCert Credential Staking
cred Coin
c

  getRegDepositTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking, Coin)
getRegDepositTxCert (DijkstraTxCertDeleg (DijkstraRegCert Credential Staking
cred Coin
c)) = (Credential Staking, Coin) -> Maybe (Credential Staking, Coin)
forall a. a -> Maybe a
Just (Credential Staking
cred, Coin
c)
  getRegDepositTxCert TxCert DijkstraEra
_ = Maybe (Credential Staking, Coin)
forall a. Maybe a
Nothing

  mkUnRegDepositTxCert :: Credential Staking -> Coin -> TxCert DijkstraEra
mkUnRegDepositTxCert Credential Staking
cred Coin
c = DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall era. DijkstraDelegCert -> DijkstraTxCert era
DijkstraTxCertDeleg (DijkstraDelegCert -> DijkstraTxCert DijkstraEra)
-> DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Coin -> DijkstraDelegCert
DijkstraUnRegCert Credential Staking
cred Coin
c

  getUnRegDepositTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking, Coin)
getUnRegDepositTxCert (DijkstraTxCertDeleg (DijkstraUnRegCert Credential Staking
cred Coin
c)) = (Credential Staking, Coin) -> Maybe (Credential Staking, Coin)
forall a. a -> Maybe a
Just (Credential Staking
cred, Coin
c)
  getUnRegDepositTxCert TxCert DijkstraEra
_ = Maybe (Credential Staking, Coin)
forall a. Maybe a
Nothing

  mkDelegTxCert :: Credential Staking -> Delegatee -> TxCert DijkstraEra
mkDelegTxCert Credential Staking
cred Delegatee
d = DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall era. DijkstraDelegCert -> DijkstraTxCert era
DijkstraTxCertDeleg (DijkstraDelegCert -> DijkstraTxCert DijkstraEra)
-> DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Delegatee -> DijkstraDelegCert
DijkstraDelegCert Credential Staking
cred Delegatee
d

  getDelegTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking, Delegatee)
getDelegTxCert (DijkstraTxCertDeleg (DijkstraDelegCert Credential Staking
cred Delegatee
d)) = (Credential Staking, Delegatee)
-> Maybe (Credential Staking, Delegatee)
forall a. a -> Maybe a
Just (Credential Staking
cred, Delegatee
d)
  getDelegTxCert TxCert DijkstraEra
_ = Maybe (Credential Staking, Delegatee)
forall a. Maybe a
Nothing

  mkRegDepositDelegTxCert :: Credential Staking -> Delegatee -> Coin -> TxCert DijkstraEra
mkRegDepositDelegTxCert Credential Staking
cred Delegatee
d Coin
c = DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall era. DijkstraDelegCert -> DijkstraTxCert era
DijkstraTxCertDeleg (DijkstraDelegCert -> DijkstraTxCert DijkstraEra)
-> DijkstraDelegCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential Staking -> Delegatee -> Coin -> DijkstraDelegCert
DijkstraRegDelegCert Credential Staking
cred Delegatee
d Coin
c
  getRegDepositDelegTxCert :: TxCert DijkstraEra -> Maybe (Credential Staking, Delegatee, Coin)
getRegDepositDelegTxCert (DijkstraTxCertDeleg (DijkstraRegDelegCert Credential Staking
cred Delegatee
d Coin
c)) = (Credential Staking, Delegatee, Coin)
-> Maybe (Credential Staking, Delegatee, Coin)
forall a. a -> Maybe a
Just (Credential Staking
cred, Delegatee
d, Coin
c)
  getRegDepositDelegTxCert TxCert DijkstraEra
_ = Maybe (Credential Staking, Delegatee, Coin)
forall a. Maybe a
Nothing

  mkAuthCommitteeHotKeyTxCert :: Credential ColdCommitteeRole
-> Credential HotCommitteeRole -> TxCert DijkstraEra
mkAuthCommitteeHotKeyTxCert Credential ColdCommitteeRole
ck Credential HotCommitteeRole
hk = ConwayGovCert -> DijkstraTxCert DijkstraEra
forall era. ConwayGovCert -> DijkstraTxCert era
DijkstraTxCertGov (ConwayGovCert -> DijkstraTxCert DijkstraEra)
-> ConwayGovCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential ColdCommitteeRole
-> Credential HotCommitteeRole -> ConwayGovCert
ConwayAuthCommitteeHotKey Credential ColdCommitteeRole
ck Credential HotCommitteeRole
hk
  getAuthCommitteeHotKeyTxCert :: TxCert DijkstraEra
-> Maybe
     (Credential ColdCommitteeRole, Credential HotCommitteeRole)
getAuthCommitteeHotKeyTxCert (DijkstraTxCertGov (ConwayAuthCommitteeHotKey Credential ColdCommitteeRole
ck Credential HotCommitteeRole
hk)) = (Credential ColdCommitteeRole, Credential HotCommitteeRole)
-> Maybe
     (Credential ColdCommitteeRole, Credential HotCommitteeRole)
forall a. a -> Maybe a
Just (Credential ColdCommitteeRole
ck, Credential HotCommitteeRole
hk)
  getAuthCommitteeHotKeyTxCert TxCert DijkstraEra
_ = Maybe (Credential ColdCommitteeRole, Credential HotCommitteeRole)
forall a. Maybe a
Nothing

  mkResignCommitteeColdTxCert :: Credential ColdCommitteeRole
-> StrictMaybe Anchor -> TxCert DijkstraEra
mkResignCommitteeColdTxCert Credential ColdCommitteeRole
ck StrictMaybe Anchor
a = ConwayGovCert -> DijkstraTxCert DijkstraEra
forall era. ConwayGovCert -> DijkstraTxCert era
DijkstraTxCertGov (ConwayGovCert -> DijkstraTxCert DijkstraEra)
-> ConwayGovCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential ColdCommitteeRole -> StrictMaybe Anchor -> ConwayGovCert
ConwayResignCommitteeColdKey Credential ColdCommitteeRole
ck StrictMaybe Anchor
a
  getResignCommitteeColdTxCert :: TxCert DijkstraEra
-> Maybe (Credential ColdCommitteeRole, StrictMaybe Anchor)
getResignCommitteeColdTxCert (DijkstraTxCertGov (ConwayResignCommitteeColdKey Credential ColdCommitteeRole
ck StrictMaybe Anchor
a)) = (Credential ColdCommitteeRole, StrictMaybe Anchor)
-> Maybe (Credential ColdCommitteeRole, StrictMaybe Anchor)
forall a. a -> Maybe a
Just (Credential ColdCommitteeRole
ck, StrictMaybe Anchor
a)
  getResignCommitteeColdTxCert TxCert DijkstraEra
_ = Maybe (Credential ColdCommitteeRole, StrictMaybe Anchor)
forall a. Maybe a
Nothing

  mkRegDRepTxCert :: Credential DRepRole
-> Coin -> StrictMaybe Anchor -> TxCert DijkstraEra
mkRegDRepTxCert Credential DRepRole
cred Coin
deposit StrictMaybe Anchor
mAnchor = ConwayGovCert -> DijkstraTxCert DijkstraEra
forall era. ConwayGovCert -> DijkstraTxCert era
DijkstraTxCertGov (ConwayGovCert -> DijkstraTxCert DijkstraEra)
-> ConwayGovCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential DRepRole -> Coin -> StrictMaybe Anchor -> ConwayGovCert
ConwayRegDRep Credential DRepRole
cred Coin
deposit StrictMaybe Anchor
mAnchor
  getRegDRepTxCert :: TxCert DijkstraEra
-> Maybe (Credential DRepRole, Coin, StrictMaybe Anchor)
getRegDRepTxCert = \case
    DijkstraTxCertGov (ConwayRegDRep Credential DRepRole
cred Coin
deposit StrictMaybe Anchor
mAnchor) -> (Credential DRepRole, Coin, StrictMaybe Anchor)
-> Maybe (Credential DRepRole, Coin, StrictMaybe Anchor)
forall a. a -> Maybe a
Just (Credential DRepRole
cred, Coin
deposit, StrictMaybe Anchor
mAnchor)
    TxCert DijkstraEra
_ -> Maybe (Credential DRepRole, Coin, StrictMaybe Anchor)
forall a. Maybe a
Nothing

  mkUnRegDRepTxCert :: Credential DRepRole -> Coin -> TxCert DijkstraEra
mkUnRegDRepTxCert Credential DRepRole
cred Coin
deposit = ConwayGovCert -> DijkstraTxCert DijkstraEra
forall era. ConwayGovCert -> DijkstraTxCert era
DijkstraTxCertGov (ConwayGovCert -> DijkstraTxCert DijkstraEra)
-> ConwayGovCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential DRepRole -> Coin -> ConwayGovCert
ConwayUnRegDRep Credential DRepRole
cred Coin
deposit
  getUnRegDRepTxCert :: TxCert DijkstraEra -> Maybe (Credential DRepRole, Coin)
getUnRegDRepTxCert = \case
    DijkstraTxCertGov (ConwayUnRegDRep Credential DRepRole
cred Coin
deposit) -> (Credential DRepRole, Coin) -> Maybe (Credential DRepRole, Coin)
forall a. a -> Maybe a
Just (Credential DRepRole
cred, Coin
deposit)
    TxCert DijkstraEra
_ -> Maybe (Credential DRepRole, Coin)
forall a. Maybe a
Nothing

  mkUpdateDRepTxCert :: Credential DRepRole -> StrictMaybe Anchor -> TxCert DijkstraEra
mkUpdateDRepTxCert Credential DRepRole
cred StrictMaybe Anchor
mAnchor = ConwayGovCert -> DijkstraTxCert DijkstraEra
forall era. ConwayGovCert -> DijkstraTxCert era
DijkstraTxCertGov (ConwayGovCert -> DijkstraTxCert DijkstraEra)
-> ConwayGovCert -> DijkstraTxCert DijkstraEra
forall a b. (a -> b) -> a -> b
$ Credential DRepRole -> StrictMaybe Anchor -> ConwayGovCert
ConwayUpdateDRep Credential DRepRole
cred StrictMaybe Anchor
mAnchor
  getUpdateDRepTxCert :: TxCert DijkstraEra
-> Maybe (Credential DRepRole, StrictMaybe Anchor)
getUpdateDRepTxCert = \case
    DijkstraTxCertGov (ConwayUpdateDRep Credential DRepRole
cred StrictMaybe Anchor
mAnchor) -> (Credential DRepRole, StrictMaybe Anchor)
-> Maybe (Credential DRepRole, StrictMaybe Anchor)
forall a. a -> Maybe a
Just (Credential DRepRole
cred, StrictMaybe Anchor
mAnchor)
    TxCert DijkstraEra
_ -> Maybe (Credential DRepRole, StrictMaybe Anchor)
forall a. Maybe a
Nothing