-- | This module provides primitives to translate elements from our skeleton to
-- actual transaction elements, including the transaction itself. Ideally, this
-- module should only export `generateTx` but we need to make visible a few
-- other primitives that will be used in balancing.
module Cooked.MockChain.GenerateTx
  ( GenerateTxError (..),
    generateBodyContent,
    generateTxOut,
    generateTx,
  )
where

import Cardano.Api qualified as Cardano
import Cardano.Node.Emulator.Internal.Node qualified as Emulator
import Control.Monad.Reader
import Cooked.MockChain.GenerateTx.Body
import Cooked.MockChain.GenerateTx.Common
import Cooked.MockChain.GenerateTx.Output
import Cooked.Skeleton
import Cooked.Wallet
import Data.Map (Map)
import Data.Set (Set)
import Plutus.Script.Utils.Scripts qualified as Script
import PlutusLedgerApi.V3 qualified as Api

-- | Generates a Cardano `TxOut` from a `TxSkelOut`
generateTxOut ::
  -- | The network Id
  Cardano.NetworkId ->
  -- | The output to translate
  TxSkelOut ->
  Either GenerateTxError (Cardano.TxOut Cardano.CtxTx Cardano.ConwayEra)
generateTxOut :: NetworkId
-> TxSkelOut -> Either GenerateTxError (TxOut CtxTx ConwayEra)
generateTxOut NetworkId
networkId TxSkelOut
txSkelOut = ReaderT NetworkId (Either GenerateTxError) (TxOut CtxTx ConwayEra)
-> NetworkId -> Either GenerateTxError (TxOut CtxTx ConwayEra)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (TxSkelOut
-> ReaderT
     NetworkId (Either GenerateTxError) (TxOut CtxTx ConwayEra)
toCardanoTxOut TxSkelOut
txSkelOut) NetworkId
networkId

-- | Generates a transaction body for a skeleton
generateBodyContent ::
  -- | fee to apply to body generation
  Integer ->
  -- | parameters of the emulator
  Emulator.Params ->
  -- | datums present in our environment
  Map Api.DatumHash Api.Datum ->
  -- | txouts present in our environment
  Map Api.TxOutRef Api.TxOut ->
  -- | validators present in our environment
  Map Script.ValidatorHash (Script.Versioned Script.Validator) ->
  -- | Possible collaterals to use
  Maybe (Set Api.TxOutRef, Wallet) ->
  -- | The skeleton to translate
  TxSkel ->
  Either GenerateTxError (Cardano.TxBodyContent Cardano.BuildTx Cardano.ConwayEra)
generateBodyContent :: Integer
-> Params
-> Map DatumHash Datum
-> Map TxOutRef TxOut
-> Map ValidatorHash (Versioned Validator)
-> Maybe (Set TxOutRef, Wallet)
-> TxSkel
-> Either GenerateTxError (TxBodyContent BuildTx ConwayEra)
generateBodyContent Integer
fee Params
params Map DatumHash Datum
managedData Map TxOutRef TxOut
managedTxOuts Map ValidatorHash (Versioned Validator)
managedValidators Maybe (Set TxOutRef, Wallet)
mCollaterals =
  (ReaderT
   TxContext
   (Either GenerateTxError)
   (TxBodyContent BuildTx ConwayEra)
 -> TxContext
 -> Either GenerateTxError (TxBodyContent BuildTx ConwayEra))
-> TxContext
-> ReaderT
     TxContext
     (Either GenerateTxError)
     (TxBodyContent BuildTx ConwayEra)
-> Either GenerateTxError (TxBodyContent BuildTx ConwayEra)
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT
  TxContext
  (Either GenerateTxError)
  (TxBodyContent BuildTx ConwayEra)
-> TxContext
-> Either GenerateTxError (TxBodyContent BuildTx ConwayEra)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT TxContext {Integer
Maybe (Set TxOutRef, Wallet)
Map TxOutRef TxOut
Map DatumHash Datum
Map ValidatorHash (Versioned Validator)
Params
fee :: Integer
params :: Params
managedData :: Map DatumHash Datum
managedTxOuts :: Map TxOutRef TxOut
managedValidators :: Map ValidatorHash (Versioned Validator)
mCollaterals :: Maybe (Set TxOutRef, Wallet)
fee :: Integer
mCollaterals :: Maybe (Set TxOutRef, Wallet)
params :: Params
managedData :: Map DatumHash Datum
managedTxOuts :: Map TxOutRef TxOut
managedValidators :: Map ValidatorHash (Versioned Validator)
..} (ReaderT
   TxContext
   (Either GenerateTxError)
   (TxBodyContent BuildTx ConwayEra)
 -> Either GenerateTxError (TxBodyContent BuildTx ConwayEra))
-> (TxSkel
    -> ReaderT
         TxContext
         (Either GenerateTxError)
         (TxBodyContent BuildTx ConwayEra))
-> TxSkel
-> Either GenerateTxError (TxBodyContent BuildTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxSkel
-> ReaderT
     TxContext
     (Either GenerateTxError)
     (TxBodyContent BuildTx ConwayEra)
txSkelToBodyContent

-- | Generates a transaction from a skeleton. Shares the same parameters as
-- `generateTxOut`. It consists of generating the body and then signing it.
generateTx ::
  -- | fee to apply to body generation
  Integer ->
  -- | parameters of the emulator
  Emulator.Params ->
  -- | datums present in our environment
  Map Api.DatumHash Api.Datum ->
  -- | txouts present in our environment
  Map Api.TxOutRef Api.TxOut ->
  -- | validators present in our environment
  Map Script.ValidatorHash (Script.Versioned Script.Validator) ->
  -- | The collateral inputs and associated collateral wallet
  Maybe (Set Api.TxOutRef, Wallet) ->
  -- | The skeleton to translate
  TxSkel ->
  Either GenerateTxError (Cardano.Tx Cardano.ConwayEra)
generateTx :: Integer
-> Params
-> Map DatumHash Datum
-> Map TxOutRef TxOut
-> Map ValidatorHash (Versioned Validator)
-> Maybe (Set TxOutRef, Wallet)
-> TxSkel
-> Either GenerateTxError (Tx ConwayEra)
generateTx Integer
fee Params
params Map DatumHash Datum
managedData Map TxOutRef TxOut
managedTxOuts Map ValidatorHash (Versioned Validator)
managedValidators Maybe (Set TxOutRef, Wallet)
mCollaterals =
  (ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra)
 -> TxContext -> Either GenerateTxError (Tx ConwayEra))
-> TxContext
-> ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra)
-> Either GenerateTxError (Tx ConwayEra)
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra)
-> TxContext -> Either GenerateTxError (Tx ConwayEra)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT TxContext {Integer
Maybe (Set TxOutRef, Wallet)
Map TxOutRef TxOut
Map DatumHash Datum
Map ValidatorHash (Versioned Validator)
Params
fee :: Integer
mCollaterals :: Maybe (Set TxOutRef, Wallet)
params :: Params
managedData :: Map DatumHash Datum
managedTxOuts :: Map TxOutRef TxOut
managedValidators :: Map ValidatorHash (Versioned Validator)
fee :: Integer
params :: Params
managedData :: Map DatumHash Datum
managedTxOuts :: Map TxOutRef TxOut
managedValidators :: Map ValidatorHash (Versioned Validator)
mCollaterals :: Maybe (Set TxOutRef, Wallet)
..} (ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra)
 -> Either GenerateTxError (Tx ConwayEra))
-> (TxSkel
    -> ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra))
-> TxSkel
-> Either GenerateTxError (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxSkel -> ReaderT TxContext (Either GenerateTxError) (Tx ConwayEra)
txSkelToCardanoTx