{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module Convex.ThreatModel.TxModifier where

import Cardano.Api
import Cardano.Ledger.Alonzo.TxBody qualified as Ledger
import Cardano.Ledger.Alonzo.TxWits qualified as Ledger
import Cardano.Ledger.Api.Era qualified as Ledger
import Cardano.Ledger.Binary qualified as CBOR
import Cardano.Ledger.Conway.Scripts qualified as Conway
import Cardano.Ledger.Conway.TxBody qualified as Conway
import Cardano.Ledger.Keys (coerceKeyRole)
import Cardano.Ledger.Mary.Value qualified as Mary
import Data.Coerce

import Cardano.Ledger.Alonzo.Scripts qualified as Ledger
import Data.Map qualified as Map
import Data.Maybe
import Data.Maybe.Strict
import Data.Sequence.Strict qualified as Seq
import Data.Set qualified as Set
import PlutusLedgerApi.Test.Examples (alwaysSucceedingNAryFunction)

import Data.Aeson (object, (.=))
import Data.Text qualified as Text

import Convex.TestingInterface.Trace.TxSummary (renderAssetName, renderDatum, toValueSummary)
import Convex.ThreatModel.Cardano.Api

-- | A transaction output paired with its index in the transaction.
data Output = Output
  { Output -> TxOut CtxTx Era
outputTxOut :: TxOut CtxTx Era
  , Output -> TxIx
outputIx :: TxIx
  }
  deriving (Int -> Output -> ShowS
[Output] -> ShowS
Output -> [Char]
(Int -> Output -> ShowS)
-> (Output -> [Char]) -> ([Output] -> ShowS) -> Show Output
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Output -> ShowS
showsPrec :: Int -> Output -> ShowS
$cshow :: Output -> [Char]
show :: Output -> [Char]
$cshowList :: [Output] -> ShowS
showList :: [Output] -> ShowS
Show)

-- | A transaction input reference togheter with the corresponding `TxOut` from the `UTxO` set.
data Input = Input
  { Input -> TxOut CtxUTxO Era
inputTxOut :: TxOut CtxUTxO Era
  , Input -> TxIn
inputTxIn :: TxIn
  }
  deriving (Int -> Input -> ShowS
[Input] -> ShowS
Input -> [Char]
(Int -> Input -> ShowS)
-> (Input -> [Char]) -> ([Input] -> ShowS) -> Show Input
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Input -> ShowS
showsPrec :: Int -> Input -> ShowS
$cshow :: Input -> [Char]
show :: Input -> [Char]
$cshowList :: [Input] -> ShowS
showList :: [Input] -> ShowS
Show)

-- | Functions common to both `Input`s and `Output`s.
class IsInputOrOutput t where
  {- | Change the target address of an input or an output. For outputs this means redirecting an
  output to a different address, and for inputs it means modifying the UTxO set, changing the
  owner of the given input.

  /Note: Does not work for script inputs./
  -}
  changeAddressOf :: t -> AddressAny -> TxModifier

  -- | Change the value of an input or an output.
  changeValueOf :: t -> Value -> TxModifier

  -- | Change the datum on an input or an output.
  changeDatumOf :: t -> Datum -> TxModifier

  -- | Change the reference script on an input or an output
  changeRefScriptOf :: t -> ReferenceScript Era -> TxModifier

  -- | Get the address (pubkey or script address) of an input or an output.
  addressOf :: t -> AddressAny

  -- | Get the value at an input or an output.
  valueOf :: t -> Value

  -- | Get the reference script at an input or an output.
  refScriptOf :: t -> ReferenceScript Era

instance IsInputOrOutput Output where
  changeAddressOf :: Output -> AddressAny -> TxModifier
changeAddressOf Output
o AddressAny
a = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIx
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeOutput (Output -> TxIx
outputIx Output
o) (AddressAny -> Maybe AddressAny
forall a. a -> Maybe a
Just AddressAny
a) Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
  changeValueOf :: Output -> Value -> TxModifier
changeValueOf Output
o Value
v = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIx
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeOutput (Output -> TxIx
outputIx Output
o) Maybe AddressAny
forall a. Maybe a
Nothing (Value -> Maybe Value
forall a. a -> Maybe a
Just Value
v) Maybe Datum
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
  changeDatumOf :: Output -> Datum -> TxModifier
changeDatumOf Output
o Datum
d = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIx
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeOutput (Output -> TxIx
outputIx Output
o) Maybe AddressAny
forall a. Maybe a
Nothing Maybe Value
forall a. Maybe a
Nothing (Datum -> Maybe Datum
forall a. a -> Maybe a
Just Datum
d) Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
  changeRefScriptOf :: Output -> ReferenceScript Era -> TxModifier
changeRefScriptOf Output
o ReferenceScript Era
r = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIx
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeOutput (Output -> TxIx
outputIx Output
o) Maybe AddressAny
forall a. Maybe a
Nothing Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing (ReferenceScript Era -> Maybe (ReferenceScript Era)
forall a. a -> Maybe a
Just ReferenceScript Era
r)
  addressOf :: Output -> AddressAny
addressOf = TxOut CtxTx Era -> AddressAny
forall ctx. TxOut ctx Era -> AddressAny
addressOfTxOut (TxOut CtxTx Era -> AddressAny)
-> (Output -> TxOut CtxTx Era) -> Output -> AddressAny
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Output -> TxOut CtxTx Era
outputTxOut
  valueOf :: Output -> Value
valueOf = TxOut CtxTx Era -> Value
forall ctx. TxOut ctx Era -> Value
valueOfTxOut (TxOut CtxTx Era -> Value)
-> (Output -> TxOut CtxTx Era) -> Output -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Output -> TxOut CtxTx Era
outputTxOut
  refScriptOf :: Output -> ReferenceScript Era
refScriptOf = TxOut CtxTx Era -> ReferenceScript Era
forall ctx. TxOut ctx Era -> ReferenceScript Era
referenceScriptOfTxOut (TxOut CtxTx Era -> ReferenceScript Era)
-> (Output -> TxOut CtxTx Era) -> Output -> ReferenceScript Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Output -> TxOut CtxTx Era
outputTxOut

instance IsInputOrOutput Input where
  changeAddressOf :: Input -> AddressAny -> TxModifier
changeAddressOf Input
i AddressAny
a
    | AddressAny -> Bool
isKeyAddressAny (Input -> AddressAny
forall t. IsInputOrOutput t => t -> AddressAny
addressOf Input
i) = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeInput (Input -> TxIn
inputTxIn Input
i) (AddressAny -> Maybe AddressAny
forall a. a -> Maybe a
Just AddressAny
a) Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
    | Bool
otherwise = [Char] -> TxModifier
forall a. HasCallStack => [Char] -> a
error [Char]
"Cannot changeAddressOf ScriptInput"
  changeValueOf :: Input -> Value -> TxModifier
changeValueOf Input
i Value
v
    | AddressAny -> Bool
isKeyAddressAny (Input -> AddressAny
forall t. IsInputOrOutput t => t -> AddressAny
addressOf Input
i) = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeInput (Input -> TxIn
inputTxIn Input
i) Maybe AddressAny
forall a. Maybe a
Nothing (Value -> Maybe Value
forall a. a -> Maybe a
Just Value
v) Maybe Datum
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
    | Bool
otherwise = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe Value
-> Maybe Datum
-> Maybe Redeemer
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeScriptInput (Input -> TxIn
inputTxIn Input
i) (Value -> Maybe Value
forall a. a -> Maybe a
Just Value
v) Maybe Datum
forall a. Maybe a
Nothing Maybe Redeemer
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
  changeDatumOf :: Input -> Datum -> TxModifier
changeDatumOf Input
i Datum
d
    | AddressAny -> Bool
isKeyAddressAny (Input -> AddressAny
forall t. IsInputOrOutput t => t -> AddressAny
addressOf Input
i) = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeInput (Input -> TxIn
inputTxIn Input
i) Maybe AddressAny
forall a. Maybe a
Nothing Maybe Value
forall a. Maybe a
Nothing (Datum -> Maybe Datum
forall a. a -> Maybe a
Just Datum
d) Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
    | Bool
otherwise = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe Value
-> Maybe Datum
-> Maybe Redeemer
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeScriptInput (Input -> TxIn
inputTxIn Input
i) Maybe Value
forall a. Maybe a
Nothing (Datum -> Maybe Datum
forall a. a -> Maybe a
Just Datum
d) Maybe Redeemer
forall a. Maybe a
Nothing Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing
  changeRefScriptOf :: Input -> ReferenceScript Era -> TxModifier
changeRefScriptOf Input
i ReferenceScript Era
r
    | AddressAny -> Bool
isKeyAddressAny (Input -> AddressAny
forall t. IsInputOrOutput t => t -> AddressAny
addressOf Input
i) = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe AddressAny
-> Maybe Value
-> Maybe Datum
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeInput (Input -> TxIn
inputTxIn Input
i) Maybe AddressAny
forall a. Maybe a
Nothing Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing (ReferenceScript Era -> Maybe (ReferenceScript Era)
forall a. a -> Maybe a
Just ReferenceScript Era
r)
    | Bool
otherwise = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe Value
-> Maybe Datum
-> Maybe Redeemer
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeScriptInput (Input -> TxIn
inputTxIn Input
i) Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing Maybe Redeemer
forall a. Maybe a
Nothing (ReferenceScript Era -> Maybe (ReferenceScript Era)
forall a. a -> Maybe a
Just ReferenceScript Era
r)
  addressOf :: Input -> AddressAny
addressOf = TxOut CtxUTxO Era -> AddressAny
forall ctx. TxOut ctx Era -> AddressAny
addressOfTxOut (TxOut CtxUTxO Era -> AddressAny)
-> (Input -> TxOut CtxUTxO Era) -> Input -> AddressAny
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Input -> TxOut CtxUTxO Era
inputTxOut
  valueOf :: Input -> Value
valueOf = TxOut CtxUTxO Era -> Value
forall ctx. TxOut ctx Era -> Value
valueOfTxOut (TxOut CtxUTxO Era -> Value)
-> (Input -> TxOut CtxUTxO Era) -> Input -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Input -> TxOut CtxUTxO Era
inputTxOut
  refScriptOf :: Input -> ReferenceScript Era
refScriptOf = TxOut CtxUTxO Era -> ReferenceScript Era
forall ctx. TxOut ctx Era -> ReferenceScript Era
referenceScriptOfTxOut (TxOut CtxUTxO Era -> ReferenceScript Era)
-> (Input -> TxOut CtxUTxO Era) -> Input -> ReferenceScript Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Input -> TxOut CtxUTxO Era
inputTxOut

{- | Type synonym for datums. The `CtxTx` context means that the actual datum value can be present,
  not just the hash.
-}
type Datum = TxOutDatum CtxTx Era

-- | Redeemers are plain `ScriptData`.
type Redeemer = ScriptData

{- | The type of transaction modifiers. When combined using the monoid instance, individual
  modifications are applied in left-to-right order.
-}
newtype TxModifier = TxModifier [TxMod]
  deriving newtype (NonEmpty TxModifier -> TxModifier
TxModifier -> TxModifier -> TxModifier
(TxModifier -> TxModifier -> TxModifier)
-> (NonEmpty TxModifier -> TxModifier)
-> (forall b. Integral b => b -> TxModifier -> TxModifier)
-> Semigroup TxModifier
forall b. Integral b => b -> TxModifier -> TxModifier
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: TxModifier -> TxModifier -> TxModifier
<> :: TxModifier -> TxModifier -> TxModifier
$csconcat :: NonEmpty TxModifier -> TxModifier
sconcat :: NonEmpty TxModifier -> TxModifier
$cstimes :: forall b. Integral b => b -> TxModifier -> TxModifier
stimes :: forall b. Integral b => b -> TxModifier -> TxModifier
Semigroup, Semigroup TxModifier
TxModifier
Semigroup TxModifier =>
TxModifier
-> (TxModifier -> TxModifier -> TxModifier)
-> ([TxModifier] -> TxModifier)
-> Monoid TxModifier
[TxModifier] -> TxModifier
TxModifier -> TxModifier -> TxModifier
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: TxModifier
mempty :: TxModifier
$cmappend :: TxModifier -> TxModifier -> TxModifier
mappend :: TxModifier -> TxModifier -> TxModifier
$cmconcat :: [TxModifier] -> TxModifier
mconcat :: [TxModifier] -> TxModifier
Monoid)

data TxMod where
  RemoveInput
    :: TxIn
    -> TxMod
  RemoveOutput
    :: TxIx
    -> TxMod
  ChangeOutput
    :: TxIx
    -> Maybe AddressAny
    -> Maybe Value
    -> Maybe Datum
    -> Maybe (ReferenceScript Era)
    -> TxMod
  ChangeInput
    :: TxIn
    -> Maybe AddressAny
    -> Maybe Value
    -> Maybe Datum
    -> Maybe (ReferenceScript Era)
    -> TxMod
  ChangeScriptInput
    :: TxIn
    -> Maybe Value
    -> Maybe Datum
    -> Maybe Redeemer
    -> Maybe (ReferenceScript Era)
    -> TxMod
  ChangeValidityRange
    :: Maybe (TxValidityLowerBound Era)
    -> Maybe (TxValidityUpperBound Era)
    -> TxMod
  AddOutput
    :: AddressAny
    -> Value
    -> Datum
    -> ReferenceScript Era
    -> TxMod
  -- TODO: unify the `AddInput` constructors

  AddInput
    :: AddressAny
    -> Value
    -> Datum
    -> ReferenceScript Era
    -> Bool -- isReferenceInput
    -> TxMod
  AddReferenceScriptInput
    :: ScriptHash
    -> Value
    -> Datum
    -> Redeemer
    -> TxMod
  AddPlutusScriptInput
    :: (IsPlutusScriptInEra lang)
    => PlutusScript lang
    -> Value
    -> Datum
    -> Redeemer
    -> ReferenceScript Era
    -> TxMod
  AddPlutusScriptReferenceInput
    :: (IsPlutusScriptInEra lang)
    => PlutusScript lang
    -> Value
    -> Datum
    -> ReferenceScript Era
    -> TxMod
  AddSimpleScriptInput
    :: SimpleScript
    -> Value
    -- TODO: -> Datum ??
    -> ReferenceScript Era
    -> Bool -- isReferenceInput
    -> TxMod
  -- | Mint tokens using a Plutus V2 script
  AddPlutusScriptMint
    :: (IsPlutusScriptInEra lang)
    => PlutusScript lang -- The minting policy script
    -> AssetName -- Name of asset to mint
    -> Quantity -- Amount (positive = mint, negative = burn)
    -> ScriptData -- Redeemer for the minting policy
    -> TxMod
  -- | Remove a required signer from the transaction
  RemoveRequiredSigner
    :: Hash PaymentKey
    -> TxMod
  ReplaceTx :: Tx Era -> UTxO Era -> TxMod

deriving stock instance Show TxMod

txMod :: TxMod -> TxModifier
txMod :: TxMod -> TxModifier
txMod TxMod
m = [TxMod] -> TxModifier
TxModifier [TxMod
m]

applyTxModifier :: Tx Era -> UTxO Era -> TxModifier -> (Tx Era, UTxO Era)
applyTxModifier :: Tx Era -> UTxO Era -> TxModifier -> (Tx Era, UTxO Era)
applyTxModifier Tx Era
tx UTxO Era
utxos (TxModifier [TxMod]
ms) = ((Tx Era, UTxO Era) -> TxMod -> (Tx Era, UTxO Era))
-> (Tx Era, UTxO Era) -> [TxMod] -> (Tx Era, UTxO Era)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl ((Tx Era -> UTxO Era -> TxMod -> (Tx Era, UTxO Era))
-> (Tx Era, UTxO Era) -> TxMod -> (Tx Era, UTxO Era)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Tx Era -> UTxO Era -> TxMod -> (Tx Era, UTxO Era)
applyTxMod) (Tx Era
tx, UTxO Era
utxos) [TxMod]
ms

mkNewTxIn :: UTxO Era -> TxIn
mkNewTxIn :: UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos = TxId -> TxIx -> TxIn
TxIn TxId
dummyTxId (Word -> TxIx
TxIx Word
txIx)
 where
  txIx :: Word
txIx =
    [Word] -> Word
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum ([Word] -> Word) -> [Word] -> Word
forall a b. (a -> b) -> a -> b
$
      Word
0
        Word -> [Word] -> [Word]
forall a. a -> [a] -> [a]
: [ (Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1) Word
ix
          | TxIn TxId
txId' (TxIx Word
ix) <- Map TxIn (TxOut CtxUTxO Era) -> [TxIn]
forall k a. Map k a -> [k]
Map.keys (Map TxIn (TxOut CtxUTxO Era) -> [TxIn])
-> Map TxIn (TxOut CtxUTxO Era) -> [TxIn]
forall a b. (a -> b) -> a -> b
$ UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO UTxO Era
utxos
          , TxId
txId' TxId -> TxId -> Bool
forall a. Eq a => a -> a -> Bool
== TxId
dummyTxId
          ]

applyTxMod :: Tx Era -> UTxO Era -> TxMod -> (Tx Era, UTxO Era)
applyTxMod :: Tx Era -> UTxO Era -> TxMod -> (Tx Era, UTxO Era)
applyTxMod Tx Era
tx UTxO Era
utxos (ChangeValidityRange Maybe (TxValidityLowerBound Era)
mlo Maybe (TxValidityUpperBound Era)
mhi) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbVldt = validity'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
scriptValidity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  Tx bdy :: TxBody Era
bdy@(ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
scriptValidity) [KeyWitness Era]
wits = Tx Era
tx
  TxBodyContent{txValidityLowerBound :: forall build era.
TxBodyContent build era -> TxValidityLowerBound era
txValidityLowerBound = TxValidityLowerBound Era
lo, txValidityUpperBound :: forall build era.
TxBodyContent build era -> TxValidityUpperBound era
txValidityUpperBound = TxValidityUpperBound Era
hi} = TxBody Era -> TxBodyContent ViewTx Era
forall era. TxBody era -> TxBodyContent ViewTx era
getTxBodyContent TxBody Era
bdy
  validity' :: ValidityInterval
validity' = (TxValidityLowerBound Era, TxValidityUpperBound Era)
-> ValidityInterval
forall era.
(TxValidityLowerBound era, TxValidityUpperBound era)
-> ValidityInterval
convValidityInterval (TxValidityLowerBound Era
-> Maybe (TxValidityLowerBound Era) -> TxValidityLowerBound Era
forall a. a -> Maybe a -> a
fromMaybe TxValidityLowerBound Era
lo Maybe (TxValidityLowerBound Era)
mlo, TxValidityUpperBound Era
-> Maybe (TxValidityUpperBound Era) -> TxValidityUpperBound Era
forall a. a -> Maybe a -> a
fromMaybe TxValidityUpperBound Era
hi Maybe (TxValidityUpperBound Era)
mhi)
applyTxMod Tx Era
tx UTxO Era
utxos (RemoveInput TxIn
i) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
TxBody ConwayEra
body' [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  inputs' :: Set TxIn
inputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.delete (TxIn -> TxIn
toShelleyTxIn TxIn
i) Set TxIn
ctbSpendInputs
  refInputs' :: Set TxIn
refInputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.delete (TxIn -> TxIn
toShelleyTxIn TxIn
i) Set TxIn
ctbReferenceInputs
  body' :: TxBody ConwayEra
body' =
    TxBody (ShelleyLedgerEra Era)
body
      { Conway.ctbSpendInputs = inputs'
      , Conway.ctbReferenceInputs = refInputs'
      }
  scriptData' :: TxBodyScriptData Era
scriptData' = case AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem (TxIn -> TxIn
toShelleyTxIn TxIn
i)) Set TxIn
ctbSpendInputs of
    StrictMaybe (AsIx Word32 TxIn)
SNothing -> TxBodyScriptData Era
scriptData
    SJust (Ledger.AsIx Word32
idx) -> Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptData (Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
idx) Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData
     where
      idxUpdate :: Word32 -> Word32
idxUpdate Word32
idx'
        | Word32
idx' Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
> Word32
idx = Word32
idx' Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1
        | Bool
otherwise = Word32
idx'
applyTxMod Tx Era
tx UTxO Era
utxos (RemoveOutput (TxIx Word
i)) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbOutputs = outputs'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  outputs' :: StrictSeq (Sized (BabbageTxOut ConwayEra))
outputs' = case Int
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
-> (StrictSeq (Sized (BabbageTxOut ConwayEra)),
    StrictSeq (Sized (BabbageTxOut ConwayEra)))
forall a. Int -> StrictSeq a -> (StrictSeq a, StrictSeq a)
Seq.splitAt (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
i) StrictSeq (Sized (TxOut ConwayEra))
StrictSeq (Sized (BabbageTxOut ConwayEra))
ctbOutputs of
    (StrictSeq (Sized (BabbageTxOut ConwayEra))
before, Sized (BabbageTxOut ConwayEra)
_ Seq.:<| StrictSeq (Sized (BabbageTxOut ConwayEra))
after) -> StrictSeq (Sized (BabbageTxOut ConwayEra))
before StrictSeq (Sized (BabbageTxOut ConwayEra))
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a. Semigroup a => a -> a -> a
<> StrictSeq (Sized (BabbageTxOut ConwayEra))
after
    (StrictSeq (Sized (BabbageTxOut ConwayEra))
_, StrictSeq (Sized (BabbageTxOut ConwayEra))
Seq.Empty) ->
      [Char] -> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a. HasCallStack => [Char] -> a
error ([Char] -> StrictSeq (Sized (BabbageTxOut ConwayEra)))
-> [Char] -> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a b. (a -> b) -> a -> b
$
        [Char]
"RemoveOutput: Can't remove index "
          [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Word -> [Char]
forall a. Show a => a -> [Char]
show Word
i
          [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" from "
          [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (StrictSeq (Sized (BabbageTxOut ConwayEra)) -> Int
forall a. StrictSeq a -> Int
Seq.length StrictSeq (Sized (TxOut ConwayEra))
StrictSeq (Sized (BabbageTxOut ConwayEra))
ctbOutputs)
          [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" outputs"
applyTxMod Tx Era
tx UTxO Era
utxos (AddOutput AddressAny
addr Value
value Datum
datum ReferenceScript Era
refscript) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbOutputs = outputs'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  outputs' :: StrictSeq (Sized (BabbageTxOut ConwayEra))
outputs' = StrictSeq (Sized (TxOut ConwayEra))
StrictSeq (Sized (BabbageTxOut ConwayEra))
ctbOutputs StrictSeq (Sized (BabbageTxOut ConwayEra))
-> Sized (BabbageTxOut ConwayEra)
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a. StrictSeq a -> a -> StrictSeq a
Seq.:|> Version -> BabbageTxOut ConwayEra -> Sized (BabbageTxOut ConwayEra)
forall a. EncCBOR a => Version -> a -> Sized a
CBOR.mkSized (forall era. Era era => Version
Ledger.eraProtVerLow @LedgerEra) TxOut ConwayEra
BabbageTxOut ConwayEra
out
  out :: TxOut ConwayEra
out =
    ShelleyBasedEra Era -> TxOut CtxUTxO Era -> TxOut ConwayEra
forall era ledgerera.
(HasCallStack, ShelleyLedgerEra era ~ ledgerera) =>
ShelleyBasedEra era -> TxOut CtxUTxO era -> TxOut ledgerera
toShelleyTxOut
      ShelleyBasedEra Era
forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra
      (AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
refscript)
  -- Note: Inline datums are embedded in the output itself, NOT in the witness set.
  -- Only supplemental datums (for TxOutDatumHash outputs) go in the witness set.
  scriptData' :: TxBodyScriptData Era
scriptData' = case Datum
datum of
    Datum
TxOutDatumNone -> TxBodyScriptData Era
scriptData
    TxOutDatumHash{} -> TxBodyScriptData Era
scriptData
    TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d -> Data (ShelleyLedgerEra Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
addDatum (HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d) TxBodyScriptData Era
scriptData
    TxOutDatumInline{} -> TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (AddInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript Bool
False) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbSpendInputs = inputs'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData'' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos

  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  inputs' :: Set TxIn
inputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbSpendInputs
  SJust (Ledger.AsIx Word32
idx) = AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem TxIn
input) Set TxIn
inputs'

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  idxUpdate :: Word32 -> Word32
idxUpdate Word32
idx'
    | Word32
idx' Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word32
idx = Word32
idx' Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1
    | Bool
otherwise = Word32
idx'

  -- Note: Inline datums are embedded in the output itself, NOT in the witness set.
  scriptData'' :: TxBodyScriptData Era
scriptData'' = case Datum
datum of
    Datum
TxOutDatumNone -> TxBodyScriptData Era
scriptData'
    TxOutDatumHash{} -> TxBodyScriptData Era
scriptData'
    TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d -> Data (ShelleyLedgerEra Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
addDatum (HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d) TxBodyScriptData Era
scriptData'
    TxOutDatumInline{} -> TxBodyScriptData Era
scriptData'

  scriptData' :: TxBodyScriptData Era
scriptData' = Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptData Maybe Word32
forall a. Maybe a
Nothing Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (AddInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript Bool
True) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbReferenceInputs = refInputs} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos

  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  refInputs :: Set TxIn
refInputs = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbReferenceInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos
applyTxMod Tx Era
tx UTxO Era
utxos (AddPlutusScriptReferenceInput PlutusScript lang
script Value
value Datum
datum ReferenceScript Era
rscript) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbReferenceInputs = refInputs'} [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts' TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos
  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  refInputs' :: Set TxIn
refInputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbReferenceInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  scriptInEra :: ScriptInEra Era
scriptInEra =
    ScriptLanguageInEra lang Era -> Script lang -> ScriptInEra Era
forall lang era.
ScriptLanguageInEra lang era -> Script lang -> ScriptInEra era
ScriptInEra
      ScriptLanguageInEra lang Era
forall lang era.
HasScriptLanguageInEra lang era =>
ScriptLanguageInEra lang era
scriptLanguageInEra
      (PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script)
  newScript :: Script (ShelleyLedgerEra Era)
newScript = forall era. ScriptInEra era -> Script (ShelleyLedgerEra era)
toShelleyScript @Era ScriptInEra Era
scriptInEra
  scripts' :: [AlonzoScript ConwayEra]
scripts' = [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts [AlonzoScript ConwayEra]
-> [AlonzoScript ConwayEra] -> [AlonzoScript ConwayEra]
forall a. [a] -> [a] -> [a]
++ [Script (ShelleyLedgerEra Era)
AlonzoScript ConwayEra
newScript]

  hash :: ScriptHash
hash = Script lang -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (Script lang -> ScriptHash) -> Script lang -> ScriptHash
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script
  addr :: AddressAny
addr = ScriptHash -> AddressAny
scriptAddressAny ScriptHash
hash
applyTxMod Tx Era
tx UTxO Era
utxos (AddReferenceScriptInput ScriptHash
script Value
value Datum
datum Redeemer
redeemer) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbSpendInputs = inputs'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos
  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  inputs' :: Set TxIn
inputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbSpendInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
forall era. ReferenceScript era
ReferenceScriptNone
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  SJust (Ledger.AsIx Word32
idx) = AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem TxIn
input) Set TxIn
inputs'
  idxUpdate :: Word32 -> Word32
idxUpdate Word32
idx'
    | Word32
idx' Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word32
idx = Word32
idx' Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1
    | Bool
otherwise = Word32
idx'

  datum' :: Data ConwayEra
datum' = case Datum
datum of
    Datum
TxOutDatumNone -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    TxOutDatumHash{} -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d
    TxOutDatumInline BabbageEraOnwards Era
_ HashableScriptData
d -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d

  scriptData' :: TxBodyScriptData Era
scriptData' =
    Word32
-> Data (ShelleyLedgerEra Era)
-> (Data (ShelleyLedgerEra Era), ExUnits)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
addScriptData Word32
idx Data (ShelleyLedgerEra Era)
Data ConwayEra
datum' (HashableScriptData -> Data (ShelleyLedgerEra Era)
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData (HashableScriptData -> Data (ShelleyLedgerEra Era))
-> HashableScriptData -> Data (ShelleyLedgerEra Era)
forall a b. (a -> b) -> a -> b
$ Redeemer -> HashableScriptData
unsafeHashableScriptData Redeemer
redeemer, ExecutionUnits -> ExUnits
toAlonzoExUnits (ExecutionUnits -> ExUnits) -> ExecutionUnits -> ExUnits
forall a b. (a -> b) -> a -> b
$ Natural -> Natural -> ExecutionUnits
ExecutionUnits Natural
0 Natural
0) (TxBodyScriptData Era -> TxBodyScriptData Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
forall a b. (a -> b) -> a -> b
$
      Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptData Maybe Word32
forall a. Maybe a
Nothing Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData

  addr :: AddressAny
addr = ScriptHash -> AddressAny
scriptAddressAny ScriptHash
script
applyTxMod Tx Era
tx UTxO Era
utxos (AddPlutusScriptInput PlutusScript lang
script Value
value Datum
datum Redeemer
redeemer ReferenceScript Era
rscript) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbSpendInputs = inputs'} [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts' TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos
  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  inputs' :: Set TxIn
inputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbSpendInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  scriptInEra :: ScriptInEra Era
scriptInEra =
    ScriptLanguageInEra lang Era -> Script lang -> ScriptInEra Era
forall lang era.
ScriptLanguageInEra lang era -> Script lang -> ScriptInEra era
ScriptInEra
      ScriptLanguageInEra lang Era
forall lang era.
HasScriptLanguageInEra lang era =>
ScriptLanguageInEra lang era
scriptLanguageInEra
      (PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script)
  newScript :: Script (ShelleyLedgerEra Era)
newScript = forall era. ScriptInEra era -> Script (ShelleyLedgerEra era)
toShelleyScript @Era ScriptInEra Era
scriptInEra
  scripts' :: [AlonzoScript ConwayEra]
scripts' = [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts [AlonzoScript ConwayEra]
-> [AlonzoScript ConwayEra] -> [AlonzoScript ConwayEra]
forall a. [a] -> [a] -> [a]
++ [Script (ShelleyLedgerEra Era)
AlonzoScript ConwayEra
newScript]

  SJust (Ledger.AsIx Word32
idx) = AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem TxIn
input) Set TxIn
inputs'
  idxUpdate :: Word32 -> Word32
idxUpdate Word32
idx'
    | Word32
idx' Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word32
idx = Word32
idx' Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1
    | Bool
otherwise = Word32
idx'

  datum' :: Data ConwayEra
datum' = case Datum
datum of
    Datum
TxOutDatumNone -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    TxOutDatumHash{} -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d
    TxOutDatumInline BabbageEraOnwards Era
_ HashableScriptData
d -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d

  scriptData' :: TxBodyScriptData Era
scriptData' =
    Word32
-> Data (ShelleyLedgerEra Era)
-> (Data (ShelleyLedgerEra Era), ExUnits)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
addScriptData Word32
idx Data (ShelleyLedgerEra Era)
Data ConwayEra
datum' (HashableScriptData -> Data (ShelleyLedgerEra Era)
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData (HashableScriptData -> Data (ShelleyLedgerEra Era))
-> HashableScriptData -> Data (ShelleyLedgerEra Era)
forall a b. (a -> b) -> a -> b
$ Redeemer -> HashableScriptData
unsafeHashableScriptData Redeemer
redeemer, ExecutionUnits -> ExUnits
toAlonzoExUnits (ExecutionUnits -> ExUnits) -> ExecutionUnits -> ExUnits
forall a b. (a -> b) -> a -> b
$ Natural -> Natural -> ExecutionUnits
ExecutionUnits Natural
0 Natural
0) (TxBodyScriptData Era -> TxBodyScriptData Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
forall a b. (a -> b) -> a -> b
$
      Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptData Maybe Word32
forall a. Maybe a
Nothing Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData

  hash :: ScriptHash
hash = Script lang -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (Script lang -> ScriptHash) -> Script lang -> ScriptHash
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script
  addr :: AddressAny
addr = ScriptHash -> AddressAny
scriptAddressAny ScriptHash
hash
applyTxMod Tx Era
tx UTxO Era
utxos (AddSimpleScriptInput SimpleScript
script Value
value ReferenceScript Era
rscript Bool
False) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbSpendInputs = inputs'} [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts' TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos

  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  inputs' :: Set TxIn
inputs' = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbSpendInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
forall ctx era. TxOutDatum ctx era
TxOutDatumNone ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  scriptInEra :: ScriptInEra Era
scriptInEra =
    ScriptLanguageInEra SimpleScript' Era
-> Script SimpleScript' -> ScriptInEra Era
forall lang era.
ScriptLanguageInEra lang era -> Script lang -> ScriptInEra era
ScriptInEra
      ScriptLanguageInEra SimpleScript' Era
SimpleScriptInConway
      (SimpleScript -> Script SimpleScript'
SimpleScript SimpleScript
script)
  newScript :: Script (ShelleyLedgerEra Era)
newScript = forall era. ScriptInEra era -> Script (ShelleyLedgerEra era)
toShelleyScript @Era ScriptInEra Era
scriptInEra
  scripts' :: [AlonzoScript ConwayEra]
scripts' = [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts [AlonzoScript ConwayEra]
-> [AlonzoScript ConwayEra] -> [AlonzoScript ConwayEra]
forall a. [a] -> [a] -> [a]
++ [Script (ShelleyLedgerEra Era)
AlonzoScript ConwayEra
newScript]

  SJust (Ledger.AsIx Word32
idx) = AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem TxIn
input) Set TxIn
inputs'
  idxUpdate :: Word32 -> Word32
idxUpdate Word32
idx'
    | Word32
idx' Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word32
idx = Word32
idx' Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1
    | Bool
otherwise = Word32
idx'

  scriptData' :: TxBodyScriptData Era
scriptData' = Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptData Maybe Word32
forall a. Maybe a
Nothing Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData

  addr :: AddressAny
addr = ScriptHash -> AddressAny
scriptAddressAny (ScriptHash -> AddressAny) -> ScriptHash -> AddressAny
forall a b. (a -> b) -> a -> b
$ Script SimpleScript' -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (SimpleScript -> Script SimpleScript'
SimpleScript SimpleScript
script)

-- NOTE: this is okay (??) because there is no requirement to provide the
-- data for reference inputs
applyTxMod Tx Era
tx UTxO Era
utxos (AddSimpleScriptInput SimpleScript
script Value
value ReferenceScript Era
rscript Bool
True) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbReferenceInputs = refInputs} [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts' TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos'
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  txIn :: TxIn
txIn = UTxO Era -> TxIn
mkNewTxIn UTxO Era
utxos
  input :: TxIn
input = TxIn -> TxIn
toShelleyTxIn TxIn
txIn
  refInputs :: Set TxIn
refInputs = TxIn -> Set TxIn -> Set TxIn
forall a. Ord a => a -> Set a -> Set a
Set.insert TxIn
input Set TxIn
ctbReferenceInputs

  txOut :: TxOut CtxUTxO Era
txOut = AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut AddressAny
addr Value
value Datum
forall ctx era. TxOutDatum ctx era
TxOutDatumNone ReferenceScript Era
rscript
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  scriptInEra :: ScriptInEra Era
scriptInEra =
    ScriptLanguageInEra SimpleScript' Era
-> Script SimpleScript' -> ScriptInEra Era
forall lang era.
ScriptLanguageInEra lang era -> Script lang -> ScriptInEra era
ScriptInEra
      ScriptLanguageInEra SimpleScript' Era
SimpleScriptInConway
      (SimpleScript -> Script SimpleScript'
SimpleScript SimpleScript
script)
  newScript :: Script (ShelleyLedgerEra Era)
newScript = forall era. ScriptInEra era -> Script (ShelleyLedgerEra era)
toShelleyScript @Era ScriptInEra Era
scriptInEra
  scripts' :: [AlonzoScript ConwayEra]
scripts' = [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts [AlonzoScript ConwayEra]
-> [AlonzoScript ConwayEra] -> [AlonzoScript ConwayEra]
forall a. [a] -> [a] -> [a]
++ [Script (ShelleyLedgerEra Era)
AlonzoScript ConwayEra
newScript]

  addr :: AddressAny
addr = ScriptHash -> AddressAny
scriptAddressAny (ScriptHash -> AddressAny) -> ScriptHash -> AddressAny
forall a b. (a -> b) -> a -> b
$ Script SimpleScript' -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (SimpleScript -> Script SimpleScript'
SimpleScript SimpleScript
script)
applyTxMod Tx Era
tx UTxO Era
utxos (ChangeOutput TxIx
ix Maybe AddressAny
maddr Maybe Value
mvalue Maybe Datum
mdatum Maybe (ReferenceScript Era)
mrscript) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbOutputs = outputs'} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  TxIx (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Int
idx) = TxIx
ix
  Tx bdy :: TxBody Era
bdy@(ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  TxBodyContent{txOuts :: forall build era. TxBodyContent build era -> [TxOut CtxTx era]
txOuts = [TxOut CtxTx Era]
txOuts} = TxBody Era -> TxBodyContent ViewTx Era
forall era. TxBody era -> TxBodyContent ViewTx era
getTxBodyContent TxBody Era
bdy
  TxOut (AddressInEra AddressTypeInEra addrtype Era
_ (Address addrtype -> AddressAny
forall addr. Address addr -> AddressAny
toAddressAny -> AddressAny
addr)) (TxOutValue Era -> Value
forall era. TxOutValue era -> Value
txOutValueToValue -> Value
value) Datum
datum ReferenceScript Era
rscript = [TxOut CtxTx Era]
txOuts [TxOut CtxTx Era] -> Int -> TxOut CtxTx Era
forall a. HasCallStack => [a] -> Int -> a
!! Int
idx
  (StrictSeq (Sized (BabbageTxOut ConwayEra))
outputsStart, Sized (BabbageTxOut ConwayEra)
_ Seq.:<| StrictSeq (Sized (BabbageTxOut ConwayEra))
outputsEnd) = Int
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
-> (StrictSeq (Sized (BabbageTxOut ConwayEra)),
    StrictSeq (Sized (BabbageTxOut ConwayEra)))
forall a. Int -> StrictSeq a -> (StrictSeq a, StrictSeq a)
Seq.splitAt Int
idx StrictSeq (Sized (TxOut ConwayEra))
StrictSeq (Sized (BabbageTxOut ConwayEra))
ctbOutputs
  outputs' :: StrictSeq (Sized (BabbageTxOut ConwayEra))
outputs' = StrictSeq (Sized (BabbageTxOut ConwayEra))
outputsStart StrictSeq (Sized (BabbageTxOut ConwayEra))
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a. StrictSeq a -> StrictSeq a -> StrictSeq a
Seq.>< (Version -> BabbageTxOut ConwayEra -> Sized (BabbageTxOut ConwayEra)
forall a. EncCBOR a => Version -> a -> Sized a
CBOR.mkSized (forall era. Era era => Version
Ledger.eraProtVerLow @LedgerEra) TxOut ConwayEra
BabbageTxOut ConwayEra
out Sized (BabbageTxOut ConwayEra)
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
-> StrictSeq (Sized (BabbageTxOut ConwayEra))
forall a. a -> StrictSeq a -> StrictSeq a
Seq.:<| StrictSeq (Sized (BabbageTxOut ConwayEra))
outputsEnd)
  out :: TxOut ConwayEra
out =
    ShelleyBasedEra Era -> TxOut CtxUTxO Era -> TxOut ConwayEra
forall era ledgerera.
(HasCallStack, ShelleyLedgerEra era ~ ledgerera) =>
ShelleyBasedEra era -> TxOut CtxUTxO era -> TxOut ledgerera
toShelleyTxOut ShelleyBasedEra Era
forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra (TxOut CtxUTxO Era -> TxOut ConwayEra)
-> TxOut CtxUTxO Era -> TxOut ConwayEra
forall a b. (a -> b) -> a -> b
$
      AddressAny
-> Value -> Datum -> ReferenceScript Era -> TxOut CtxUTxO Era
makeTxOut
        (AddressAny -> Maybe AddressAny -> AddressAny
forall a. a -> Maybe a -> a
fromMaybe AddressAny
addr Maybe AddressAny
maddr)
        (Value -> Maybe Value -> Value
forall a. a -> Maybe a -> a
fromMaybe Value
value Maybe Value
mvalue)
        (Datum -> Maybe Datum -> Datum
forall a. a -> Maybe a -> a
fromMaybe Datum
datum Maybe Datum
mdatum)
        (ReferenceScript Era
-> Maybe (ReferenceScript Era) -> ReferenceScript Era
forall a. a -> Maybe a -> a
fromMaybe ReferenceScript Era
rscript Maybe (ReferenceScript Era)
mrscript)

  -- Note: Inline datums are embedded in the output itself, NOT in the witness set.
  scriptData' :: TxBodyScriptData Era
scriptData' = case Maybe Datum
mdatum of
    Maybe Datum
Nothing -> TxBodyScriptData Era
scriptData
    Just Datum
d -> case Datum
d of
      Datum
TxOutDatumNone -> TxBodyScriptData Era
scriptData
      TxOutDatumHash{} -> TxBodyScriptData Era
scriptData
      TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d' -> Data (ShelleyLedgerEra Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
addDatum (HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d') TxBodyScriptData Era
scriptData
      TxOutDatumInline{} -> TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (ChangeInput TxIn
txIn Maybe AddressAny
maddr Maybe Value
mvalue Maybe Datum
mdatum Maybe (ReferenceScript Era)
mrscript) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos')
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  (AddressAny
addr, Value
value, TxOutDatum CtxUTxO Era
utxoDatum, ReferenceScript Era
rscript) = case TxIn -> Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup TxIn
txIn (Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era))
-> Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era)
forall a b. (a -> b) -> a -> b
$ UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO UTxO Era
utxos of
    Just (TxOut (AddressInEra AddressTypeInEra addrtype Era
_ (Address addrtype -> AddressAny
forall addr. Address addr -> AddressAny
toAddressAny -> AddressAny
addr')) (TxOutValue Era -> Value
forall era. TxOutValue era -> Value
txOutValueToValue -> Value
value') TxOutDatum CtxUTxO Era
datum ReferenceScript Era
rscript') ->
      (AddressAny
addr', Value
value', TxOutDatum CtxUTxO Era
datum, ReferenceScript Era
rscript')
    Maybe (TxOut CtxUTxO Era)
Nothing -> [Char]
-> (AddressAny, Value, TxOutDatum CtxUTxO Era, ReferenceScript Era)
forall a. HasCallStack => [Char] -> a
error ([Char]
 -> (AddressAny, Value, TxOutDatum CtxUTxO Era,
     ReferenceScript Era))
-> [Char]
-> (AddressAny, Value, TxOutDatum CtxUTxO Era, ReferenceScript Era)
forall a b. (a -> b) -> a -> b
$ [Char]
"Index " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ TxIn -> [Char]
forall a. Show a => a -> [Char]
show TxIn
txIn [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" doesn't exist."

  txOut :: TxOut CtxUTxO Era
txOut =
    AddressInEra Era
-> TxOutValue Era
-> TxOutDatum CtxUTxO Era
-> ReferenceScript Era
-> TxOut CtxUTxO Era
forall ctx era.
AddressInEra era
-> TxOutValue era
-> TxOutDatum ctx era
-> ReferenceScript era
-> TxOut ctx era
TxOut
      (ShelleyBasedEra Era -> AddressAny -> AddressInEra Era
forall era. ShelleyBasedEra era -> AddressAny -> AddressInEra era
anyAddressInShelleyBasedEra ShelleyBasedEra Era
forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra (AddressAny -> Maybe AddressAny -> AddressAny
forall a. a -> Maybe a -> a
fromMaybe AddressAny
addr Maybe AddressAny
maddr))
      (ShelleyBasedEra Era
-> Value (ShelleyLedgerEra Era) -> TxOutValue Era
forall era.
(Eq (Value (ShelleyLedgerEra era)),
 Show (Value (ShelleyLedgerEra era))) =>
ShelleyBasedEra era
-> Value (ShelleyLedgerEra era) -> TxOutValue era
TxOutValueShelleyBased ShelleyBasedEra Era
forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra (Value (ShelleyLedgerEra Era) -> TxOutValue Era)
-> Value (ShelleyLedgerEra Era) -> TxOutValue Era
forall a b. (a -> b) -> a -> b
$ Value -> MaryValue
toMaryValue (Value -> MaryValue) -> Value -> MaryValue
forall a b. (a -> b) -> a -> b
$ Value -> Maybe Value -> Value
forall a. a -> Maybe a -> a
fromMaybe Value
value Maybe Value
mvalue)
      (TxOutDatum CtxUTxO Era
-> (Datum -> TxOutDatum CtxUTxO Era)
-> Maybe Datum
-> TxOutDatum CtxUTxO Era
forall b a. b -> (a -> b) -> Maybe a -> b
maybe TxOutDatum CtxUTxO Era
utxoDatum Datum -> TxOutDatum CtxUTxO Era
toCtxUTxODatum Maybe Datum
mdatum)
      (ReferenceScript Era
-> Maybe (ReferenceScript Era) -> ReferenceScript Era
forall a. a -> Maybe a -> a
fromMaybe ReferenceScript Era
rscript Maybe (ReferenceScript Era)
mrscript)
  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  -- Note: Inline datums are embedded in the output itself, NOT in the witness set.
  scriptData' :: TxBodyScriptData Era
scriptData' = case Maybe Datum
mdatum of
    Maybe Datum
Nothing -> TxBodyScriptData Era
scriptData
    Just Datum
TxOutDatumNone -> TxBodyScriptData Era
scriptData
    Just TxOutDatumHash{} -> TxBodyScriptData Era
scriptData
    Just (TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d) -> Data (ShelleyLedgerEra Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
addDatum (HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d) TxBodyScriptData Era
scriptData
    Just TxOutDatumInline{} -> TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (ChangeScriptInput TxIn
txIn Maybe Value
mvalue Maybe Datum
mdatum Maybe Redeemer
mredeemer Maybe (ReferenceScript Era)
mrscript) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos')
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  (AddressInEra Era
addr, Value
value, TxOutDatum CtxUTxO Era
utxoDatum, ReferenceScript Era
rscript) = case TxIn -> Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup TxIn
txIn (Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era))
-> Map TxIn (TxOut CtxUTxO Era) -> Maybe (TxOut CtxUTxO Era)
forall a b. (a -> b) -> a -> b
$ UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO UTxO Era
utxos of
    Just (TxOut AddressInEra Era
addr' (TxOutValue Era -> Value
forall era. TxOutValue era -> Value
txOutValueToValue -> Value
value') TxOutDatum CtxUTxO Era
utxoDatum' ReferenceScript Era
rscript') ->
      (AddressInEra Era
addr', Value
value', TxOutDatum CtxUTxO Era
utxoDatum', ReferenceScript Era
rscript')
    Maybe (TxOut CtxUTxO Era)
Nothing -> [Char]
-> (AddressInEra Era, Value, TxOutDatum CtxUTxO Era,
    ReferenceScript Era)
forall a. HasCallStack => [Char] -> a
error ([Char]
 -> (AddressInEra Era, Value, TxOutDatum CtxUTxO Era,
     ReferenceScript Era))
-> [Char]
-> (AddressInEra Era, Value, TxOutDatum CtxUTxO Era,
    ReferenceScript Era)
forall a b. (a -> b) -> a -> b
$ [Char]
"The index " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ TxIn -> [Char]
forall a. Show a => a -> [Char]
show TxIn
txIn [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" doesn't exist."

  -- Try TxDats first (maintains consistency for redeemer substitution attacks), fall back to inline datum
  (Data ConwayEra
datum, (Data ConwayEra
redeemer, ExUnits
exunits)) = case TxBodyScriptData Era
scriptData of
    TxBodyScriptData Era
TxBodyNoScriptData -> [Char] -> (Data ConwayEra, (Data ConwayEra, ExUnits))
forall a. HasCallStack => [Char] -> a
error [Char]
"No script data available"
    TxBodyScriptData AlonzoEraOnwards Era
_ (Ledger.TxDats Map DataHash (Data ConwayEra)
dats) (Ledger.Redeemers Map (PlutusPurpose AsIx ConwayEra) (Data ConwayEra, ExUnits)
rdmrs) ->
      ( case DataHash -> Map DataHash (Data ConwayEra) -> Maybe (Data ConwayEra)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup DataHash
utxoDatumHash Map DataHash (Data ConwayEra)
dats of
          Just Data ConwayEra
d -> Data ConwayEra
d -- Datum found in TxDats map (original behavior)
          Maybe (Data ConwayEra)
Nothing -> case TxOutDatum CtxUTxO Era
utxoDatum of
            TxOutDatumInline BabbageEraOnwards Era
_ HashableScriptData
d -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d -- Fallback: use inline datum from UTxO
            TxOutDatum CtxUTxO Era
_ -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error ([Char] -> Data ConwayEra) -> [Char] -> Data ConwayEra
forall a b. (a -> b) -> a -> b
$ [Char]
"Datum hash " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ DataHash -> [Char]
forall a. Show a => a -> [Char]
show DataHash
utxoDatumHash [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" not found in transaction datum map"
      , (Data ConwayEra, ExUnits)
-> Maybe (Data ConwayEra, ExUnits) -> (Data ConwayEra, ExUnits)
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> (Data ConwayEra, ExUnits)
forall a. HasCallStack => [Char] -> a
error ([Char] -> (Data ConwayEra, ExUnits))
-> [Char] -> (Data ConwayEra, ExUnits)
forall a b. (a -> b) -> a -> b
$ [Char]
"Redeemer for spending input at index " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Word32 -> [Char]
forall a. Show a => a -> [Char]
show Word32
idx [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" not found in transaction redeemers") (Maybe (Data ConwayEra, ExUnits) -> (Data ConwayEra, ExUnits))
-> Maybe (Data ConwayEra, ExUnits) -> (Data ConwayEra, ExUnits)
forall a b. (a -> b) -> a -> b
$ ConwayPlutusPurpose AsIx ConwayEra
-> Map
     (ConwayPlutusPurpose AsIx ConwayEra) (Data ConwayEra, ExUnits)
-> Maybe (Data ConwayEra, ExUnits)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (AsIx Word32 TxIn -> ConwayPlutusPurpose AsIx ConwayEra
forall (f :: * -> * -> *) era.
f Word32 TxIn -> ConwayPlutusPurpose f era
Conway.ConwaySpending (Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
Ledger.AsIx Word32
idx)) Map (PlutusPurpose AsIx ConwayEra) (Data ConwayEra, ExUnits)
Map (ConwayPlutusPurpose AsIx ConwayEra) (Data ConwayEra, ExUnits)
rdmrs
      )

  utxoDatumHash :: DataHash
utxoDatumHash = case TxOutDatum CtxUTxO Era
utxoDatum of
    TxOutDatum CtxUTxO Era
TxOutDatumNone -> [Char] -> DataHash
forall a. HasCallStack => [Char] -> a
error [Char]
"No existing datum"
    TxOutDatumInline BabbageEraOnwards Era
_ HashableScriptData
d -> Hash Redeemer -> DataHash
forall a b. Coercible a b => a -> b
coerce (Hash Redeemer -> DataHash) -> Hash Redeemer -> DataHash
forall a b. (a -> b) -> a -> b
$ HashableScriptData -> Hash Redeemer
hashScriptDataBytes HashableScriptData
d
    TxOutDatumHash AlonzoEraOnwards Era
_ Hash Redeemer
h -> Hash Redeemer -> DataHash
forall a b. Coercible a b => a -> b
coerce Hash Redeemer
h

  adatum :: Data ConwayEra
adatum = case Maybe Datum
mdatum of
    Just Datum
TxOutDatumNone -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    Just TxOutDatumHash{} -> [Char] -> Data ConwayEra
forall a. HasCallStack => [Char] -> a
error [Char]
"Bad test!"
    -- Just (TxOutDatumInTx _ d) -> toAlonzoData d
    Just (TxOutSupplementalDatum AlonzoEraOnwards Era
_ HashableScriptData
d) -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d
    Just (TxOutDatumInline BabbageEraOnwards Era
_ HashableScriptData
d) -> HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData HashableScriptData
d
    Maybe Datum
Nothing -> Data ConwayEra
datum

  txOut :: TxOut CtxUTxO Era
txOut =
    AddressInEra Era
-> TxOutValue Era
-> TxOutDatum CtxUTxO Era
-> ReferenceScript Era
-> TxOut CtxUTxO Era
forall ctx era.
AddressInEra era
-> TxOutValue era
-> TxOutDatum ctx era
-> ReferenceScript era
-> TxOut ctx era
TxOut
      AddressInEra Era
addr
      (ShelleyBasedEra Era
-> Value (ShelleyLedgerEra Era) -> TxOutValue Era
forall era.
(Eq (Value (ShelleyLedgerEra era)),
 Show (Value (ShelleyLedgerEra era))) =>
ShelleyBasedEra era
-> Value (ShelleyLedgerEra era) -> TxOutValue era
TxOutValueShelleyBased ShelleyBasedEra Era
forall era. IsShelleyBasedEra era => ShelleyBasedEra era
shelleyBasedEra (Value (ShelleyLedgerEra Era) -> TxOutValue Era)
-> Value (ShelleyLedgerEra Era) -> TxOutValue Era
forall a b. (a -> b) -> a -> b
$ Value -> MaryValue
toMaryValue (Value -> MaryValue) -> Value -> MaryValue
forall a b. (a -> b) -> a -> b
$ Value -> Maybe Value -> Value
forall a. a -> Maybe a -> a
fromMaybe Value
value Maybe Value
mvalue)
      (TxOutDatum CtxUTxO Era
-> (Datum -> TxOutDatum CtxUTxO Era)
-> Maybe Datum
-> TxOutDatum CtxUTxO Era
forall b a. b -> (a -> b) -> Maybe a -> b
maybe TxOutDatum CtxUTxO Era
utxoDatum Datum -> TxOutDatum CtxUTxO Era
toCtxUTxODatum Maybe Datum
mdatum)
      (ReferenceScript Era
-> Maybe (ReferenceScript Era) -> ReferenceScript Era
forall a. a -> Maybe a -> a
fromMaybe ReferenceScript Era
rscript Maybe (ReferenceScript Era)
mrscript)

  utxos' :: UTxO Era
utxos' = Map TxIn (TxOut CtxUTxO Era) -> UTxO Era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO Era) -> UTxO Era)
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> UTxO Era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxIn
-> TxOut CtxUTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
-> Map TxIn (TxOut CtxUTxO Era)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TxIn
txIn TxOut CtxUTxO Era
txOut (Map TxIn (TxOut CtxUTxO Era) -> Map TxIn (TxOut CtxUTxO Era))
-> (UTxO Era -> Map TxIn (TxOut CtxUTxO Era))
-> UTxO Era
-> Map TxIn (TxOut CtxUTxO Era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO Era -> Map TxIn (TxOut CtxUTxO Era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO (UTxO Era -> UTxO Era) -> UTxO Era -> UTxO Era
forall a b. (a -> b) -> a -> b
$ UTxO Era
utxos

  idx :: Word32
idx = case AsItem Word32 TxIn -> Set TxIn -> StrictMaybe (AsIx Word32 TxIn)
forall elem container.
Indexable elem container =>
AsItem Word32 elem -> container -> StrictMaybe (AsIx Word32 elem)
Ledger.indexOf (TxIn -> AsItem Word32 TxIn
forall ix it. it -> AsItem ix it
Ledger.AsItem (TxIn -> TxIn
toShelleyTxIn TxIn
txIn)) Set TxIn
ctbSpendInputs of
    SJust (Ledger.AsIx Word32
idx') -> Word32
idx'
    StrictMaybe (AsIx Word32 TxIn)
_ -> [Char] -> Word32
forall a. HasCallStack => [Char] -> a
error [Char]
"The impossible happened!"

  scriptData' :: TxBodyScriptData Era
scriptData' =
    let newRdmr :: (Data ConwayEra, ExUnits)
newRdmr = (Data ConwayEra
-> (Redeemer -> Data ConwayEra) -> Maybe Redeemer -> Data ConwayEra
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Data ConwayEra
redeemer (HashableScriptData -> Data ConwayEra
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData (HashableScriptData -> Data ConwayEra)
-> (Redeemer -> HashableScriptData) -> Redeemer -> Data ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Redeemer -> HashableScriptData
unsafeHashableScriptData) Maybe Redeemer
mredeemer, ExUnits
exunits)
        -- Check if the original UTxO uses an inline datum
        isInlineDatum :: Bool
isInlineDatum = case TxOutDatum CtxUTxO Era
utxoDatum of
          TxOutDatumInline{} -> Bool
True
          TxOutDatum CtxUTxO Era
_ -> Bool
False
     in -- If the original is inline and we're NOT changing the datum, only update the redeemer
        -- (avoid adding orphaned datums to TxDats which causes NotAllowedSupplementalDatums)
        -- Otherwise, add the datum to TxDats as needed for spending
        if Bool
isInlineDatum Bool -> Bool -> Bool
&& Maybe Datum -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Datum
mdatum
          then Word32
-> (Data (ShelleyLedgerEra Era), ExUnits)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
updateRedeemer Word32
idx (Data (ShelleyLedgerEra Era), ExUnits)
(Data ConwayEra, ExUnits)
newRdmr TxBodyScriptData Era
scriptData
          else Word32
-> Data (ShelleyLedgerEra Era)
-> (Data (ShelleyLedgerEra Era), ExUnits)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
addScriptData Word32
idx Data (ShelleyLedgerEra Era)
Data ConwayEra
adatum (Data (ShelleyLedgerEra Era), ExUnits)
(Data ConwayEra, ExUnits)
newRdmr TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (AddPlutusScriptMint PlutusScript lang
script AssetName
assetName Quantity
quantity Redeemer
redeemer) =
  ( TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
body{Conway.ctbMint = mint'} [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts' TxBodyScriptData Era
scriptData' Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits
  , UTxO Era
utxos
  )
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx

  -- Convert cardano-api types to ledger types
  scriptHash :: ScriptHash
scriptHash = Script lang -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (Script lang -> ScriptHash) -> Script lang -> ScriptHash
forall a b. (a -> b) -> a -> b
$ PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script
  ledgerPolicyId :: PolicyID
ledgerPolicyId = ScriptHash -> PolicyID
Mary.PolicyID (ScriptHash -> ScriptHash
toShelleyScriptHash ScriptHash
scriptHash)
  ledgerAssetName :: AssetName
ledgerAssetName = AssetName -> AssetName
toMaryAssetName AssetName
assetName
  Quantity Integer
qty = Quantity
quantity

  -- Add the asset to the mint field
  newMintAsset :: MultiAsset
newMintAsset = Map PolicyID (Map AssetName Integer) -> MultiAsset
Mary.MultiAsset (Map PolicyID (Map AssetName Integer) -> MultiAsset)
-> Map PolicyID (Map AssetName Integer) -> MultiAsset
forall a b. (a -> b) -> a -> b
$ PolicyID
-> Map AssetName Integer -> Map PolicyID (Map AssetName Integer)
forall k a. k -> a -> Map k a
Map.singleton PolicyID
ledgerPolicyId (AssetName -> Integer -> Map AssetName Integer
forall k a. k -> a -> Map k a
Map.singleton AssetName
ledgerAssetName Integer
qty)
  mint' :: MultiAsset
mint' = MultiAsset
ctbMint MultiAsset -> MultiAsset -> MultiAsset
forall a. Semigroup a => a -> a -> a
<> MultiAsset
newMintAsset

  -- Calculate the mint index (sorted position of PolicyId in mint map keys)
  Mary.MultiAsset Map PolicyID (Map AssetName Integer)
mintMap = MultiAsset
mint'
  mintIdx :: Word32
mintIdx = case PolicyID -> Map PolicyID (Map AssetName Integer) -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe Int
Map.lookupIndex PolicyID
ledgerPolicyId Map PolicyID (Map AssetName Integer)
mintMap of
    Just Int
idx' -> Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx'
    Maybe Int
Nothing -> [Char] -> Word32
forall a. HasCallStack => [Char] -> a
error [Char]
"The impossible happened: PolicyId not in mint map after insertion"

  -- Check if we need to update existing minting redeemer indices
  -- (if our new PolicyId sorted before some existing ones)
  Mary.MultiAsset Map PolicyID (Map AssetName Integer)
oldMintMap = MultiAsset
ctbMint
  oldMintKeys :: [PolicyID]
oldMintKeys = Map PolicyID (Map AssetName Integer) -> [PolicyID]
forall k a. Map k a -> [k]
Map.keys Map PolicyID (Map AssetName Integer)
oldMintMap
  -- For each existing policy, check if its new index changed
  idxUpdate :: Word32 -> Word32
idxUpdate Word32
oldIdx
    | (PolicyID -> Bool) -> [PolicyID] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any
        ( \PolicyID
p ->
            PolicyID -> Map PolicyID (Map AssetName Integer) -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe Int
Map.lookupIndex PolicyID
p Map PolicyID (Map AssetName Integer)
mintMap Maybe Int -> Maybe Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Maybe Int
forall a. a -> Maybe a
Just (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
oldIdx Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
              Bool -> Bool -> Bool
&& PolicyID -> Map PolicyID (Map AssetName Integer) -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe Int
Map.lookupIndex PolicyID
p Map PolicyID (Map AssetName Integer)
oldMintMap Maybe Int -> Maybe Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Maybe Int
forall a. a -> Maybe a
Just (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
oldIdx)
        )
        [PolicyID]
oldMintKeys =
        Word32
oldIdx Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
1
    | Bool
otherwise = Word32
oldIdx

  -- Add the script to the scripts list
  scriptInEra :: ScriptInEra Era
scriptInEra =
    ScriptLanguageInEra lang Era -> Script lang -> ScriptInEra Era
forall lang era.
ScriptLanguageInEra lang era -> Script lang -> ScriptInEra era
ScriptInEra
      ScriptLanguageInEra lang Era
forall lang era.
HasScriptLanguageInEra lang era =>
ScriptLanguageInEra lang era
scriptLanguageInEra
      (PlutusScriptVersion lang -> PlutusScript lang -> Script lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> Script lang
PlutusScript PlutusScriptVersion lang
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang
plutusScriptVersion PlutusScript lang
script)
  newScript :: Script (ShelleyLedgerEra Era)
newScript = forall era. ScriptInEra era -> Script (ShelleyLedgerEra era)
toShelleyScript @Era ScriptInEra Era
scriptInEra
  scripts' :: [AlonzoScript ConwayEra]
scripts' = [Script (ShelleyLedgerEra Era)]
[AlonzoScript ConwayEra]
scripts [AlonzoScript ConwayEra]
-> [AlonzoScript ConwayEra] -> [AlonzoScript ConwayEra]
forall a. [a] -> [a] -> [a]
++ [Script (ShelleyLedgerEra Era)
AlonzoScript ConwayEra
newScript]

  -- Add the minting redeemer with the correct index
  scriptData' :: TxBodyScriptData Era
scriptData' =
    Word32
-> (Data (ShelleyLedgerEra Era), ExUnits)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
addMintingRedeemer
      Word32
mintIdx
      (HashableScriptData -> Data (ShelleyLedgerEra Era)
forall ledgerera.
Era ledgerera =>
HashableScriptData -> Data ledgerera
toAlonzoData (HashableScriptData -> Data (ShelleyLedgerEra Era))
-> HashableScriptData -> Data (ShelleyLedgerEra Era)
forall a b. (a -> b) -> a -> b
$ Redeemer -> HashableScriptData
unsafeHashableScriptData Redeemer
redeemer, ExecutionUnits -> ExUnits
toAlonzoExUnits (ExecutionUnits -> ExUnits) -> ExecutionUnits -> ExUnits
forall a b. (a -> b) -> a -> b
$ Natural -> Natural -> ExecutionUnits
ExecutionUnits Natural
0 Natural
0)
      (TxBodyScriptData Era -> TxBodyScriptData Era)
-> TxBodyScriptData Era -> TxBodyScriptData Era
forall a b. (a -> b) -> a -> b
$ Maybe Word32
-> (Word32 -> Word32)
-> TxBodyScriptData Era
-> TxBodyScriptData Era
recomputeScriptDataForMint Maybe Word32
forall a. Maybe a
Nothing Word32 -> Word32
idxUpdate TxBodyScriptData Era
scriptData
applyTxMod Tx Era
tx UTxO Era
utxos (RemoveRequiredSigner (PaymentKeyHash KeyHash 'Payment
kh)) =
  (TxBody Era -> [KeyWitness Era] -> Tx Era
forall era. TxBody era -> [KeyWitness era] -> Tx era
Tx (ShelleyBasedEra Era
-> TxBody (ShelleyLedgerEra Era)
-> [Script (ShelleyLedgerEra Era)]
-> TxBodyScriptData Era
-> Maybe (TxAuxData (ShelleyLedgerEra Era))
-> TxScriptValidity Era
-> TxBody Era
forall era.
ShelleyBasedEra era
-> TxBody (ShelleyLedgerEra era)
-> [Script (ShelleyLedgerEra era)]
-> TxBodyScriptData era
-> Maybe (TxAuxData (ShelleyLedgerEra era))
-> TxScriptValidity era
-> TxBody era
ShelleyTxBody ShelleyBasedEra Era
era TxBody (ShelleyLedgerEra Era)
TxBody ConwayEra
body' [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits, UTxO Era
utxos)
 where
  Tx (ShelleyTxBody ShelleyBasedEra Era
era body :: TxBody (ShelleyLedgerEra Era)
body@Conway.ConwayTxBody{StrictMaybe ScriptIntegrityHash
StrictMaybe Coin
StrictMaybe Network
StrictMaybe TxAuxDataHash
StrictMaybe (Sized (TxOut ConwayEra))
VotingProcedures ConwayEra
Coin
MultiAsset
Set (KeyHash 'Witness)
Set TxIn
OSet (TxCert ConwayEra)
OSet (ProposalProcedure ConwayEra)
ValidityInterval
Withdrawals
StrictSeq (Sized (TxOut ConwayEra))
ctbVldt :: TxBody ConwayEra -> ValidityInterval
ctbAdHash :: TxBody ConwayEra -> StrictMaybe TxAuxDataHash
ctbCerts :: TxBody ConwayEra -> OSet (TxCert ConwayEra)
ctbCollateralInputs :: TxBody ConwayEra -> Set TxIn
ctbCollateralReturn :: TxBody ConwayEra -> StrictMaybe (Sized (TxOut ConwayEra))
ctbCurrentTreasuryValue :: TxBody ConwayEra -> StrictMaybe Coin
ctbMint :: TxBody ConwayEra -> MultiAsset
ctbOutputs :: TxBody ConwayEra -> StrictSeq (Sized (TxOut ConwayEra))
ctbProposalProcedures :: TxBody ConwayEra -> OSet (ProposalProcedure ConwayEra)
ctbReferenceInputs :: TxBody ConwayEra -> Set TxIn
ctbReqSignerHashes :: TxBody ConwayEra -> Set (KeyHash 'Witness)
ctbScriptIntegrityHash :: TxBody ConwayEra -> StrictMaybe ScriptIntegrityHash
ctbSpendInputs :: TxBody ConwayEra -> Set TxIn
ctbTotalCollateral :: TxBody ConwayEra -> StrictMaybe Coin
ctbTreasuryDonation :: TxBody ConwayEra -> Coin
ctbTxNetworkId :: TxBody ConwayEra -> StrictMaybe Network
ctbTxfee :: TxBody ConwayEra -> Coin
ctbVotingProcedures :: TxBody ConwayEra -> VotingProcedures ConwayEra
ctbWithdrawals :: TxBody ConwayEra -> Withdrawals
ctbSpendInputs :: Set TxIn
ctbCollateralInputs :: Set TxIn
ctbReferenceInputs :: Set TxIn
ctbOutputs :: StrictSeq (Sized (TxOut ConwayEra))
ctbCollateralReturn :: StrictMaybe (Sized (TxOut ConwayEra))
ctbTotalCollateral :: StrictMaybe Coin
ctbCerts :: OSet (TxCert ConwayEra)
ctbWithdrawals :: Withdrawals
ctbTxfee :: Coin
ctbVldt :: ValidityInterval
ctbReqSignerHashes :: Set (KeyHash 'Witness)
ctbMint :: MultiAsset
ctbScriptIntegrityHash :: StrictMaybe ScriptIntegrityHash
ctbAdHash :: StrictMaybe TxAuxDataHash
ctbTxNetworkId :: StrictMaybe Network
ctbVotingProcedures :: VotingProcedures ConwayEra
ctbProposalProcedures :: OSet (ProposalProcedure ConwayEra)
ctbCurrentTreasuryValue :: StrictMaybe Coin
ctbTreasuryDonation :: Coin
..} [Script (ShelleyLedgerEra Era)]
scripts TxBodyScriptData Era
scriptData Maybe (TxAuxData (ShelleyLedgerEra Era))
auxData TxScriptValidity Era
validity) [KeyWitness Era]
wits = Tx Era
tx
  body' :: TxBody ConwayEra
body' = TxBody (ShelleyLedgerEra Era)
body{Conway.ctbReqSignerHashes = Set.delete (coerceKeyRole kh) ctbReqSignerHashes}
applyTxMod Tx Era
_ UTxO Era
_ (ReplaceTx Tx Era
tx UTxO Era
utxos) = (Tx Era
tx, UTxO Era
utxos)

-- | Add a new output of any type (public key or script)
addOutput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addOutput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addOutput AddressAny
addr Value
value Datum
datum ReferenceScript Era
refscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ AddressAny -> Value -> Datum -> ReferenceScript Era -> TxMod
AddOutput AddressAny
addr Value
value Datum
datum ReferenceScript Era
refscript

-- | Remove an output of any type.
removeOutput :: Output -> TxModifier
removeOutput :: Output -> TxModifier
removeOutput Output
output = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIx -> TxMod
RemoveOutput (TxIx -> TxMod) -> TxIx -> TxMod
forall a b. (a -> b) -> a -> b
$ Output -> TxIx
outputIx Output
output

-- | Add a new public key input.
addKeyInput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addKeyInput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addKeyInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ AddressAny
-> Value -> Datum -> ReferenceScript Era -> Bool -> TxMod
AddInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript Bool
False

-- | Add a new public key reference input.
addKeyReferenceInput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addKeyReferenceInput :: AddressAny -> Value -> Datum -> ReferenceScript Era -> TxModifier
addKeyReferenceInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ AddressAny
-> Value -> Datum -> ReferenceScript Era -> Bool -> TxMod
AddInput AddressAny
addr Value
value Datum
datum ReferenceScript Era
rscript Bool
True

-- | Remove an input of any type.
removeInput :: Input -> TxModifier
removeInput :: Input -> TxModifier
removeInput Input
inp = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn -> TxMod
RemoveInput (TxIn -> TxMod) -> TxIn -> TxMod
forall a b. (a -> b) -> a -> b
$ Input -> TxIn
inputTxIn Input
inp

-- | Add a reference script input
addReferenceScriptInput :: ScriptHash -> Value -> Datum -> Redeemer -> TxModifier
addReferenceScriptInput :: ScriptHash -> Value -> Datum -> Redeemer -> TxModifier
addReferenceScriptInput ScriptHash
script Value
value Datum
datum Redeemer
redeemer = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ ScriptHash -> Value -> Datum -> Redeemer -> TxMod
AddReferenceScriptInput ScriptHash
script Value
value Datum
datum Redeemer
redeemer

-- | Add a plutus V2 script input.
addPlutusScriptInput :: (IsPlutusScriptInEra lang) => PlutusScript lang -> Value -> Datum -> Redeemer -> ReferenceScript Era -> TxModifier
addPlutusScriptInput :: forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang
-> Value -> Datum -> Redeemer -> ReferenceScript Era -> TxModifier
addPlutusScriptInput PlutusScript lang
script Value
value Datum
datum Redeemer
redeemer ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ PlutusScript lang
-> Value -> Datum -> Redeemer -> ReferenceScript Era -> TxMod
forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang
-> Value -> Datum -> Redeemer -> ReferenceScript Era -> TxMod
AddPlutusScriptInput PlutusScript lang
script Value
value Datum
datum Redeemer
redeemer ReferenceScript Era
rscript

-- | Add a plutus script reference input.
addPlutusScriptReferenceInput :: (IsPlutusScriptInEra lang) => PlutusScript lang -> Value -> Datum -> ReferenceScript Era -> TxModifier
addPlutusScriptReferenceInput :: forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang
-> Value -> Datum -> ReferenceScript Era -> TxModifier
addPlutusScriptReferenceInput PlutusScript lang
script Value
value Datum
datum ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ PlutusScript lang -> Value -> Datum -> ReferenceScript Era -> TxMod
forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang -> Value -> Datum -> ReferenceScript Era -> TxMod
AddPlutusScriptReferenceInput PlutusScript lang
script Value
value Datum
datum ReferenceScript Era
rscript

-- | Add a simple script input.
addSimpleScriptInput :: SimpleScript -> Value -> ReferenceScript Era -> TxModifier
addSimpleScriptInput :: SimpleScript -> Value -> ReferenceScript Era -> TxModifier
addSimpleScriptInput SimpleScript
script Value
value ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ SimpleScript -> Value -> ReferenceScript Era -> Bool -> TxMod
AddSimpleScriptInput SimpleScript
script Value
value ReferenceScript Era
rscript Bool
False

-- | Add a simple script reference input.
addSimpleScriptReferenceInput :: SimpleScript -> Value -> ReferenceScript Era -> TxModifier
addSimpleScriptReferenceInput :: SimpleScript -> Value -> ReferenceScript Era -> TxModifier
addSimpleScriptReferenceInput SimpleScript
script Value
value ReferenceScript Era
rscript = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ SimpleScript -> Value -> ReferenceScript Era -> Bool -> TxMod
AddSimpleScriptInput SimpleScript
script Value
value ReferenceScript Era
rscript Bool
True

-- | Smart constructor for minting with a Plutus V2 script
addPlutusScriptMint
  :: (IsPlutusScriptInEra lang)
  => PlutusScript lang
  -> AssetName
  -> Quantity
  -> ScriptData -- Redeemer
  -> TxModifier
addPlutusScriptMint :: forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang
-> AssetName -> Quantity -> Redeemer -> TxModifier
addPlutusScriptMint PlutusScript lang
script AssetName
name Quantity
qty Redeemer
redeemer =
  TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ PlutusScript lang -> AssetName -> Quantity -> Redeemer -> TxMod
forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang -> AssetName -> Quantity -> Redeemer -> TxMod
AddPlutusScriptMint PlutusScript lang
script AssetName
name Quantity
qty Redeemer
redeemer

{- | Always-succeeds minting policy for testing
Takes 2 arguments: redeemer and script context
-}
alwaysSucceedsMintingPolicy :: PlutusScript PlutusScriptV2
alwaysSucceedsMintingPolicy :: PlutusScript PlutusScriptV2
alwaysSucceedsMintingPolicy =
  ShortByteString -> PlutusScript PlutusScriptV2
forall lang. ShortByteString -> PlutusScript lang
PlutusScriptSerialised (ShortByteString -> PlutusScript PlutusScriptV2)
-> ShortByteString -> PlutusScript PlutusScriptV2
forall a b. (a -> b) -> a -> b
$ Natural -> ShortByteString
alwaysSucceedingNAryFunction Natural
2

-- | Change the redeemer of a script input.
changeRedeemerOf :: Input -> Redeemer -> TxModifier
changeRedeemerOf :: Input -> Redeemer -> TxModifier
changeRedeemerOf Input
i Redeemer
r
  | AddressAny -> Bool
isKeyAddressAny (Input -> AddressAny
forall t. IsInputOrOutput t => t -> AddressAny
addressOf Input
i) = [Char] -> TxModifier
forall a. HasCallStack => [Char] -> a
error [Char]
"Cannot changeRedeemerOf public key input"
  | Bool
otherwise = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ TxIn
-> Maybe Value
-> Maybe Datum
-> Maybe Redeemer
-> Maybe (ReferenceScript Era)
-> TxMod
ChangeScriptInput (Input -> TxIn
inputTxIn Input
i) Maybe Value
forall a. Maybe a
Nothing Maybe Datum
forall a. Maybe a
Nothing (Redeemer -> Maybe Redeemer
forall a. a -> Maybe a
Just Redeemer
r) Maybe (ReferenceScript Era)
forall a. Maybe a
Nothing

-- | Change the validity range of the transaction.
changeValidityRange :: (TxValidityLowerBound Era, TxValidityUpperBound Era) -> TxModifier
changeValidityRange :: (TxValidityLowerBound Era, TxValidityUpperBound Era) -> TxModifier
changeValidityRange (TxValidityLowerBound Era
lo, TxValidityUpperBound Era
hi) = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ Maybe (TxValidityLowerBound Era)
-> Maybe (TxValidityUpperBound Era) -> TxMod
ChangeValidityRange (TxValidityLowerBound Era -> Maybe (TxValidityLowerBound Era)
forall a. a -> Maybe a
Just TxValidityLowerBound Era
lo) (TxValidityUpperBound Era -> Maybe (TxValidityUpperBound Era)
forall a. a -> Maybe a
Just TxValidityUpperBound Era
hi)

-- | Change the validity lower bound of the transaction.
changeValidityLowerBound :: TxValidityLowerBound Era -> TxModifier
changeValidityLowerBound :: TxValidityLowerBound Era -> TxModifier
changeValidityLowerBound TxValidityLowerBound Era
lo = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ Maybe (TxValidityLowerBound Era)
-> Maybe (TxValidityUpperBound Era) -> TxMod
ChangeValidityRange (TxValidityLowerBound Era -> Maybe (TxValidityLowerBound Era)
forall a. a -> Maybe a
Just TxValidityLowerBound Era
lo) Maybe (TxValidityUpperBound Era)
forall a. Maybe a
Nothing

-- | Change the validity upper bound of the transaction.
changeValidityUpperBound :: TxValidityUpperBound Era -> TxModifier
changeValidityUpperBound :: TxValidityUpperBound Era -> TxModifier
changeValidityUpperBound TxValidityUpperBound Era
hi = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ Maybe (TxValidityLowerBound Era)
-> Maybe (TxValidityUpperBound Era) -> TxMod
ChangeValidityRange Maybe (TxValidityLowerBound Era)
forall a. Maybe a
Nothing (TxValidityUpperBound Era -> Maybe (TxValidityUpperBound Era)
forall a. a -> Maybe a
Just TxValidityUpperBound Era
hi)

-- | Remove a required signer from the transaction.
removeRequiredSigner :: Hash PaymentKey -> TxModifier
removeRequiredSigner :: Hash PaymentKey -> TxModifier
removeRequiredSigner = TxMod -> TxModifier
txMod (TxMod -> TxModifier)
-> (Hash PaymentKey -> TxMod) -> Hash PaymentKey -> TxModifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hash PaymentKey -> TxMod
RemoveRequiredSigner

{- | The most general transaction modifier. Simply replace the original transaction and `UTxO` set
  by the given values. In most cases the modifiers above should be sufficient.
-}
replaceTx :: Tx Era -> UTxO Era -> TxModifier
replaceTx :: Tx Era -> UTxO Era -> TxModifier
replaceTx Tx Era
tx UTxO Era
utxos = TxMod -> TxModifier
txMod (TxMod -> TxModifier) -> TxMod -> TxModifier
forall a b. (a -> b) -> a -> b
$ Tx Era -> UTxO Era -> TxMod
ReplaceTx Tx Era
tx UTxO Era
utxos

-- ---------------------------------------------------------------------
-- ToJSON instance for TxMod
-- ---------------------------------------------------------------------

-- | Render an AddressAny as text (bech32 for Shelley, show for Byron).
renderAddressAny :: AddressAny -> Text
renderAddressAny :: AddressAny -> Text
renderAddressAny (AddressShelley Address ShelleyAddr
addr) = Address ShelleyAddr -> Text
forall addr. SerialiseAddress addr => addr -> Text
serialiseAddress Address ShelleyAddr
addr
renderAddressAny (AddressByron Address ByronAddr
addr) = [Char] -> Text
Text.pack (Address ByronAddr -> [Char]
forall a. Show a => a -> [Char]
show Address ByronAddr
addr)

-- | Render a Datum (TxOutDatum CtxTx Era) as a JSON-friendly text value.
renderDatumAny :: Datum -> Maybe Text
renderDatumAny :: Datum -> Maybe Text
renderDatumAny = Datum -> Maybe Text
renderDatum

instance ToJSON TxMod where
  toJSON :: TxMod -> Value
toJSON (RemoveInput TxIn
txIn) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"removeInput" :: Text)
      , Key
"utxo" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= TxIn -> Text
renderTxIn TxIn
txIn
      ]
  toJSON (RemoveOutput (TxIx Word
ix)) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"removeOutput" :: Text)
      , Key
"index" Key -> Word -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Word
ix
      ]
  toJSON (ChangeOutput (TxIx Word
ix) Maybe AddressAny
mAddr Maybe Value
mVal Maybe Datum
mDatum Maybe (ReferenceScript Era)
mRefScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"changeOutput" :: Text)
      , Key
"index" Key -> Word -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Word
ix
      , Key
"address" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (AddressAny -> Text) -> Maybe AddressAny -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AddressAny -> Text
renderAddressAny Maybe AddressAny
mAddr
      , Key
"value" Key -> Maybe ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Value -> ValueSummary) -> Maybe Value -> Maybe ValueSummary
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> ValueSummary
toValueSummary Maybe Value
mVal
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Maybe Datum
mDatum Maybe Datum -> (Datum -> Maybe Text) -> Maybe Text
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Datum -> Maybe Text
renderDatumAny)
      , Key
"referenceScript" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ReferenceScript Era -> Text)
-> Maybe (ReferenceScript Era) -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text)
-> (ReferenceScript Era -> [Char]) -> ReferenceScript Era -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show) Maybe (ReferenceScript Era)
mRefScript
      ]
  toJSON (ChangeInput TxIn
txIn Maybe AddressAny
mAddr Maybe Value
mVal Maybe Datum
mDatum Maybe (ReferenceScript Era)
mRefScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"changeInput" :: Text)
      , Key
"utxo" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= TxIn -> Text
renderTxIn TxIn
txIn
      , Key
"address" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (AddressAny -> Text) -> Maybe AddressAny -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AddressAny -> Text
renderAddressAny Maybe AddressAny
mAddr
      , Key
"value" Key -> Maybe ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Value -> ValueSummary) -> Maybe Value -> Maybe ValueSummary
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> ValueSummary
toValueSummary Maybe Value
mVal
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Maybe Datum
mDatum Maybe Datum -> (Datum -> Maybe Text) -> Maybe Text
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Datum -> Maybe Text
renderDatumAny)
      , Key
"referenceScript" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ReferenceScript Era -> Text)
-> Maybe (ReferenceScript Era) -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text)
-> (ReferenceScript Era -> [Char]) -> ReferenceScript Era -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show) Maybe (ReferenceScript Era)
mRefScript
      ]
  toJSON (ChangeScriptInput TxIn
txIn Maybe Value
mVal Maybe Datum
mDatum Maybe Redeemer
mRedeemer Maybe (ReferenceScript Era)
mRefScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"changeScriptInput" :: Text)
      , Key
"utxo" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= TxIn -> Text
renderTxIn TxIn
txIn
      , Key
"value" Key -> Maybe ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Value -> ValueSummary) -> Maybe Value -> Maybe ValueSummary
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> ValueSummary
toValueSummary Maybe Value
mVal
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Maybe Datum
mDatum Maybe Datum -> (Datum -> Maybe Text) -> Maybe Text
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Datum -> Maybe Text
renderDatumAny)
      , Key
"redeemer" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Redeemer -> Text) -> Maybe Redeemer -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text) -> (Redeemer -> [Char]) -> Redeemer -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Redeemer -> [Char]
forall a. Show a => a -> [Char]
show) Maybe Redeemer
mRedeemer
      , Key
"referenceScript" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ReferenceScript Era -> Text)
-> Maybe (ReferenceScript Era) -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text)
-> (ReferenceScript Era -> [Char]) -> ReferenceScript Era -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show) Maybe (ReferenceScript Era)
mRefScript
      ]
  toJSON (ChangeValidityRange Maybe (TxValidityLowerBound Era)
mLower Maybe (TxValidityUpperBound Era)
mUpper) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"changeValidityRange" :: Text)
      , Key
"lowerBound" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (TxValidityLowerBound Era -> Text)
-> Maybe (TxValidityLowerBound Era) -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text)
-> (TxValidityLowerBound Era -> [Char])
-> TxValidityLowerBound Era
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxValidityLowerBound Era -> [Char]
forall a. Show a => a -> [Char]
show) Maybe (TxValidityLowerBound Era)
mLower
      , Key
"upperBound" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (TxValidityUpperBound Era -> Text)
-> Maybe (TxValidityUpperBound Era) -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> Text
Text.pack ([Char] -> Text)
-> (TxValidityUpperBound Era -> [Char])
-> TxValidityUpperBound Era
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxValidityUpperBound Era -> [Char]
forall a. Show a => a -> [Char]
show) Maybe (TxValidityUpperBound Era)
mUpper
      ]
  toJSON (AddOutput AddressAny
addr Value
val Datum
datum ReferenceScript Era
refScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addOutput" :: Text)
      , Key
"address" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AddressAny -> Text
renderAddressAny AddressAny
addr
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Datum -> Maybe Text
renderDatumAny Datum
datum
      , Key
"referenceScript" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show ReferenceScript Era
refScript)
      ]
  toJSON (AddInput AddressAny
addr Value
val Datum
datum ReferenceScript Era
refScript Bool
isRef) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addInput" :: Text)
      , Key
"address" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AddressAny -> Text
renderAddressAny AddressAny
addr
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Datum -> Maybe Text
renderDatumAny Datum
datum
      , Key
"referenceScript" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show ReferenceScript Era
refScript)
      , Key
"isReferenceInput" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
isRef
      ]
  toJSON (AddReferenceScriptInput ScriptHash
scriptHash Value
val Datum
datum Redeemer
redeemer) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addReferenceScriptInput" :: Text)
      , Key
"scriptHash" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ScriptHash -> Text
forall a. SerialiseAsRawBytes a => a -> Text
serialiseToRawBytesHexText ScriptHash
scriptHash
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Datum -> Maybe Text
renderDatumAny Datum
datum
      , Key
"redeemer" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (Redeemer -> [Char]
forall a. Show a => a -> [Char]
show Redeemer
redeemer)
      ]
  toJSON (AddPlutusScriptInput PlutusScript lang
_script Value
val Datum
datum Redeemer
redeemer ReferenceScript Era
refScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addPlutusScriptInput" :: Text)
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Datum -> Maybe Text
renderDatumAny Datum
datum
      , Key
"redeemer" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (Redeemer -> [Char]
forall a. Show a => a -> [Char]
show Redeemer
redeemer)
      , Key
"referenceScript" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show ReferenceScript Era
refScript)
      ]
  toJSON (AddPlutusScriptReferenceInput PlutusScript lang
_script Value
val Datum
datum ReferenceScript Era
refScript) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addPlutusScriptReferenceInput" :: Text)
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"datum" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Datum -> Maybe Text
renderDatumAny Datum
datum
      , Key
"referenceScript" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show ReferenceScript Era
refScript)
      ]
  toJSON (AddSimpleScriptInput SimpleScript
_script Value
val ReferenceScript Era
refScript Bool
isRef) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addSimpleScriptInput" :: Text)
      , Key
"value" Key -> ValueSummary -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value -> ValueSummary
toValueSummary Value
val
      , Key
"referenceScript" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (ReferenceScript Era -> [Char]
forall a. Show a => a -> [Char]
show ReferenceScript Era
refScript)
      , Key
"isReferenceInput" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
isRef
      ]
  toJSON (AddPlutusScriptMint PlutusScript lang
_script AssetName
assetName Quantity
qty Redeemer
redeemer) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"addPlutusScriptMint" :: Text)
      , Key
"assetName" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AssetName -> Text
renderAssetName AssetName
assetName
      , Key
"quantity" Key -> Quantity -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Quantity
qty
      , Key
"redeemer" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Char] -> Text
Text.pack (Redeemer -> [Char]
forall a. Show a => a -> [Char]
show Redeemer
redeemer)
      ]
  toJSON (RemoveRequiredSigner Hash PaymentKey
keyHash) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"removeRequiredSigner" :: Text)
      , Key
"keyHash" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Hash PaymentKey -> Text
forall a. SerialiseAsRawBytes a => a -> Text
serialiseToRawBytesHexText Hash PaymentKey
keyHash
      ]
  toJSON (ReplaceTx Tx Era
_tx UTxO Era
_utxo) =
    [Pair] -> Value
object
      [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"replaceTx" :: Text)
      ]