@@ -54,6 +54,7 @@ module Cardano.Api.ProtocolParameters
54
54
-- * Errors
55
55
, ProtocolParametersError (.. )
56
56
, ProtocolParametersConversionError (.. )
57
+ , CostModelNotEnoughParametersError (.. )
57
58
58
59
-- * PraosNonce
59
60
, PraosNonce
@@ -143,14 +144,14 @@ import qualified PlutusLedgerApi.V3.ParamName as PlutusV3
143
144
import Control.Monad
144
145
import Data.Aeson (FromJSON (.. ), ToJSON (.. ), object , withObject , (.!=) , (.:) , (.:?) ,
145
146
(.=) )
146
- import Data.Bifunctor (bimap , first )
147
+ import Data.Bifunctor (first )
147
148
import Data.ByteString (ByteString )
148
149
import Data.Data (Data )
149
150
import Data.Either.Combinators (maybeToRight )
150
151
import Data.Int (Int64 )
151
152
import Data.Map.Strict (Map )
152
153
import qualified Data.Map.Strict as Map
153
- import Data.Maybe (isJust )
154
+ import Data.Maybe (fromMaybe , isJust )
154
155
import Data.Maybe.Strict (StrictMaybe (.. ))
155
156
import Data.String (IsString )
156
157
import Data.Text (Text )
@@ -1006,7 +1007,11 @@ newtype CostModels = CostModels {unCostModels :: Map AnyPlutusScriptVersion Cost
1006
1007
deriving (Eq , Show )
1007
1008
1008
1009
instance FromJSON CostModels where
1009
- parseJSON v = CostModels . fromAlonzoCostModels <$> parseJSON v
1010
+ parseJSON v = do
1011
+ pModels <- parseJSON v
1012
+ case fromAlonzoCostModels pModels of
1013
+ Left err -> fail $ displayError err
1014
+ Right costModels -> return $ CostModels costModels
1010
1015
1011
1016
instance ToJSON CostModels where
1012
1017
toJSON (CostModels costModels) =
@@ -1030,12 +1035,15 @@ toAlonzoCostModels m = do
1030
1035
1031
1036
fromAlonzoCostModels
1032
1037
:: Plutus. CostModels
1033
- -> Map AnyPlutusScriptVersion CostModel
1038
+ -> Either CostModelNotEnoughParametersError ( Map AnyPlutusScriptVersion CostModel )
1034
1039
fromAlonzoCostModels cModels =
1035
- fromList
1036
- . map (bimap fromAlonzoScriptLanguage fromAlonzoCostModel)
1037
- $ toList
1038
- $ Plutus. costModelsValid cModels
1040
+ case Map. toList errs of
1041
+ [] -> Right $ Map. mapKeys fromAlonzoScriptLanguage models -- All models are valid
1042
+ ((_, err) : _) -> Left err -- Take first error
1043
+ where
1044
+ (errs, models) = Map. mapEither id entries
1045
+ entries :: Map Plutus. Language (Either CostModelNotEnoughParametersError CostModel )
1046
+ entries = Map. map fromAlonzoCostModel $ Plutus. costModelsValid cModels
1039
1047
1040
1048
toAlonzoScriptLanguage :: AnyPlutusScriptVersion -> Plutus. Language
1041
1049
toAlonzoScriptLanguage (AnyPlutusScriptVersion PlutusScriptV1 ) = Plutus. PlutusV1
@@ -1051,8 +1059,11 @@ toAlonzoCostModel
1051
1059
:: CostModel -> Plutus. Language -> Either ProtocolParametersConversionError Alonzo. CostModel
1052
1060
toAlonzoCostModel (CostModel m) l = first (PpceInvalidCostModel (CostModel m)) $ Alonzo. mkCostModel l m
1053
1061
1054
- fromAlonzoCostModel :: Alonzo. CostModel -> CostModel
1055
- fromAlonzoCostModel m = CostModel $ Alonzo. getCostModelParams m
1062
+ fromAlonzoCostModel :: Alonzo. CostModel -> Either CostModelNotEnoughParametersError CostModel
1063
+ fromAlonzoCostModel m = validateCostModelSize Nothing lang params
1064
+ where
1065
+ params = Alonzo. getCostModelParams m
1066
+ lang = Alonzo. getCostModelLanguage m
1056
1067
1057
1068
validateCostModelSize
1058
1069
:: Maybe (ShelleyBasedEra era )
@@ -1076,14 +1087,15 @@ validateCostModelSize mSbe lang model
1076
1087
Plutus. PlutusV1 -> length $ allValues @ PlutusV1. ParamName -- 166
1077
1088
Plutus. PlutusV2 ->
1078
1089
let nParamNames = length $ allValues @ PlutusV2. ParamName -- 185
1090
+ lessTen = nParamNames - 10
1079
1091
in case mSbe of
1080
1092
Nothing ->
1081
1093
-- We don't know the era, so we can't know the exact number of parameters that is expected,
1082
1094
-- so we need to be lenient
1083
- nParamNames - 10
1095
+ lessTen
1084
1096
Just sbe ->
1085
1097
caseShelleyToBabbageOrConwayEraOnwards
1086
- (const $ nParamNames - 10 ) -- Ten parameters were added to V2 in Conway, need to remove them here
1098
+ (const lessTen ) -- Ten parameters were added to V2 in Conway, need to remove them here
1087
1099
(const nParamNames)
1088
1100
sbe
1089
1101
Plutus. PlutusV3 -> length $ allValues @ PlutusV3. ParamName -- 297
@@ -1346,32 +1358,41 @@ fromLedgerUpdate
1346
1358
=> Ledger. EraCrypto ledgerera ~ StandardCrypto
1347
1359
=> ShelleyBasedEra era
1348
1360
-> Ledger. Update ledgerera
1349
- -> UpdateProposal
1361
+ -> Either CostModelNotEnoughParametersError UpdateProposal
1350
1362
fromLedgerUpdate sbe (Ledger. Update ppup epochno) =
1351
- UpdateProposal ( fromLedgerProposedPPUpdates sbe ppup) epochno
1363
+ UpdateProposal <$> fromLedgerProposedPPUpdates sbe ppup <*> pure epochno
1352
1364
1353
1365
fromLedgerProposedPPUpdates
1354
1366
:: forall era ledgerera
1355
1367
. ShelleyLedgerEra era ~ ledgerera
1356
1368
=> Ledger. EraCrypto ledgerera ~ StandardCrypto
1357
1369
=> ShelleyBasedEra era
1358
1370
-> Ledger. ProposedPPUpdates ledgerera
1359
- -> Map (Hash GenesisKey ) ProtocolParametersUpdate
1360
- fromLedgerProposedPPUpdates sbe =
1361
- Map. map (fromLedgerPParamsUpdate sbe)
1362
- . Map. mapKeysMonotonic GenesisKeyHash
1363
- . (\ (Ledger. ProposedPPUpdates ppup) -> ppup)
1371
+ -> Either
1372
+ CostModelNotEnoughParametersError
1373
+ (Map (Hash GenesisKey ) ProtocolParametersUpdate )
1374
+ fromLedgerProposedPPUpdates sbe (Ledger. ProposedPPUpdates ppus) =
1375
+ case Map. toList errs of
1376
+ [] -> Right maps
1377
+ ((_, err) : _) -> Left err
1378
+ where
1379
+ (errs, maps) =
1380
+ Map. map (fromLedgerPParamsUpdate sbe) ppus
1381
+ & Map. mapKeysMonotonic GenesisKeyHash
1382
+ & Map. mapEither id
1364
1383
1365
1384
fromLedgerPParamsUpdate
1366
1385
:: ShelleyBasedEra era
1367
1386
-> Ledger. PParamsUpdate (ShelleyLedgerEra era )
1368
- -> ProtocolParametersUpdate
1369
- fromLedgerPParamsUpdate ShelleyBasedEraShelley = fromShelleyPParamsUpdate
1370
- fromLedgerPParamsUpdate ShelleyBasedEraAllegra = fromShelleyPParamsUpdate
1371
- fromLedgerPParamsUpdate ShelleyBasedEraMary = fromShelleyPParamsUpdate
1372
- fromLedgerPParamsUpdate ShelleyBasedEraAlonzo = fromAlonzoPParamsUpdate
1373
- fromLedgerPParamsUpdate ShelleyBasedEraBabbage = fromBabbagePParamsUpdate
1374
- fromLedgerPParamsUpdate ShelleyBasedEraConway = fromConwayPParamsUpdate
1387
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1388
+ fromLedgerPParamsUpdate era ppu =
1389
+ case era of
1390
+ ShelleyBasedEraShelley -> pure $ fromShelleyPParamsUpdate ppu
1391
+ ShelleyBasedEraAllegra -> pure $ fromShelleyPParamsUpdate ppu
1392
+ ShelleyBasedEraMary -> pure $ fromShelleyPParamsUpdate ppu
1393
+ ShelleyBasedEraAlonzo -> fromAlonzoPParamsUpdate ppu
1394
+ ShelleyBasedEraBabbage -> fromBabbagePParamsUpdate ppu
1395
+ ShelleyBasedEraConway -> fromConwayPParamsUpdate ppu
1375
1396
1376
1397
fromShelleyCommonPParamsUpdate
1377
1398
:: EraPParams ledgerera
@@ -1431,64 +1452,75 @@ fromShelleyPParamsUpdate ppu =
1431
1452
fromAlonzoCommonPParamsUpdate
1432
1453
:: AlonzoEraPParams ledgerera
1433
1454
=> PParamsUpdate ledgerera
1434
- -> ProtocolParametersUpdate
1455
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1435
1456
fromAlonzoCommonPParamsUpdate ppu =
1436
- (fromShelleyCommonPParamsUpdate ppu)
1437
- { protocolUpdateCostModels =
1438
- maybe
1439
- mempty
1440
- fromAlonzoCostModels
1441
- (strictMaybeToMaybe (ppu ^. ppuCostModelsL))
1442
- , protocolUpdatePrices =
1443
- fromAlonzoPrices
1444
- <$> strictMaybeToMaybe (ppu ^. ppuPricesL)
1445
- , protocolUpdateMaxTxExUnits =
1446
- fromAlonzoExUnits
1447
- <$> strictMaybeToMaybe (ppu ^. ppuMaxTxExUnitsL)
1448
- , protocolUpdateMaxBlockExUnits =
1449
- fromAlonzoExUnits
1450
- <$> strictMaybeToMaybe (ppu ^. ppuMaxBlockExUnitsL)
1451
- , protocolUpdateMaxValueSize = strictMaybeToMaybe (ppu ^. ppuMaxValSizeL)
1452
- , protocolUpdateCollateralPercent = strictMaybeToMaybe (ppu ^. ppuCollateralPercentageL)
1453
- , protocolUpdateMaxCollateralInputs = strictMaybeToMaybe (ppu ^. ppuMaxCollateralInputsL)
1454
- , protocolUpdateUTxOCostPerByte = Nothing
1455
- }
1457
+ case costModels of
1458
+ Left err -> Left err
1459
+ Right mCostModelMap ->
1460
+ Right $
1461
+ (fromShelleyCommonPParamsUpdate ppu)
1462
+ { protocolUpdateCostModels = fromMaybe mempty mCostModelMap
1463
+ , protocolUpdatePrices =
1464
+ fromAlonzoPrices
1465
+ <$> strictMaybeToMaybe (ppu ^. ppuPricesL)
1466
+ , protocolUpdateMaxTxExUnits =
1467
+ fromAlonzoExUnits
1468
+ <$> strictMaybeToMaybe (ppu ^. ppuMaxTxExUnitsL)
1469
+ , protocolUpdateMaxBlockExUnits =
1470
+ fromAlonzoExUnits
1471
+ <$> strictMaybeToMaybe (ppu ^. ppuMaxBlockExUnitsL)
1472
+ , protocolUpdateMaxValueSize = strictMaybeToMaybe (ppu ^. ppuMaxValSizeL)
1473
+ , protocolUpdateCollateralPercent = strictMaybeToMaybe (ppu ^. ppuCollateralPercentageL)
1474
+ , protocolUpdateMaxCollateralInputs = strictMaybeToMaybe (ppu ^. ppuMaxCollateralInputsL)
1475
+ , protocolUpdateUTxOCostPerByte = Nothing
1476
+ }
1477
+ where
1478
+ mCostModels :: Maybe (Plutus. CostModels )
1479
+ mCostModels = strictMaybeToMaybe (ppu ^. ppuCostModelsL)
1480
+ costModels
1481
+ :: Either
1482
+ CostModelNotEnoughParametersError
1483
+ (Maybe (Map AnyPlutusScriptVersion CostModel ))
1484
+ costModels = sequence $ fromAlonzoCostModels <$> mCostModels
1456
1485
1457
1486
fromAlonzoPParamsUpdate
1458
1487
:: Ledger. Crypto crypto
1459
1488
=> PParamsUpdate (Ledger. AlonzoEra crypto )
1460
- -> ProtocolParametersUpdate
1489
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1461
1490
fromAlonzoPParamsUpdate ppu =
1462
- (fromAlonzoCommonPParamsUpdate ppu)
1463
- { protocolUpdateProtocolVersion =
1464
- (\ (Ledger. ProtVer a b) -> (Ledger. getVersion a, b))
1465
- <$> strictMaybeToMaybe (ppu ^. ppuProtocolVersionL)
1466
- }
1491
+ (fromAlonzoCommonPParamsUpdate ppu) <&> \ ppu' ->
1492
+ ppu'
1493
+ { protocolUpdateProtocolVersion =
1494
+ (\ (Ledger. ProtVer a b) -> (Ledger. getVersion a, b))
1495
+ <$> strictMaybeToMaybe (ppu ^. ppuProtocolVersionL)
1496
+ }
1467
1497
1468
1498
fromBabbageCommonPParamsUpdate
1469
1499
:: BabbageEraPParams ledgerera
1470
1500
=> PParamsUpdate ledgerera
1471
- -> ProtocolParametersUpdate
1501
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1472
1502
fromBabbageCommonPParamsUpdate ppu =
1473
- (fromAlonzoCommonPParamsUpdate ppu)
1474
- { protocolUpdateUTxOCostPerByte = unCoinPerByte <$> strictMaybeToMaybe (ppu ^. ppuCoinsPerUTxOByteL)
1475
- }
1503
+ (fromAlonzoCommonPParamsUpdate ppu) <&> \ ppu' ->
1504
+ ppu'
1505
+ { protocolUpdateUTxOCostPerByte = unCoinPerByte <$> strictMaybeToMaybe (ppu ^. ppuCoinsPerUTxOByteL)
1506
+ }
1476
1507
1477
1508
fromBabbagePParamsUpdate
1478
1509
:: Ledger. Crypto crypto
1479
1510
=> PParamsUpdate (Ledger. BabbageEra crypto )
1480
- -> ProtocolParametersUpdate
1511
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1481
1512
fromBabbagePParamsUpdate ppu =
1482
- (fromBabbageCommonPParamsUpdate ppu)
1483
- { protocolUpdateProtocolVersion =
1484
- (\ (Ledger. ProtVer a b) -> (Ledger. getVersion a, b))
1485
- <$> strictMaybeToMaybe (ppu ^. ppuProtocolVersionL)
1486
- }
1513
+ (fromBabbageCommonPParamsUpdate ppu) <&> \ ppu' ->
1514
+ ppu'
1515
+ { protocolUpdateProtocolVersion =
1516
+ (\ (Ledger. ProtVer a b) -> (Ledger. getVersion a, b))
1517
+ <$> strictMaybeToMaybe (ppu ^. ppuProtocolVersionL)
1518
+ }
1487
1519
1488
1520
fromConwayPParamsUpdate
1489
1521
:: BabbageEraPParams ledgerera
1490
1522
=> PParamsUpdate ledgerera
1491
- -> ProtocolParametersUpdate
1523
+ -> Either CostModelNotEnoughParametersError ProtocolParametersUpdate
1492
1524
fromConwayPParamsUpdate = fromBabbageCommonPParamsUpdate
1493
1525
1494
1526
-- ----------------------------------------------------------------------------
@@ -1666,13 +1698,15 @@ toConwayPParams = toBabbagePParams
1666
1698
fromLedgerPParams
1667
1699
:: ShelleyBasedEra era
1668
1700
-> Ledger. PParams (ShelleyLedgerEra era )
1669
- -> ProtocolParameters
1670
- fromLedgerPParams ShelleyBasedEraShelley = fromShelleyPParams
1671
- fromLedgerPParams ShelleyBasedEraAllegra = fromShelleyPParams
1672
- fromLedgerPParams ShelleyBasedEraMary = fromShelleyPParams
1673
- fromLedgerPParams ShelleyBasedEraAlonzo = fromExactlyAlonzoPParams
1674
- fromLedgerPParams ShelleyBasedEraBabbage = fromBabbagePParams
1675
- fromLedgerPParams ShelleyBasedEraConway = fromConwayPParams
1701
+ -> Either CostModelNotEnoughParametersError ProtocolParameters
1702
+ fromLedgerPParams sbe pp =
1703
+ case sbe of
1704
+ ShelleyBasedEraShelley -> pure $ fromShelleyPParams pp
1705
+ ShelleyBasedEraAllegra -> pure $ fromShelleyPParams pp
1706
+ ShelleyBasedEraMary -> pure $ fromShelleyPParams pp
1707
+ ShelleyBasedEraAlonzo -> fromExactlyAlonzoPParams pp
1708
+ ShelleyBasedEraBabbage -> fromBabbagePParams pp
1709
+ ShelleyBasedEraConway -> fromConwayPParams pp
1676
1710
1677
1711
{-# DEPRECATED
1678
1712
fromShelleyCommonPParams
@@ -1737,18 +1771,23 @@ fromShelleyPParams pp =
1737
1771
fromAlonzoPParams
1738
1772
:: AlonzoEraPParams ledgerera
1739
1773
=> PParams ledgerera
1740
- -> ProtocolParameters
1774
+ -> Either CostModelNotEnoughParametersError ProtocolParameters
1741
1775
fromAlonzoPParams pp =
1742
- (fromShelleyCommonPParams pp)
1743
- { protocolParamCostModels = fromAlonzoCostModels $ pp ^. ppCostModelsL
1744
- , protocolParamDecentralization = Just . Ledger. unboundRational $ pp ^. ppDG
1745
- , protocolParamPrices = Just . fromAlonzoPrices $ pp ^. ppPricesL
1746
- , protocolParamMaxTxExUnits = Just . fromAlonzoExUnits $ pp ^. ppMaxTxExUnitsL
1747
- , protocolParamMaxBlockExUnits = Just . fromAlonzoExUnits $ pp ^. ppMaxBlockExUnitsL
1748
- , protocolParamMaxValueSize = Just $ pp ^. ppMaxValSizeL
1749
- , protocolParamCollateralPercent = Just $ pp ^. ppCollateralPercentageL
1750
- , protocolParamMaxCollateralInputs = Just $ pp ^. ppMaxCollateralInputsL
1751
- }
1776
+ ppCostModels <&> \ costModels ->
1777
+ base
1778
+ { protocolParamCostModels = costModels
1779
+ , protocolParamDecentralization = Just . Ledger. unboundRational $ pp ^. ppDG
1780
+ , protocolParamPrices = Just . fromAlonzoPrices $ pp ^. ppPricesL
1781
+ , protocolParamMaxTxExUnits = Just . fromAlonzoExUnits $ pp ^. ppMaxTxExUnitsL
1782
+ , protocolParamMaxBlockExUnits = Just . fromAlonzoExUnits $ pp ^. ppMaxBlockExUnitsL
1783
+ , protocolParamMaxValueSize = Just $ pp ^. ppMaxValSizeL
1784
+ , protocolParamCollateralPercent = Just $ pp ^. ppCollateralPercentageL
1785
+ , protocolParamMaxCollateralInputs = Just $ pp ^. ppMaxCollateralInputsL
1786
+ }
1787
+ where
1788
+ base = fromShelleyCommonPParams pp
1789
+ ppCostModels :: Either CostModelNotEnoughParametersError (Map AnyPlutusScriptVersion CostModel )
1790
+ ppCostModels = fromAlonzoCostModels $ pp ^. ppCostModelsL
1752
1791
1753
1792
{-# DEPRECATED
1754
1793
fromExactlyAlonzoPParams
@@ -1757,11 +1796,12 @@ fromAlonzoPParams pp =
1757
1796
fromExactlyAlonzoPParams
1758
1797
:: (AlonzoEraPParams ledgerera , Ledger. ExactEra Ledger. AlonzoEra ledgerera )
1759
1798
=> PParams ledgerera
1760
- -> ProtocolParameters
1799
+ -> Either CostModelNotEnoughParametersError ProtocolParameters
1761
1800
fromExactlyAlonzoPParams pp =
1762
- (fromAlonzoPParams pp)
1763
- { protocolParamUTxOCostPerByte = Just . unCoinPerWord $ pp ^. ppCoinsPerUTxOWordL
1764
- }
1801
+ (fromAlonzoPParams pp) <&> \ pp' ->
1802
+ pp'
1803
+ { protocolParamUTxOCostPerByte = Just . unCoinPerWord $ pp ^. ppCoinsPerUTxOWordL
1804
+ }
1765
1805
1766
1806
{-# DEPRECATED
1767
1807
fromBabbagePParams
@@ -1770,12 +1810,13 @@ fromExactlyAlonzoPParams pp =
1770
1810
fromBabbagePParams
1771
1811
:: BabbageEraPParams ledgerera
1772
1812
=> PParams ledgerera
1773
- -> ProtocolParameters
1813
+ -> Either CostModelNotEnoughParametersError ProtocolParameters
1774
1814
fromBabbagePParams pp =
1775
- (fromAlonzoPParams pp)
1776
- { protocolParamUTxOCostPerByte = Just . unCoinPerByte $ pp ^. ppCoinsPerUTxOByteL
1777
- , protocolParamDecentralization = Nothing
1778
- }
1815
+ (fromAlonzoPParams pp) <&> \ pp' ->
1816
+ pp'
1817
+ { protocolParamUTxOCostPerByte = Just . unCoinPerByte $ pp ^. ppCoinsPerUTxOByteL
1818
+ , protocolParamDecentralization = Nothing
1819
+ }
1779
1820
1780
1821
{-# DEPRECATED
1781
1822
fromConwayPParams
@@ -1784,7 +1825,7 @@ fromBabbagePParams pp =
1784
1825
fromConwayPParams
1785
1826
:: BabbageEraPParams ledgerera
1786
1827
=> PParams ledgerera
1787
- -> ProtocolParameters
1828
+ -> Either CostModelNotEnoughParametersError ProtocolParameters
1788
1829
fromConwayPParams = fromBabbagePParams
1789
1830
1790
1831
{-# DEPRECATED
@@ -1894,6 +1935,7 @@ data ProtocolParametersConversionError
1894
1935
-- protocol parameters for @lang@ is @actual@ and that number is below the @minimum@ expected number of parameters.
1895
1936
data CostModelNotEnoughParametersError
1896
1937
= CostModelNotEnoughParametersError Plutus. Language Int Int
1938
+ deriving Show
1897
1939
1898
1940
type ProtocolParameterName = String
1899
1941
0 commit comments