{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.Rpc.Server.Internal.UtxoRpc.Type.Tx
  ( txToUtxoRpcTx
  , anyEraTxConstraints
  , txInToUtxoRpcTxInput
  , metadatumToUtxoRpcMetadatum
  , txAuxDataScripts
  )
where

import Cardano.Api.Address
import Cardano.Api.Block
import Cardano.Api.Era
import Cardano.Api.Experimental
  ( PlutusScriptPurpose (..)
  , toPlutusScriptPurposeIndex
  )
import Cardano.Api.Ledger qualified as L
import Cardano.Api.Plutus
import Cardano.Api.Serialise.Raw
import Cardano.Api.Tx
import Cardano.Api.Value
import Cardano.Rpc.Proto.Api.UtxoRpc.Query qualified as U5c
import Cardano.Rpc.Proto.Api.UtxoRpc.Query qualified as UtxoRpc
import Cardano.Rpc.Server.Internal.Orphans ()
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.Certificate (txCertToUtxoRpcCertificate)
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.Governance (proposalProcedureToUtxoRpcProposal)
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.PlutusData (scriptDataToUtxoRpcPlutusData)
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.Script (ledgerScriptToUtxoRpcScript)
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.TxEval (mkProtoRedeemer)
import Cardano.Rpc.Server.Internal.UtxoRpc.Type.TxOutput
  ( policyAssetsToUtxoRpcMultiassets
  , txOutToUtxoRpcTxOutput
  )

import Cardano.Crypto.DSIGN.Class qualified as DSIGN
import Cardano.Ledger.Api qualified as L
import Cardano.Ledger.BaseTypes qualified as L
import Cardano.Ledger.Conway.Core qualified as L
import Cardano.Ledger.Keys.Bootstrap qualified as L

import RIO hiding (toList)

import Data.Map.Strict qualified as M
import Data.ProtoLens (defMessage)
import GHC.IsList
import Network.GRPC.Spec

-- | Convert a ledger transaction to the UTxO RPC 'UtxoRpc.Tx' message.
-- Populates hash, fee, successful, inputs, outputs, reference inputs, validity,
-- mint, withdrawals, collateral, certificates, witnesses, auxiliary data and
-- governance proposals, with spending, withdrawal and certificate redeemers
-- wired to their respective entries. Era-gated fields are read through the
-- any-era getters, whose 'Nothing' maps to the proto default; the
-- 'ShelleyBasedEra' witness is recovered from 'IsShelleyBasedEra' and brings
-- the any-era reading classes into scope.
txToUtxoRpcTx
  :: forall era
   . IsShelleyBasedEra era
  => L.Tx L.TopTx (ShelleyLedgerEra era)
  -> Proto UtxoRpc.Tx
txToUtxoRpcTx :: forall era.
IsShelleyBasedEra era =>
Tx TopTx (ShelleyLedgerEra era) -> Proto Tx
txToUtxoRpcTx Tx TopTx (ShelleyLedgerEra era)
ledgerTx = ShelleyBasedEra era
-> ((IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) =>
    Proto Tx)
-> Proto Tx
forall era a.
ShelleyBasedEra era
-> ((IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a)
-> a
anyEraTxConstraints ShelleyBasedEra era
sbe (((IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) =>
  Proto Tx)
 -> Proto Tx)
-> ((IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) =>
    Proto Tx)
-> Proto Tx
forall a b. (a -> b) -> a -> b
$ do
  let convertTxOut :: TxOut (ShelleyLedgerEra era) -> Proto TxOutput
convertTxOut = ShelleyBasedEra era -> TxOut CtxUTxO era -> Proto TxOutput
forall era.
ShelleyBasedEra era -> TxOut CtxUTxO era -> Proto TxOutput
txOutToUtxoRpcTxOutput ShelleyBasedEra era
sbe (TxOut CtxUTxO era -> Proto TxOutput)
-> (TxOut (ShelleyLedgerEra era) -> TxOut CtxUTxO era)
-> TxOut (ShelleyLedgerEra era)
-> Proto TxOutput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyBasedEra era
-> TxOut (ShelleyLedgerEra era) -> TxOut CtxUTxO era
forall era ctx.
ShelleyBasedEra era
-> TxOut (ShelleyLedgerEra era) -> TxOut ctx era
fromShelleyTxOut ShelleyBasedEra era
sbe
      body :: TxBody TopTx (ShelleyLedgerEra era)
body = Tx TopTx (ShelleyLedgerEra era)
ledgerTx Tx TopTx (ShelleyLedgerEra era)
-> Getting
     (TxBody TopTx (ShelleyLedgerEra era))
     (Tx TopTx (ShelleyLedgerEra era))
     (TxBody TopTx (ShelleyLedgerEra era))
-> TxBody TopTx (ShelleyLedgerEra era)
forall s a. s -> Getting a s a -> a
^. Getting
  (TxBody TopTx (ShelleyLedgerEra era))
  (Tx TopTx (ShelleyLedgerEra era))
  (TxBody TopTx (ShelleyLedgerEra era))
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel).
Lens'
  (Tx l (ShelleyLedgerEra era)) (TxBody l (ShelleyLedgerEra era))
L.bodyTxL
      wits :: TxWits (ShelleyLedgerEra era)
wits = Tx TopTx (ShelleyLedgerEra era)
ledgerTx Tx TopTx (ShelleyLedgerEra era)
-> Getting
     (TxWits (ShelleyLedgerEra era))
     (Tx TopTx (ShelleyLedgerEra era))
     (TxWits (ShelleyLedgerEra era))
-> TxWits (ShelleyLedgerEra era)
forall s a. s -> Getting a s a -> a
^. Getting
  (TxWits (ShelleyLedgerEra era))
  (Tx TopTx (ShelleyLedgerEra era))
  (TxWits (ShelleyLedgerEra era))
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxWits era)
forall (l :: TxLevel).
Lens' (Tx l (ShelleyLedgerEra era)) (TxWits (ShelleyLedgerEra era))
L.witsTxL
      -- reference inputs exist from Babbage onwards
      referenceInputs :: [TxIn]
referenceInputs = [TxIn] -> (Set TxIn -> [TxIn]) -> Maybe (Set TxIn) -> [TxIn]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] Set TxIn -> [Item (Set TxIn)]
Set TxIn -> [TxIn]
forall l. IsList l => l -> [Item l]
toList (Maybe (Set TxIn) -> [TxIn]) -> Maybe (Set TxIn) -> [TxIn]
forall a b. (a -> b) -> a -> b
$ TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe (Set TxIn))
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe (Set TxIn))
-> Maybe (Set TxIn)
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (Set TxIn))
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (Set TxIn))
forall era (l :: TxLevel).
AnyEraTxBody era =>
SimpleGetter (TxBody l era) (Maybe (Set TxIn))
forall (l :: TxLevel).
SimpleGetter (TxBody l (ShelleyLedgerEra era)) (Maybe (Set TxIn))
L.referenceInputsTxBodyG
      -- Shelley's plain TTL arrives as an interval without a lower bound
      validity :: Proto TxValidity
validity = do
        let L.ValidityInterval StrictMaybe SlotNo
lowerBound StrictMaybe SlotNo
upperBound = TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     ValidityInterval
     (TxBody TopTx (ShelleyLedgerEra era))
     ValidityInterval
-> ValidityInterval
forall s a. s -> Getting a s a -> a
^. Getting
  ValidityInterval
  (TxBody TopTx (ShelleyLedgerEra era))
  ValidityInterval
forall era.
AnyEraTxBody era =>
SimpleGetter (TxBody TopTx era) ValidityInterval
SimpleGetter (TxBody TopTx (ShelleyLedgerEra era)) ValidityInterval
L.vldtTxBodyG
        Proto TxValidity
forall msg. Message msg => msg
defMessage
          Proto TxValidity
-> (Proto TxValidity -> Proto TxValidity) -> Proto TxValidity
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto TxValidity) Word64
forall (f :: * -> *) s a.
(Functor f, HasField s "start" a) =>
LensLike' f s a
U5c.start LensLike' Identity (Proto TxValidity) Word64
-> Word64 -> Proto TxValidity -> Proto TxValidity
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word64 -> (SlotNo -> Word64) -> StrictMaybe SlotNo -> Word64
forall a b. a -> (b -> a) -> StrictMaybe b -> a
L.strictMaybe Word64
0 SlotNo -> Word64
unSlotNo StrictMaybe SlotNo
lowerBound
          Proto TxValidity
-> (Proto TxValidity -> Proto TxValidity) -> Proto TxValidity
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto TxValidity) Word64
forall (f :: * -> *) s a.
(Functor f, HasField s "ttl" a) =>
LensLike' f s a
U5c.ttl LensLike' Identity (Proto TxValidity) Word64
-> Word64 -> Proto TxValidity -> Proto TxValidity
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word64 -> (SlotNo -> Word64) -> StrictMaybe SlotNo -> Word64
forall a b. a -> (b -> a) -> StrictMaybe b -> a
L.strictMaybe Word64
0 SlotNo -> Word64
unSlotNo StrictMaybe SlotNo
upperBound
      -- minting exists from Mary onwards
      mint :: Map PolicyId PolicyAssets
mint = Map PolicyId PolicyAssets
-> (MultiAsset -> Map PolicyId PolicyAssets)
-> Maybe MultiAsset
-> Map PolicyId PolicyAssets
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Map PolicyId PolicyAssets
forall a. Monoid a => a
mempty MultiAsset -> Map PolicyId PolicyAssets
multiAssetToPolicyAssets (Maybe MultiAsset -> Map PolicyId PolicyAssets)
-> Maybe MultiAsset -> Map PolicyId PolicyAssets
forall a b. (a -> b) -> a -> b
$ TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe MultiAsset)
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe MultiAsset)
-> Maybe MultiAsset
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe MultiAsset)
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe MultiAsset)
forall era (l :: TxLevel).
AnyEraTxBody era =>
SimpleGetter (TxBody l era) (Maybe MultiAsset)
forall (l :: TxLevel).
SimpleGetter (TxBody l (ShelleyLedgerEra era)) (Maybe MultiAsset)
L.mintTxBodyG
      -- the spending redeemer at index ix belongs to the input at position
      -- ix in the sorted input set
      inputs :: [Proto UtxoRpc.TxInput]
      inputs :: [Proto TxInput]
inputs =
        [Word32] -> [TxIn] -> [(Word32, TxIn)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0 ..] (Set TxIn -> [Item (Set TxIn)]
forall l. IsList l => l -> [Item l]
toList (TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Set TxIn) (TxBody TopTx (ShelleyLedgerEra era)) (Set TxIn)
-> Set TxIn
forall s a. s -> Getting a s a -> a
^. Getting (Set TxIn) (TxBody TopTx (ShelleyLedgerEra era)) (Set TxIn)
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (Set TxIn)
forall (l :: TxLevel).
Lens' (TxBody l (ShelleyLedgerEra era)) (Set TxIn)
L.inputsTxBodyL)) [(Word32, TxIn)]
-> ((Word32, TxIn) -> Proto TxInput) -> [Proto TxInput]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Word32
ix, TxIn
txIn) ->
          TxIn -> Proto TxInput
txInToUtxoRpcTxInput (TxIn -> TxIn
fromShelleyTxIn TxIn
txIn)
            Proto TxInput -> (Proto TxInput -> Proto TxInput) -> Proto TxInput
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto TxInput) (Maybe (Proto Redeemer))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'redeemer" a) =>
LensLike' f s a
U5c.maybe'redeemer LensLike' Identity (Proto TxInput) (Maybe (Proto Redeemer))
-> Maybe (Proto Redeemer) -> Proto TxInput -> Proto TxInput
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (PlutusScriptPurpose, Word32)
-> Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
-> Maybe (Proto Redeemer)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (PlutusScriptPurpose
SpendingScript, Word32
ix) Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
redeemersByIndex
      -- the withdrawal redeemer at index ix belongs to the withdrawal at
      -- position ix in the sorted withdrawal map
      withdrawals :: [Proto UtxoRpc.Withdrawal]
      withdrawals :: [Proto Withdrawal]
withdrawals =
        [Word32]
-> [(AccountAddress, Coin)] -> [(Word32, (AccountAddress, Coin))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0 ..] (Map AccountAddress Coin -> [(AccountAddress, Coin)]
forall k a. Map k a -> [(k, a)]
M.toList (Withdrawals -> Map AccountAddress Coin
L.unWithdrawals (TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     Withdrawals (TxBody TopTx (ShelleyLedgerEra era)) Withdrawals
-> Withdrawals
forall s a. s -> Getting a s a -> a
^. Getting
  Withdrawals (TxBody TopTx (ShelleyLedgerEra era)) Withdrawals
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) Withdrawals
forall (l :: TxLevel).
Lens' (TxBody l (ShelleyLedgerEra era)) Withdrawals
L.withdrawalsTxBodyL)))
          [(Word32, (AccountAddress, Coin))]
-> ((Word32, (AccountAddress, Coin)) -> Proto Withdrawal)
-> [Proto Withdrawal]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Word32
ix, (AccountAddress
rewardAccount, Coin
coin)) ->
            Proto Withdrawal
forall msg. Message msg => msg
defMessage
              Proto Withdrawal
-> (Proto Withdrawal -> Proto Withdrawal) -> Proto Withdrawal
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Withdrawal) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "rewardAccount" a) =>
LensLike' f s a
U5c.rewardAccount LensLike' Identity (Proto Withdrawal) ByteString
-> ByteString -> Proto Withdrawal -> Proto Withdrawal
forall s t a b. ASetter s t a b -> b -> s -> t
.~ StakeAddress -> ByteString
forall a. SerialiseAsRawBytes a => a -> ByteString
serialiseToRawBytes (AccountAddress -> StakeAddress
fromShelleyStakeAddr AccountAddress
rewardAccount)
              Proto Withdrawal
-> (Proto Withdrawal -> Proto Withdrawal) -> Proto Withdrawal
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Withdrawal) (Proto BigInt)
forall (f :: * -> *) s a.
(Functor f, HasField s "coin" a) =>
LensLike' f s a
U5c.coin LensLike' Identity (Proto Withdrawal) (Proto BigInt)
-> Proto BigInt -> Proto Withdrawal -> Proto Withdrawal
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Coin -> Proto BigInt
forall t s. Inject t s => t -> s
inject Coin
coin
              Proto Withdrawal
-> (Proto Withdrawal -> Proto Withdrawal) -> Proto Withdrawal
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Withdrawal) (Maybe (Proto Redeemer))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'redeemer" a) =>
LensLike' f s a
U5c.maybe'redeemer
                LensLike' Identity (Proto Withdrawal) (Maybe (Proto Redeemer))
-> Maybe (Proto Redeemer) -> Proto Withdrawal -> Proto Withdrawal
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (PlutusScriptPurpose, Word32)
-> Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
-> Maybe (Proto Redeemer)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (PlutusScriptPurpose
WithdrawingScript, Word32
ix) Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
redeemersByIndex
      -- collateral inputs exist from Alonzo onwards
      collateralInputs :: [TxIn]
collateralInputs = [TxIn] -> (Set TxIn -> [TxIn]) -> Maybe (Set TxIn) -> [TxIn]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] Set TxIn -> [Item (Set TxIn)]
Set TxIn -> [TxIn]
forall l. IsList l => l -> [Item l]
toList (Maybe (Set TxIn) -> [TxIn]) -> Maybe (Set TxIn) -> [TxIn]
forall a b. (a -> b) -> a -> b
$ TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe (Set TxIn))
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe (Set TxIn))
-> Maybe (Set TxIn)
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (Set TxIn))
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (Set TxIn))
forall era.
AnyEraTxBody era =>
SimpleGetter (TxBody TopTx era) (Maybe (Set TxIn))
SimpleGetter
  (TxBody TopTx (ShelleyLedgerEra era)) (Maybe (Set TxIn))
L.collateralInputsTxBodyG
      -- collateral return and total collateral exist from Babbage onwards;
      -- the outer 'Maybe' is era support, the inner one field presence
      collateralReturn :: Maybe (L.TxOut (ShelleyLedgerEra era))
      collateralReturn :: Maybe (TxOut (ShelleyLedgerEra era))
collateralReturn = Maybe (Maybe (TxOut (ShelleyLedgerEra era)))
-> Maybe (TxOut (ShelleyLedgerEra era))
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe (TxOut (ShelleyLedgerEra era)))
 -> Maybe (TxOut (ShelleyLedgerEra era)))
-> Maybe (Maybe (TxOut (ShelleyLedgerEra era)))
-> Maybe (TxOut (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe (Maybe (TxOut (ShelleyLedgerEra era))))
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe (Maybe (TxOut (ShelleyLedgerEra era))))
-> Maybe (Maybe (TxOut (ShelleyLedgerEra era)))
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (Maybe (TxOut (ShelleyLedgerEra era))))
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (Maybe (TxOut (ShelleyLedgerEra era))))
forall era.
AnyEraTxBody era =>
SimpleGetter (TxBody TopTx era) (Maybe (Maybe (TxOut era)))
SimpleGetter
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (Maybe (TxOut (ShelleyLedgerEra era))))
L.collateralReturnTxBodyG
      totalCollateral :: Maybe L.Coin
      totalCollateral :: Maybe Coin
totalCollateral = Maybe (Maybe Coin) -> Maybe Coin
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe Coin) -> Maybe Coin)
-> Maybe (Maybe Coin) -> Maybe Coin
forall a b. (a -> b) -> a -> b
$ TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe (Maybe Coin))
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe (Maybe Coin))
-> Maybe (Maybe Coin)
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (Maybe Coin))
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (Maybe Coin))
forall era.
AnyEraTxBody era =>
SimpleGetter (TxBody TopTx era) (Maybe (Maybe Coin))
SimpleGetter
  (TxBody TopTx (ShelleyLedgerEra era)) (Maybe (Maybe Coin))
L.totalCollateralTxBodyG
      collateral :: Maybe (Proto Collateral)
collateral
        | [TxIn] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TxIn]
collateralInputs
        , Maybe (TxOut (ShelleyLedgerEra era))
Nothing <- Maybe (TxOut (ShelleyLedgerEra era))
collateralReturn
        , Maybe Coin
Nothing <- Maybe Coin
totalCollateral =
            Maybe (Proto Collateral)
forall a. Maybe a
Nothing
        | Bool
otherwise =
            Proto Collateral -> Maybe (Proto Collateral)
forall a. a -> Maybe a
Just (Proto Collateral -> Maybe (Proto Collateral))
-> Proto Collateral -> Maybe (Proto Collateral)
forall a b. (a -> b) -> a -> b
$
              Proto Collateral
forall msg. Message msg => msg
defMessage
                Proto Collateral
-> (Proto Collateral -> Proto Collateral) -> Proto Collateral
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Collateral) [Proto TxInput]
forall (f :: * -> *) s a.
(Functor f, HasField s "collateral" a) =>
LensLike' f s a
U5c.collateral LensLike' Identity (Proto Collateral) [Proto TxInput]
-> [Proto TxInput] -> Proto Collateral -> Proto Collateral
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (TxIn -> Proto TxInput) -> [TxIn] -> [Proto TxInput]
forall a b. (a -> b) -> [a] -> [b]
map (TxIn -> Proto TxInput
txInToUtxoRpcTxInput (TxIn -> Proto TxInput) -> (TxIn -> TxIn) -> TxIn -> Proto TxInput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn -> TxIn
fromShelleyTxIn) [TxIn]
collateralInputs
                Proto Collateral
-> (Proto Collateral -> Proto Collateral) -> Proto Collateral
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Collateral) (Maybe (Proto TxOutput))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'collateralReturn" a) =>
LensLike' f s a
U5c.maybe'collateralReturn LensLike' Identity (Proto Collateral) (Maybe (Proto TxOutput))
-> Maybe (Proto TxOutput) -> Proto Collateral -> Proto Collateral
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (TxOut (ShelleyLedgerEra era) -> Proto TxOutput)
-> Maybe (TxOut (ShelleyLedgerEra era)) -> Maybe (Proto TxOutput)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TxOut (ShelleyLedgerEra era) -> Proto TxOutput
convertTxOut Maybe (TxOut (ShelleyLedgerEra era))
collateralReturn
                Proto Collateral
-> (Proto Collateral -> Proto Collateral) -> Proto Collateral
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Collateral) (Maybe (Proto BigInt))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'totalCollateral" a) =>
LensLike' f s a
U5c.maybe'totalCollateral LensLike' Identity (Proto Collateral) (Maybe (Proto BigInt))
-> Maybe (Proto BigInt) -> Proto Collateral -> Proto Collateral
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Coin -> Proto BigInt) -> Maybe Coin -> Maybe (Proto BigInt)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Coin -> Proto BigInt
forall t s. Inject t s => t -> s
inject Maybe Coin
totalCollateral
      -- a transaction marked invalid during phase-2 validation consumes its
      -- collateral instead of producing its outputs; before Alonzo every
      -- transaction is valid
      L.IsValid Bool
isValid = IsValid -> Maybe IsValid -> IsValid
forall a. a -> Maybe a -> a
fromMaybe (Bool -> IsValid
L.IsValid Bool
True) (Maybe IsValid -> IsValid) -> Maybe IsValid -> IsValid
forall a b. (a -> b) -> a -> b
$ Tx TopTx (ShelleyLedgerEra era)
ledgerTx Tx TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe IsValid) (Tx TopTx (ShelleyLedgerEra era)) (Maybe IsValid)
-> Maybe IsValid
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe IsValid) (Tx TopTx (ShelleyLedgerEra era)) (Maybe IsValid)
forall era.
AnyEraTx era =>
SimpleGetter (Tx TopTx era) (Maybe IsValid)
SimpleGetter (Tx TopTx (ShelleyLedgerEra era)) (Maybe IsValid)
L.isValidTxG
      vkeyWitnesses :: [Proto UtxoRpc.VKeyWitness]
      vkeyWitnesses :: [Proto VKeyWitness]
vkeyWitnesses =
        Set (WitVKey Witness) -> [Item (Set (WitVKey Witness))]
forall l. IsList l => l -> [Item l]
toList (TxWits (ShelleyLedgerEra era)
wits TxWits (ShelleyLedgerEra era)
-> Getting
     (Set (WitVKey Witness))
     (TxWits (ShelleyLedgerEra era))
     (Set (WitVKey Witness))
-> Set (WitVKey Witness)
forall s a. s -> Getting a s a -> a
^. Getting
  (Set (WitVKey Witness))
  (TxWits (ShelleyLedgerEra era))
  (Set (WitVKey Witness))
forall era.
EraTxWits era =>
Lens' (TxWits era) (Set (WitVKey Witness))
Lens' (TxWits (ShelleyLedgerEra era)) (Set (WitVKey Witness))
L.addrTxWitsL) [WitVKey Witness]
-> (WitVKey Witness -> Proto VKeyWitness) -> [Proto VKeyWitness]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(L.WitVKey (L.VKey VerKeyDSIGN DSIGN
vkey) (DSIGN.SignedDSIGN SigDSIGN DSIGN
signature)) ->
          Proto VKeyWitness
forall msg. Message msg => msg
defMessage
            Proto VKeyWitness
-> (Proto VKeyWitness -> Proto VKeyWitness) -> Proto VKeyWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto VKeyWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "vkey" a) =>
LensLike' f s a
U5c.vkey LensLike' Identity (Proto VKeyWitness) ByteString
-> ByteString -> Proto VKeyWitness -> Proto VKeyWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ VerKeyDSIGN DSIGN -> ByteString
forall v. DSIGNAlgorithm v => VerKeyDSIGN v -> ByteString
DSIGN.rawSerialiseVerKeyDSIGN VerKeyDSIGN DSIGN
vkey
            Proto VKeyWitness
-> (Proto VKeyWitness -> Proto VKeyWitness) -> Proto VKeyWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto VKeyWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "signature" a) =>
LensLike' f s a
U5c.signature LensLike' Identity (Proto VKeyWitness) ByteString
-> ByteString -> Proto VKeyWitness -> Proto VKeyWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ SigDSIGN DSIGN -> ByteString
forall v. DSIGNAlgorithm v => SigDSIGN v -> ByteString
DSIGN.rawSerialiseSigDSIGN SigDSIGN DSIGN
signature
      bootstrapWitnesses :: [Proto UtxoRpc.BootstrapWitness]
      bootstrapWitnesses :: [Proto BootstrapWitness]
bootstrapWitnesses =
        Set BootstrapWitness -> [Item (Set BootstrapWitness)]
forall l. IsList l => l -> [Item l]
toList (TxWits (ShelleyLedgerEra era)
wits TxWits (ShelleyLedgerEra era)
-> Getting
     (Set BootstrapWitness)
     (TxWits (ShelleyLedgerEra era))
     (Set BootstrapWitness)
-> Set BootstrapWitness
forall s a. s -> Getting a s a -> a
^. Getting
  (Set BootstrapWitness)
  (TxWits (ShelleyLedgerEra era))
  (Set BootstrapWitness)
forall era.
EraTxWits era =>
Lens' (TxWits era) (Set BootstrapWitness)
Lens' (TxWits (ShelleyLedgerEra era)) (Set BootstrapWitness)
L.bootAddrTxWitsL) [BootstrapWitness]
-> (BootstrapWitness -> Proto BootstrapWitness)
-> [Proto BootstrapWitness]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \BootstrapWitness
bootstrapWitness -> do
          let L.VKey VerKeyDSIGN DSIGN
bootstrapKey = BootstrapWitness -> VKey Witness
L.bwKey BootstrapWitness
bootstrapWitness
              DSIGN.SignedDSIGN SigDSIGN DSIGN
bootstrapSignature = BootstrapWitness
-> SignedDSIGN DSIGN (Hash HASH EraIndependentTxBody)
L.bwSignature BootstrapWitness
bootstrapWitness
          Proto BootstrapWitness
forall msg. Message msg => msg
defMessage
            Proto BootstrapWitness
-> (Proto BootstrapWitness -> Proto BootstrapWitness)
-> Proto BootstrapWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto BootstrapWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "vkey" a) =>
LensLike' f s a
U5c.vkey LensLike' Identity (Proto BootstrapWitness) ByteString
-> ByteString -> Proto BootstrapWitness -> Proto BootstrapWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ VerKeyDSIGN DSIGN -> ByteString
forall v. DSIGNAlgorithm v => VerKeyDSIGN v -> ByteString
DSIGN.rawSerialiseVerKeyDSIGN VerKeyDSIGN DSIGN
bootstrapKey
            Proto BootstrapWitness
-> (Proto BootstrapWitness -> Proto BootstrapWitness)
-> Proto BootstrapWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto BootstrapWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "signature" a) =>
LensLike' f s a
U5c.signature LensLike' Identity (Proto BootstrapWitness) ByteString
-> ByteString -> Proto BootstrapWitness -> Proto BootstrapWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ SigDSIGN DSIGN -> ByteString
forall v. DSIGNAlgorithm v => SigDSIGN v -> ByteString
DSIGN.rawSerialiseSigDSIGN SigDSIGN DSIGN
bootstrapSignature
            Proto BootstrapWitness
-> (Proto BootstrapWitness -> Proto BootstrapWitness)
-> Proto BootstrapWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto BootstrapWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "chainCode" a) =>
LensLike' f s a
U5c.chainCode LensLike' Identity (Proto BootstrapWitness) ByteString
-> ByteString -> Proto BootstrapWitness -> Proto BootstrapWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ChainCode -> ByteString
L.unChainCode (BootstrapWitness -> ChainCode
L.bwChainCode BootstrapWitness
bootstrapWitness)
            Proto BootstrapWitness
-> (Proto BootstrapWitness -> Proto BootstrapWitness)
-> Proto BootstrapWitness
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto BootstrapWitness) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "attributes" a) =>
LensLike' f s a
U5c.attributes LensLike' Identity (Proto BootstrapWitness) ByteString
-> ByteString -> Proto BootstrapWitness -> Proto BootstrapWitness
forall s t a b. ASetter s t a b -> b -> s -> t
.~ BootstrapWitness -> ByteString
L.bwAttributes BootstrapWitness
bootstrapWitness
      scriptWitnesses :: [Proto UtxoRpc.Script]
      scriptWitnesses :: [Proto Script]
scriptWitnesses =
        Map ScriptHash (Script (ShelleyLedgerEra era))
-> [Script (ShelleyLedgerEra era)]
forall k a. Map k a -> [a]
M.elems (TxWits (ShelleyLedgerEra era)
wits TxWits (ShelleyLedgerEra era)
-> Getting
     (Map ScriptHash (Script (ShelleyLedgerEra era)))
     (TxWits (ShelleyLedgerEra era))
     (Map ScriptHash (Script (ShelleyLedgerEra era)))
-> Map ScriptHash (Script (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (Map ScriptHash (Script (ShelleyLedgerEra era)))
  (TxWits (ShelleyLedgerEra era))
  (Map ScriptHash (Script (ShelleyLedgerEra era)))
forall era.
EraTxWits era =>
Lens' (TxWits era) (Map ScriptHash (Script era))
Lens'
  (TxWits (ShelleyLedgerEra era))
  (Map ScriptHash (Script (ShelleyLedgerEra era)))
L.scriptTxWitsL) [Script (ShelleyLedgerEra era)]
-> (Script (ShelleyLedgerEra era) -> Proto Script)
-> [Proto Script]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> ShelleyBasedEra era
-> Script (ShelleyLedgerEra era) -> Proto Script
forall era.
ShelleyBasedEra era
-> Script (ShelleyLedgerEra era) -> Proto Script
ledgerScriptToUtxoRpcScript ShelleyBasedEra era
sbe
      -- plutus datums exist from Alonzo onwards
      plutusDatums :: [Proto UtxoRpc.PlutusData]
      plutusDatums :: [Proto PlutusData]
plutusDatums =
        [Data (ShelleyLedgerEra era)]
-> (TxDats (ShelleyLedgerEra era) -> [Data (ShelleyLedgerEra era)])
-> Maybe (TxDats (ShelleyLedgerEra era))
-> [Data (ShelleyLedgerEra era)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (Map DataHash (Data (ShelleyLedgerEra era))
-> [Data (ShelleyLedgerEra era)]
forall k a. Map k a -> [a]
M.elems (Map DataHash (Data (ShelleyLedgerEra era))
 -> [Data (ShelleyLedgerEra era)])
-> (TxDats (ShelleyLedgerEra era)
    -> Map DataHash (Data (ShelleyLedgerEra era)))
-> TxDats (ShelleyLedgerEra era)
-> [Data (ShelleyLedgerEra era)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxDats (ShelleyLedgerEra era)
-> Map DataHash (Data (ShelleyLedgerEra era))
forall era. TxDats era -> Map DataHash (Data era)
L.unTxDats) (TxWits (ShelleyLedgerEra era)
wits TxWits (ShelleyLedgerEra era)
-> Getting
     (Maybe (TxDats (ShelleyLedgerEra era)))
     (TxWits (ShelleyLedgerEra era))
     (Maybe (TxDats (ShelleyLedgerEra era)))
-> Maybe (TxDats (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (TxDats (ShelleyLedgerEra era)))
  (TxWits (ShelleyLedgerEra era))
  (Maybe (TxDats (ShelleyLedgerEra era)))
forall era.
AnyEraTxWits era =>
SimpleGetter (TxWits era) (Maybe (TxDats era))
SimpleGetter
  (TxWits (ShelleyLedgerEra era))
  (Maybe (TxDats (ShelleyLedgerEra era)))
L.datsTxWitsG) [Data (ShelleyLedgerEra era)]
-> (Data (ShelleyLedgerEra era) -> Proto PlutusData)
-> [Proto PlutusData]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \Data (ShelleyLedgerEra era)
datum ->
          ScriptData -> Proto PlutusData
scriptDataToUtxoRpcPlutusData (ScriptData -> Proto PlutusData)
-> (HashableScriptData -> ScriptData)
-> HashableScriptData
-> Proto PlutusData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HashableScriptData -> ScriptData
getScriptData (HashableScriptData -> Proto PlutusData)
-> HashableScriptData -> Proto PlutusData
forall a b. (a -> b) -> a -> b
$ Data (ShelleyLedgerEra era) -> HashableScriptData
forall ledgerera. Data ledgerera -> HashableScriptData
fromAlonzoData Data (ShelleyLedgerEra era)
datum
      -- redeemers exist from Alonzo onwards; they are keyed by plutus
      -- script purpose and index so that spending, withdrawal and
      -- certificate redeemers can be attached to their inputs, withdrawals
      -- and certificates. Before Alonzo the redeemer getter yields nothing,
      -- so the classifier is never consulted there
      redeemersByIndex :: Map (PlutusScriptPurpose, Word32) (Proto UtxoRpc.Redeemer)
      redeemersByIndex :: Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
redeemersByIndex =
        [Item (Map (PlutusScriptPurpose, Word32) (Proto Redeemer))]
-> Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
forall l. IsList l => [Item l] -> l
fromList
          [ ( (PlutusScriptPurpose, Word32)
scriptPurposeIndex
            , (PlutusScriptPurpose, Word32)
-> ExecutionUnits
-> Maybe (ScriptData, ByteString)
-> Proto Redeemer
mkProtoRedeemer
                (PlutusScriptPurpose, Word32)
scriptPurposeIndex
                (ExUnits -> ExecutionUnits
fromAlonzoExUnits ExUnits
exUnits)
                ((ScriptData, ByteString) -> Maybe (ScriptData, ByteString)
forall a. a -> Maybe a
Just (HashableScriptData -> ScriptData
getScriptData (Data (ShelleyLedgerEra era) -> HashableScriptData
forall ledgerera. Data ledgerera -> HashableScriptData
fromAlonzoData Data (ShelleyLedgerEra era)
datum), Data (ShelleyLedgerEra era) -> ByteString
forall t. SafeToHash t => t -> ByteString
L.originalBytes Data (ShelleyLedgerEra era)
datum))
            )
          | (PlutusPurpose AsIx (ShelleyLedgerEra era)
purpose, (Data (ShelleyLedgerEra era)
datum, ExUnits
exUnits)) <-
              [(PlutusPurpose AsIx (ShelleyLedgerEra era),
  (Data (ShelleyLedgerEra era), ExUnits))]
-> (Redeemers (ShelleyLedgerEra era)
    -> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
         (Data (ShelleyLedgerEra era), ExUnits))])
-> Maybe (Redeemers (ShelleyLedgerEra era))
-> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
     (Data (ShelleyLedgerEra era), ExUnits))]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (Map
  (PlutusPurpose AsIx (ShelleyLedgerEra era))
  (Data (ShelleyLedgerEra era), ExUnits)
-> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
     (Data (ShelleyLedgerEra era), ExUnits))]
forall k a. Map k a -> [(k, a)]
M.toList (Map
   (PlutusPurpose AsIx (ShelleyLedgerEra era))
   (Data (ShelleyLedgerEra era), ExUnits)
 -> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
      (Data (ShelleyLedgerEra era), ExUnits))])
-> (Redeemers (ShelleyLedgerEra era)
    -> Map
         (PlutusPurpose AsIx (ShelleyLedgerEra era))
         (Data (ShelleyLedgerEra era), ExUnits))
-> Redeemers (ShelleyLedgerEra era)
-> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
     (Data (ShelleyLedgerEra era), ExUnits))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Redeemers (ShelleyLedgerEra era)
-> Map
     (PlutusPurpose AsIx (ShelleyLedgerEra era))
     (Data (ShelleyLedgerEra era), ExUnits)
forall era.
Redeemers era -> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
L.unRedeemers) (Maybe (Redeemers (ShelleyLedgerEra era))
 -> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
      (Data (ShelleyLedgerEra era), ExUnits))])
-> Maybe (Redeemers (ShelleyLedgerEra era))
-> [(PlutusPurpose AsIx (ShelleyLedgerEra era),
     (Data (ShelleyLedgerEra era), ExUnits))]
forall a b. (a -> b) -> a -> b
$ TxWits (ShelleyLedgerEra era)
wits TxWits (ShelleyLedgerEra era)
-> Getting
     (Maybe (Redeemers (ShelleyLedgerEra era)))
     (TxWits (ShelleyLedgerEra era))
     (Maybe (Redeemers (ShelleyLedgerEra era)))
-> Maybe (Redeemers (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (Redeemers (ShelleyLedgerEra era)))
  (TxWits (ShelleyLedgerEra era))
  (Maybe (Redeemers (ShelleyLedgerEra era)))
forall era.
AnyEraTxWits era =>
SimpleGetter (TxWits era) (Maybe (Redeemers era))
SimpleGetter
  (TxWits (ShelleyLedgerEra era))
  (Maybe (Redeemers (ShelleyLedgerEra era)))
L.rdmrsTxWitsG
          , let scriptPurposeIndex :: (PlutusScriptPurpose, Word32)
scriptPurposeIndex = ShelleyBasedEra era
-> PlutusPurpose AsIx (ShelleyLedgerEra era)
-> (PlutusScriptPurpose, Word32)
forall era.
ShelleyBasedEra era
-> PlutusPurpose AsIx (ShelleyLedgerEra era)
-> (PlutusScriptPurpose, Word32)
toPlutusScriptPurposeIndex ShelleyBasedEra era
sbe PlutusPurpose AsIx (ShelleyLedgerEra era)
purpose
          ]
      witnessSet :: Proto UtxoRpc.WitnessSet
      witnessSet :: Proto WitnessSet
witnessSet =
        Proto WitnessSet
forall msg. Message msg => msg
defMessage
          Proto WitnessSet
-> (Proto WitnessSet -> Proto WitnessSet) -> Proto WitnessSet
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto WitnessSet) [Proto VKeyWitness]
forall (f :: * -> *) s a.
(Functor f, HasField s "vkeywitness" a) =>
LensLike' f s a
U5c.vkeywitness LensLike' Identity (Proto WitnessSet) [Proto VKeyWitness]
-> [Proto VKeyWitness] -> Proto WitnessSet -> Proto WitnessSet
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto VKeyWitness]
vkeyWitnesses
          Proto WitnessSet
-> (Proto WitnessSet -> Proto WitnessSet) -> Proto WitnessSet
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto WitnessSet) [Proto Script]
forall (f :: * -> *) s a.
(Functor f, HasField s "script" a) =>
LensLike' f s a
U5c.script LensLike' Identity (Proto WitnessSet) [Proto Script]
-> [Proto Script] -> Proto WitnessSet -> Proto WitnessSet
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto Script]
scriptWitnesses
          Proto WitnessSet
-> (Proto WitnessSet -> Proto WitnessSet) -> Proto WitnessSet
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto WitnessSet) [Proto PlutusData]
forall (f :: * -> *) s a.
(Functor f, HasField s "plutusDatums" a) =>
LensLike' f s a
U5c.plutusDatums LensLike' Identity (Proto WitnessSet) [Proto PlutusData]
-> [Proto PlutusData] -> Proto WitnessSet -> Proto WitnessSet
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto PlutusData]
plutusDatums
          Proto WitnessSet
-> (Proto WitnessSet -> Proto WitnessSet) -> Proto WitnessSet
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto WitnessSet) [Proto Redeemer]
forall (f :: * -> *) s a.
(Functor f, HasField s "redeemers" a) =>
LensLike' f s a
U5c.redeemers LensLike' Identity (Proto WitnessSet) [Proto Redeemer]
-> [Proto Redeemer] -> Proto WitnessSet -> Proto WitnessSet
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
-> [Proto Redeemer]
forall k a. Map k a -> [a]
M.elems Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
redeemersByIndex
          Proto WitnessSet
-> (Proto WitnessSet -> Proto WitnessSet) -> Proto WitnessSet
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto WitnessSet) [Proto BootstrapWitness]
forall (f :: * -> *) s a.
(Functor f, HasField s "bootstrapWitnesses" a) =>
LensLike' f s a
U5c.bootstrapWitnesses LensLike' Identity (Proto WitnessSet) [Proto BootstrapWitness]
-> [Proto BootstrapWitness] -> Proto WitnessSet -> Proto WitnessSet
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto BootstrapWitness]
bootstrapWitnesses
      -- the certificate redeemer at index ix belongs to the certificate at
      -- position ix in the certificate list
      certificates :: [Proto UtxoRpc.Certificate]
      certificates :: [Proto Certificate]
certificates =
        [Word32]
-> [Item (StrictSeq (TxCert (ShelleyLedgerEra era)))]
-> [(Word32, Item (StrictSeq (TxCert (ShelleyLedgerEra era))))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0 ..] (StrictSeq (TxCert (ShelleyLedgerEra era))
-> [Item (StrictSeq (TxCert (ShelleyLedgerEra era)))]
forall l. IsList l => l -> [Item l]
toList (TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (StrictSeq (TxCert (ShelleyLedgerEra era)))
     (TxBody TopTx (ShelleyLedgerEra era))
     (StrictSeq (TxCert (ShelleyLedgerEra era)))
-> StrictSeq (TxCert (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictSeq (TxCert (ShelleyLedgerEra era)))
  (TxBody TopTx (ShelleyLedgerEra era))
  (StrictSeq (TxCert (ShelleyLedgerEra era)))
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (StrictSeq (TxCert era))
forall (l :: TxLevel).
Lens'
  (TxBody l (ShelleyLedgerEra era))
  (StrictSeq (TxCert (ShelleyLedgerEra era)))
L.certsTxBodyL)) [(Word32, Item (StrictSeq (TxCert (ShelleyLedgerEra era))))]
-> ((Word32, Item (StrictSeq (TxCert (ShelleyLedgerEra era))))
    -> Proto Certificate)
-> [Proto Certificate]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Word32
ix, Item (StrictSeq (TxCert (ShelleyLedgerEra era)))
cert) ->
          ShelleyBasedEra era
-> TxCert (ShelleyLedgerEra era) -> Proto Certificate
forall era.
ShelleyBasedEra era
-> TxCert (ShelleyLedgerEra era) -> Proto Certificate
txCertToUtxoRpcCertificate ShelleyBasedEra era
sbe Item (StrictSeq (TxCert (ShelleyLedgerEra era)))
TxCert (ShelleyLedgerEra era)
cert
            Proto Certificate
-> (Proto Certificate -> Proto Certificate) -> Proto Certificate
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Certificate) (Maybe (Proto Redeemer))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'redeemer" a) =>
LensLike' f s a
U5c.maybe'redeemer
              LensLike' Identity (Proto Certificate) (Maybe (Proto Redeemer))
-> Maybe (Proto Redeemer) -> Proto Certificate -> Proto Certificate
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (PlutusScriptPurpose, Word32)
-> Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
-> Maybe (Proto Redeemer)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (PlutusScriptPurpose
CertifyingScript, Word32
ix) Map (PlutusScriptPurpose, Word32) (Proto Redeemer)
redeemersByIndex
      -- auxiliary data is only set when the transaction carries any; the
      -- metadata map is uniformly accessible, the auxiliary scripts vary
      -- per era family
      auxiliary :: Maybe (Proto UtxoRpc.AuxData)
      auxiliary :: Maybe (Proto AuxData)
auxiliary =
        StrictMaybe (TxAuxData (ShelleyLedgerEra era))
-> Maybe (TxAuxData (ShelleyLedgerEra era))
forall a. StrictMaybe a -> Maybe a
L.strictMaybeToMaybe (Tx TopTx (ShelleyLedgerEra era)
ledgerTx Tx TopTx (ShelleyLedgerEra era)
-> Getting
     (StrictMaybe (TxAuxData (ShelleyLedgerEra era)))
     (Tx TopTx (ShelleyLedgerEra era))
     (StrictMaybe (TxAuxData (ShelleyLedgerEra era)))
-> StrictMaybe (TxAuxData (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictMaybe (TxAuxData (ShelleyLedgerEra era)))
  (Tx TopTx (ShelleyLedgerEra era))
  (StrictMaybe (TxAuxData (ShelleyLedgerEra era)))
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (StrictMaybe (TxAuxData era))
forall (l :: TxLevel).
Lens'
  (Tx l (ShelleyLedgerEra era))
  (StrictMaybe (TxAuxData (ShelleyLedgerEra era)))
L.auxDataTxL) Maybe (TxAuxData (ShelleyLedgerEra era))
-> (TxAuxData (ShelleyLedgerEra era) -> Proto AuxData)
-> Maybe (Proto AuxData)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \TxAuxData (ShelleyLedgerEra era)
auxData ->
          Proto AuxData
forall msg. Message msg => msg
defMessage
            Proto AuxData -> (Proto AuxData -> Proto AuxData) -> Proto AuxData
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto AuxData) [Proto Metadata]
forall (f :: * -> *) s a.
(Functor f, HasField s "metadata" a) =>
LensLike' f s a
U5c.metadata
              LensLike' Identity (Proto AuxData) [Proto Metadata]
-> [Proto Metadata] -> Proto AuxData -> Proto AuxData
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ( Map Word64 Metadatum -> [(Word64, Metadatum)]
forall k a. Map k a -> [(k, a)]
M.toList (TxAuxData (ShelleyLedgerEra era)
auxData TxAuxData (ShelleyLedgerEra era)
-> Getting
     (Map Word64 Metadatum)
     (TxAuxData (ShelleyLedgerEra era))
     (Map Word64 Metadatum)
-> Map Word64 Metadatum
forall s a. s -> Getting a s a -> a
^. Getting
  (Map Word64 Metadatum)
  (TxAuxData (ShelleyLedgerEra era))
  (Map Word64 Metadatum)
forall era.
EraTxAuxData era =>
Lens' (TxAuxData era) (Map Word64 Metadatum)
Lens' (TxAuxData (ShelleyLedgerEra era)) (Map Word64 Metadatum)
L.metadataTxAuxDataL) [(Word64, Metadatum)]
-> ((Word64, Metadatum) -> Proto Metadata) -> [Proto Metadata]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Word64
metadataLabel, Metadatum
metadatum) ->
                     Proto Metadata
forall msg. Message msg => msg
defMessage
                       Proto Metadata
-> (Proto Metadata -> Proto Metadata) -> Proto Metadata
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadata) Word64
forall (f :: * -> *) s a.
(Functor f, HasField s "label" a) =>
LensLike' f s a
U5c.label LensLike' Identity (Proto Metadata) Word64
-> Word64 -> Proto Metadata -> Proto Metadata
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word64
metadataLabel
                       Proto Metadata
-> (Proto Metadata -> Proto Metadata) -> Proto Metadata
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadata) (Proto Metadatum)
forall (f :: * -> *) s a.
(Functor f, HasField s "value" a) =>
LensLike' f s a
U5c.value LensLike' Identity (Proto Metadata) (Proto Metadatum)
-> Proto Metadatum -> Proto Metadata -> Proto Metadata
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Metadatum -> Proto Metadatum
metadatumToUtxoRpcMetadatum Metadatum
metadatum
                 )
            Proto AuxData -> (Proto AuxData -> Proto AuxData) -> Proto AuxData
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto AuxData) [Proto Script]
forall (f :: * -> *) s a.
(Functor f, HasField s "scripts" a) =>
LensLike' f s a
U5c.scripts
              LensLike' Identity (Proto AuxData) [Proto Script]
-> [Proto Script] -> Proto AuxData -> Proto AuxData
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (ShelleyBasedEra era
-> TxAuxData (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
forall era.
ShelleyBasedEra era
-> TxAuxData (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
txAuxDataScripts ShelleyBasedEra era
sbe TxAuxData (ShelleyLedgerEra era)
auxData [Script (ShelleyLedgerEra era)]
-> (Script (ShelleyLedgerEra era) -> Proto Script)
-> [Proto Script]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> ShelleyBasedEra era
-> Script (ShelleyLedgerEra era) -> Proto Script
forall era.
ShelleyBasedEra era
-> Script (ShelleyLedgerEra era) -> Proto Script
ledgerScriptToUtxoRpcScript ShelleyBasedEra era
sbe)
      -- governance proposals exist from Conway onwards; converting them
      -- needs 'L.ConwayEraPParams' for the parameter update rendering,
      -- which resolves at the concrete eras
      proposals :: [Proto UtxoRpc.GovernanceActionProposal]
      proposals :: [Proto GovernanceActionProposal]
proposals = case ShelleyBasedEra era
sbe of
        ShelleyBasedEra era
ShelleyBasedEraShelley -> []
        ShelleyBasedEra era
ShelleyBasedEraAllegra -> []
        ShelleyBasedEra era
ShelleyBasedEraMary -> []
        ShelleyBasedEra era
ShelleyBasedEraAlonzo -> []
        ShelleyBasedEra era
ShelleyBasedEraBabbage -> []
        ShelleyBasedEra era
ShelleyBasedEraConway -> [Proto GovernanceActionProposal]
ConwayEraPParams (ShelleyLedgerEra era) =>
[Proto GovernanceActionProposal]
conwayOnwardsProposals
        ShelleyBasedEra era
ShelleyBasedEraDijkstra -> [Proto GovernanceActionProposal]
ConwayEraPParams (ShelleyLedgerEra era) =>
[Proto GovernanceActionProposal]
conwayOnwardsProposals
       where
        conwayOnwardsProposals
          :: L.ConwayEraPParams (ShelleyLedgerEra era)
          => [Proto UtxoRpc.GovernanceActionProposal]
        conwayOnwardsProposals :: ConwayEraPParams (ShelleyLedgerEra era) =>
[Proto GovernanceActionProposal]
conwayOnwardsProposals =
          [Proto GovernanceActionProposal]
-> (OSet (ProposalProcedure (ShelleyLedgerEra era))
    -> [Proto GovernanceActionProposal])
-> Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era)))
-> [Proto GovernanceActionProposal]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((ProposalProcedure (ShelleyLedgerEra era)
 -> Proto GovernanceActionProposal)
-> [ProposalProcedure (ShelleyLedgerEra era)]
-> [Proto GovernanceActionProposal]
forall a b. (a -> b) -> [a] -> [b]
map ProposalProcedure (ShelleyLedgerEra era)
-> Proto GovernanceActionProposal
forall era.
ConwayEraPParams era =>
ProposalProcedure era -> Proto GovernanceActionProposal
proposalProcedureToUtxoRpcProposal ([ProposalProcedure (ShelleyLedgerEra era)]
 -> [Proto GovernanceActionProposal])
-> (OSet (ProposalProcedure (ShelleyLedgerEra era))
    -> [ProposalProcedure (ShelleyLedgerEra era)])
-> OSet (ProposalProcedure (ShelleyLedgerEra era))
-> [Proto GovernanceActionProposal]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OSet (ProposalProcedure (ShelleyLedgerEra era))
-> [Item (OSet (ProposalProcedure (ShelleyLedgerEra era)))]
OSet (ProposalProcedure (ShelleyLedgerEra era))
-> [ProposalProcedure (ShelleyLedgerEra era)]
forall l. IsList l => l -> [Item l]
toList) (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era)))
 -> [Proto GovernanceActionProposal])
-> Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era)))
-> [Proto GovernanceActionProposal]
forall a b. (a -> b) -> a -> b
$
            TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era))))
     (TxBody TopTx (ShelleyLedgerEra era))
     (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era))))
-> Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era)))
forall s a. s -> Getting a s a -> a
^. Getting
  (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era))))
  (TxBody TopTx (ShelleyLedgerEra era))
  (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era))))
forall era (l :: TxLevel).
AnyEraTxBody era =>
SimpleGetter (TxBody l era) (Maybe (OSet (ProposalProcedure era)))
forall (l :: TxLevel).
SimpleGetter
  (TxBody l (ShelleyLedgerEra era))
  (Maybe (OSet (ProposalProcedure (ShelleyLedgerEra era))))
L.proposalProceduresTxBodyG
  Proto Tx
forall msg. Message msg => msg
defMessage
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "hash" a) =>
LensLike' f s a
U5c.hash LensLike' Identity (Proto Tx) ByteString
-> ByteString -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ TxId -> ByteString
forall a. SerialiseAsRawBytes a => a -> ByteString
serialiseToRawBytes (TxId -> TxId
fromShelleyTxId (Tx TopTx (ShelleyLedgerEra era) -> TxId
forall era (l :: TxLevel). EraTx era => Tx l era -> TxId
L.txIdTx Tx TopTx (ShelleyLedgerEra era)
ledgerTx))
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto TxInput]
forall (f :: * -> *) s a.
(Functor f, HasField s "inputs" a) =>
LensLike' f s a
U5c.inputs LensLike' Identity (Proto Tx) [Proto TxInput]
-> [Proto TxInput] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto TxInput]
inputs
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto TxOutput]
forall (f :: * -> *) s a.
(Functor f, HasField s "outputs" a) =>
LensLike' f s a
U5c.outputs LensLike' Identity (Proto Tx) [Proto TxOutput]
-> [Proto TxOutput] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (TxOut (ShelleyLedgerEra era) -> Proto TxOutput)
-> [TxOut (ShelleyLedgerEra era)] -> [Proto TxOutput]
forall a b. (a -> b) -> [a] -> [b]
map TxOut (ShelleyLedgerEra era) -> Proto TxOutput
convertTxOut (StrictSeq (TxOut (ShelleyLedgerEra era))
-> [Item (StrictSeq (TxOut (ShelleyLedgerEra era)))]
forall l. IsList l => l -> [Item l]
toList (TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting
     (StrictSeq (TxOut (ShelleyLedgerEra era)))
     (TxBody TopTx (ShelleyLedgerEra era))
     (StrictSeq (TxOut (ShelleyLedgerEra era)))
-> StrictSeq (TxOut (ShelleyLedgerEra era))
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictSeq (TxOut (ShelleyLedgerEra era)))
  (TxBody TopTx (ShelleyLedgerEra era))
  (StrictSeq (TxOut (ShelleyLedgerEra era)))
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (StrictSeq (TxOut era))
forall (l :: TxLevel).
Lens'
  (TxBody l (ShelleyLedgerEra era))
  (StrictSeq (TxOut (ShelleyLedgerEra era)))
L.outputsTxBodyL))
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto TxInput]
forall (f :: * -> *) s a.
(Functor f, HasField s "referenceInputs" a) =>
LensLike' f s a
U5c.referenceInputs LensLike' Identity (Proto Tx) [Proto TxInput]
-> [Proto TxInput] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (TxIn -> Proto TxInput) -> [TxIn] -> [Proto TxInput]
forall a b. (a -> b) -> [a] -> [b]
map (TxIn -> Proto TxInput
txInToUtxoRpcTxInput (TxIn -> Proto TxInput) -> (TxIn -> TxIn) -> TxIn -> Proto TxInput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn -> TxIn
fromShelleyTxIn) [TxIn]
referenceInputs
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto Certificate]
forall (f :: * -> *) s a.
(Functor f, HasField s "certificates" a) =>
LensLike' f s a
U5c.certificates LensLike' Identity (Proto Tx) [Proto Certificate]
-> [Proto Certificate] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto Certificate]
certificates
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) (Proto TxValidity)
forall (f :: * -> *) s a.
(Functor f, HasField s "validity" a) =>
LensLike' f s a
U5c.validity LensLike' Identity (Proto Tx) (Proto TxValidity)
-> Proto TxValidity -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Proto TxValidity
validity
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto Multiasset]
forall (f :: * -> *) s a.
(Functor f, HasField s "mint" a) =>
LensLike' f s a
U5c.mint LensLike' Identity (Proto Tx) [Proto Multiasset]
-> [Proto Multiasset] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Map PolicyId PolicyAssets -> [Proto Multiasset]
policyAssetsToUtxoRpcMultiassets Map PolicyId PolicyAssets
mint
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto Withdrawal]
forall (f :: * -> *) s a.
(Functor f, HasField s "withdrawals" a) =>
LensLike' f s a
U5c.withdrawals LensLike' Identity (Proto Tx) [Proto Withdrawal]
-> [Proto Withdrawal] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto Withdrawal]
withdrawals
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) (Maybe (Proto Collateral))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'collateral" a) =>
LensLike' f s a
U5c.maybe'collateral LensLike' Identity (Proto Tx) (Maybe (Proto Collateral))
-> Maybe (Proto Collateral) -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe (Proto Collateral)
collateral
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) (Proto WitnessSet)
forall (f :: * -> *) s a.
(Functor f, HasField s "witnesses" a) =>
LensLike' f s a
U5c.witnesses LensLike' Identity (Proto Tx) (Proto WitnessSet)
-> Proto WitnessSet -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Proto WitnessSet
witnessSet
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) (Proto BigInt)
forall (f :: * -> *) s a.
(Functor f, HasField s "fee" a) =>
LensLike' f s a
U5c.fee LensLike' Identity (Proto Tx) (Proto BigInt)
-> Proto BigInt -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Coin -> Proto BigInt
forall t s. Inject t s => t -> s
inject (TxBody TopTx (ShelleyLedgerEra era)
body TxBody TopTx (ShelleyLedgerEra era)
-> Getting Coin (TxBody TopTx (ShelleyLedgerEra era)) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (TxBody TopTx (ShelleyLedgerEra era)) Coin
forall era. EraTxBody era => Lens' (TxBody TopTx era) Coin
Lens' (TxBody TopTx (ShelleyLedgerEra era)) Coin
L.feeTxBodyL)
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) Bool
forall (f :: * -> *) s a.
(Functor f, HasField s "successful" a) =>
LensLike' f s a
U5c.successful LensLike' Identity (Proto Tx) Bool -> Bool -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
isValid
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) (Maybe (Proto AuxData))
forall (f :: * -> *) s a.
(Functor f, HasField s "maybe'auxiliary" a) =>
LensLike' f s a
U5c.maybe'auxiliary LensLike' Identity (Proto Tx) (Maybe (Proto AuxData))
-> Maybe (Proto AuxData) -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe (Proto AuxData)
auxiliary
    Proto Tx -> (Proto Tx -> Proto Tx) -> Proto Tx
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Tx) [Proto GovernanceActionProposal]
forall (f :: * -> *) s a.
(Functor f, HasField s "proposals" a) =>
LensLike' f s a
U5c.proposals LensLike' Identity (Proto Tx) [Proto GovernanceActionProposal]
-> [Proto GovernanceActionProposal] -> Proto Tx -> Proto Tx
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Proto GovernanceActionProposal]
proposals
 where
  sbe :: ShelleyBasedEra era
sbe = forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra @era

-- | Bring the constraints of 'txToUtxoRpcTx' into scope for a Shelley-based
-- era: the uniform any-era transaction reading classes of cardano-ledger-api,
-- whose era-gated getters return 'Nothing' where the era predates a field,
-- and 'IsShelleyBasedEra' to recover the witness. Unlike the eon constraint
-- bundles this dispatch is total, including Dijkstra.
anyEraTxConstraints
  :: ShelleyBasedEra era
  -> ((IsShelleyBasedEra era, L.AnyEraTx (ShelleyLedgerEra era)) => a)
  -> a
anyEraTxConstraints :: forall era a.
ShelleyBasedEra era
-> ((IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a)
-> a
anyEraTxConstraints ShelleyBasedEra era
sbe (IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k = case ShelleyBasedEra era
sbe of
  ShelleyBasedEra era
ShelleyBasedEraShelley -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraAllegra -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraMary -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraAlonzo -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraBabbage -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraConway -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k
  ShelleyBasedEra era
ShelleyBasedEraDijkstra -> a
(IsShelleyBasedEra era, AnyEraTx (ShelleyLedgerEra era)) => a
k

-- | Convert a 'TxIn' to the UTxO RPC 'UtxoRpc.TxInput' message.
-- Only the transaction hash and output index are populated:
-- resolving @as_output@ requires a UTxO lookup, and the caller attaches the
-- spending @redeemer@ where one exists.
txInToUtxoRpcTxInput :: TxIn -> Proto UtxoRpc.TxInput
txInToUtxoRpcTxInput :: TxIn -> Proto TxInput
txInToUtxoRpcTxInput (TxIn TxId
txId' (TxIx Word
txIx)) =
  Proto TxInput
forall msg. Message msg => msg
defMessage
    Proto TxInput -> (Proto TxInput -> Proto TxInput) -> Proto TxInput
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto TxInput) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "txHash" a) =>
LensLike' f s a
U5c.txHash LensLike' Identity (Proto TxInput) ByteString
-> ByteString -> Proto TxInput -> Proto TxInput
forall s t a b. ASetter s t a b -> b -> s -> t
.~ TxId -> ByteString
forall a. SerialiseAsRawBytes a => a -> ByteString
serialiseToRawBytes TxId
txId'
    Proto TxInput -> (Proto TxInput -> Proto TxInput) -> Proto TxInput
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto TxInput) Word32
forall (f :: * -> *) s a.
(Functor f, HasField s "outputIndex" a) =>
LensLike' f s a
U5c.outputIndex LensLike' Identity (Proto TxInput) Word32
-> Word32 -> Proto TxInput -> Proto TxInput
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
txIx

-- | Convert a ledger metadatum to the UTxO RPC 'UtxoRpc.Metadatum' message.
-- The UTxO RPC encoding only supports signed 64-bit metadata integers, while
-- the ledger rules allow any integer with an 8-byte magnitude, i.e. within
-- @[-(2^64 - 1), 2^64 - 1]@. Values outside of the 'Int64' range are
-- therefore clamped to 'minBound' and 'maxBound' respectively. Consumers
-- which need full fidelity should decode the @native_bytes@ CBOR of the
-- transaction instead.
metadatumToUtxoRpcMetadatum :: L.Metadatum -> Proto UtxoRpc.Metadatum
metadatumToUtxoRpcMetadatum :: Metadatum -> Proto Metadatum
metadatumToUtxoRpcMetadatum = \case
  L.I Integer
int -> do
    let clamped :: Int64
clamped =
          Integer -> Int64
forall a. Num a => Integer -> a
fromInteger (Integer -> Int64) -> (Integer -> Integer) -> Integer -> Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer -> Integer
forall a. Ord a => a -> a -> a
max (Int64 -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
minBound @Int64)) (Integer -> Int64) -> Integer -> Int64
forall a b. (a -> b) -> a -> b
$
            Integer -> Integer -> Integer
forall a. Ord a => a -> a -> a
min (Int64 -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
maxBound @Int64)) Integer
int
    Proto Metadatum
forall msg. Message msg => msg
defMessage Proto Metadatum
-> (Proto Metadatum -> Proto Metadatum) -> Proto Metadatum
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadatum) Int64
forall (f :: * -> *) s a.
(Functor f, HasField s "int" a) =>
LensLike' f s a
U5c.int LensLike' Identity (Proto Metadatum) Int64
-> Int64 -> Proto Metadatum -> Proto Metadatum
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Int64
clamped
  L.B ByteString
bytes -> Proto Metadatum
forall msg. Message msg => msg
defMessage Proto Metadatum
-> (Proto Metadatum -> Proto Metadatum) -> Proto Metadatum
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadatum) ByteString
forall (f :: * -> *) s a.
(Functor f, HasField s "bytes" a) =>
LensLike' f s a
U5c.bytes LensLike' Identity (Proto Metadatum) ByteString
-> ByteString -> Proto Metadatum -> Proto Metadatum
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ByteString
bytes
  L.S Text
text -> Proto Metadatum
forall msg. Message msg => msg
defMessage Proto Metadatum
-> (Proto Metadatum -> Proto Metadatum) -> Proto Metadatum
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadatum) Text
forall (f :: * -> *) s a.
(Functor f, HasField s "text" a) =>
LensLike' f s a
U5c.text LensLike' Identity (Proto Metadatum) Text
-> Text -> Proto Metadatum -> Proto Metadatum
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Text
text
  L.List [Metadatum]
elements ->
    Proto Metadatum
forall msg. Message msg => msg
defMessage Proto Metadatum
-> (Proto Metadatum -> Proto Metadatum) -> Proto Metadatum
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadatum) (Proto MetadatumArray)
forall (f :: * -> *) s a.
(Functor f, HasField s "array" a) =>
LensLike' f s a
U5c.array LensLike' Identity (Proto Metadatum) (Proto MetadatumArray)
-> (([Proto Metadatum] -> Identity [Proto Metadatum])
    -> Proto MetadatumArray -> Identity (Proto MetadatumArray))
-> ([Proto Metadatum] -> Identity [Proto Metadatum])
-> Proto Metadatum
-> Identity (Proto Metadatum)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Proto Metadatum] -> Identity [Proto Metadatum])
-> Proto MetadatumArray -> Identity (Proto MetadatumArray)
forall (f :: * -> *) s a.
(Functor f, HasField s "items" a) =>
LensLike' f s a
U5c.items (([Proto Metadatum] -> Identity [Proto Metadatum])
 -> Proto Metadatum -> Identity (Proto Metadatum))
-> [Proto Metadatum] -> Proto Metadatum -> Proto Metadatum
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Metadatum -> Proto Metadatum) -> [Metadatum] -> [Proto Metadatum]
forall a b. (a -> b) -> [a] -> [b]
map Metadatum -> Proto Metadatum
metadatumToUtxoRpcMetadatum [Metadatum]
elements
  L.Map [(Metadatum, Metadatum)]
keyValuePairs ->
    Proto Metadatum
forall msg. Message msg => msg
defMessage
      Proto Metadatum
-> (Proto Metadatum -> Proto Metadatum) -> Proto Metadatum
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto Metadatum) (Proto MetadatumMap)
forall (f :: * -> *) s a.
(Functor f, HasField s "map" a) =>
LensLike' f s a
U5c.map LensLike' Identity (Proto Metadatum) (Proto MetadatumMap)
-> (([Proto MetadatumPair] -> Identity [Proto MetadatumPair])
    -> Proto MetadatumMap -> Identity (Proto MetadatumMap))
-> ([Proto MetadatumPair] -> Identity [Proto MetadatumPair])
-> Proto Metadatum
-> Identity (Proto Metadatum)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Proto MetadatumPair] -> Identity [Proto MetadatumPair])
-> Proto MetadatumMap -> Identity (Proto MetadatumMap)
forall (f :: * -> *) s a.
(Functor f, HasField s "pairs" a) =>
LensLike' f s a
U5c.pairs
        (([Proto MetadatumPair] -> Identity [Proto MetadatumPair])
 -> Proto Metadatum -> Identity (Proto Metadatum))
-> [Proto MetadatumPair] -> Proto Metadatum -> Proto Metadatum
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ( [(Metadatum, Metadatum)]
keyValuePairs [(Metadatum, Metadatum)]
-> ((Metadatum, Metadatum) -> Proto MetadatumPair)
-> [Proto MetadatumPair]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Metadatum
key, Metadatum
value) ->
               Proto MetadatumPair
forall msg. Message msg => msg
defMessage
                 Proto MetadatumPair
-> (Proto MetadatumPair -> Proto MetadatumPair)
-> Proto MetadatumPair
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto MetadatumPair) (Proto Metadatum)
forall (f :: * -> *) s a.
(Functor f, HasField s "key" a) =>
LensLike' f s a
U5c.key LensLike' Identity (Proto MetadatumPair) (Proto Metadatum)
-> Proto Metadatum -> Proto MetadatumPair -> Proto MetadatumPair
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Metadatum -> Proto Metadatum
metadatumToUtxoRpcMetadatum Metadatum
key
                 Proto MetadatumPair
-> (Proto MetadatumPair -> Proto MetadatumPair)
-> Proto MetadatumPair
forall a b. a -> (a -> b) -> b
& LensLike' Identity (Proto MetadatumPair) (Proto Metadatum)
forall (f :: * -> *) s a.
(Functor f, HasField s "value" a) =>
LensLike' f s a
U5c.value LensLike' Identity (Proto MetadatumPair) (Proto Metadatum)
-> Proto Metadatum -> Proto MetadatumPair -> Proto MetadatumPair
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Metadatum -> Proto Metadatum
metadatumToUtxoRpcMetadatum Metadatum
value
           )

-- | Extract the auxiliary scripts of a transaction as ledger 'L.Script'
-- values. Shelley auxiliary data carries no scripts, Allegra and Mary carry
-- timelock scripts, and Alonzo onwards additionally carry Plutus scripts. The
-- dispatch matches on the concrete eras because the auxiliary data and
-- script types of each era family only line up at concrete eras.
txAuxDataScripts
  :: ShelleyBasedEra era
  -> L.TxAuxData (ShelleyLedgerEra era)
  -> [L.Script (ShelleyLedgerEra era)]
txAuxDataScripts :: forall era.
ShelleyBasedEra era
-> TxAuxData (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
txAuxDataScripts ShelleyBasedEra era
sbe TxAuxData (ShelleyLedgerEra era)
auxData =
  case ShelleyBasedEra era
sbe of
    ShelleyBasedEra era
ShelleyBasedEraShelley -> []
    ShelleyBasedEra era
ShelleyBasedEraAllegra -> StrictSeq (NativeScript AllegraEra)
-> [Item (StrictSeq (NativeScript AllegraEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (NativeScript AllegraEra)
 -> [Item (StrictSeq (NativeScript AllegraEra))])
-> StrictSeq (NativeScript AllegraEra)
-> [Item (StrictSeq (NativeScript AllegraEra))]
forall a b. (a -> b) -> a -> b
$ AllegraTxAuxData AllegraEra
TxAuxData (ShelleyLedgerEra era)
auxData AllegraTxAuxData AllegraEra
-> Getting
     (StrictSeq (NativeScript AllegraEra))
     (AllegraTxAuxData AllegraEra)
     (StrictSeq (NativeScript AllegraEra))
-> StrictSeq (NativeScript AllegraEra)
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictSeq (NativeScript AllegraEra))
  (AllegraTxAuxData AllegraEra)
  (StrictSeq (NativeScript AllegraEra))
(StrictSeq (NativeScript AllegraEra)
 -> Const
      (StrictSeq (NativeScript AllegraEra))
      (StrictSeq (NativeScript AllegraEra)))
-> TxAuxData AllegraEra
-> Const
     (StrictSeq (NativeScript AllegraEra)) (TxAuxData AllegraEra)
forall era.
AllegraEraTxAuxData era =>
Lens' (TxAuxData era) (StrictSeq (NativeScript era))
Lens' (TxAuxData AllegraEra) (StrictSeq (NativeScript AllegraEra))
L.nativeScriptsTxAuxDataL
    ShelleyBasedEra era
ShelleyBasedEraMary -> StrictSeq (NativeScript MaryEra)
-> [Item (StrictSeq (NativeScript MaryEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (NativeScript MaryEra)
 -> [Item (StrictSeq (NativeScript MaryEra))])
-> StrictSeq (NativeScript MaryEra)
-> [Item (StrictSeq (NativeScript MaryEra))]
forall a b. (a -> b) -> a -> b
$ AllegraTxAuxData MaryEra
TxAuxData (ShelleyLedgerEra era)
auxData AllegraTxAuxData MaryEra
-> Getting
     (StrictSeq (NativeScript MaryEra))
     (AllegraTxAuxData MaryEra)
     (StrictSeq (NativeScript MaryEra))
-> StrictSeq (NativeScript MaryEra)
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictSeq (NativeScript MaryEra))
  (AllegraTxAuxData MaryEra)
  (StrictSeq (NativeScript MaryEra))
(StrictSeq (NativeScript MaryEra)
 -> Const
      (StrictSeq (NativeScript MaryEra))
      (StrictSeq (NativeScript MaryEra)))
-> TxAuxData MaryEra
-> Const (StrictSeq (NativeScript MaryEra)) (TxAuxData MaryEra)
forall era.
AllegraEraTxAuxData era =>
Lens' (TxAuxData era) (StrictSeq (NativeScript era))
Lens' (TxAuxData MaryEra) (StrictSeq (NativeScript MaryEra))
L.nativeScriptsTxAuxDataL
    ShelleyBasedEra era
ShelleyBasedEraAlonzo -> StrictSeq (AlonzoScript AlonzoEra)
-> [Item (StrictSeq (AlonzoScript AlonzoEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (AlonzoScript AlonzoEra)
 -> [Item (StrictSeq (AlonzoScript AlonzoEra))])
-> StrictSeq (AlonzoScript AlonzoEra)
-> [Item (StrictSeq (AlonzoScript AlonzoEra))]
forall a b. (a -> b) -> a -> b
$ AlonzoTxAuxData AlonzoEra -> StrictSeq (AlonzoScript AlonzoEra)
forall era.
AlonzoEraScript era =>
AlonzoTxAuxData era -> StrictSeq (AlonzoScript era)
L.getAlonzoTxAuxDataScripts TxAuxData (ShelleyLedgerEra era)
AlonzoTxAuxData AlonzoEra
auxData
    ShelleyBasedEra era
ShelleyBasedEraBabbage -> StrictSeq (AlonzoScript BabbageEra)
-> [Item (StrictSeq (AlonzoScript BabbageEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (AlonzoScript BabbageEra)
 -> [Item (StrictSeq (AlonzoScript BabbageEra))])
-> StrictSeq (AlonzoScript BabbageEra)
-> [Item (StrictSeq (AlonzoScript BabbageEra))]
forall a b. (a -> b) -> a -> b
$ AlonzoTxAuxData BabbageEra -> StrictSeq (AlonzoScript BabbageEra)
forall era.
AlonzoEraScript era =>
AlonzoTxAuxData era -> StrictSeq (AlonzoScript era)
L.getAlonzoTxAuxDataScripts TxAuxData (ShelleyLedgerEra era)
AlonzoTxAuxData BabbageEra
auxData
    ShelleyBasedEra era
ShelleyBasedEraConway -> StrictSeq (AlonzoScript ConwayEra)
-> [Item (StrictSeq (AlonzoScript ConwayEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (AlonzoScript ConwayEra)
 -> [Item (StrictSeq (AlonzoScript ConwayEra))])
-> StrictSeq (AlonzoScript ConwayEra)
-> [Item (StrictSeq (AlonzoScript ConwayEra))]
forall a b. (a -> b) -> a -> b
$ AlonzoTxAuxData ConwayEra -> StrictSeq (AlonzoScript ConwayEra)
forall era.
AlonzoEraScript era =>
AlonzoTxAuxData era -> StrictSeq (AlonzoScript era)
L.getAlonzoTxAuxDataScripts TxAuxData (ShelleyLedgerEra era)
AlonzoTxAuxData ConwayEra
auxData
    ShelleyBasedEra era
ShelleyBasedEraDijkstra -> StrictSeq (AlonzoScript DijkstraEra)
-> [Item (StrictSeq (AlonzoScript DijkstraEra))]
forall l. IsList l => l -> [Item l]
toList (StrictSeq (AlonzoScript DijkstraEra)
 -> [Item (StrictSeq (AlonzoScript DijkstraEra))])
-> StrictSeq (AlonzoScript DijkstraEra)
-> [Item (StrictSeq (AlonzoScript DijkstraEra))]
forall a b. (a -> b) -> a -> b
$ AlonzoTxAuxData DijkstraEra -> StrictSeq (AlonzoScript DijkstraEra)
forall era.
AlonzoEraScript era =>
AlonzoTxAuxData era -> StrictSeq (AlonzoScript era)
L.getAlonzoTxAuxDataScripts TxAuxData (ShelleyLedgerEra era)
AlonzoTxAuxData DijkstraEra
auxData