{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# OPTIONS_HADDOCK not-home #-}

module Cardano.Ledger.Shelley.Tx (
  -- * Transaction
  ShelleyTx (..),
  Tx (..),
  bodyShelleyTxL,
  witsShelleyTxL,
  auxDataShelleyTxL,
  mkBasicShelleyTx,
  shelleyMinFeeTx,
  sizeShelleyTxF,
  shelleyTxEqRaw,
) where

import Cardano.Ledger.Binary (
  Annotator (..),
  DecCBOR (decCBOR),
  EncCBOR (encCBOR),
  Encoding,
  ToCBOR,
  decodeNullStrictMaybe,
  encodeListLen,
  encodeNullStrictMaybe,
  serialize,
 )
import Cardano.Ledger.Binary.Coders
import qualified Cardano.Ledger.Binary.Plain as Plain
import Cardano.Ledger.Coin (Coin)
import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Shelley.Era (ShelleyEra)
import Cardano.Ledger.Shelley.Scripts (validateMultiSig)
import Cardano.Ledger.Shelley.TxAuxData ()
import Cardano.Ledger.Shelley.TxBody ()
import Cardano.Ledger.Shelley.TxWits ()
import Cardano.Ledger.Val ((<+>), (<×>))
import Control.DeepSeq (NFData)
import qualified Data.ByteString.Lazy as LBS
import Data.Functor.Classes (Eq1 (..))
import Data.Maybe.Strict (
  StrictMaybe (..),
  strictMaybeToMaybe,
 )
import GHC.Generics (Generic)
import Lens.Micro (Lens', SimpleGetter, lens, to, (^.))
import NoThunks.Class (NoThunks (..))

-- ========================================================

data ShelleyTx era = ShelleyTx
  { forall era. ShelleyTx era -> TxBody era
stBody :: !(TxBody era)
  , forall era. ShelleyTx era -> TxWits era
stWits :: !(TxWits era)
  , forall era. ShelleyTx era -> StrictMaybe (TxAuxData era)
stAuxData :: !(StrictMaybe (TxAuxData era))
  }
  deriving ((forall x. ShelleyTx era -> Rep (ShelleyTx era) x)
-> (forall x. Rep (ShelleyTx era) x -> ShelleyTx era)
-> Generic (ShelleyTx era)
forall x. Rep (ShelleyTx era) x -> ShelleyTx era
forall x. ShelleyTx era -> Rep (ShelleyTx era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (ShelleyTx era) x -> ShelleyTx era
forall era x. ShelleyTx era -> Rep (ShelleyTx era) x
$cfrom :: forall era x. ShelleyTx era -> Rep (ShelleyTx era) x
from :: forall x. ShelleyTx era -> Rep (ShelleyTx era) x
$cto :: forall era x. Rep (ShelleyTx era) x -> ShelleyTx era
to :: forall x. Rep (ShelleyTx era) x -> ShelleyTx era
Generic)

instance
  ( NFData (TxBody era)
  , NFData (TxWits era)
  , NFData (TxAuxData era)
  ) =>
  NFData (ShelleyTx era)

deriving instance
  ( Era era
  , Eq (TxBody era)
  , Eq (TxWits era)
  , Eq (TxAuxData era)
  ) =>
  Eq (ShelleyTx era)

deriving instance
  ( Era era
  , Show (TxBody era)
  , Show (TxWits era)
  , Show (TxAuxData era)
  ) =>
  Show (ShelleyTx era)

instance
  ( Era era
  , NoThunks (TxAuxData era)
  , NoThunks (TxBody era)
  , NoThunks (TxWits era)
  ) =>
  NoThunks (ShelleyTx era)

-- | `TxBody` setter and getter for `ShelleyTx`.
bodyShelleyTxL :: Lens' (ShelleyTx era) (TxBody era)
bodyShelleyTxL :: forall era (f :: * -> *).
Functor f =>
(TxBody era -> f (TxBody era))
-> ShelleyTx era -> f (ShelleyTx era)
bodyShelleyTxL =
  (ShelleyTx era -> TxBody era)
-> (ShelleyTx era -> TxBody era -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (TxBody era -> f (TxBody era))
   -> ShelleyTx era -> f (ShelleyTx era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens ShelleyTx era -> TxBody era
forall era. ShelleyTx era -> TxBody era
stBody ((ShelleyTx era -> TxBody era -> ShelleyTx era)
 -> forall {f :: * -> *}.
    Functor f =>
    (TxBody era -> f (TxBody era))
    -> ShelleyTx era -> f (ShelleyTx era))
-> (ShelleyTx era -> TxBody era -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (TxBody era -> f (TxBody era))
   -> ShelleyTx era -> f (ShelleyTx era)
forall a b. (a -> b) -> a -> b
$ \ShelleyTx era
tx TxBody era
txBody -> ShelleyTx era
tx {stBody = txBody}
{-# INLINEABLE bodyShelleyTxL #-}

-- | `TxWits` setter and getter for `ShelleyTx`.
witsShelleyTxL :: Lens' (ShelleyTx era) (TxWits era)
witsShelleyTxL :: forall era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> ShelleyTx era -> f (ShelleyTx era)
witsShelleyTxL =
  (ShelleyTx era -> TxWits era)
-> (ShelleyTx era -> TxWits era -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (TxWits era -> f (TxWits era))
   -> ShelleyTx era -> f (ShelleyTx era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens ShelleyTx era -> TxWits era
forall era. ShelleyTx era -> TxWits era
stWits ((ShelleyTx era -> TxWits era -> ShelleyTx era)
 -> forall {f :: * -> *}.
    Functor f =>
    (TxWits era -> f (TxWits era))
    -> ShelleyTx era -> f (ShelleyTx era))
-> (ShelleyTx era -> TxWits era -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (TxWits era -> f (TxWits era))
   -> ShelleyTx era -> f (ShelleyTx era)
forall a b. (a -> b) -> a -> b
$ \ShelleyTx era
tx TxWits era
txWits -> ShelleyTx era
tx {stWits = txWits}
{-# INLINEABLE witsShelleyTxL #-}

-- | `TxAuxData` setter and getter for `ShelleyTx`.
auxDataShelleyTxL :: Lens' (ShelleyTx era) (StrictMaybe (TxAuxData era))
auxDataShelleyTxL :: forall era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> ShelleyTx era -> f (ShelleyTx era)
auxDataShelleyTxL =
  (ShelleyTx era -> StrictMaybe (TxAuxData era))
-> (ShelleyTx era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
   -> ShelleyTx era -> f (ShelleyTx era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens ShelleyTx era -> StrictMaybe (TxAuxData era)
forall era. ShelleyTx era -> StrictMaybe (TxAuxData era)
stAuxData ((ShelleyTx era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
 -> forall {f :: * -> *}.
    Functor f =>
    (StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
    -> ShelleyTx era -> f (ShelleyTx era))
-> (ShelleyTx era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> forall {f :: * -> *}.
   Functor f =>
   (StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
   -> ShelleyTx era -> f (ShelleyTx era)
forall a b. (a -> b) -> a -> b
$ \ShelleyTx era
tx StrictMaybe (TxAuxData era)
txAuxData -> ShelleyTx era
tx {stAuxData = txAuxData}
{-# INLINEABLE auxDataShelleyTxL #-}

mkBasicShelleyTx :: EraTx era => TxBody era -> ShelleyTx era
mkBasicShelleyTx :: forall era. EraTx era => TxBody era -> ShelleyTx era
mkBasicShelleyTx TxBody era
txBody =
  ShelleyTx
    { stBody :: TxBody era
stBody = TxBody era
txBody
    , stWits :: TxWits era
stWits = TxWits era
forall era. EraTxWits era => TxWits era
mkBasicTxWits
    , stAuxData :: StrictMaybe (TxAuxData era)
stAuxData = StrictMaybe (TxAuxData era)
forall a. StrictMaybe a
SNothing
    }

toCBORForSizeComputation ::
  ( EncCBOR (TxBody era)
  , EncCBOR (TxWits era)
  , EncCBOR (TxAuxData era)
  ) =>
  ShelleyTx era ->
  Encoding
toCBORForSizeComputation :: forall era.
(EncCBOR (TxBody era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
ShelleyTx era -> Encoding
toCBORForSizeComputation ShelleyTx {TxBody era
stBody :: forall era. ShelleyTx era -> TxBody era
stBody :: TxBody era
stBody, TxWits era
stWits :: forall era. ShelleyTx era -> TxWits era
stWits :: TxWits era
stWits, StrictMaybe (TxAuxData era)
stAuxData :: forall era. ShelleyTx era -> StrictMaybe (TxAuxData era)
stAuxData :: StrictMaybe (TxAuxData era)
stAuxData} =
  Word -> Encoding
encodeListLen Word
3
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> TxBody era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR TxBody era
stBody
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> TxWits era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR TxWits era
stWits
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> (TxAuxData era -> Encoding)
-> StrictMaybe (TxAuxData era) -> Encoding
forall a. (a -> Encoding) -> StrictMaybe a -> Encoding
encodeNullStrictMaybe TxAuxData era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StrictMaybe (TxAuxData era)
stAuxData

-- | txsize computes the length of the serialised bytes (for estimations)
sizeShelleyTxF :: forall era. EraTx era => SimpleGetter (ShelleyTx era) Integer
sizeShelleyTxF :: forall era. EraTx era => SimpleGetter (ShelleyTx era) Integer
sizeShelleyTxF =
  (ShelleyTx era -> Integer) -> SimpleGetter (ShelleyTx era) Integer
forall s a. (s -> a) -> SimpleGetter s a
to ((ShelleyTx era -> Integer)
 -> SimpleGetter (ShelleyTx era) Integer)
-> (ShelleyTx era -> Integer)
-> SimpleGetter (ShelleyTx era) Integer
forall a b. (a -> b) -> a -> b
$
    Int64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral
      (Int64 -> Integer)
-> (ShelleyTx era -> Int64) -> ShelleyTx era -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Int64
LBS.length
      (ByteString -> Int64)
-> (ShelleyTx era -> ByteString) -> ShelleyTx era -> Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize (forall era. Era era => Version
eraProtVerLow @era)
      (Encoding -> ByteString)
-> (ShelleyTx era -> Encoding) -> ShelleyTx era -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyTx era -> Encoding
forall era.
(EncCBOR (TxBody era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
ShelleyTx era -> Encoding
toCBORForSizeComputation
{-# INLINEABLE sizeShelleyTxF #-}

instance
  ( EraTxBody era
  , EraTxWits era
  , EraTxAuxData era
  ) =>
  DecCBOR (Annotator (ShelleyTx era))
  where
  decCBOR :: forall s. Decoder s (Annotator (ShelleyTx era))
decCBOR =
    Decode ('Closed 'Dense) (Annotator (ShelleyTx era))
-> Decoder s (Annotator (ShelleyTx era))
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode ('Closed 'Dense) (Annotator (ShelleyTx era))
 -> Decoder s (Annotator (ShelleyTx era)))
-> Decode ('Closed 'Dense) (Annotator (ShelleyTx era))
-> Decoder s (Annotator (ShelleyTx era))
forall a b. (a -> b) -> a -> b
$
      Decode
  ('Closed 'Dense)
  (TxBody era
   -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode
     ('Closed 'Dense)
     (Annotator
        (TxBody era
         -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era))
forall t1 (w :: Wrapped).
Typeable t1 =>
Decode w t1 -> Decode w (Annotator t1)
Ann ((TxBody era
 -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode
     ('Closed 'Dense)
     (TxBody era
      -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall t. t -> Decode ('Closed 'Dense) t
RecD TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
forall era.
TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
ShelleyTx)
        Decode
  ('Closed 'Dense)
  (Annotator
     (TxBody era
      -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era))
-> Decode ('Closed Any) (Annotator (TxBody era))
-> Decode
     ('Closed 'Dense)
     (Annotator
        (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode ('Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! Decode ('Closed Any) (Annotator (TxBody era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        Decode
  ('Closed 'Dense)
  (Annotator
     (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era))
-> Decode ('Closed Any) (Annotator (TxWits era))
-> Decode
     ('Closed 'Dense)
     (Annotator (StrictMaybe (TxAuxData era) -> ShelleyTx era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode ('Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! Decode ('Closed Any) (Annotator (TxWits era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        Decode
  ('Closed 'Dense)
  (Annotator (StrictMaybe (TxAuxData era) -> ShelleyTx era))
-> Decode
     ('Closed 'Dense) (Annotator (StrictMaybe (TxAuxData era)))
-> Decode ('Closed 'Dense) (Annotator (ShelleyTx era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode ('Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! (forall s. Decoder s (Annotator (StrictMaybe (TxAuxData era))))
-> Decode
     ('Closed 'Dense) (Annotator (StrictMaybe (TxAuxData era)))
forall t. (forall s. Decoder s t) -> Decode ('Closed 'Dense) t
D (StrictMaybe (Annotator (TxAuxData era))
-> Annotator (StrictMaybe (TxAuxData era))
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a.
Monad m =>
StrictMaybe (m a) -> m (StrictMaybe a)
sequence (StrictMaybe (Annotator (TxAuxData era))
 -> Annotator (StrictMaybe (TxAuxData era)))
-> Decoder s (StrictMaybe (Annotator (TxAuxData era)))
-> Decoder s (Annotator (StrictMaybe (TxAuxData era)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (TxAuxData era))
-> Decoder s (StrictMaybe (Annotator (TxAuxData era)))
forall s a. Decoder s a -> Decoder s (StrictMaybe a)
decodeNullStrictMaybe Decoder s (Annotator (TxAuxData era))
forall s. Decoder s (Annotator (TxAuxData era))
forall a s. DecCBOR a => Decoder s a
decCBOR)

instance DecCBOR (Annotator (Tx ShelleyEra)) where
  decCBOR :: forall s. Decoder s (Annotator (Tx ShelleyEra))
decCBOR = (ShelleyTx ShelleyEra -> Tx ShelleyEra)
-> Annotator (ShelleyTx ShelleyEra) -> Annotator (Tx ShelleyEra)
forall a b. (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ShelleyTx ShelleyEra -> Tx ShelleyEra
MkShelleyTx (Annotator (ShelleyTx ShelleyEra) -> Annotator (Tx ShelleyEra))
-> Decoder s (Annotator (ShelleyTx ShelleyEra))
-> Decoder s (Annotator (Tx ShelleyEra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (ShelleyTx ShelleyEra))
forall s. Decoder s (Annotator (ShelleyTx ShelleyEra))
forall a s. DecCBOR a => Decoder s a
decCBOR

instance EraTx ShelleyEra where
  newtype Tx ShelleyEra = MkShelleyTx {Tx ShelleyEra -> ShelleyTx ShelleyEra
unShelleyTx :: ShelleyTx ShelleyEra}
    deriving newtype (Tx ShelleyEra -> Tx ShelleyEra -> Bool
(Tx ShelleyEra -> Tx ShelleyEra -> Bool)
-> (Tx ShelleyEra -> Tx ShelleyEra -> Bool) -> Eq (Tx ShelleyEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tx ShelleyEra -> Tx ShelleyEra -> Bool
== :: Tx ShelleyEra -> Tx ShelleyEra -> Bool
$c/= :: Tx ShelleyEra -> Tx ShelleyEra -> Bool
/= :: Tx ShelleyEra -> Tx ShelleyEra -> Bool
Eq, Typeable (Tx ShelleyEra)
Typeable (Tx ShelleyEra) =>
(Tx ShelleyEra -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy (Tx ShelleyEra) -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy [Tx ShelleyEra] -> Size)
-> EncCBOR (Tx ShelleyEra)
Tx ShelleyEra -> Encoding
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> EncCBOR a
$cencCBOR :: Tx ShelleyEra -> Encoding
encCBOR :: Tx ShelleyEra -> Encoding
$cencodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
$cencodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
encodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
EncCBOR, Tx ShelleyEra -> ()
(Tx ShelleyEra -> ()) -> NFData (Tx ShelleyEra)
forall a. (a -> ()) -> NFData a
$crnf :: Tx ShelleyEra -> ()
rnf :: Tx ShelleyEra -> ()
NFData, Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo)
Proxy (Tx ShelleyEra) -> String
(Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo))
-> (Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo))
-> (Proxy (Tx ShelleyEra) -> String)
-> NoThunks (Tx ShelleyEra)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> Tx ShelleyEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy (Tx ShelleyEra) -> String
showTypeOf :: Proxy (Tx ShelleyEra) -> String
NoThunks, Int -> Tx ShelleyEra -> ShowS
[Tx ShelleyEra] -> ShowS
Tx ShelleyEra -> String
(Int -> Tx ShelleyEra -> ShowS)
-> (Tx ShelleyEra -> String)
-> ([Tx ShelleyEra] -> ShowS)
-> Show (Tx ShelleyEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tx ShelleyEra -> ShowS
showsPrec :: Int -> Tx ShelleyEra -> ShowS
$cshow :: Tx ShelleyEra -> String
show :: Tx ShelleyEra -> String
$cshowList :: [Tx ShelleyEra] -> ShowS
showList :: [Tx ShelleyEra] -> ShowS
Show, Typeable (Tx ShelleyEra)
Typeable (Tx ShelleyEra) =>
(Tx ShelleyEra -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (Tx ShelleyEra) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [Tx ShelleyEra] -> Size)
-> ToCBOR (Tx ShelleyEra)
Tx ShelleyEra -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> ToCBOR a
$ctoCBOR :: Tx ShelleyEra -> Encoding
toCBOR :: Tx ShelleyEra -> Encoding
$cencodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ShelleyEra) -> Size
$cencodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ShelleyEra] -> Size
ToCBOR)
    deriving ((forall x. Tx ShelleyEra -> Rep (Tx ShelleyEra) x)
-> (forall x. Rep (Tx ShelleyEra) x -> Tx ShelleyEra)
-> Generic (Tx ShelleyEra)
forall x. Rep (Tx ShelleyEra) x -> Tx ShelleyEra
forall x. Tx ShelleyEra -> Rep (Tx ShelleyEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tx ShelleyEra -> Rep (Tx ShelleyEra) x
from :: forall x. Tx ShelleyEra -> Rep (Tx ShelleyEra) x
$cto :: forall x. Rep (Tx ShelleyEra) x -> Tx ShelleyEra
to :: forall x. Rep (Tx ShelleyEra) x -> Tx ShelleyEra
Generic)

  mkBasicTx :: TxBody ShelleyEra -> Tx ShelleyEra
mkBasicTx = ShelleyTx ShelleyEra -> Tx ShelleyEra
MkShelleyTx (ShelleyTx ShelleyEra -> Tx ShelleyEra)
-> (TxBody ShelleyEra -> ShelleyTx ShelleyEra)
-> TxBody ShelleyEra
-> Tx ShelleyEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody ShelleyEra -> ShelleyTx ShelleyEra
forall era. EraTx era => TxBody era -> ShelleyTx era
mkBasicShelleyTx

  bodyTxL :: Lens' (Tx ShelleyEra) (TxBody ShelleyEra)
bodyTxL = (ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> Tx ShelleyEra -> f (Tx ShelleyEra)
Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL ((ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
 -> Tx ShelleyEra -> f (Tx ShelleyEra))
-> ((TxBody ShelleyEra -> f (TxBody ShelleyEra))
    -> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> (TxBody ShelleyEra -> f (TxBody ShelleyEra))
-> Tx ShelleyEra
-> f (Tx ShelleyEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody ShelleyEra -> f (TxBody ShelleyEra))
-> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra)
forall era (f :: * -> *).
Functor f =>
(TxBody era -> f (TxBody era))
-> ShelleyTx era -> f (ShelleyTx era)
bodyShelleyTxL
  {-# INLINE bodyTxL #-}

  witsTxL :: Lens' (Tx ShelleyEra) (TxWits ShelleyEra)
witsTxL = (ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> Tx ShelleyEra -> f (Tx ShelleyEra)
Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL ((ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
 -> Tx ShelleyEra -> f (Tx ShelleyEra))
-> ((ShelleyTxWits ShelleyEra -> f (ShelleyTxWits ShelleyEra))
    -> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> (ShelleyTxWits ShelleyEra -> f (ShelleyTxWits ShelleyEra))
-> Tx ShelleyEra
-> f (Tx ShelleyEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits ShelleyEra -> f (TxWits ShelleyEra))
-> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra)
(ShelleyTxWits ShelleyEra -> f (ShelleyTxWits ShelleyEra))
-> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra)
forall era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> ShelleyTx era -> f (ShelleyTx era)
witsShelleyTxL
  {-# INLINE witsTxL #-}

  auxDataTxL :: Lens' (Tx ShelleyEra) (StrictMaybe (TxAuxData ShelleyEra))
auxDataTxL = (ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> Tx ShelleyEra -> f (Tx ShelleyEra)
Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL ((ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
 -> Tx ShelleyEra -> f (Tx ShelleyEra))
-> ((StrictMaybe (ShelleyTxAuxData ShelleyEra)
     -> f (StrictMaybe (ShelleyTxAuxData ShelleyEra)))
    -> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra))
-> (StrictMaybe (ShelleyTxAuxData ShelleyEra)
    -> f (StrictMaybe (ShelleyTxAuxData ShelleyEra)))
-> Tx ShelleyEra
-> f (Tx ShelleyEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxAuxData ShelleyEra)
 -> f (StrictMaybe (TxAuxData ShelleyEra)))
-> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra)
(StrictMaybe (ShelleyTxAuxData ShelleyEra)
 -> f (StrictMaybe (ShelleyTxAuxData ShelleyEra)))
-> ShelleyTx ShelleyEra -> f (ShelleyTx ShelleyEra)
forall era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> ShelleyTx era -> f (ShelleyTx era)
auxDataShelleyTxL
  {-# INLINE auxDataTxL #-}

  sizeTxF :: SimpleGetter (Tx ShelleyEra) Integer
sizeTxF = (ShelleyTx ShelleyEra -> Const r (ShelleyTx ShelleyEra))
-> Tx ShelleyEra -> Const r (Tx ShelleyEra)
Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL ((ShelleyTx ShelleyEra -> Const r (ShelleyTx ShelleyEra))
 -> Tx ShelleyEra -> Const r (Tx ShelleyEra))
-> ((Integer -> Const r Integer)
    -> ShelleyTx ShelleyEra -> Const r (ShelleyTx ShelleyEra))
-> (Integer -> Const r Integer)
-> Tx ShelleyEra
-> Const r (Tx ShelleyEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Const r Integer)
-> ShelleyTx ShelleyEra -> Const r (ShelleyTx ShelleyEra)
forall era. EraTx era => SimpleGetter (ShelleyTx era) Integer
SimpleGetter (ShelleyTx ShelleyEra) Integer
sizeShelleyTxF
  {-# INLINE sizeTxF #-}

  validateNativeScript :: Tx ShelleyEra -> NativeScript ShelleyEra -> Bool
validateNativeScript = Tx ShelleyEra -> NativeScript ShelleyEra -> Bool
forall era.
(ShelleyEraScript era, EraTx era,
 NativeScript era ~ MultiSig era) =>
Tx era -> NativeScript era -> Bool
validateMultiSig
  {-# INLINE validateNativeScript #-}

  getMinFeeTx :: PParams ShelleyEra -> Tx ShelleyEra -> Int -> Coin
getMinFeeTx PParams ShelleyEra
pp Tx ShelleyEra
tx Int
_ = PParams ShelleyEra -> Tx ShelleyEra -> Coin
forall era. EraTx era => PParams era -> Tx era -> Coin
shelleyMinFeeTx PParams ShelleyEra
pp Tx ShelleyEra
tx

shelleyTxEqRaw :: EraTx era => Tx era -> Tx era -> Bool
shelleyTxEqRaw :: forall era. EraTx era => Tx era -> Tx era -> Bool
shelleyTxEqRaw Tx era
tx1 Tx era
tx2 =
  TxBody era -> TxBody era -> Bool
forall a. EqRaw a => a -> a -> Bool
eqRaw (Tx era
tx1 Tx era -> Getting (TxBody era) (Tx era) (TxBody era) -> TxBody era
forall s a. s -> Getting a s a -> a
^. Getting (TxBody era) (Tx era) (TxBody era)
forall era. EraTx era => Lens' (Tx era) (TxBody era)
Lens' (Tx era) (TxBody era)
bodyTxL) (Tx era
tx2 Tx era -> Getting (TxBody era) (Tx era) (TxBody era) -> TxBody era
forall s a. s -> Getting a s a -> a
^. Getting (TxBody era) (Tx era) (TxBody era)
forall era. EraTx era => Lens' (Tx era) (TxBody era)
Lens' (Tx era) (TxBody era)
bodyTxL)
    Bool -> Bool -> Bool
&& TxWits era -> TxWits era -> Bool
forall a. EqRaw a => a -> a -> Bool
eqRaw (Tx era
tx1 Tx era -> Getting (TxWits era) (Tx era) (TxWits era) -> TxWits era
forall s a. s -> Getting a s a -> a
^. Getting (TxWits era) (Tx era) (TxWits era)
forall era. EraTx era => Lens' (Tx era) (TxWits era)
Lens' (Tx era) (TxWits era)
witsTxL) (Tx era
tx2 Tx era -> Getting (TxWits era) (Tx era) (TxWits era) -> TxWits era
forall s a. s -> Getting a s a -> a
^. Getting (TxWits era) (Tx era) (TxWits era)
forall era. EraTx era => Lens' (Tx era) (TxWits era)
Lens' (Tx era) (TxWits era)
witsTxL)
    Bool -> Bool -> Bool
&& (TxAuxData era -> TxAuxData era -> Bool)
-> Maybe (TxAuxData era) -> Maybe (TxAuxData era) -> Bool
forall a b. (a -> b -> Bool) -> Maybe a -> Maybe b -> Bool
forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq -- TODO: Implement Eq1 instance for StrictMaybe
      TxAuxData era -> TxAuxData era -> Bool
forall a. EqRaw a => a -> a -> Bool
eqRaw
      (StrictMaybe (TxAuxData era) -> Maybe (TxAuxData era)
forall a. StrictMaybe a -> Maybe a
strictMaybeToMaybe (Tx era
tx1 Tx era
-> Getting
     (StrictMaybe (TxAuxData era))
     (Tx era)
     (StrictMaybe (TxAuxData era))
-> StrictMaybe (TxAuxData era)
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictMaybe (TxAuxData era))
  (Tx era)
  (StrictMaybe (TxAuxData era))
forall era.
EraTx era =>
Lens' (Tx era) (StrictMaybe (TxAuxData era))
Lens' (Tx era) (StrictMaybe (TxAuxData era))
auxDataTxL))
      (StrictMaybe (TxAuxData era) -> Maybe (TxAuxData era)
forall a. StrictMaybe a -> Maybe a
strictMaybeToMaybe (Tx era
tx2 Tx era
-> Getting
     (StrictMaybe (TxAuxData era))
     (Tx era)
     (StrictMaybe (TxAuxData era))
-> StrictMaybe (TxAuxData era)
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictMaybe (TxAuxData era))
  (Tx era)
  (StrictMaybe (TxAuxData era))
forall era.
EraTx era =>
Lens' (Tx era) (StrictMaybe (TxAuxData era))
Lens' (Tx era) (StrictMaybe (TxAuxData era))
auxDataTxL))

instance EqRaw (Tx ShelleyEra) where
  eqRaw :: Tx ShelleyEra -> Tx ShelleyEra -> Bool
eqRaw = Tx ShelleyEra -> Tx ShelleyEra -> Bool
forall era. EraTx era => Tx era -> Tx era -> Bool
shelleyTxEqRaw

shelleyTxL :: Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL :: Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
shelleyTxL = (Tx ShelleyEra -> ShelleyTx ShelleyEra)
-> (Tx ShelleyEra -> ShelleyTx ShelleyEra -> Tx ShelleyEra)
-> Lens' (Tx ShelleyEra) (ShelleyTx ShelleyEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx ShelleyEra -> ShelleyTx ShelleyEra
unShelleyTx (\Tx ShelleyEra
x ShelleyTx ShelleyEra
y -> Tx ShelleyEra
x {unShelleyTx = y})

--------------------------------------------------------------------------------
-- Serialisation
--------------------------------------------------------------------------------

instance
  (Era era, EncCBOR (TxWits era), EncCBOR (TxBody era), EncCBOR (TxAuxData era)) =>
  EncCBOR (ShelleyTx era)
  where
  encCBOR :: ShelleyTx era -> Encoding
encCBOR ShelleyTx {StrictMaybe (TxAuxData era)
TxWits era
TxBody era
stBody :: forall era. ShelleyTx era -> TxBody era
stWits :: forall era. ShelleyTx era -> TxWits era
stAuxData :: forall era. ShelleyTx era -> StrictMaybe (TxAuxData era)
stBody :: TxBody era
stWits :: TxWits era
stAuxData :: StrictMaybe (TxAuxData era)
..} =
    Encode ('Closed 'Dense) (ShelleyTx era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode ('Closed 'Dense) (ShelleyTx era) -> Encoding)
-> Encode ('Closed 'Dense) (ShelleyTx era) -> Encoding
forall a b. (a -> b) -> a -> b
$
      (TxBody era
 -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Encode
     ('Closed 'Dense)
     (TxBody era
      -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall t. t -> Encode ('Closed 'Dense) t
Rec TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
forall era.
TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
ShelleyTx
        Encode
  ('Closed 'Dense)
  (TxBody era
   -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Encode ('Closed 'Dense) (TxBody era)
-> Encode
     ('Closed 'Dense)
     (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> TxBody era -> Encode ('Closed 'Dense) (TxBody era)
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To TxBody era
stBody
        Encode
  ('Closed 'Dense)
  (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Encode ('Closed 'Dense) (TxWits era)
-> Encode
     ('Closed 'Dense) (StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> TxWits era -> Encode ('Closed 'Dense) (TxWits era)
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To TxWits era
stWits
        Encode
  ('Closed 'Dense) (StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Encode ('Closed 'Dense) (StrictMaybe (TxAuxData era))
-> Encode ('Closed 'Dense) (ShelleyTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> (StrictMaybe (TxAuxData era) -> Encoding)
-> StrictMaybe (TxAuxData era)
-> Encode ('Closed 'Dense) (StrictMaybe (TxAuxData era))
forall t. (t -> Encoding) -> t -> Encode ('Closed 'Dense) t
E ((TxAuxData era -> Encoding)
-> StrictMaybe (TxAuxData era) -> Encoding
forall a. (a -> Encoding) -> StrictMaybe a -> Encoding
encodeNullStrictMaybe TxAuxData era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR) StrictMaybe (TxAuxData era)
stAuxData

instance
  ( Era era
  , DecCBOR (TxBody era)
  , DecCBOR (TxWits era)
  , DecCBOR (TxAuxData era)
  ) =>
  DecCBOR (ShelleyTx era)
  where
  decCBOR :: forall s. Decoder s (ShelleyTx era)
decCBOR =
    Decode ('Closed 'Dense) (ShelleyTx era)
-> Decoder s (ShelleyTx era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode ('Closed 'Dense) (ShelleyTx era)
 -> Decoder s (ShelleyTx era))
-> Decode ('Closed 'Dense) (ShelleyTx era)
-> Decoder s (ShelleyTx era)
forall a b. (a -> b) -> a -> b
$
      (TxBody era
 -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode
     ('Closed 'Dense)
     (TxBody era
      -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall t. t -> Decode ('Closed 'Dense) t
RecD TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
forall era.
TxBody era
-> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era
ShelleyTx
        Decode
  ('Closed 'Dense)
  (TxBody era
   -> TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode ('Closed Any) (TxBody era)
-> Decode
     ('Closed 'Dense)
     (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (TxBody era)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        Decode
  ('Closed 'Dense)
  (TxWits era -> StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode ('Closed Any) (TxWits era)
-> Decode
     ('Closed 'Dense) (StrictMaybe (TxAuxData era) -> ShelleyTx era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (TxWits era)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
        Decode
  ('Closed 'Dense) (StrictMaybe (TxAuxData era) -> ShelleyTx era)
-> Decode ('Closed 'Dense) (StrictMaybe (TxAuxData era))
-> Decode ('Closed 'Dense) (ShelleyTx era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! (forall s. Decoder s (StrictMaybe (TxAuxData era)))
-> Decode ('Closed 'Dense) (StrictMaybe (TxAuxData era))
forall t. (forall s. Decoder s t) -> Decode ('Closed 'Dense) t
D (Decoder s (TxAuxData era)
-> Decoder s (StrictMaybe (TxAuxData era))
forall s a. Decoder s a -> Decoder s (StrictMaybe a)
decodeNullStrictMaybe Decoder s (TxAuxData era)
forall s. Decoder s (TxAuxData era)
forall a s. DecCBOR a => Decoder s a
decCBOR)

instance
  (Era era, EncCBOR (TxWits era), EncCBOR (TxBody era), EncCBOR (TxAuxData era)) =>
  ToCBOR (ShelleyTx era)
  where
  toCBOR :: ShelleyTx era -> Encoding
toCBOR = forall era t. (Era era, EncCBOR t) => t -> Encoding
toEraCBOR @era

-- | Minimum fee calculation
shelleyMinFeeTx :: EraTx era => PParams era -> Tx era -> Coin
shelleyMinFeeTx :: forall era. EraTx era => PParams era -> Tx era -> Coin
shelleyMinFeeTx PParams era
pp Tx era
tx =
  (Tx era
tx Tx era -> Getting Integer (Tx era) Integer -> Integer
forall s a. s -> Getting a s a -> a
^. Getting Integer (Tx era) Integer
forall era. EraTx era => SimpleGetter (Tx era) Integer
SimpleGetter (Tx era) Integer
sizeTxF Integer -> Coin -> Coin
forall i. Integral i => i -> Coin -> Coin
forall t i. (Val t, Integral i) => i -> t -> t
<×> PParams era
pp PParams era -> Getting Coin (PParams era) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (PParams era) Coin
forall era. EraPParams era => Lens' (PParams era) Coin
Lens' (PParams era) Coin
ppMinFeeAL) Coin -> Coin -> Coin
forall t. Val t => t -> t -> t
<+> PParams era
pp PParams era -> Getting Coin (PParams era) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (PParams era) Coin
forall era. EraPParams era => Lens' (PParams era) Coin
Lens' (PParams era) Coin
ppMinFeeBL