{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE UndecidableSuperClasses #-}

module Cardano.Ledger.Api.Tx.Wits (
  -- * Shelley onwards
  EraTxWits (TxWits),
  mkBasicTxWits,

  -- ** Address witness
  addrTxWitsL,
  KeyRole (Witness),

  -- *** WitVKey
  WitVKey (WitVKey),
  witVKeyHash,

  -- ** Byron address witness
  bootAddrTxWitsL,
  BootstrapWitness,

  -- ** Script witness
  scriptTxWitsL,
  hashScriptTxWitsL,

  -- * Any era
  AnyEraTxWits (..),

  -- * Alonzo onwards
  AlonzoEraTxWits,
  datsTxWitsL,
  hashDataTxWitsL,
  TxDats (..),
  unTxDats,
  unTxDatsL,
  rdmrsTxWitsL,
  Redeemers (..),
  unRedeemers,
  unRedeemersL,
  PlutusPurpose,
  AlonzoPlutusPurpose (..),
  AsIx (..),
  AsItem (..),

  -- ** Conway
  ConwayPlutusPurpose (..),

  -- * Upgrade
  binaryUpgradeTxWits,
  upgradeTxWits,
) where

import Cardano.Ledger.Alonzo.Scripts (
  AlonzoPlutusPurpose (..),
  AsItem (..),
  AsIx (..),
  PlutusPurpose,
 )
import Cardano.Ledger.Alonzo.TxWits (
  AlonzoEraTxWits,
  Redeemers (..),
  TxDats (..),
  datsTxWitsL,
  hashDataTxWitsL,
  rdmrsTxWitsL,
  unRedeemers,
  unRedeemersL,
  unTxDats,
  unTxDatsL,
 )
import Cardano.Ledger.Api.Era
import Cardano.Ledger.Api.Scripts (AnyEraScript)
import Cardano.Ledger.Conway.Scripts (ConwayPlutusPurpose (..))
import Cardano.Ledger.Core (EraTxWits (..), binaryUpgradeTxWits, hashScriptTxWitsL)
import Cardano.Ledger.Keys (KeyRole (Witness))
import Cardano.Ledger.Keys.Bootstrap (BootstrapWitness)
import Cardano.Ledger.Keys.WitVKey (WitVKey (WitVKey), witVKeyHash)
import Lens.Micro

class (EraTxWits era, AnyEraScript era) => AnyEraTxWits era where
  datsTxWitsG :: SimpleGetter (TxWits era) (Maybe (TxDats era))
  default datsTxWitsG :: AlonzoEraTxWits era => SimpleGetter (TxWits era) (Maybe (TxDats era))
  datsTxWitsG = (TxDats era -> Const r (TxDats era))
-> TxWits era -> Const r (TxWits era)
forall era. AlonzoEraTxWits era => Lens' (TxWits era) (TxDats era)
Lens' (TxWits era) (TxDats era)
datsTxWitsL ((TxDats era -> Const r (TxDats era))
 -> TxWits era -> Const r (TxWits era))
-> ((Maybe (TxDats era) -> Const r (Maybe (TxDats era)))
    -> TxDats era -> Const r (TxDats era))
-> (Maybe (TxDats era) -> Const r (Maybe (TxDats era)))
-> TxWits era
-> Const r (TxWits era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxDats era -> Maybe (TxDats era))
-> SimpleGetter (TxDats era) (Maybe (TxDats era))
forall s a. (s -> a) -> SimpleGetter s a
to TxDats era -> Maybe (TxDats era)
forall a. a -> Maybe a
Just

  rdmrsTxWitsG :: SimpleGetter (TxWits era) (Maybe (Redeemers era))
  default rdmrsTxWitsG :: AlonzoEraTxWits era => SimpleGetter (TxWits era) (Maybe (Redeemers era))
  rdmrsTxWitsG = (Redeemers era -> Const r (Redeemers era))
-> TxWits era -> Const r (TxWits era)
forall era.
AlonzoEraTxWits era =>
Lens' (TxWits era) (Redeemers era)
Lens' (TxWits era) (Redeemers era)
rdmrsTxWitsL ((Redeemers era -> Const r (Redeemers era))
 -> TxWits era -> Const r (TxWits era))
-> ((Maybe (Redeemers era) -> Const r (Maybe (Redeemers era)))
    -> Redeemers era -> Const r (Redeemers era))
-> (Maybe (Redeemers era) -> Const r (Maybe (Redeemers era)))
-> TxWits era
-> Const r (TxWits era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Redeemers era -> Maybe (Redeemers era))
-> SimpleGetter (Redeemers era) (Maybe (Redeemers era))
forall s a. (s -> a) -> SimpleGetter s a
to Redeemers era -> Maybe (Redeemers era)
forall a. a -> Maybe a
Just

instance AnyEraTxWits ShelleyEra where
  datsTxWitsG :: SimpleGetter (TxWits ShelleyEra) (Maybe (TxDats ShelleyEra))
datsTxWitsG = (ShelleyTxWits ShelleyEra -> Maybe (TxDats ShelleyEra))
-> SimpleGetter
     (ShelleyTxWits ShelleyEra) (Maybe (TxDats ShelleyEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (TxDats ShelleyEra)
-> ShelleyTxWits ShelleyEra -> Maybe (TxDats ShelleyEra)
forall a b. a -> b -> a
const Maybe (TxDats ShelleyEra)
forall a. Maybe a
Nothing)
  rdmrsTxWitsG :: SimpleGetter (TxWits ShelleyEra) (Maybe (Redeemers ShelleyEra))
rdmrsTxWitsG = (ShelleyTxWits ShelleyEra -> Maybe (Redeemers ShelleyEra))
-> SimpleGetter
     (ShelleyTxWits ShelleyEra) (Maybe (Redeemers ShelleyEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (Redeemers ShelleyEra)
-> ShelleyTxWits ShelleyEra -> Maybe (Redeemers ShelleyEra)
forall a b. a -> b -> a
const Maybe (Redeemers ShelleyEra)
forall a. Maybe a
Nothing)

instance AnyEraTxWits AllegraEra where
  datsTxWitsG :: SimpleGetter (TxWits AllegraEra) (Maybe (TxDats AllegraEra))
datsTxWitsG = (ShelleyTxWits AllegraEra -> Maybe (TxDats AllegraEra))
-> SimpleGetter
     (ShelleyTxWits AllegraEra) (Maybe (TxDats AllegraEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (TxDats AllegraEra)
-> ShelleyTxWits AllegraEra -> Maybe (TxDats AllegraEra)
forall a b. a -> b -> a
const Maybe (TxDats AllegraEra)
forall a. Maybe a
Nothing)
  rdmrsTxWitsG :: SimpleGetter (TxWits AllegraEra) (Maybe (Redeemers AllegraEra))
rdmrsTxWitsG = (ShelleyTxWits AllegraEra -> Maybe (Redeemers AllegraEra))
-> SimpleGetter
     (ShelleyTxWits AllegraEra) (Maybe (Redeemers AllegraEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (Redeemers AllegraEra)
-> ShelleyTxWits AllegraEra -> Maybe (Redeemers AllegraEra)
forall a b. a -> b -> a
const Maybe (Redeemers AllegraEra)
forall a. Maybe a
Nothing)

instance AnyEraTxWits MaryEra where
  datsTxWitsG :: SimpleGetter (TxWits MaryEra) (Maybe (TxDats MaryEra))
datsTxWitsG = (ShelleyTxWits MaryEra -> Maybe (TxDats MaryEra))
-> SimpleGetter (ShelleyTxWits MaryEra) (Maybe (TxDats MaryEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (TxDats MaryEra)
-> ShelleyTxWits MaryEra -> Maybe (TxDats MaryEra)
forall a b. a -> b -> a
const Maybe (TxDats MaryEra)
forall a. Maybe a
Nothing)
  rdmrsTxWitsG :: SimpleGetter (TxWits MaryEra) (Maybe (Redeemers MaryEra))
rdmrsTxWitsG = (ShelleyTxWits MaryEra -> Maybe (Redeemers MaryEra))
-> SimpleGetter (ShelleyTxWits MaryEra) (Maybe (Redeemers MaryEra))
forall s a. (s -> a) -> SimpleGetter s a
to (Maybe (Redeemers MaryEra)
-> ShelleyTxWits MaryEra -> Maybe (Redeemers MaryEra)
forall a b. a -> b -> a
const Maybe (Redeemers MaryEra)
forall a. Maybe a
Nothing)

instance AnyEraTxWits AlonzoEra

instance AnyEraTxWits BabbageEra

instance AnyEraTxWits ConwayEra

instance AnyEraTxWits DijkstraEra