-- | This module provides a function to ensure that each redeemer used in a
-- skeleton is attached a reference input with the right reference script when
-- it exists in the index.
module Cooked.MockChain.AutoReferenceScripts (toTxSkelWithReferenceScripts) where

import Control.Monad
import Cooked.Conversion
import Cooked.MockChain.BlockChain
import Cooked.MockChain.UtxoSearch
import Cooked.Output
import Cooked.Skeleton
import Data.Map qualified as Map
import Data.Maybe
import Optics.Core
import PlutusLedgerApi.V3 qualified as Api

-- | Searches through the known utxos for a utxo containing a reference script
-- with a given script hash, and returns the first such utxo found, if any.
retrieveReferenceScript :: (MonadBlockChain m, ToScriptHash s) => s -> m (Maybe Api.TxOutRef)
retrieveReferenceScript :: forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> m (Maybe TxOutRef)
retrieveReferenceScript = ([TxOutRef] -> Maybe TxOutRef
forall a. [a] -> Maybe a
listToMaybe ([TxOutRef] -> Maybe TxOutRef)
-> ([(TxOutRef,
      ConcreteOutput Credential OutputDatum Value ScriptHash)]
    -> [TxOutRef])
-> [(TxOutRef,
     ConcreteOutput Credential OutputDatum Value ScriptHash)]
-> Maybe TxOutRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((TxOutRef, ConcreteOutput Credential OutputDatum Value ScriptHash)
-> TxOutRef
forall a b. (a, b) -> a
fst ((TxOutRef, ConcreteOutput Credential OutputDatum Value ScriptHash)
 -> TxOutRef)
-> [(TxOutRef,
     ConcreteOutput Credential OutputDatum Value ScriptHash)]
-> [TxOutRef]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([(TxOutRef,
   ConcreteOutput Credential OutputDatum Value ScriptHash)]
 -> Maybe TxOutRef)
-> m [(TxOutRef,
       ConcreteOutput Credential OutputDatum Value ScriptHash)]
-> m (Maybe TxOutRef)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (m [(TxOutRef,
     ConcreteOutput Credential OutputDatum Value ScriptHash)]
 -> m (Maybe TxOutRef))
-> (s
    -> m [(TxOutRef,
           ConcreteOutput Credential OutputDatum Value ScriptHash)])
-> s
-> m (Maybe TxOutRef)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UtxoSearch
  m (ConcreteOutput Credential OutputDatum Value ScriptHash)
-> m [(TxOutRef,
       ConcreteOutput Credential OutputDatum Value ScriptHash)]
forall (m :: * -> *) a.
Monad m =>
UtxoSearch m a -> m [(TxOutRef, a)]
runUtxoSearch (UtxoSearch
   m (ConcreteOutput Credential OutputDatum Value ScriptHash)
 -> m [(TxOutRef,
        ConcreteOutput Credential OutputDatum Value ScriptHash)])
-> (s
    -> UtxoSearch
         m (ConcreteOutput Credential OutputDatum Value ScriptHash))
-> s
-> m [(TxOutRef,
       ConcreteOutput Credential OutputDatum Value ScriptHash)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s
-> UtxoSearch
     m (ConcreteOutput Credential OutputDatum Value ScriptHash)
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s
-> UtxoSearch
     m (ConcreteOutput Credential OutputDatum Value ScriptHash)
referenceScriptOutputsSearch

-- | Attempts to find in the index a utxo containing a reference script with the
-- given script hash, and attaches it to a redeemer when it does not yet have a
-- reference input, in which case an event is logged.
updateRedeemer :: (MonadBlockChain m, ToScriptHash s) => s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer :: forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer s
script txSkelRed :: TxSkelRedeemer
txSkelRed@(TxSkelRedeemer Redeemer
red Maybe TxOutRef
Nothing) = do
  Maybe TxOutRef
oRefM <- s -> m (Maybe TxOutRef)
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> m (Maybe TxOutRef)
retrieveReferenceScript s
script
  case Maybe TxOutRef
oRefM of
    Maybe TxOutRef
Nothing -> TxSkelRedeemer -> m TxSkelRedeemer
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return TxSkelRedeemer
txSkelRed
    Just TxOutRef
oRef -> do
      MockChainLogEntry -> m ()
forall (m :: * -> *).
MonadBlockChainBalancing m =>
MockChainLogEntry -> m ()
logEvent (MockChainLogEntry -> m ()) -> MockChainLogEntry -> m ()
forall a b. (a -> b) -> a -> b
$ Redeemer -> TxOutRef -> ScriptHash -> MockChainLogEntry
MCLogAddedReferenceScript Redeemer
red TxOutRef
oRef (s -> ScriptHash
forall a. ToScriptHash a => a -> ScriptHash
toScriptHash s
script)
      TxSkelRedeemer -> m TxSkelRedeemer
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TxSkelRedeemer -> m TxSkelRedeemer)
-> TxSkelRedeemer -> m TxSkelRedeemer
forall a b. (a -> b) -> a -> b
$ Redeemer -> Maybe TxOutRef -> TxSkelRedeemer
TxSkelRedeemer Redeemer
red (Maybe TxOutRef -> TxSkelRedeemer)
-> Maybe TxOutRef -> TxSkelRedeemer
forall a b. (a -> b) -> a -> b
$ TxOutRef -> Maybe TxOutRef
forall a. a -> Maybe a
Just TxOutRef
oRef
updateRedeemer s
_ TxSkelRedeemer
redeemer = TxSkelRedeemer -> m TxSkelRedeemer
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return TxSkelRedeemer
redeemer

-- | Goes through the various parts of the skeleton where a redeemer can appear,
-- and attempt to attach a reference input to each of them, following the rules
-- from `updateRedeemer`
toTxSkelWithReferenceScripts :: (MonadBlockChain m) => TxSkel -> m TxSkel
toTxSkelWithReferenceScripts :: forall (m :: * -> *). MonadBlockChain m => TxSkel -> m TxSkel
toTxSkelWithReferenceScripts TxSkel
txSkel = do
  [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
newMints <- [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
-> ((Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)
    -> m (Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer))
-> m [(Versioned MintingPolicy, TxSkelRedeemer, TokenName,
       Integer)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (TxSkelMints
-> [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
txSkelMintsToList (TxSkelMints
 -> [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)])
-> TxSkelMints
-> [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
forall a b. (a -> b) -> a -> b
$ TxSkel
txSkel TxSkel -> Optic' A_Lens NoIx TxSkel TxSkelMints -> TxSkelMints
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx TxSkel TxSkelMints
txSkelMintsL) (((Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)
  -> m (Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer))
 -> m [(Versioned MintingPolicy, TxSkelRedeemer, TokenName,
        Integer)])
-> ((Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)
    -> m (Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer))
-> m [(Versioned MintingPolicy, TxSkelRedeemer, TokenName,
       Integer)]
forall a b. (a -> b) -> a -> b
$ \(Versioned MintingPolicy
mPol, TxSkelRedeemer
red, TokenName
tk, Integer
nb) ->
    (Versioned MintingPolicy
mPol,,TokenName
tk,Integer
nb) (TxSkelRedeemer
 -> (Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer))
-> m TxSkelRedeemer
-> m (Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Versioned MintingPolicy -> TxSkelRedeemer -> m TxSkelRedeemer
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer Versioned MintingPolicy
mPol TxSkelRedeemer
red
  [(TxOutRef, TxSkelRedeemer)]
newInputs <- [(TxOutRef, TxSkelRedeemer)]
-> ((TxOutRef, TxSkelRedeemer) -> m (TxOutRef, TxSkelRedeemer))
-> m [(TxOutRef, TxSkelRedeemer)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (Map TxOutRef TxSkelRedeemer -> [(TxOutRef, TxSkelRedeemer)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map TxOutRef TxSkelRedeemer -> [(TxOutRef, TxSkelRedeemer)])
-> Map TxOutRef TxSkelRedeemer -> [(TxOutRef, TxSkelRedeemer)]
forall a b. (a -> b) -> a -> b
$ TxSkel
txSkel TxSkel
-> Optic' A_Lens NoIx TxSkel (Map TxOutRef TxSkelRedeemer)
-> Map TxOutRef TxSkelRedeemer
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx TxSkel (Map TxOutRef TxSkelRedeemer)
txSkelInsL) (((TxOutRef, TxSkelRedeemer) -> m (TxOutRef, TxSkelRedeemer))
 -> m [(TxOutRef, TxSkelRedeemer)])
-> ((TxOutRef, TxSkelRedeemer) -> m (TxOutRef, TxSkelRedeemer))
-> m [(TxOutRef, TxSkelRedeemer)]
forall a b. (a -> b) -> a -> b
$ \(TxOutRef
oRef, TxSkelRedeemer
red) -> do
    Maybe TxOut
outputM <- TxOutRef -> m (Maybe TxOut)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
TxOutRef -> m (Maybe TxOut)
txOutByRef TxOutRef
oRef
    -- We retrieve the possible script hash of the current oRef
    case (ConcreteOutput ScriptHash OutputDatum Value ScriptHash
-> Optic'
     A_Lens
     NoIx
     (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
     (OwnerType
        (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
-> OwnerType
     (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  A_Lens
  NoIx
  (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
  (OwnerType
     (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
forall o. IsAbstractOutput o => Lens' o (OwnerType o)
outputOwnerL) (ConcreteOutput ScriptHash OutputDatum Value ScriptHash
 -> OwnerType
      (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
-> Maybe (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
-> Maybe
     (OwnerType
        (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe TxOut
outputM Maybe TxOut
-> (TxOut
    -> Maybe (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
-> Maybe (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TxOut
-> Maybe (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
TxOut
-> Maybe
     (ConcreteOutput
        ScriptHash
        (DatumType TxOut)
        (ValueType TxOut)
        (ReferenceScriptType TxOut))
forall out.
IsTxInfoOutput out =>
out
-> Maybe
     (ConcreteOutput
        ScriptHash
        (DatumType out)
        (ValueType out)
        (ReferenceScriptType out))
isScriptOutput) of
      -- Either the txOutRef is unknown, or it belongs to a private key
      Maybe
  (OwnerType
     (ConcreteOutput ScriptHash OutputDatum Value ScriptHash))
Nothing -> (TxOutRef, TxSkelRedeemer) -> m (TxOutRef, TxSkelRedeemer)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TxOutRef
oRef, TxSkelRedeemer
red)
      Just OwnerType (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
scriptHash -> (TxOutRef
oRef,) (TxSkelRedeemer -> (TxOutRef, TxSkelRedeemer))
-> m TxSkelRedeemer -> m (TxOutRef, TxSkelRedeemer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> OwnerType (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
-> TxSkelRedeemer -> m TxSkelRedeemer
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer OwnerType (ConcreteOutput ScriptHash OutputDatum Value ScriptHash)
scriptHash TxSkelRedeemer
red
  [TxSkelProposal]
newProposals <- [TxSkelProposal]
-> (TxSkelProposal -> m TxSkelProposal) -> m [TxSkelProposal]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (TxSkel
txSkel TxSkel
-> Optic' A_Lens NoIx TxSkel [TxSkelProposal] -> [TxSkelProposal]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx TxSkel [TxSkelProposal]
txSkelProposalsL) ((TxSkelProposal -> m TxSkelProposal) -> m [TxSkelProposal])
-> (TxSkelProposal -> m TxSkelProposal) -> m [TxSkelProposal]
forall a b. (a -> b) -> a -> b
$ \TxSkelProposal
prop ->
    case TxSkelProposal
prop TxSkelProposal
-> Optic'
     A_Lens
     NoIx
     TxSkelProposal
     (Maybe (Versioned Script, TxSkelRedeemer))
-> Maybe (Versioned Script, TxSkelRedeemer)
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  A_Lens
  NoIx
  TxSkelProposal
  (Maybe (Versioned Script, TxSkelRedeemer))
txSkelProposalWitnessL of
      Maybe (Versioned Script, TxSkelRedeemer)
Nothing -> TxSkelProposal -> m TxSkelProposal
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return TxSkelProposal
prop
      Just (Versioned Script
script, TxSkelRedeemer
red) -> (Maybe (Versioned Script, TxSkelRedeemer)
 -> TxSkelProposal -> TxSkelProposal)
-> TxSkelProposal
-> Maybe (Versioned Script, TxSkelRedeemer)
-> TxSkelProposal
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Optic'
  A_Lens
  NoIx
  TxSkelProposal
  (Maybe (Versioned Script, TxSkelRedeemer))
-> Maybe (Versioned Script, TxSkelRedeemer)
-> TxSkelProposal
-> TxSkelProposal
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Optic'
  A_Lens
  NoIx
  TxSkelProposal
  (Maybe (Versioned Script, TxSkelRedeemer))
txSkelProposalWitnessL) TxSkelProposal
prop (Maybe (Versioned Script, TxSkelRedeemer) -> TxSkelProposal)
-> (TxSkelRedeemer -> Maybe (Versioned Script, TxSkelRedeemer))
-> TxSkelRedeemer
-> TxSkelProposal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Versioned Script, TxSkelRedeemer)
-> Maybe (Versioned Script, TxSkelRedeemer)
forall a. a -> Maybe a
Just ((Versioned Script, TxSkelRedeemer)
 -> Maybe (Versioned Script, TxSkelRedeemer))
-> (TxSkelRedeemer -> (Versioned Script, TxSkelRedeemer))
-> TxSkelRedeemer
-> Maybe (Versioned Script, TxSkelRedeemer)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Versioned Script
script,) (TxSkelRedeemer -> TxSkelProposal)
-> m TxSkelRedeemer -> m TxSkelProposal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Versioned Script -> TxSkelRedeemer -> m TxSkelRedeemer
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer Versioned Script
script TxSkelRedeemer
red
  [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
newWithdrawals <- [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
-> ((Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
    -> m (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada)))
-> m [(Either (Versioned Script) PubKeyHash,
       (TxSkelRedeemer, Ada))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
-> [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
forall k a. Map k a -> [(k, a)]
Map.toList (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
 -> [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))])
-> Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
-> [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
forall a b. (a -> b) -> a -> b
$ TxSkel
txSkel TxSkel
-> Optic'
     A_Lens
     NoIx
     TxSkel
     (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada))
-> Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  A_Lens
  NoIx
  TxSkel
  (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada))
txSkelWithdrawalsL) (((Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
  -> m (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada)))
 -> m [(Either (Versioned Script) PubKeyHash,
        (TxSkelRedeemer, Ada))])
-> ((Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
    -> m (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada)))
-> m [(Either (Versioned Script) PubKeyHash,
       (TxSkelRedeemer, Ada))]
forall a b. (a -> b) -> a -> b
$ \(Either (Versioned Script) PubKeyHash
wit, (TxSkelRedeemer
red, Ada
quantity)) -> case Either (Versioned Script) PubKeyHash
wit of
    Right PubKeyHash
_ -> (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
-> m (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either (Versioned Script) PubKeyHash
wit, (TxSkelRedeemer
red, Ada
quantity))
    Left Versioned Script
script -> (Versioned Script -> Either (Versioned Script) PubKeyHash
forall a b. a -> Either a b
Left Versioned Script
script,) ((TxSkelRedeemer, Ada)
 -> (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada)))
-> (TxSkelRedeemer -> (TxSkelRedeemer, Ada))
-> TxSkelRedeemer
-> (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,Ada
quantity) (TxSkelRedeemer
 -> (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada)))
-> m TxSkelRedeemer
-> m (Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Versioned Script -> TxSkelRedeemer -> m TxSkelRedeemer
forall (m :: * -> *) s.
(MonadBlockChain m, ToScriptHash s) =>
s -> TxSkelRedeemer -> m TxSkelRedeemer
updateRedeemer Versioned Script
script TxSkelRedeemer
red
  TxSkel -> m TxSkel
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TxSkel -> m TxSkel) -> TxSkel -> m TxSkel
forall a b. (a -> b) -> a -> b
$
    TxSkel
txSkel
      TxSkel -> (TxSkel -> TxSkel) -> TxSkel
forall a b. a -> (a -> b) -> b
& Optic' A_Lens NoIx TxSkel TxSkelMints
txSkelMintsL
      Optic' A_Lens NoIx TxSkel TxSkelMints
-> TxSkelMints -> TxSkel -> TxSkel
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
-> TxSkelMints
txSkelMintsFromList [(Versioned MintingPolicy, TxSkelRedeemer, TokenName, Integer)]
newMints
      TxSkel -> (TxSkel -> TxSkel) -> TxSkel
forall a b. a -> (a -> b) -> b
& Optic' A_Lens NoIx TxSkel (Map TxOutRef TxSkelRedeemer)
txSkelInsL
      Optic' A_Lens NoIx TxSkel (Map TxOutRef TxSkelRedeemer)
-> Map TxOutRef TxSkelRedeemer -> TxSkel -> TxSkel
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ [(TxOutRef, TxSkelRedeemer)] -> Map TxOutRef TxSkelRedeemer
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(TxOutRef, TxSkelRedeemer)]
newInputs
      TxSkel -> (TxSkel -> TxSkel) -> TxSkel
forall a b. a -> (a -> b) -> b
& Optic' A_Lens NoIx TxSkel [TxSkelProposal]
txSkelProposalsL
      Optic' A_Lens NoIx TxSkel [TxSkelProposal]
-> [TxSkelProposal] -> TxSkel -> TxSkel
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ [TxSkelProposal]
newProposals
      TxSkel -> (TxSkel -> TxSkel) -> TxSkel
forall a b. a -> (a -> b) -> b
& Optic'
  A_Lens
  NoIx
  TxSkel
  (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada))
txSkelWithdrawalsL
      Optic'
  A_Lens
  NoIx
  TxSkel
  (Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada))
-> Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
-> TxSkel
-> TxSkel
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
-> Map (Either (Versioned Script) PubKeyHash) (TxSkelRedeemer, Ada)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Either (Versioned Script) PubKeyHash, (TxSkelRedeemer, Ada))]
newWithdrawals