{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Conway.Tx (
  module BabbageTxReExport,
  tierRefScriptFee,
  getConwayMinFeeTx,
  Tx (..),
) where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Core (AlonzoEraTxWits)
import Cardano.Ledger.Alonzo.Tx (
  alonzoMinFeeTx,
  alonzoTxEqRaw,
  auxDataAlonzoTxL,
  bodyAlonzoTxL,
  isValidAlonzoTxL,
  mkBasicAlonzoTx,
  sizeAlonzoTxF,
  witsAlonzoTxL,
 )
import Cardano.Ledger.Babbage.Tx as BabbageTxReExport (
  AlonzoEraTx (..),
  AlonzoTx (..),
  Tx (..),
 )
import Cardano.Ledger.BaseTypes (NonZero (..), unboundRational)
import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR, ToCBOR)
import Cardano.Ledger.Coin (Coin (Coin))
import Cardano.Ledger.Conway.Era (ConwayEra)
import Cardano.Ledger.Conway.PParams (ConwayEraPParams (..), ppMinFeeRefScriptCostPerByteL)
import Cardano.Ledger.Conway.TxAuxData ()
import Cardano.Ledger.Conway.TxBody ()
import Cardano.Ledger.Conway.TxWits ()
import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Val (Val (..))
import Control.DeepSeq (NFData)
import Data.Typeable (Typeable)
import Data.Word (Word32)
import GHC.Generics (Generic)
import GHC.Stack
import Lens.Micro (Lens', lens, (^.))
import NoThunks.Class (NoThunks)

instance HasEraTxLevel Tx ConwayEra where
  toSTxLevel :: forall (l :: TxLevel). Tx l ConwayEra -> STxLevel l ConwayEra
toSTxLevel (MkConwayTx AlonzoTx {}) = forall era. STxTopLevel TopTx era
STopTxOnly @ConwayEra

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

  mkBasicTx :: forall (l :: TxLevel). TxBody l ConwayEra -> Tx l ConwayEra
mkBasicTx = AlonzoTx l ConwayEra -> Tx l ConwayEra
forall (l :: TxLevel). AlonzoTx l ConwayEra -> Tx l ConwayEra
MkConwayTx (AlonzoTx l ConwayEra -> Tx l ConwayEra)
-> (TxBody l ConwayEra -> AlonzoTx l ConwayEra)
-> TxBody l ConwayEra
-> Tx l ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody l ConwayEra -> AlonzoTx l ConwayEra
forall era (l :: TxLevel).
(EraTx era, STxLevel l era ~ STxTopLevel l era) =>
TxBody l era -> AlonzoTx l era
mkBasicAlonzoTx

  bodyTxL :: forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxBody l ConwayEra)
bodyTxL = (AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL ((AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
 -> Tx l ConwayEra -> f (Tx l ConwayEra))
-> ((TxBody l ConwayEra -> f (TxBody l ConwayEra))
    -> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> (TxBody l ConwayEra -> f (TxBody l ConwayEra))
-> Tx l ConwayEra
-> f (Tx l ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody l ConwayEra -> f (TxBody l ConwayEra))
-> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxBody l era -> f (TxBody l era))
-> AlonzoTx l era -> f (AlonzoTx l era)
bodyAlonzoTxL
  {-# INLINE bodyTxL #-}

  witsTxL :: forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxWits ConwayEra)
witsTxL = (AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL ((AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
 -> Tx l ConwayEra -> f (Tx l ConwayEra))
-> ((AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
    -> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> (AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
-> Tx l ConwayEra
-> f (Tx l ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits ConwayEra -> f (TxWits ConwayEra))
-> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra)
(AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
-> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> AlonzoTx l era -> f (AlonzoTx l era)
witsAlonzoTxL
  {-# INLINE witsTxL #-}

  auxDataTxL :: forall (l :: TxLevel).
Lens' (Tx l ConwayEra) (StrictMaybe (TxAuxData ConwayEra))
auxDataTxL = (AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL ((AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
 -> Tx l ConwayEra -> f (Tx l ConwayEra))
-> ((StrictMaybe (AlonzoTxAuxData ConwayEra)
     -> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
    -> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> (StrictMaybe (AlonzoTxAuxData ConwayEra)
    -> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
-> Tx l ConwayEra
-> f (Tx l ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxAuxData ConwayEra)
 -> f (StrictMaybe (TxAuxData ConwayEra)))
-> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra)
(StrictMaybe (AlonzoTxAuxData ConwayEra)
 -> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
-> AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> AlonzoTx l era -> f (AlonzoTx l era)
auxDataAlonzoTxL
  {-# INLINE auxDataTxL #-}

  sizeTxF :: forall (l :: TxLevel).
HasCallStack =>
SimpleGetter (Tx l ConwayEra) Word32
sizeTxF = (AlonzoTx l ConwayEra -> Const r (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> Const r (Tx l ConwayEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL ((AlonzoTx l ConwayEra -> Const r (AlonzoTx l ConwayEra))
 -> Tx l ConwayEra -> Const r (Tx l ConwayEra))
-> ((Word32 -> Const r Word32)
    -> AlonzoTx l ConwayEra -> Const r (AlonzoTx l ConwayEra))
-> (Word32 -> Const r Word32)
-> Tx l ConwayEra
-> Const r (Tx l ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32 -> Const r Word32)
-> AlonzoTx l ConwayEra -> Const r (AlonzoTx l ConwayEra)
SimpleGetter (AlonzoTx l ConwayEra) Word32
forall era (l :: TxLevel).
(HasCallStack, EraTx era) =>
SimpleGetter (AlonzoTx l era) Word32
sizeAlonzoTxF
  {-# INLINE sizeTxF #-}

  validateNativeScript :: forall (l :: TxLevel).
Tx l ConwayEra -> NativeScript ConwayEra -> Bool
validateNativeScript = Tx l ConwayEra -> NativeScript ConwayEra -> Bool
forall era (t :: TxLevel).
(EraTx era, AllegraEraTxBody era, AllegraEraScript era,
 NativeScript era ~ Timelock era) =>
Tx t era -> NativeScript era -> Bool
validateTimelock
  {-# INLINE validateNativeScript #-}

  getMinFeeTx :: forall (l :: TxLevel).
PParams ConwayEra -> Tx l ConwayEra -> Int -> Coin
getMinFeeTx = PParams ConwayEra -> Tx l ConwayEra -> Int -> Coin
forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, ConwayEraPParams era) =>
PParams era -> Tx l era -> Int -> Coin
getConwayMinFeeTx

instance EqRaw (Tx l ConwayEra) where
  eqRaw :: Tx l ConwayEra -> Tx l ConwayEra -> Bool
eqRaw = Tx l ConwayEra -> Tx l ConwayEra -> Bool
forall era (l :: TxLevel).
(AlonzoEraTx era, STxLevel l era ~ STxTopLevel l era) =>
Tx l era -> Tx l era -> Bool
alonzoTxEqRaw

conwayTxL :: Lens' (Tx l ConwayEra) (AlonzoTx l ConwayEra)
conwayTxL :: forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL = (Tx l ConwayEra -> AlonzoTx l ConwayEra)
-> (Tx l ConwayEra -> AlonzoTx l ConwayEra -> Tx l ConwayEra)
-> Lens
     (Tx l ConwayEra)
     (Tx l ConwayEra)
     (AlonzoTx l ConwayEra)
     (AlonzoTx l ConwayEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx l ConwayEra -> AlonzoTx l ConwayEra
forall (l :: TxLevel). Tx l ConwayEra -> AlonzoTx l ConwayEra
unConwayTx (\Tx l ConwayEra
x AlonzoTx l ConwayEra
y -> Tx l ConwayEra
x {unConwayTx = y})

getConwayMinFeeTx ::
  ( EraTx era
  , AlonzoEraTxWits era
  , ConwayEraPParams era
  ) =>
  PParams era ->
  Tx l era ->
  Int ->
  Coin
getConwayMinFeeTx :: forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, ConwayEraPParams era) =>
PParams era -> Tx l era -> Int -> Coin
getConwayMinFeeTx PParams era
pp Tx l era
tx Int
refScriptsSize =
  PParams era -> Tx l era -> Coin
forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx l era -> Coin
alonzoMinFeeTx PParams era
pp Tx l era
tx Coin -> Coin -> Coin
forall t. Val t => t -> t -> t
<+> Coin
refScriptsFee
  where
    refScriptCostPerByte :: Rational
refScriptCostPerByte = NonNegativeInterval -> Rational
forall r. BoundedRational r => r -> Rational
unboundRational (PParams era
pp PParams era
-> Getting NonNegativeInterval (PParams era) NonNegativeInterval
-> NonNegativeInterval
forall s a. s -> Getting a s a -> a
^. Getting NonNegativeInterval (PParams era) NonNegativeInterval
forall era.
ConwayEraPParams era =>
Lens' (PParams era) NonNegativeInterval
Lens' (PParams era) NonNegativeInterval
ppMinFeeRefScriptCostPerByteL)
    refScriptsFee :: Coin
refScriptsFee =
      HasCallStack => Rational -> Int -> Rational -> Int -> Coin
Rational -> Int -> Rational -> Int -> Coin
tierRefScriptFee
        (PositiveInterval -> Rational
forall r. BoundedRational r => r -> Rational
unboundRational (PositiveInterval -> Rational) -> PositiveInterval -> Rational
forall a b. (a -> b) -> a -> b
$ PParams era
pp PParams era
-> Getting PositiveInterval (PParams era) PositiveInterval
-> PositiveInterval
forall s a. s -> Getting a s a -> a
^. Getting PositiveInterval (PParams era) PositiveInterval
forall era.
ConwayEraPParams era =>
SimpleGetter (PParams era) PositiveInterval
SimpleGetter (PParams era) PositiveInterval
ppRefScriptCostMultiplierG)
        (forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word32 @Int (Word32 -> Int)
-> (NonZero Word32 -> Word32) -> NonZero Word32 -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonZero Word32 -> Word32
forall a. NonZero a -> a
unNonZero (NonZero Word32 -> Int) -> NonZero Word32 -> Int
forall a b. (a -> b) -> a -> b
$ PParams era
pp PParams era
-> Getting (NonZero Word32) (PParams era) (NonZero Word32)
-> NonZero Word32
forall s a. s -> Getting a s a -> a
^. Getting (NonZero Word32) (PParams era) (NonZero Word32)
forall era.
ConwayEraPParams era =>
SimpleGetter (PParams era) (NonZero Word32)
SimpleGetter (PParams era) (NonZero Word32)
ppRefScriptCostStrideG)
        Rational
refScriptCostPerByte
        Int
refScriptsSize

-- | Calculate the fee for reference scripts using an exponential growth of the price per
-- byte with linear increments
tierRefScriptFee ::
  HasCallStack =>
  -- | Growth factor or step multiplier
  Rational ->
  -- | Increment size in which price grows linearly according to the price
  Int ->
  -- | Base fee. Currently this is customizable by `ppMinFeeRefScriptCostPerByteL`
  Rational ->
  -- | Total RefScript size in bytes
  Int ->
  Coin
tierRefScriptFee :: HasCallStack => Rational -> Int -> Rational -> Int -> Coin
tierRefScriptFee Rational
multiplier Int
sizeIncrement
  | Rational
multiplier Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= Rational
0 Bool -> Bool -> Bool
|| Int
sizeIncrement Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = String -> Rational -> Int -> Coin
forall a. HasCallStack => String -> a
error String
"Size increment and multiplier must be positive"
  | Bool
otherwise = Rational -> Rational -> Int -> Coin
go Rational
0
  where
    go :: Rational -> Rational -> Int -> Coin
go !Rational
acc !Rational
curTierPrice !Int
n
      | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
sizeIncrement =
          Integer -> Coin
Coin (Integer -> Coin) -> Integer -> Coin
forall a b. (a -> b) -> a -> b
$ Rational -> Integer
forall b. Integral b => Rational -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Rational
acc Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Int -> Rational
forall a. Real a => a -> Rational
toRational Int
n Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice)
      | Bool
otherwise =
          Rational -> Rational -> Int -> Coin
go (Rational
acc Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
sizeIncrementRational Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice) (Rational
multiplier Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice) (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sizeIncrement)
    sizeIncrementRational :: Rational
sizeIncrementRational = Int -> Rational
forall a. Real a => a -> Rational
toRational Int
sizeIncrement

instance AlonzoEraTx ConwayEra where
  isValidTxL :: Lens' (Tx TopTx ConwayEra) IsValid
isValidTxL = (AlonzoTx TopTx ConwayEra -> f (AlonzoTx TopTx ConwayEra))
-> Tx TopTx ConwayEra -> f (Tx TopTx ConwayEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l ConwayEra -> f (AlonzoTx l ConwayEra))
-> Tx l ConwayEra -> f (Tx l ConwayEra)
conwayTxL ((AlonzoTx TopTx ConwayEra -> f (AlonzoTx TopTx ConwayEra))
 -> Tx TopTx ConwayEra -> f (Tx TopTx ConwayEra))
-> ((IsValid -> f IsValid)
    -> AlonzoTx TopTx ConwayEra -> f (AlonzoTx TopTx ConwayEra))
-> (IsValid -> f IsValid)
-> Tx TopTx ConwayEra
-> f (Tx TopTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsValid -> f IsValid)
-> AlonzoTx TopTx ConwayEra -> f (AlonzoTx TopTx ConwayEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsValid -> f IsValid) -> AlonzoTx l era -> f (AlonzoTx l era)
isValidAlonzoTxL
  {-# INLINE isValidTxL #-}

instance Typeable l => DecCBOR (Annotator (Tx l ConwayEra)) where
  decCBOR :: forall s. Decoder s (Annotator (Tx l ConwayEra))
decCBOR = (AlonzoTx l ConwayEra -> Tx l ConwayEra)
-> Annotator (AlonzoTx l ConwayEra) -> Annotator (Tx l ConwayEra)
forall a b. (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AlonzoTx l ConwayEra -> Tx l ConwayEra
forall (l :: TxLevel). AlonzoTx l ConwayEra -> Tx l ConwayEra
MkConwayTx (Annotator (AlonzoTx l ConwayEra) -> Annotator (Tx l ConwayEra))
-> Decoder s (Annotator (AlonzoTx l ConwayEra))
-> Decoder s (Annotator (Tx l ConwayEra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (AlonzoTx l ConwayEra))
forall s. Decoder s (Annotator (AlonzoTx l ConwayEra))
forall a s. DecCBOR a => Decoder s a
decCBOR