{-# 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,
  conwayTotalRefundsTxCerts,
  conwayTxCertDelegDecoder,
 )
import Cardano.Ledger.Core (
  Era,
  EraTxCert (..),
  KeyHash,
  KeyRole (..),
  PoolCert (..),
  ScriptHash,
  Value,
  eraProtVerLow,
  fromEraCBOR,
 )
import Cardano.Ledger.Credential (StakeCredential, 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 GHC.Generics (Generic)
import NoThunks.Class (NoThunks)

data DijkstraDelegCert
  = DijkstraRegCert !StakeCredential !Coin
  | DijkstraUnRegCert !StakeCredential !Coin
  | DijkstraDelegCert !StakeCredential !Delegatee
  | DijkstraRegDelegCert !StakeCredential !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 StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraUnRegCert StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Coin -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Coin
deposit
    DijkstraDelegCert StakeCredential
cred (DelegStake KeyHash 'StakePool
poolId) -> ShelleyDelegCert -> Encoding
encodeShelleyDelegCert (ShelleyDelegCert -> Encoding) -> ShelleyDelegCert -> Encoding
forall a b. (a -> b) -> a -> b
$ StakeCredential -> KeyHash 'StakePool -> ShelleyDelegCert
ShelleyDelegCert StakeCredential
cred KeyHash 'StakePool
poolId
    DijkstraDelegCert StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
cred
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> DRep -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR DRep
drep
    DijkstraDelegCert StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
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 StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
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 StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
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 StakeCredential
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
<> StakeCredential -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StakeCredential
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 StakeCredential
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
.= StakeCredential -> Value
forall a. ToJSON a => a -> Value
toJSON StakeCredential
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 StakeCredential
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
.= StakeCredential -> Value
forall a. ToJSON a => a -> Value
toJSON StakeCredential
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 StakeCredential
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
.= StakeCredential -> Value
forall a. ToJSON a => a -> Value
toJSON StakeCredential
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 StakeCredential
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
.= StakeCredential -> Value
forall a. ToJSON a => a -> Value
toJSON StakeCredential
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
          StakeCredential
cred <- Decoder s StakeCredential
forall s. Decoder s StakeCredential
forall a s. DecCBOR a => Decoder s a
decCBOR
          KeyHash 'StakePool
stakePool <- Decoder s (KeyHash 'StakePool)
forall s. Decoder s (KeyHash 'StakePool)
forall a s. DecCBOR a => Decoder s a
decCBOR
          (Int, DijkstraTxCert era) -> Decoder s (Int, DijkstraTxCert era)
forall a. a -> Decoder s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
3, StakeCredential -> Delegatee -> TxCert era
forall era.
ConwayEraTxCert era =>
StakeCredential -> Delegatee -> TxCert era
DelegTxCert StakeCredential
cred (KeyHash 'StakePool -> Delegatee
DelegStake KeyHash 'StakePool
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, Val (Value 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

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 PoolParams
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
$ PoolParams -> TxCert DijkstraEra
forall era. EraTxCert era => PoolParams -> TxCert era
RegPoolTxCert PoolParams
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 StakeCredential
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
$ StakeCredential -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
StakeCredential -> Coin -> TxCert era
RegDepositTxCert StakeCredential
cred Coin
c
    UnRegDepositTxCert StakeCredential
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
$ StakeCredential -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
StakeCredential -> Coin -> TxCert era
UnRegDepositTxCert StakeCredential
cred Coin
c
    DelegTxCert StakeCredential
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
$ StakeCredential -> Delegatee -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
StakeCredential -> Delegatee -> TxCert era
DelegTxCert StakeCredential
cred Delegatee
d
    RegDepositDelegTxCert StakeCredential
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
$ StakeCredential -> Delegatee -> Coin -> TxCert DijkstraEra
forall era.
ConwayEraTxCert era =>
StakeCredential -> Delegatee -> Coin -> TxCert era
RegDepositDelegTxCert StakeCredential
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 :: PoolParams -> TxCert DijkstraEra
mkRegPoolTxCert = PoolCert -> DijkstraTxCert DijkstraEra
forall era. PoolCert -> DijkstraTxCert era
DijkstraTxCertPool (PoolCert -> DijkstraTxCert DijkstraEra)
-> (PoolParams -> PoolCert)
-> PoolParams
-> DijkstraTxCert DijkstraEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PoolParams -> PoolCert
RegPool

  getRegPoolTxCert :: TxCert DijkstraEra -> Maybe PoolParams
getRegPoolTxCert (DijkstraTxCertPool (RegPool PoolParams
poolParams)) = PoolParams -> Maybe PoolParams
forall a. a -> Maybe a
Just PoolParams
poolParams
  getRegPoolTxCert TxCert DijkstraEra
_ = Maybe PoolParams
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 StakeCredential
lookupRegStakeTxCert = \case
    RegDepositTxCert StakeCredential
c Coin
_ -> StakeCredential -> Maybe StakeCredential
forall a. a -> Maybe a
Just StakeCredential
c
    RegDepositDelegTxCert StakeCredential
c Delegatee
_ Coin
_ -> StakeCredential -> Maybe StakeCredential
forall a. a -> Maybe a
Just StakeCredential
c
    TxCert DijkstraEra
_ -> Maybe StakeCredential
forall a. Maybe a
Nothing
  lookupUnRegStakeTxCert :: TxCert DijkstraEra -> Maybe StakeCredential
lookupUnRegStakeTxCert = \case
    UnRegDepositTxCert StakeCredential
c Coin
_ -> StakeCredential -> Maybe StakeCredential
forall a. a -> Maybe a
Just StakeCredential
c
    TxCert DijkstraEra
_ -> Maybe StakeCredential
forall a. Maybe a
Nothing

  getTotalRefundsTxCerts :: forall (f :: * -> *).
Foldable f =>
PParams DijkstraEra
-> (StakeCredential -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> f (TxCert DijkstraEra)
-> Coin
getTotalRefundsTxCerts = PParams DijkstraEra
-> (StakeCredential -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> f (TxCert DijkstraEra)
-> Coin
forall era (f :: * -> *).
(EraPParams era, Foldable f, ConwayEraTxCert era) =>
PParams era
-> (StakeCredential -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> f (TxCert era)
-> Coin
conwayTotalRefundsTxCerts

  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 StakeCredential
cred Coin
_ -> StakeCredential -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash StakeCredential
cred
      DijkstraUnRegCert StakeCredential
cred Coin
_ -> StakeCredential -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash StakeCredential
cred
      DijkstraDelegCert StakeCredential
cred Delegatee
_ -> StakeCredential -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash StakeCredential
cred
      DijkstraRegDelegCert StakeCredential
cred Delegatee
_ Coin
_ -> StakeCredential -> Maybe ScriptHash
forall (kr :: KeyRole). Credential kr -> Maybe ScriptHash
credScriptHash StakeCredential
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 StakeCredential
cred Coin
_ -> StakeCredential -> Maybe (KeyHash 'Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash 'Witness)
credKeyHashWitness StakeCredential
cred
      DijkstraUnRegCert StakeCredential
cred Coin
_ -> StakeCredential -> Maybe (KeyHash 'Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash 'Witness)
credKeyHashWitness StakeCredential
cred
      DijkstraDelegCert StakeCredential
cred Delegatee
_ -> StakeCredential -> Maybe (KeyHash 'Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash 'Witness)
credKeyHashWitness StakeCredential
cred
      DijkstraRegDelegCert StakeCredential
cred Delegatee
_ Coin
_ -> StakeCredential -> Maybe (KeyHash 'Witness)
forall (r :: KeyRole). Credential r -> Maybe (KeyHash 'Witness)
credKeyHashWitness StakeCredential
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 :: StakeCredential -> Coin -> TxCert DijkstraEra
mkRegDepositTxCert StakeCredential
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
$ StakeCredential -> Coin -> DijkstraDelegCert
DijkstraRegCert StakeCredential
cred Coin
c

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

  mkUnRegDepositTxCert :: StakeCredential -> Coin -> TxCert DijkstraEra
mkUnRegDepositTxCert StakeCredential
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
$ StakeCredential -> Coin -> DijkstraDelegCert
DijkstraUnRegCert StakeCredential
cred Coin
c

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

  mkDelegTxCert :: StakeCredential -> Delegatee -> TxCert DijkstraEra
mkDelegTxCert StakeCredential
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
$ StakeCredential -> Delegatee -> DijkstraDelegCert
DijkstraDelegCert StakeCredential
cred Delegatee
d

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

  mkRegDepositDelegTxCert :: StakeCredential -> Delegatee -> Coin -> TxCert DijkstraEra
mkRegDepositDelegTxCert StakeCredential
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
$ StakeCredential -> Delegatee -> Coin -> DijkstraDelegCert
DijkstraRegDelegCert StakeCredential
cred Delegatee
d Coin
c
  getRegDepositDelegTxCert :: TxCert DijkstraEra -> Maybe (StakeCredential, Delegatee, Coin)
getRegDepositDelegTxCert (DijkstraTxCertDeleg (DijkstraRegDelegCert StakeCredential
cred Delegatee
d Coin
c)) = (StakeCredential, Delegatee, Coin)
-> Maybe (StakeCredential, Delegatee, Coin)
forall a. a -> Maybe a
Just (StakeCredential
cred, Delegatee
d, Coin
c)
  getRegDepositDelegTxCert TxCert DijkstraEra
_ = Maybe (StakeCredential, 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