{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Cardano.Ledger.Core (
EraTx (..),
txIdTx,
EraTxOut (..),
bootAddrTxOutF,
coinTxOutL,
compactCoinTxOutL,
isAdaOnlyTxOutF,
EraTxBody (..),
txIdTxBody,
EraTxAuxData (..),
hashTxAuxData,
EraTxWits (..),
EraScript (..),
hashScript,
isNativeScript,
hashScriptTxWitsL,
keyHashWitnessesTxWits,
Value,
EraPParams (..),
mkCoinTxOut,
module Cardano.Ledger.Core.Era,
EraSegWits (..),
bBodySize,
RewardType (..),
Reward (..),
module Cardano.Ledger.Hashes,
module Cardano.Ledger.Core.TxCert,
module Cardano.Ledger.Core.PParams,
module Cardano.Ledger.Core.Translation,
) where
import qualified Cardano.Crypto.Hash as Hash
import Cardano.Ledger.Address (
Addr (..),
BootstrapAddress,
CompactAddr,
Withdrawals,
compactAddr,
decompactAddr,
isBootstrapCompactAddr,
)
import Cardano.Ledger.BaseTypes (ProtVer (..))
import Cardano.Ledger.Binary (
DecCBOR,
DecShareCBOR (Share),
EncCBOR,
EncCBORGroup,
Interns,
Sized (sizedValue),
ToCBOR,
encCBORGroup,
mkSized,
serialize',
)
import Cardano.Ledger.Coin (Coin)
import Cardano.Ledger.Compactible (Compactible (..))
import Cardano.Ledger.Core.Era
import Cardano.Ledger.Core.PParams
import Cardano.Ledger.Core.Translation
import Cardano.Ledger.Core.TxCert
import Cardano.Ledger.Credential (Credential)
import Cardano.Ledger.Hashes hiding (GenDelegPair (..), GenDelegs (..), unsafeMakeSafeHash)
import Cardano.Ledger.Keys.Bootstrap (BootstrapWitness, bootstrapWitKeyHash)
import Cardano.Ledger.Keys.WitVKey (WitVKey, witVKeyHash)
import Cardano.Ledger.MemoBytes
import Cardano.Ledger.Metadata
import Cardano.Ledger.Rewards (Reward (..), RewardType (..))
import Cardano.Ledger.TxIn (TxId (..), TxIn (..))
import Cardano.Ledger.Val (Val (..), inject)
import Control.DeepSeq (NFData)
import Data.Aeson (ToJSON)
import qualified Data.ByteString as BS
import Data.Kind (Type)
import Data.Map (Map)
import qualified Data.Map.Strict as Map
import Data.Maybe (fromMaybe, isJust)
import Data.Maybe.Strict (StrictMaybe, strictMaybe)
import Data.MemPack
import Data.Sequence.Strict (StrictSeq)
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Void (Void)
import Data.Word (Word32, Word64)
import GHC.Stack (HasCallStack)
import Lens.Micro
import NoThunks.Class (NoThunks)
class
( EraTxBody era
, EraTxWits era
, EraTxAuxData era
, EraPParams era
, NFData (Tx era)
, NoThunks (Tx era)
, DecCBOR (Tx era)
, EncCBOR (Tx era)
, ToCBOR (Tx era)
, Show (Tx era)
, Eq (Tx era)
, EqRaw (Tx era)
) =>
EraTx era
where
type Tx era = (r :: Type) | r -> era
type TxUpgradeError era :: Type
type TxUpgradeError era = Void
mkBasicTx :: TxBody era -> Tx era
bodyTxL :: Lens' (Tx era) (TxBody era)
witsTxL :: Lens' (Tx era) (TxWits era)
auxDataTxL :: Lens' (Tx era) (StrictMaybe (TxAuxData era))
sizeTxF :: SimpleGetter (Tx era) Integer
wireSizeTxF :: SimpleGetter (Tx era) Word32
sizeTxForFeeCalculation :: SafeToHash (TxWits era) => Tx era -> Integer
sizeTxForFeeCalculation Tx era
tx =
Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$
TxBody era -> Int
forall t. SafeToHash t => t -> Int
originalBytesSize (Tx era
tx 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)
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ TxWits era -> Int
forall t. SafeToHash t => t -> Int
originalBytesSize (Tx era
tx 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)
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> (TxAuxData era -> Int) -> StrictMaybe (TxAuxData era) -> Int
forall a b. a -> (b -> a) -> StrictMaybe b -> a
strictMaybe Int
1 TxAuxData era -> Int
forall t. SafeToHash t => t -> Int
originalBytesSize (Tx era
tx 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)
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
validateNativeScript :: Tx era -> NativeScript era -> Bool
getMinFeeTx ::
PParams era ->
Tx era ->
Int ->
Coin
upgradeTx ::
EraTx (PreviousEra era) =>
Tx (PreviousEra era) ->
Either (TxUpgradeError era) (Tx era)
class
( EraTxOut era
, EraTxCert era
, EraPParams era
, HashAnnotated (TxBody era) EraIndependentTxBody
, DecCBOR (TxBody era)
, EncCBOR (TxBody era)
, ToCBOR (TxBody era)
, NoThunks (TxBody era)
, NFData (TxBody era)
, Show (TxBody era)
, Eq (TxBody era)
, EqRaw (TxBody era)
) =>
EraTxBody era
where
data TxBody era
type TxBodyUpgradeError era :: Type
type TxBodyUpgradeError era = Void
mkBasicTxBody :: TxBody era
inputsTxBodyL :: Lens' (TxBody era) (Set TxIn)
outputsTxBodyL :: Lens' (TxBody era) (StrictSeq (TxOut era))
feeTxBodyL :: Lens' (TxBody era) Coin
withdrawalsTxBodyL :: Lens' (TxBody era) Withdrawals
auxDataHashTxBodyL :: Lens' (TxBody era) (StrictMaybe TxAuxDataHash)
spendableInputsTxBodyF :: SimpleGetter (TxBody era) (Set TxIn)
allInputsTxBodyF :: SimpleGetter (TxBody era) (Set TxIn)
certsTxBodyL :: Lens' (TxBody era) (StrictSeq (TxCert era))
getTotalDepositsTxBody ::
PParams era ->
(KeyHash 'StakePool -> Bool) ->
TxBody era ->
Coin
getTotalDepositsTxBody PParams era
pp KeyHash 'StakePool -> Bool
isPoolRegisted TxBody era
txBody =
PParams era
-> (KeyHash 'StakePool -> Bool) -> StrictSeq (TxCert era) -> Coin
forall era (f :: * -> *).
(EraTxCert era, Foldable f) =>
PParams era
-> (KeyHash 'StakePool -> Bool) -> f (TxCert era) -> Coin
forall (f :: * -> *).
Foldable f =>
PParams era
-> (KeyHash 'StakePool -> Bool) -> f (TxCert era) -> Coin
getTotalDepositsTxCerts PParams era
pp KeyHash 'StakePool -> Bool
isPoolRegisted (TxBody era
txBody TxBody era
-> Getting
(StrictSeq (TxCert era)) (TxBody era) (StrictSeq (TxCert era))
-> StrictSeq (TxCert era)
forall s a. s -> Getting a s a -> a
^. Getting
(StrictSeq (TxCert era)) (TxBody era) (StrictSeq (TxCert era))
forall era.
EraTxBody era =>
Lens' (TxBody era) (StrictSeq (TxCert era))
Lens' (TxBody era) (StrictSeq (TxCert era))
certsTxBodyL)
getTotalRefundsTxBody ::
PParams era ->
(Credential 'Staking -> Maybe Coin) ->
(Credential 'DRepRole -> Maybe Coin) ->
TxBody era ->
Coin
getTotalRefundsTxBody PParams era
pp Credential 'Staking -> Maybe Coin
lookupStakingDeposit Credential 'DRepRole -> Maybe Coin
lookupDRepDeposit TxBody era
txBody =
PParams era
-> (Credential 'Staking -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> StrictSeq (TxCert era)
-> Coin
forall era (f :: * -> *).
(EraTxCert era, Foldable f) =>
PParams era
-> (Credential 'Staking -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> f (TxCert era)
-> Coin
forall (f :: * -> *).
Foldable f =>
PParams era
-> (Credential 'Staking -> Maybe Coin)
-> (Credential 'DRepRole -> Maybe Coin)
-> f (TxCert era)
-> Coin
getTotalRefundsTxCerts PParams era
pp Credential 'Staking -> Maybe Coin
lookupStakingDeposit Credential 'DRepRole -> Maybe Coin
lookupDRepDeposit (TxBody era
txBody TxBody era
-> Getting
(StrictSeq (TxCert era)) (TxBody era) (StrictSeq (TxCert era))
-> StrictSeq (TxCert era)
forall s a. s -> Getting a s a -> a
^. Getting
(StrictSeq (TxCert era)) (TxBody era) (StrictSeq (TxCert era))
forall era.
EraTxBody era =>
Lens' (TxBody era) (StrictSeq (TxCert era))
Lens' (TxBody era) (StrictSeq (TxCert era))
certsTxBodyL)
getGenesisKeyHashCountTxBody :: TxBody era -> Int
getGenesisKeyHashCountTxBody TxBody era
_ = Int
0
upgradeTxBody ::
EraTxBody (PreviousEra era) =>
TxBody (PreviousEra era) ->
Either (TxBodyUpgradeError era) (TxBody era)
class
( Val (Value era)
, ToJSON (TxOut era)
, DecCBOR (Value era)
, DecCBOR (CompactForm (Value era))
, MemPack (CompactForm (Value era))
, EncCBOR (Value era)
, ToCBOR (TxOut era)
, EncCBOR (TxOut era)
, DecCBOR (TxOut era)
, DecShareCBOR (TxOut era)
, Share (TxOut era) ~ Interns (Credential 'Staking)
, NoThunks (TxOut era)
, NFData (TxOut era)
, Show (TxOut era)
, Eq (TxOut era)
, MemPack (TxOut era)
, EraPParams era
) =>
EraTxOut era
where
type TxOut era = (r :: Type) | r -> era
{-# MINIMAL
mkBasicTxOut
, upgradeTxOut
, valueEitherTxOutL
, addrEitherTxOutL
, (getMinCoinSizedTxOut | getMinCoinTxOut)
#-}
mkBasicTxOut :: HasCallStack => Addr -> Value era -> TxOut era
upgradeTxOut :: EraTxOut (PreviousEra era) => TxOut (PreviousEra era) -> TxOut era
valueTxOutL :: Lens' (TxOut era) (Value era)
valueTxOutL =
(TxOut era -> Value era)
-> (TxOut era -> Value era -> TxOut era)
-> Lens' (TxOut era) (Value era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut -> case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
value -> Value era
value
Right CompactForm (Value era)
cValue -> CompactForm (Value era) -> Value era
forall a. Compactible a => CompactForm a -> a
fromCompact CompactForm (Value era)
cValue
)
(\TxOut era
txOut Value era
value -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Either (Value era) (CompactForm (Value era))
-> Identity (Either (Value era) (CompactForm (Value era))))
-> TxOut era -> Identity (TxOut era)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL ((Either (Value era) (CompactForm (Value era))
-> Identity (Either (Value era) (CompactForm (Value era))))
-> TxOut era -> Identity (TxOut era))
-> Either (Value era) (CompactForm (Value era))
-> TxOut era
-> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Value era -> Either (Value era) (CompactForm (Value era))
forall a b. a -> Either a b
Left Value era
value)
{-# INLINE valueTxOutL #-}
compactValueTxOutL :: HasCallStack => Lens' (TxOut era) (CompactForm (Value era))
compactValueTxOutL =
(TxOut era -> CompactForm (Value era))
-> (TxOut era -> CompactForm (Value era) -> TxOut era)
-> Lens' (TxOut era) (CompactForm (Value era))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut -> case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
value -> Value era -> CompactForm (Value era)
forall a. (HasCallStack, Val a) => a -> CompactForm a
toCompactPartial Value era
value
Right CompactForm (Value era)
cValue -> CompactForm (Value era)
cValue
)
(\TxOut era
txOut CompactForm (Value era)
cValue -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Either (Value era) (CompactForm (Value era))
-> Identity (Either (Value era) (CompactForm (Value era))))
-> TxOut era -> Identity (TxOut era)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL ((Either (Value era) (CompactForm (Value era))
-> Identity (Either (Value era) (CompactForm (Value era))))
-> TxOut era -> Identity (TxOut era))
-> Either (Value era) (CompactForm (Value era))
-> TxOut era
-> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ CompactForm (Value era)
-> Either (Value era) (CompactForm (Value era))
forall a b. b -> Either a b
Right CompactForm (Value era)
cValue)
{-# INLINE compactValueTxOutL #-}
valueEitherTxOutL :: Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
addrTxOutL :: Lens' (TxOut era) Addr
addrTxOutL =
(TxOut era -> Addr)
-> (TxOut era -> Addr -> TxOut era) -> Lens' (TxOut era) Addr
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut -> case TxOut era
txOut TxOut era
-> Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
-> Either Addr CompactAddr
forall s a. s -> Getting a s a -> a
^. Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either Addr CompactAddr)
Lens' (TxOut era) (Either Addr CompactAddr)
addrEitherTxOutL of
Left Addr
addr -> Addr
addr
Right CompactAddr
cAddr -> HasCallStack => CompactAddr -> Addr
CompactAddr -> Addr
decompactAddr CompactAddr
cAddr
)
(\TxOut era
txOut Addr
addr -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Either Addr CompactAddr -> Identity (Either Addr CompactAddr))
-> TxOut era -> Identity (TxOut era)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either Addr CompactAddr)
Lens' (TxOut era) (Either Addr CompactAddr)
addrEitherTxOutL ((Either Addr CompactAddr -> Identity (Either Addr CompactAddr))
-> TxOut era -> Identity (TxOut era))
-> Either Addr CompactAddr -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Addr -> Either Addr CompactAddr
forall a b. a -> Either a b
Left Addr
addr)
{-# INLINE addrTxOutL #-}
compactAddrTxOutL :: Lens' (TxOut era) CompactAddr
compactAddrTxOutL =
(TxOut era -> CompactAddr)
-> (TxOut era -> CompactAddr -> TxOut era)
-> Lens' (TxOut era) CompactAddr
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut -> case TxOut era
txOut TxOut era
-> Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
-> Either Addr CompactAddr
forall s a. s -> Getting a s a -> a
^. Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either Addr CompactAddr)
Lens' (TxOut era) (Either Addr CompactAddr)
addrEitherTxOutL of
Left Addr
addr -> Addr -> CompactAddr
compactAddr Addr
addr
Right CompactAddr
cAddr -> CompactAddr
cAddr
)
(\TxOut era
txOut CompactAddr
cAddr -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Either Addr CompactAddr -> Identity (Either Addr CompactAddr))
-> TxOut era -> Identity (TxOut era)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either Addr CompactAddr)
Lens' (TxOut era) (Either Addr CompactAddr)
addrEitherTxOutL ((Either Addr CompactAddr -> Identity (Either Addr CompactAddr))
-> TxOut era -> Identity (TxOut era))
-> Either Addr CompactAddr -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ CompactAddr -> Either Addr CompactAddr
forall a b. b -> Either a b
Right CompactAddr
cAddr)
{-# INLINE compactAddrTxOutL #-}
addrEitherTxOutL :: Lens' (TxOut era) (Either Addr CompactAddr)
getMinCoinSizedTxOut :: PParams era -> Sized (TxOut era) -> Coin
getMinCoinSizedTxOut PParams era
pp = PParams era -> TxOut era -> Coin
forall era. EraTxOut era => PParams era -> TxOut era -> Coin
getMinCoinTxOut PParams era
pp (TxOut era -> Coin)
-> (Sized (TxOut era) -> TxOut era) -> Sized (TxOut era) -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sized (TxOut era) -> TxOut era
forall a. Sized a -> a
sizedValue
getMinCoinTxOut :: PParams era -> TxOut era -> Coin
getMinCoinTxOut PParams era
pp TxOut era
txOut =
let ProtVer Version
version Natural
_ = PParams era
pp PParams era -> Getting ProtVer (PParams era) ProtVer -> ProtVer
forall s a. s -> Getting a s a -> a
^. Getting ProtVer (PParams era) ProtVer
forall era. EraPParams era => Lens' (PParams era) ProtVer
Lens' (PParams era) ProtVer
ppProtocolVersionL
in PParams era -> Sized (TxOut era) -> Coin
forall era.
EraTxOut era =>
PParams era -> Sized (TxOut era) -> Coin
getMinCoinSizedTxOut PParams era
pp (Version -> TxOut era -> Sized (TxOut era)
forall a. EncCBOR a => Version -> a -> Sized a
mkSized Version
version TxOut era
txOut)
bootAddrTxOutF ::
EraTxOut era => SimpleGetter (TxOut era) (Maybe BootstrapAddress)
bootAddrTxOutF :: forall era.
EraTxOut era =>
SimpleGetter (TxOut era) (Maybe BootstrapAddress)
bootAddrTxOutF = (TxOut era -> Maybe BootstrapAddress)
-> SimpleGetter (TxOut era) (Maybe BootstrapAddress)
forall s a. (s -> a) -> SimpleGetter s a
to ((TxOut era -> Maybe BootstrapAddress)
-> SimpleGetter (TxOut era) (Maybe BootstrapAddress))
-> (TxOut era -> Maybe BootstrapAddress)
-> SimpleGetter (TxOut era) (Maybe BootstrapAddress)
forall a b. (a -> b) -> a -> b
$ \TxOut era
txOut ->
case TxOut era
txOut TxOut era
-> Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
-> Either Addr CompactAddr
forall s a. s -> Getting a s a -> a
^. Getting
(Either Addr CompactAddr) (TxOut era) (Either Addr CompactAddr)
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either Addr CompactAddr)
Lens' (TxOut era) (Either Addr CompactAddr)
addrEitherTxOutL of
Left (AddrBootstrap BootstrapAddress
bootstrapAddr) -> BootstrapAddress -> Maybe BootstrapAddress
forall a. a -> Maybe a
Just BootstrapAddress
bootstrapAddr
Right CompactAddr
cAddr
| CompactAddr -> Bool
isBootstrapCompactAddr CompactAddr
cAddr -> do
AddrBootstrap BootstrapAddress
bootstrapAddr <- Addr -> Maybe Addr
forall a. a -> Maybe a
Just (HasCallStack => CompactAddr -> Addr
CompactAddr -> Addr
decompactAddr CompactAddr
cAddr)
BootstrapAddress -> Maybe BootstrapAddress
forall a. a -> Maybe a
Just BootstrapAddress
bootstrapAddr
Either Addr CompactAddr
_ -> Maybe BootstrapAddress
forall a. Maybe a
Nothing
{-# INLINE bootAddrTxOutF #-}
coinTxOutL :: (HasCallStack, EraTxOut era) => Lens' (TxOut era) Coin
coinTxOutL :: forall era. (HasCallStack, EraTxOut era) => Lens' (TxOut era) Coin
coinTxOutL =
(TxOut era -> Coin)
-> (TxOut era -> Coin -> TxOut era)
-> Lens (TxOut era) (TxOut era) Coin Coin
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut ->
case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
val -> Value era -> Coin
forall t. Val t => t -> Coin
coin Value era
val
Right CompactForm (Value era)
cVal -> CompactForm Coin -> Coin
forall a. Compactible a => CompactForm a -> a
fromCompact (CompactForm (Value era) -> CompactForm Coin
forall t. Val t => CompactForm t -> CompactForm Coin
coinCompact CompactForm (Value era)
cVal)
)
( \TxOut era
txOut Coin
c ->
case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
val -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Value era -> Identity (Value era))
-> TxOut era -> Identity (TxOut era)
forall era. EraTxOut era => Lens' (TxOut era) (Value era)
Lens' (TxOut era) (Value era)
valueTxOutL ((Value era -> Identity (Value era))
-> TxOut era -> Identity (TxOut era))
-> Value era -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Coin -> Coin) -> Value era -> Value era
forall t. Val t => (Coin -> Coin) -> t -> t
modifyCoin (Coin -> Coin -> Coin
forall a b. a -> b -> a
const Coin
c) Value era
val
Right CompactForm (Value era)
cVal ->
TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (CompactForm (Value era) -> Identity (CompactForm (Value era)))
-> TxOut era -> Identity (TxOut era)
forall era.
(EraTxOut era, HasCallStack) =>
Lens' (TxOut era) (CompactForm (Value era))
Lens' (TxOut era) (CompactForm (Value era))
compactValueTxOutL ((CompactForm (Value era) -> Identity (CompactForm (Value era)))
-> TxOut era -> Identity (TxOut era))
-> CompactForm (Value era) -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (CompactForm Coin -> CompactForm Coin)
-> CompactForm (Value era) -> CompactForm (Value era)
forall t.
Val t =>
(CompactForm Coin -> CompactForm Coin)
-> CompactForm t -> CompactForm t
modifyCompactCoin (CompactForm Coin -> CompactForm Coin -> CompactForm Coin
forall a b. a -> b -> a
const (Coin -> CompactForm Coin
forall a. (HasCallStack, Val a) => a -> CompactForm a
toCompactPartial Coin
c)) CompactForm (Value era)
cVal
)
{-# INLINE coinTxOutL #-}
compactCoinTxOutL :: (HasCallStack, EraTxOut era) => Lens' (TxOut era) (CompactForm Coin)
compactCoinTxOutL :: forall era.
(HasCallStack, EraTxOut era) =>
Lens' (TxOut era) (CompactForm Coin)
compactCoinTxOutL =
(TxOut era -> CompactForm Coin)
-> (TxOut era -> CompactForm Coin -> TxOut era)
-> Lens
(TxOut era) (TxOut era) (CompactForm Coin) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
( \TxOut era
txOut ->
case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
val -> Coin -> CompactForm Coin
forall a. (HasCallStack, Val a) => a -> CompactForm a
toCompactPartial (Value era -> Coin
forall t. Val t => t -> Coin
coin Value era
val)
Right CompactForm (Value era)
cVal -> CompactForm (Value era) -> CompactForm Coin
forall t. Val t => CompactForm t -> CompactForm Coin
coinCompact CompactForm (Value era)
cVal
)
( \TxOut era
txOut CompactForm Coin
cCoin ->
case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
val -> TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (Value era -> Identity (Value era))
-> TxOut era -> Identity (TxOut era)
forall era. EraTxOut era => Lens' (TxOut era) (Value era)
Lens' (TxOut era) (Value era)
valueTxOutL ((Value era -> Identity (Value era))
-> TxOut era -> Identity (TxOut era))
-> Value era -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Coin -> Coin) -> Value era -> Value era
forall t. Val t => (Coin -> Coin) -> t -> t
modifyCoin (Coin -> Coin -> Coin
forall a b. a -> b -> a
const (CompactForm Coin -> Coin
forall a. Compactible a => CompactForm a -> a
fromCompact CompactForm Coin
cCoin)) Value era
val
Right CompactForm (Value era)
cVal ->
TxOut era
txOut TxOut era -> (TxOut era -> TxOut era) -> TxOut era
forall a b. a -> (a -> b) -> b
& (CompactForm (Value era) -> Identity (CompactForm (Value era)))
-> TxOut era -> Identity (TxOut era)
forall era.
(EraTxOut era, HasCallStack) =>
Lens' (TxOut era) (CompactForm (Value era))
Lens' (TxOut era) (CompactForm (Value era))
compactValueTxOutL ((CompactForm (Value era) -> Identity (CompactForm (Value era)))
-> TxOut era -> Identity (TxOut era))
-> CompactForm (Value era) -> TxOut era -> TxOut era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (CompactForm Coin -> CompactForm Coin)
-> CompactForm (Value era) -> CompactForm (Value era)
forall t.
Val t =>
(CompactForm Coin -> CompactForm Coin)
-> CompactForm t -> CompactForm t
modifyCompactCoin (CompactForm Coin -> CompactForm Coin -> CompactForm Coin
forall a b. a -> b -> a
const CompactForm Coin
cCoin) CompactForm (Value era)
cVal
)
{-# INLINE compactCoinTxOutL #-}
isAdaOnlyTxOutF :: EraTxOut era => SimpleGetter (TxOut era) Bool
isAdaOnlyTxOutF :: forall era. EraTxOut era => SimpleGetter (TxOut era) Bool
isAdaOnlyTxOutF = (TxOut era -> Bool) -> SimpleGetter (TxOut era) Bool
forall s a. (s -> a) -> SimpleGetter s a
to ((TxOut era -> Bool) -> SimpleGetter (TxOut era) Bool)
-> (TxOut era -> Bool) -> SimpleGetter (TxOut era) Bool
forall a b. (a -> b) -> a -> b
$ \TxOut era
txOut ->
case TxOut era
txOut TxOut era
-> Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
-> Either (Value era) (CompactForm (Value era))
forall s a. s -> Getting a s a -> a
^. Getting
(Either (Value era) (CompactForm (Value era)))
(TxOut era)
(Either (Value era) (CompactForm (Value era)))
forall era.
EraTxOut era =>
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
Lens' (TxOut era) (Either (Value era) (CompactForm (Value era)))
valueEitherTxOutL of
Left Value era
val -> Value era -> Bool
forall t. Val t => t -> Bool
isAdaOnly Value era
val
Right CompactForm (Value era)
cVal -> CompactForm (Value era) -> Bool
forall t. Val t => CompactForm t -> Bool
isAdaOnlyCompact CompactForm (Value era)
cVal
toCompactPartial :: (HasCallStack, Val a) => a -> CompactForm a
toCompactPartial :: forall a. (HasCallStack, Val a) => a -> CompactForm a
toCompactPartial a
v =
CompactForm a -> Maybe (CompactForm a) -> CompactForm a
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> CompactForm a
forall a. HasCallStack => [Char] -> a
error ([Char] -> CompactForm a) -> [Char] -> CompactForm a
forall a b. (a -> b) -> a -> b
$ [Char]
"Illegal value in TxOut: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> a -> [Char]
forall a. Show a => a -> [Char]
show a
v) (Maybe (CompactForm a) -> CompactForm a)
-> Maybe (CompactForm a) -> CompactForm a
forall a b. (a -> b) -> a -> b
$ a -> Maybe (CompactForm a)
forall a. Compactible a => a -> Maybe (CompactForm a)
toCompact a
v
mkCoinTxOut :: EraTxOut era => Addr -> Coin -> TxOut era
mkCoinTxOut :: forall era. EraTxOut era => Addr -> Coin -> TxOut era
mkCoinTxOut Addr
addr = Addr -> Value era -> TxOut era
forall era.
(EraTxOut era, HasCallStack) =>
Addr -> Value era -> TxOut era
mkBasicTxOut Addr
addr (Value era -> TxOut era)
-> (Coin -> Value era) -> Coin -> TxOut era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coin -> Value era
forall t s. Inject t s => t -> s
inject
type family Value era :: Type
class
( Era era
, Eq (TxAuxData era)
, EqRaw (TxAuxData era)
, Show (TxAuxData era)
, NoThunks (TxAuxData era)
, ToCBOR (TxAuxData era)
, EncCBOR (TxAuxData era)
, DecCBOR (TxAuxData era)
, HashAnnotated (TxAuxData era) EraIndependentTxAuxData
) =>
EraTxAuxData era
where
type TxAuxData era = (r :: Type) | r -> era
mkBasicTxAuxData :: TxAuxData era
metadataTxAuxDataL :: Lens' (TxAuxData era) (Map Word64 Metadatum)
upgradeTxAuxData :: EraTxAuxData (PreviousEra era) => TxAuxData (PreviousEra era) -> TxAuxData era
validateTxAuxData :: ProtVer -> TxAuxData era -> Bool
hashTxAuxData :: EraTxAuxData era => TxAuxData era -> TxAuxDataHash
hashTxAuxData :: forall era. EraTxAuxData era => TxAuxData era -> TxAuxDataHash
hashTxAuxData = SafeHash EraIndependentTxAuxData -> TxAuxDataHash
TxAuxDataHash (SafeHash EraIndependentTxAuxData -> TxAuxDataHash)
-> (TxAuxData era -> SafeHash EraIndependentTxAuxData)
-> TxAuxData era
-> TxAuxDataHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxAuxData era -> SafeHash EraIndependentTxAuxData
forall x i. HashAnnotated x i => x -> SafeHash i
hashAnnotated
class
( EraScript era
, Eq (TxWits era)
, EqRaw (TxWits era)
, Show (TxWits era)
, Monoid (TxWits era)
, NoThunks (TxWits era)
, ToCBOR (TxWits era)
, EncCBOR (TxWits era)
, DecCBOR (TxWits era)
) =>
EraTxWits era
where
type TxWits era = (r :: Type) | r -> era
mkBasicTxWits :: TxWits era
mkBasicTxWits = TxWits era
forall a. Monoid a => a
mempty
addrTxWitsL :: Lens' (TxWits era) (Set (WitVKey 'Witness))
bootAddrTxWitsL :: Lens' (TxWits era) (Set BootstrapWitness)
scriptTxWitsL :: Lens' (TxWits era) (Map ScriptHash (Script era))
upgradeTxWits :: EraTxWits (PreviousEra era) => TxWits (PreviousEra era) -> TxWits era
hashScriptTxWitsL ::
EraTxWits era =>
Lens (TxWits era) (TxWits era) (Map ScriptHash (Script era)) [Script era]
hashScriptTxWitsL :: forall era.
EraTxWits era =>
Lens
(TxWits era)
(TxWits era)
(Map ScriptHash (Script era))
[Script era]
hashScriptTxWitsL =
(TxWits era -> Map ScriptHash (Script era))
-> (TxWits era -> [Script era] -> TxWits era)
-> Lens
(TxWits era)
(TxWits era)
(Map ScriptHash (Script era))
[Script era]
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
(TxWits era
-> Getting
(Map ScriptHash (Script era))
(TxWits era)
(Map ScriptHash (Script era))
-> Map ScriptHash (Script era)
forall s a. s -> Getting a s a -> a
^. Getting
(Map ScriptHash (Script era))
(TxWits era)
(Map ScriptHash (Script era))
forall era.
EraTxWits era =>
Lens' (TxWits era) (Map ScriptHash (Script era))
Lens' (TxWits era) (Map ScriptHash (Script era))
scriptTxWitsL)
(\TxWits era
wits [Script era]
ss -> TxWits era
wits TxWits era -> (TxWits era -> TxWits era) -> TxWits era
forall a b. a -> (a -> b) -> b
& (Map ScriptHash (Script era)
-> Identity (Map ScriptHash (Script era)))
-> TxWits era -> Identity (TxWits era)
forall era.
EraTxWits era =>
Lens' (TxWits era) (Map ScriptHash (Script era))
Lens' (TxWits era) (Map ScriptHash (Script era))
scriptTxWitsL ((Map ScriptHash (Script era)
-> Identity (Map ScriptHash (Script era)))
-> TxWits era -> Identity (TxWits era))
-> Map ScriptHash (Script era) -> TxWits era -> TxWits era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [(ScriptHash, Script era)] -> Map ScriptHash (Script era)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Script era -> ScriptHash
forall era. EraScript era => Script era -> ScriptHash
hashScript Script era
s, Script era
s) | Script era
s <- [Script era]
ss])
{-# INLINEABLE hashScriptTxWitsL #-}
keyHashWitnessesTxWits ::
EraTxWits era =>
TxWits era ->
Set (KeyHash 'Witness)
keyHashWitnessesTxWits :: forall era. EraTxWits era => TxWits era -> Set (KeyHash 'Witness)
keyHashWitnessesTxWits TxWits era
txWits =
(WitVKey 'Witness -> KeyHash 'Witness)
-> Set (WitVKey 'Witness) -> Set (KeyHash 'Witness)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map WitVKey 'Witness -> KeyHash 'Witness
forall (kr :: KeyRole). WitVKey kr -> KeyHash 'Witness
witVKeyHash (TxWits era
txWits TxWits era
-> Getting
(Set (WitVKey 'Witness)) (TxWits era) (Set (WitVKey 'Witness))
-> Set (WitVKey 'Witness)
forall s a. s -> Getting a s a -> a
^. Getting
(Set (WitVKey 'Witness)) (TxWits era) (Set (WitVKey 'Witness))
forall era.
EraTxWits era =>
Lens' (TxWits era) (Set (WitVKey 'Witness))
Lens' (TxWits era) (Set (WitVKey 'Witness))
addrTxWitsL)
Set (KeyHash 'Witness)
-> Set (KeyHash 'Witness) -> Set (KeyHash 'Witness)
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` (BootstrapWitness -> KeyHash 'Witness)
-> Set BootstrapWitness -> Set (KeyHash 'Witness)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map BootstrapWitness -> KeyHash 'Witness
bootstrapWitKeyHash (TxWits era
txWits TxWits era
-> Getting
(Set BootstrapWitness) (TxWits era) (Set BootstrapWitness)
-> Set BootstrapWitness
forall s a. s -> Getting a s a -> a
^. Getting (Set BootstrapWitness) (TxWits era) (Set BootstrapWitness)
forall era.
EraTxWits era =>
Lens' (TxWits era) (Set BootstrapWitness)
Lens' (TxWits era) (Set BootstrapWitness)
bootAddrTxWitsL)
{-# INLINEABLE keyHashWitnessesTxWits #-}
class
( Era era
, Show (Script era)
, Eq (Script era)
, EqRaw (Script era)
, ToCBOR (Script era)
, EncCBOR (Script era)
, DecCBOR (Script era)
, NoThunks (Script era)
, SafeToHash (Script era)
, Eq (NativeScript era)
, Show (NativeScript era)
, NFData (NativeScript era)
, NoThunks (NativeScript era)
, EncCBOR (NativeScript era)
, DecCBOR (NativeScript era)
) =>
EraScript era
where
type Script era = (r :: Type) | r -> era
type NativeScript era = (r :: Type) | r -> era
upgradeScript :: EraScript (PreviousEra era) => Script (PreviousEra era) -> Script era
scriptPrefixTag :: Script era -> BS.ByteString
getNativeScript :: Script era -> Maybe (NativeScript era)
fromNativeScript :: NativeScript era -> Script era
isNativeScript :: EraScript era => Script era -> Bool
isNativeScript :: forall era. EraScript era => Script era -> Bool
isNativeScript = Maybe (NativeScript era) -> Bool
forall a. Maybe a -> Bool
isJust (Maybe (NativeScript era) -> Bool)
-> (Script era -> Maybe (NativeScript era)) -> Script era -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Script era -> Maybe (NativeScript era)
forall era. EraScript era => Script era -> Maybe (NativeScript era)
getNativeScript
hashScript :: forall era. EraScript era => Script era -> ScriptHash
hashScript :: forall era. EraScript era => Script era -> ScriptHash
hashScript =
Hash ADDRHASH EraIndependentScript -> ScriptHash
ScriptHash
(Hash ADDRHASH EraIndependentScript -> ScriptHash)
-> (Script era -> Hash ADDRHASH EraIndependentScript)
-> Script era
-> ScriptHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hash ADDRHASH (Script era) -> Hash ADDRHASH EraIndependentScript
forall h a b. Hash h a -> Hash h b
Hash.castHash
(Hash ADDRHASH (Script era) -> Hash ADDRHASH EraIndependentScript)
-> (Script era -> Hash ADDRHASH (Script era))
-> Script era
-> Hash ADDRHASH EraIndependentScript
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Script era -> ByteString)
-> Script era -> Hash ADDRHASH (Script era)
forall h a. HashAlgorithm h => (a -> ByteString) -> a -> Hash h a
Hash.hashWith
(\Script era
x -> forall era. EraScript era => Script era -> ByteString
scriptPrefixTag @era Script era
x ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Script era -> ByteString
forall t. SafeToHash t => t -> ByteString
originalBytes Script era
x)
class
( EraTx era
, Eq (TxSeq era)
, Show (TxSeq era)
, EncCBORGroup (TxSeq era)
, DecCBOR (TxSeq era)
) =>
EraSegWits era
where
type TxSeq era = (r :: Type) | r -> era
fromTxSeq :: TxSeq era -> StrictSeq (Tx era)
toTxSeq :: StrictSeq (Tx era) -> TxSeq era
hashTxSeq :: TxSeq era -> Hash.Hash HASH EraIndependentBlockBody
numSegComponents :: Word64
bBodySize :: forall era. EraSegWits era => ProtVer -> TxSeq era -> Int
bBodySize :: forall era. EraSegWits era => ProtVer -> TxSeq era -> Int
bBodySize (ProtVer Version
v Natural
_) = ByteString -> Int
BS.length (ByteString -> Int)
-> (TxSeq era -> ByteString) -> TxSeq era -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize' Version
v (Encoding -> ByteString)
-> (TxSeq era -> Encoding) -> TxSeq era -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxSeq era -> Encoding
forall a. EncCBORGroup a => a -> Encoding
encCBORGroup
txIdTx :: EraTx era => Tx era -> TxId
txIdTx :: forall era. EraTx era => Tx era -> TxId
txIdTx Tx era
tx = TxBody era -> TxId
forall era. EraTxBody era => TxBody era -> TxId
txIdTxBody (Tx era
tx 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)
txIdTxBody :: EraTxBody era => TxBody era -> TxId
txIdTxBody :: forall era. EraTxBody era => TxBody era -> TxId
txIdTxBody = SafeHash EraIndependentTxBody -> TxId
TxId (SafeHash EraIndependentTxBody -> TxId)
-> (TxBody era -> SafeHash EraIndependentTxBody)
-> TxBody era
-> TxId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody era -> SafeHash EraIndependentTxBody
forall x i. HashAnnotated x i => x -> SafeHash i
hashAnnotated