Skip to content

Commit d798c19

Browse files
committed
tx-generator cleanups
* Merge `createChangeInEra` with `createScriptChange`. * Make `mkUTxOScript` polymorphic on the era.
1 parent 753d91b commit d798c19

File tree

3 files changed

+37
-57
lines changed

3 files changed

+37
-57
lines changed

bench/tx-generator/src/Cardano/Benchmarking/PlutusExample.hs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE GADTs #-}
22
{-# LANGUAGE RankNTypes #-}
33
{-# LANGUAGE ScopedTypeVariables #-}
4+
{-# LANGUAGE TypeApplications #-}
45
module Cardano.Benchmarking.PlutusExample
56
where
67
import Prelude
@@ -21,31 +22,34 @@ import Cardano.Benchmarking.Wallet
2122
import qualified Plutus.V1.Ledger.Api as Plutus
2223
import Plutus.V1.Ledger.Contexts (ScriptContext(..), ScriptPurpose(..), TxInfo(..), TxOutRef(..))
2324

24-
mkUtxoScript ::
25-
NetworkId
25+
mkUTxOScript :: forall era.
26+
(IsCardanoEra era, IsShelleyBasedEra era)
27+
=> NetworkId
2628
-> (FilePath, Script PlutusScriptV1, ScriptData)
2729
-> Validity
28-
-> ToUTxO AlonzoEra
29-
mkUtxoScript networkId (scriptFile, script, txOutDatum) validity values
30+
-> ToUTxO era
31+
mkUTxOScript networkId (scriptFile, script, txOutDatum) validity values
3032
= ( map mkTxOut values
3133
, newFunds
3234
)
3335
where
34-
mkTxOut v = TxOut
35-
plutusScriptAddr
36-
(lovelaceToTxOutValue v)
37-
(TxOutDatumHash ScriptDataInAlonzoEra $ hashScriptData txOutDatum)
38-
ReferenceScriptNone
39-
4036
plutusScriptAddr = makeShelleyAddressInEra
4137
networkId
4238
(PaymentCredentialByScript $ hashScript script)
4339
NoStakeAddress
4440

41+
mkTxOut v = case scriptDataSupportedInEra (cardanoEra @ era) of
42+
Nothing -> error " mkUtxOScript scriptDataSupportedInEra==Nothing"
43+
Just tag -> TxOut
44+
plutusScriptAddr
45+
(lovelaceToTxOutValue v)
46+
(TxOutDatumHash tag $ hashScriptData txOutDatum)
47+
ReferenceScriptNone
48+
4549
newFunds txId = zipWith (mkNewFund txId) [TxIx 0 ..] values
4650

4751
mkNewFund :: TxId -> TxIx -> Lovelace -> Fund
48-
mkNewFund txId txIx val = Fund $ InAnyCardanoEra AlonzoEra $ FundInEra {
52+
mkNewFund txId txIx val = Fund $ InAnyCardanoEra (cardanoEra @ era) $ FundInEra {
4953
_fundTxIn = TxIn txId txIx
5054
, _fundVal = lovelaceToTxOutValue val
5155
, _fundSigningKey = Nothing

bench/tx-generator/src/Cardano/Benchmarking/Script/Core.hs

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ runBenchmarkInEra sourceWallet submitMode (ThreadName threadName) shape tps era
265265
let walletRefDst = walletRefSrc
266266
metadata <- makeMetadata
267267

268+
268269
fundSource <- liftIO (mkBufferedSource walletRefSrc
269270
(auxInputs shape)
270271
(auxMinValuePerUTxO shape)
@@ -326,6 +327,7 @@ runPlutusBenchmark sourceWallet submitMode scriptFile scriptBudget scriptData sc
326327
walletRefDst = walletRefSrc
327328
walletRefCollateral = walletRefSrc
328329
fundKey <- getName $ KeyName "pass-partout"
330+
329331
script <- liftIO $ PlutusExample.readScript scriptFile
330332
-- This does not remove the collateral from the wallet, i.e. same collateral is uses for everything.
331333
-- This is fine unless a script ever fails.
@@ -464,72 +466,44 @@ initWallet :: WalletName -> ActionM ()
464466
initWallet name = liftIO Wallet.initWallet >>= setName name
465467

466468
createChange :: AnyCardanoEra -> WalletName -> WalletName -> SubmitMode -> PayMode -> Lovelace -> Int -> ActionM ()
467-
createChange era sourceWallet dstWallet submitMode payMode value count = case payMode of
468-
PayToAddr keyName -> withEra era $ createChangeInEra sourceWallet dstWallet submitMode PlainOldFund keyName value count
469-
-- Problem here: PayToCollateral will create an output marked as collateral
470-
-- and also return any change to a collateral, which makes the returned change unusable.
471-
PayToCollateral keyName -> withEra era $ createChangeInEra sourceWallet dstWallet submitMode CollateralFund keyName value count
472-
PayToScript scriptFile scriptData -> createChangeScriptFunds sourceWallet dstWallet submitMode scriptFile scriptData value count
473-
474-
createChangeScriptFunds :: WalletName -> WalletName -> SubmitMode -> FilePath -> ScriptData -> Lovelace -> Int -> ActionM ()
475-
createChangeScriptFunds sourceWallet dstWallet submitMode scriptFile scriptData value count = do
476-
walletRef <- getName dstWallet
477-
networkId <- getUser TNetworkId
478-
protocolParameters <- getProtocolParameters
479-
_fundKey <- getName $ KeyName "pass-partout"
480-
fee <- getUser TFee
481-
script <- liftIO $ PlutusExample.readScript scriptFile --TODO: this should throw a file-not-found-error !
482-
let
483-
createCoins fundSource coins = do
484-
let
485-
-- selector :: FundSet.FundSource
486-
-- selector = mkWalletFundSource walletRef $ FundSet.selectMinValue $ sum coins + fee
487-
inOut :: [Lovelace] -> [Lovelace]
488-
inOut = Wallet.includeChange fee coins
489-
toUTxO = PlutusExample.mkUtxoScript networkId (scriptFile, script, scriptData) Confirmed
490-
fundToStore = mkWalletFundStore walletRef
491-
492-
tx <- liftIO $ sourceToStoreTransaction
493-
(genTx protocolParameters (TxInsCollateralNone, [])
494-
(mkFee fee) TxMetadataNone (KeyWitness KeyWitnessForSpending))
495-
fundSource inOut toUTxO fundToStore
496-
return $ fmap txInModeCardano tx
497-
addressMsg = Text.unpack $ serialiseAddress $ makeShelleyAddress networkId (PaymentCredentialByScript $ hashScript script) NoStakeAddress
498-
createChangeGeneric sourceWallet submitMode createCoins addressMsg value count
469+
createChange era sourceWallet dstWallet submitMode payMode value count
470+
= withEra era $ createChangeInEra sourceWallet dstWallet submitMode payMode value count
499471

500472
createChangeInEra :: forall era. IsShelleyBasedEra era
501473
=> WalletName
502474
-> WalletName
503475
-> SubmitMode
504-
-> Variant
505-
-> KeyName
476+
-> PayMode
506477
-> Lovelace
507478
-> Int
508479
-> AsType era
509480
-> ActionM ()
510-
createChangeInEra sourceWallet dstWallet submitMode variant keyName value count _proxy = do
481+
createChangeInEra sourceWallet dstWallet submitMode payMode value count era = do
511482
networkId <- getUser TNetworkId
512483
walletRef <- getName dstWallet
513484
fee <- getUser TFee
514485
protocolParameters <- getProtocolParameters
515-
fundKey <- getName keyName
486+
(toUTxO, addressMsg) <- case payMode of
487+
PayToAddr keyName -> do
488+
fundKey <- getName keyName
489+
return ( Wallet.mkUTxOVariant PlainOldFund networkId fundKey Confirmed
490+
, Text.unpack $ serialiseAddress $ keyAddress @ era networkId fundKey)
491+
PayToCollateral keyName -> do
492+
fundKey <- getName keyName
493+
return ( Wallet.mkUTxOVariant CollateralFund networkId fundKey Confirmed
494+
, Text.unpack $ serialiseAddress $ keyAddress @ era networkId fundKey)
495+
PayToScript scriptFile scriptData -> do
496+
script <- liftIO $ PlutusExample.readScript scriptFile --TODO: this should throw a file-not-found-error !
497+
return ( PlutusExample.mkUTxOScript networkId (scriptFile, script, scriptData) Confirmed
498+
, Text.unpack $ serialiseAddress $ makeShelleyAddress networkId (PaymentCredentialByScript $ hashScript script) NoStakeAddress )
516499
let
517500
createCoins :: FundSet.FundSource -> [Lovelace] -> ActionM (Either String (TxInMode CardanoMode))
518501
createCoins fundSource coins = do
519-
let
520-
-- selector :: FundSet.FundSource
521-
-- selector = mkWalletFundSource walletRef $ FundSet.selectMinValue $ sum coins + fee
522-
inOut :: [Lovelace] -> [Lovelace]
523-
inOut = Wallet.includeChange fee coins
524-
toUTxO = Wallet.mkUTxOVariant variant networkId fundKey Confirmed
525-
fundToStore = mkWalletFundStore walletRef
526-
527502
(tx :: Either String (Tx era)) <- liftIO $ sourceToStoreTransaction
528503
(genTx protocolParameters (TxInsCollateralNone, [])
529504
(mkFee fee) TxMetadataNone (KeyWitness KeyWitnessForSpending))
530-
fundSource inOut toUTxO fundToStore
505+
fundSource (Wallet.includeChange fee coins) toUTxO (mkWalletFundStore walletRef)
531506
return $ fmap txInModeCardano tx
532-
addressMsg = Text.unpack $ serialiseAddress $ keyAddress @ era networkId fundKey
533507
createChangeGeneric sourceWallet submitMode createCoins addressMsg value count
534508

535509
createChangeGeneric ::

bench/tx-generator/src/Cardano/Benchmarking/Wallet.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import Cardano.Api.Shelley (ProtocolParameters, ReferenceScript(..))
1818
type WalletRef = MVar Wallet
1919

2020
type TxGenerator era = [Fund] -> [TxOut CtxTx era] -> Either String (Tx era, TxId)
21+
-- Todo: ToUTxO implicitly assumes that all outputs are of the same type (Plutus. normal, collateral).
22+
-- This is too special
2123
type ToUTxO era = [Lovelace] -> ([TxOut CtxTx era], TxId -> [Fund])
2224

2325
data Wallet = Wallet {

0 commit comments

Comments
 (0)