Skip to content
This repository was archived by the owner on Dec 2, 2024. It is now read-only.

Commit 87bfb9f

Browse files
Fix cardano-node-emulator
1 parent 9fabd72 commit 87bfb9f

File tree

10 files changed

+134
-138
lines changed

10 files changed

+134
-138
lines changed

cardano-node-emulator/cardano-node-emulator.cabal

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,28 +45,30 @@ library
4545
-- Local components
4646
--------------------
4747
build-depends:
48-
, freer-extras >=1.2.0
49-
, plutus-ledger >=1.2.0
48+
, freer-extras >=1.2.0
49+
, plutus-ledger >=1.2.0
50+
, plutus-script-utils >=1.2.0
5051

5152
--------------------------
5253
-- Other IOG dependencies
5354
--------------------------
5455
build-depends:
55-
, cardano-api:{cardano-api, gen} >=8.0
56+
, cardano-api:{cardano-api, gen} ^>=8.2
5657
, cardano-crypto
5758
, cardano-ledger-allegra
5859
, cardano-ledger-alonzo
60+
, cardano-ledger-api
5961
, cardano-ledger-babbage
6062
, cardano-ledger-core
6163
, cardano-ledger-mary
6264
, cardano-ledger-shelley
6365
, cardano-slotting
64-
, mtl
6566
, ouroboros-consensus
6667
, plutus-core >=1.0.0
6768
, plutus-ledger-api >=1.0.0
6869
, plutus-tx >=1.0.0
69-
, quickcheck-contractmodel >=0.1.4.0
70+
71+
-- , quickcheck-contractmodel >=0.1.4.0
7072

7173
------------------------
7274
-- Non-IOG dependencies
@@ -86,6 +88,7 @@ library
8688
, mtl
8789
, prettyprinter >=1.1.0.1
8890
, QuickCheck
91+
, quickcheck-contractmodel
8992
, quickcheck-dynamic
9093
, serialise
9194
, text

cardano-node-emulator/src/Cardano/Node/Emulator/Generators.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ import Data.Maybe (fromMaybe, isNothing)
7979
import Data.Set (Set)
8080
import Data.Set qualified as Set
8181
import Data.String (fromString)
82-
import Gen.Cardano.Api.Typed qualified as Gen
8382
import GHC.Stack (HasCallStack)
8483
import Hedgehog (Gen, MonadGen, MonadTest, Range)
8584
import Hedgehog qualified as H
@@ -91,15 +90,16 @@ import Ledger (CardanoTx (CardanoEmulatorEraTx), Interval, MintingPolicy (getMin
9190
ValidationErrorInPhase, ValidationPhase (Phase1, Phase2), ValidationResult (FailPhase1, FailPhase2),
9291
addCardanoTxSignature, createGenesisTransaction, minLovelaceTxOutEstimated, pubKeyAddress, txOutValue)
9392
import Ledger.CardanoWallet qualified as CW
93+
import Ledger.Scripts qualified as Script
9494
import Ledger.Tx qualified as Tx
9595
import Ledger.Tx.CardanoAPI (ToCardanoError, fromCardanoPlutusScript)
9696
import Ledger.Tx.CardanoAPI qualified as C hiding (makeTransactionBody)
9797
import Ledger.Value.CardanoAPI qualified as Value
9898
import Numeric.Natural (Natural)
99-
import Plutus.V1.Ledger.Api qualified as V1
100-
import Plutus.V1.Ledger.Interval qualified as Interval
101-
import Plutus.V1.Ledger.Scripts qualified as Script
99+
import PlutusLedgerApi.V1 qualified as V1
100+
import PlutusLedgerApi.V1.Interval qualified as Interval
102101
import PlutusTx (toData)
102+
import Test.Gen.Cardano.Api.Typed qualified as Gen
103103

104104
-- | Attach signatures of all known private keys to a transaction.
105105
signAll :: CardanoTx -> CardanoTx
@@ -222,7 +222,7 @@ makeTx
222222
=> C.TxBodyContent C.BuildTx C.BabbageEra
223223
-> m CardanoTx
224224
makeTx bodyContent = do
225-
txBody <- either (fail . ("makeTx: Can't create TxBody: " <>) . show) pure $ C.makeTransactionBody bodyContent
225+
txBody <- either (fail . ("makeTx: Can't create TxBody: " <>) . show) pure $ C.createAndValidateTransactionBody bodyContent
226226
pure $ signAll $ CardanoEmulatorEraTx $ C.Tx txBody []
227227

228228
-- | Generate a valid transaction, using the unspent outputs provided.
@@ -278,7 +278,7 @@ genValidTransactionBodySpending' g ins totalVal = do
278278
(C.AsPlutusScript C.AsPlutusScriptV2)
279279
(getMintingPolicy alwaysSucceedPolicy))
280280
<*> pure C.NoScriptDatumForMint
281-
<*> pure (C.fromPlutusData $ toData Script.unitRedeemer)
281+
<*> pure (C.unsafeHashableScriptData $ C.fromPlutusData $ toData Script.unitRedeemer)
282282
<*> pure C.zeroExecutionUnits
283283
let txMintValue = C.TxMintValue C.MultiAssetInBabbageEra (fromMaybe mempty mintValue)
284284
(C.BuildTxWith (Map.singleton alwaysSucceedPolicyId mintWitness))

cardano-node-emulator/src/Cardano/Node/Emulator/Internal/Node/Chain.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import GHC.Generics (Generic)
3333
import Ledger (Block, Blockchain, CardanoTx, OnChainTx, Slot (Slot), getCardanoTxId, getCardanoTxValidityRange,
3434
unOnChain)
3535
import Ledger.Index qualified as Index
36-
import Ledger.Interval qualified as Interval
36+
import PlutusLedgerApi.V1.Interval qualified as Interval
3737
import Prettyprinter (Pretty (pretty), vsep, (<+>))
3838

3939
-- | Events produced by the blockchain emulator.

cardano-node-emulator/src/Cardano/Node/Emulator/Internal/Node/Fee.hs

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ module Cardano.Node.Emulator.Internal.Node.Fee(
1919
import Cardano.Api qualified as C
2020
import Cardano.Api.Shelley qualified as C
2121
import Cardano.Api.Shelley qualified as C.Api
22-
import Cardano.Ledger.BaseTypes (Globals (systemStart))
23-
import Cardano.Ledger.Core qualified as C.Ledger (Tx)
24-
import Cardano.Ledger.Shelley.API qualified as C.Ledger hiding (Tx)
25-
import Cardano.Node.Emulator.Internal.Node.Params (EmulatorEra, PParams, Params (emulatorPParams), emulatorEraHistory,
22+
import Cardano.Ledger.BaseTypes (Globals (systemStart), epochInfo)
23+
import Cardano.Node.Emulator.Internal.Node.Params (EmulatorEra, Params (emulatorPParams), bundledProtocolParameters,
2624
emulatorGlobals, pProtocolParams)
2725
import Cardano.Node.Emulator.Internal.Node.Validation (CardanoLedgerError, UTxO (UTxO), makeTransactionBody)
2826
import Control.Arrow ((&&&))
@@ -40,20 +38,19 @@ import Ledger.Index (UtxoIndex, ValidationError (MaxCollateralInputsExceeded, Tx
4038
ValidationPhase (Phase1), adjustTxOut, minAdaTxOutEstimated)
4139
import Ledger.Tx (ToCardanoError (TxBodyError), TxOut)
4240
import Ledger.Tx qualified as Tx
43-
import Ledger.Tx.CardanoAPI (CardanoBuildTx (CardanoBuildTx), fromPlutusIndex, getCardanoBuildTx, toCardanoFee,
41+
import Ledger.Tx.CardanoAPI (CardanoBuildTx (CardanoBuildTx), getCardanoBuildTx, toCardanoFee,
4442
toCardanoReturnCollateral, toCardanoTotalCollateral)
4543
import Ledger.Tx.CardanoAPI qualified as CardanoAPI
4644
import Ledger.Value.CardanoAPI (isZero, lovelaceToValue, split, valueGeq)
4745

4846
estimateCardanoBuildTxFee
4947
:: Params
50-
-> UTxO EmulatorEra
5148
-> CardanoBuildTx
5249
-> Either CardanoLedgerError C.Lovelace
53-
estimateCardanoBuildTxFee params utxo txBodyContent = do
50+
estimateCardanoBuildTxFee params txBodyContent = do
5451
let nkeys = C.Api.estimateTransactionKeyWitnessCount (getCardanoBuildTx txBodyContent)
55-
txBody <- makeTransactionBody params utxo txBodyContent
56-
pure $ evaluateTransactionFee (emulatorPParams params) txBody nkeys
52+
txBody <- makeTransactionBody txBodyContent
53+
pure $ evaluateTransactionFee (bundledProtocolParameters params) txBody nkeys
5754

5855
-- | Creates a balanced transaction by calculating the execution units, the fees and the change,
5956
-- which is assigned to the given address. Only balances Ada.
@@ -65,7 +62,7 @@ makeAutoBalancedTransaction
6562
-> Either CardanoLedgerError (C.Api.Tx C.Api.BabbageEra)
6663
makeAutoBalancedTransaction params utxo (CardanoBuildTx txBodyContent) cChangeAddr = first Right $ do
6764
-- Compute the change.
68-
C.Api.BalancedTxBody _ change _ <- first (TxBodyError . C.Api.displayError) $ balance []
65+
C.Api.BalancedTxBody _ _ change _ <- first (TxBodyError . C.Api.displayError) $ balance []
6966
let
7067
-- Recompute execution units with full set of UTxOs, including change.
7168
trial = balance [change]
@@ -76,18 +73,19 @@ makeAutoBalancedTransaction params utxo (CardanoBuildTx txBodyContent) cChangeAd
7673
C.Api.TxOut addr (C.Api.TxOutValue vtype $ value <> lovelaceToValue delta) datum _referenceScript
7774
_ -> change
7875
-- Construct the body with correct execution units and fees.
79-
C.Api.BalancedTxBody txBody _ _ <- first (TxBodyError . C.Api.displayError) $ balance [change']
76+
C.Api.BalancedTxBody _ txBody _ _ <- first (TxBodyError . C.Api.displayError) $ balance [change']
8077
pure $ C.Api.makeSignedTransaction [] txBody
8178
where
82-
eh = emulatorEraHistory params
83-
ss = systemStart $ emulatorGlobals params
79+
globals = emulatorGlobals params
80+
ei = C.Api.LedgerEpochInfo $ epochInfo globals
81+
ss = systemStart globals
8482
utxo' = fromLedgerUTxO utxo
8583
balance extraOuts = C.Api.makeTransactionBodyAutoBalance
86-
C.Api.BabbageEraInCardanoMode
8784
ss
88-
eh
85+
ei
8986
(pProtocolParams params)
9087
mempty
88+
mempty
9189
utxo'
9290
txBodyContent { C.Api.txOuts = C.Api.txOuts txBodyContent ++ extraOuts }
9391
cChangeAddr
@@ -117,11 +115,10 @@ makeAutoBalancedTransactionWithUtxoProvider params txUtxo cChangeAddr utxoProvid
117115

118116
calcFee n fee = do
119117

120-
(txBodyContent, extraUtxos) <- handleBalanceTx params txUtxo cChangeAddr utxoProvider errorReporter fee unbalancedBodyContent
118+
(txBodyContent, _) <- handleBalanceTx params txUtxo cChangeAddr utxoProvider errorReporter fee unbalancedBodyContent
121119

122120
newFee <- either errorReporter pure $ do
123-
let cUtxo = fromPlutusIndex $ txUtxo <> extraUtxos
124-
estimateCardanoBuildTxFee params cUtxo (CardanoBuildTx txBodyContent)
121+
estimateCardanoBuildTxFee params (CardanoBuildTx txBodyContent)
125122

126123
if newFee /= fee
127124
then if n == (0 :: Int)
@@ -132,11 +129,10 @@ makeAutoBalancedTransactionWithUtxoProvider params txUtxo cChangeAddr utxoProvid
132129

133130
theFee <- calcFee 5 initialFeeEstimate
134131

135-
(txBodyContent, extraUtxos) <- handleBalanceTx params txUtxo cChangeAddr utxoProvider errorReporter theFee unbalancedBodyContent
132+
(txBodyContent, _) <- handleBalanceTx params txUtxo cChangeAddr utxoProvider errorReporter theFee unbalancedBodyContent
136133

137134
either errorReporter pure $ do
138-
let cUtxo = fromPlutusIndex $ txUtxo <> extraUtxos
139-
C.makeSignedTransaction [] <$> makeTransactionBody params cUtxo (CardanoBuildTx txBodyContent)
135+
C.makeSignedTransaction [] <$> makeTransactionBody (CardanoBuildTx txBodyContent)
140136

141137
-- | Balance an unbalanced transaction by adding missing inputs and outputs
142138
handleBalanceTx
@@ -351,9 +347,5 @@ fromLedgerUTxO (UTxO utxo) =
351347
$ utxo
352348

353349
-- Adapted from cardano-api Cardano.API.Fee to avoid PParams conversion
354-
evaluateTransactionFee :: PParams -> C.Api.TxBody C.Api.BabbageEra -> Word -> C.Api.Lovelace
355-
evaluateTransactionFee pparams txbody keywitcount = case C.Api.makeSignedTransaction [] txbody of
356-
C.Api.ShelleyTx _ tx -> evalShelleyBasedEra tx
357-
where
358-
evalShelleyBasedEra :: C.Ledger.Tx (C.Api.ShelleyLedgerEra C.Api.BabbageEra) -> C.Api.Lovelace
359-
evalShelleyBasedEra tx = C.Api.fromShelleyLovelace $ C.Ledger.evaluateTransactionFee pparams tx keywitcount
350+
evaluateTransactionFee :: C.BundledProtocolParameters C.Api.BabbageEra -> C.Api.TxBody C.Api.BabbageEra -> Word -> C.Api.Lovelace
351+
evaluateTransactionFee params txbody keywitcount = C.evaluateTransactionFee params txbody keywitcount 0

cardano-node-emulator/src/Cardano/Node/Emulator/Internal/Node/Params.hs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
{-# LANGUAGE RecordWildCards #-}
66
{-# LANGUAGE TemplateHaskell #-}
77
{-# OPTIONS_GHC -Wno-orphans #-}
8+
{-# LANGUAGE TupleSections #-}
89
-- | The set of parameters, like protocol parameters and slot configuration.
910
module Cardano.Node.Emulator.Internal.Node.Params (
1011
Params(..),
1112
paramsWithProtocolsParameters,
1213
slotConfigL,
1314
emulatorPParamsL,
14-
pParamsFromProtocolParams,
1515
pProtocolParams,
16+
pParamsFromProtocolParams,
17+
bundledProtocolParameters,
1618
protocolParamsL,
1719
networkIdL,
1820
increaseTransactionLimits,
@@ -30,10 +32,12 @@ module Cardano.Node.Emulator.Internal.Node.Params (
3032

3133
import Cardano.Api qualified as C
3234
import Cardano.Api.Shelley qualified as C
35+
import Cardano.Ledger.Alonzo.PParams qualified as C
36+
import Cardano.Ledger.Alonzo.Scripts qualified as Alonzo
3337
import Cardano.Ledger.Babbage (BabbageEra)
34-
import Cardano.Ledger.Babbage.PParams (retractPP)
3538
import Cardano.Ledger.Babbage.PParams qualified as C
3639
import Cardano.Ledger.BaseTypes (boundRational)
40+
import Cardano.Ledger.Core qualified as C
3741
import Cardano.Ledger.Crypto (StandardCrypto)
3842
import Cardano.Ledger.Shelley.API (Coin (Coin), Globals, ShelleyGenesis, mkShelleyGlobals)
3943
import Cardano.Ledger.Shelley.API qualified as C.Ledger
@@ -47,17 +51,18 @@ import Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), Value (Object), (.:),
4751
import Data.Aeson qualified as JSON
4852
import Data.Aeson.Types (prependFailure, typeMismatch)
4953
import Data.Default (Default (def))
50-
import Data.Map (fromList)
51-
import Data.Maybe (fromMaybe)
54+
import Data.Map qualified as Map
55+
import Data.Maybe (fromJust, fromMaybe)
5256
import Data.Ratio ((%))
57+
import Data.SOP.Counting qualified as Ouroboros
5358
import Data.SOP.Strict (K (K), NP (Nil, (:*)))
5459
import GHC.Generics (Generic)
5560
import GHC.Natural (Natural)
5661
import Ledger.Test (testnet)
5762
import Ouroboros.Consensus.HardFork.History qualified as Ouroboros
58-
import Ouroboros.Consensus.Util.Counting qualified as Ouroboros
59-
import Plutus.V1.Ledger.Api (POSIXTime (POSIXTime))
60-
import PlutusCore (defaultCostModelParams)
63+
import Plutus.Script.Utils.Scripts (Language (PlutusV3))
64+
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCostModelParams)
65+
import PlutusLedgerApi.V1 (POSIXTime (POSIXTime))
6166
import Prettyprinter (Pretty (pretty), viaShow, vsep, (<+>))
6267

6368
-- | The default era for the emulator
@@ -94,7 +99,13 @@ pProtocolParams :: Params -> C.ProtocolParameters
9499
pProtocolParams p = C.fromLedgerPParams C.ShelleyBasedEraBabbage $ emulatorPParams p
95100

96101
pParamsFromProtocolParams :: C.ProtocolParameters -> PParams
97-
pParamsFromProtocolParams = C.toLedgerPParams C.ShelleyBasedEraBabbage
102+
pParamsFromProtocolParams = either (error . show) id . C.toLedgerPParams C.ShelleyBasedEraBabbage
103+
104+
bundledProtocolParameters :: Params -> C.BundledProtocolParameters C.BabbageEra
105+
bundledProtocolParameters params = C.BundleAsShelleyBasedProtocolParameters
106+
C.ShelleyBasedEraBabbage
107+
(pProtocolParams params)
108+
(emulatorPParams params)
98109

99110
paramsWithProtocolsParameters :: SlotConfig -> C.ProtocolParameters -> C.NetworkId -> Params
100111
paramsWithProtocolsParameters sc p = Params sc (pParamsFromProtocolParams p)
@@ -114,7 +125,7 @@ instance ToJSON Params where
114125
instance FromJSON Params where
115126
parseJSON (Object v) = Params
116127
<$> (v .: "pSlotConfig" >>= parseJSON)
117-
<*> (C.toLedgerPParams C.ShelleyBasedEraBabbage <$> (v .: "pProtocolParams" >>= parseJSON))
128+
<*> (pParamsFromProtocolParams <$> (v .: "pProtocolParams" >>= parseJSON))
118129
<*> (v .: "pNetworkId" >>= parseJSON)
119130
parseJSON _ = fail "Can't parse a Param"
120131

@@ -163,9 +174,10 @@ instance Default C.ProtocolParameters where
163174
, protocolParamMonetaryExpansion = 3 % 1000
164175
, protocolParamTreasuryCut = 1 % 5
165176
, protocolParamUTxOCostPerWord = Nothing -- Obsolete from babbage onwards
166-
, protocolParamCostModels = fromList
167-
[ (C.AnyPlutusScriptVersion C.PlutusScriptV1, C.CostModel $ fromMaybe (error "Ledger.Params: defaultCostModelParams is broken") defaultCostModelParams)
168-
, (C.AnyPlutusScriptVersion C.PlutusScriptV2, C.CostModel $ fromMaybe (error "Ledger.Params: defaultCostModelParams is broken") defaultCostModelParams) ]
177+
, protocolParamCostModels =
178+
let costModel = fromJust $ defaultCostModelParams >>= Alonzo.costModelFromMap PlutusV3
179+
costModels = Map.fromList $ map (, costModel) [minBound .. maxBound]
180+
in C.fromAlonzoCostModels $ Alonzo.CostModels costModels mempty mempty
169181
, protocolParamPrices = Just (C.ExecutionUnitPrices {priceExecutionSteps = 721 % 10000000, priceExecutionMemory = 577 % 10000})
170182
, protocolParamMaxTxExUnits = Just (C.ExecutionUnits {executionSteps = 10000000000, executionMemory = 14000000})
171183
, protocolParamMaxBlockExUnits = Just (C.ExecutionUnits {executionSteps = 40000000000, executionMemory = 62000000})
@@ -192,14 +204,18 @@ emulatorGlobals :: Params -> Globals
192204
emulatorGlobals params = mkShelleyGlobals
193205
(genesisDefaultsFromParams params)
194206
(fixedEpochInfo emulatorEpochSize (slotLength params))
195-
(fst $ C.protocolParamProtocolVersion $ pProtocolParams params)
207+
(toEnum $ fromIntegral $ fst $ C.protocolParamProtocolVersion $ pProtocolParams params)
196208

197-
genesisDefaultsFromParams :: Params -> ShelleyGenesis EmulatorEra
209+
genesisDefaultsFromParams :: Params -> ShelleyGenesis StandardCrypto
198210
genesisDefaultsFromParams params@Params { pSlotConfig, pNetworkId } = C.shelleyGenesisDefaults
199211
{ C.sgSystemStart = posixTimeToUTCTime $ scSlotZeroTime pSlotConfig
200212
, C.sgNetworkMagic = case pNetworkId of C.Testnet (C.NetworkMagic nm) -> nm; _ -> 0
201213
, C.sgNetworkId = case pNetworkId of C.Testnet _ -> C.Ledger.Testnet; C.Mainnet -> C.Ledger.Mainnet
202-
, C.sgProtocolParams = retractPP (Coin 0) d C.Ledger.NeutralNonce $ emulatorPParams params
214+
, C.sgProtocolParams = emulatorPParams params
215+
& C.downgradePParams (C.DowngradeBabbagePParams d C.Ledger.NeutralNonce)
216+
& C.downgradePParams (C.DowngradeAlonzoPParams (Coin 0))
217+
& C.downgradePParams ()
218+
& C.downgradePParams ()
203219
}
204220
where
205221
d = fromMaybe (error "3 % 5 should be valid UnitInterval") $ boundRational (3 % 5)
@@ -209,4 +225,4 @@ emulatorEraHistory :: Params -> C.EraHistory C.CardanoMode
209225
emulatorEraHistory params = C.EraHistory C.CardanoMode (Ouroboros.mkInterpreter $ Ouroboros.summaryWithExactly list)
210226
where
211227
one = Ouroboros.nonEmptyHead $ Ouroboros.getSummary $ Ouroboros.neverForksSummary emulatorEpochSize (slotLength params)
212-
list = Ouroboros.Exactly $ K one :* K one :* K one :* K one :* K one :* K one :* Nil
228+
list = Ouroboros.Exactly $ K one :* K one :* K one :* K one :* K one :* K one :* K one :* Nil

cardano-node-emulator/src/Cardano/Node/Emulator/Internal/Node/TimeSlot.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ import Data.Time.Clock.POSIX qualified as Time
3333
import GHC.Generics (Generic)
3434
import Ledger.Orphans ()
3535
import Ledger.Slot (Slot (Slot), SlotRange)
36-
import Plutus.V1.Ledger.Interval (Extended (Finite), Interval (Interval), LowerBound (LowerBound),
37-
UpperBound (UpperBound), interval, member)
38-
import Plutus.V1.Ledger.Time (POSIXTime (POSIXTime, getPOSIXTime), POSIXTimeRange)
36+
import PlutusLedgerApi.V1.Interval (Extended (Finite), Interval (Interval), LowerBound (LowerBound),
37+
UpperBound (UpperBound), interval, member)
38+
import PlutusLedgerApi.V1.Time (POSIXTime (POSIXTime, getPOSIXTime), POSIXTimeRange)
3939
import PlutusTx.Lift (makeLift)
4040
import PlutusTx.Prelude (Integer, divide, fmap, ($), (*), (+), (-), (.))
4141
import Prelude (Eq, IO, Show, (<$>))

0 commit comments

Comments
 (0)