From 0a1bdf4d9fcc35fc0b78aa656003497faf8495f5 Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Thu, 24 Jul 2025 02:38:02 -0500 Subject: [PATCH 1/6] Use Data backed ledger types for COOP --- .../coop/src/PlutusBenchmark/Coop/Gen.hs | 59 ++++++++++--------- .../coop/src/PlutusBenchmark/Coop/Scripts.hs | 36 +++++------ .../src/PlutusBenchmark/Coop/TestContext.hs | 6 +- .../coop/src/PlutusBenchmark/Coop/Types.hs | 7 ++- .../coop/src/PlutusBenchmark/Coop/Utils.hs | 34 ++++++----- .../coop/test/9.6/authMpBurning.eval.golden | 8 +-- .../coop/test/9.6/authMpMinting.eval.golden | 8 +-- .../coop/test/9.6/certMpBurning.eval.golden | 8 +-- .../coop/test/9.6/certMpMinting.eval.golden | 8 +-- .../coop/test/9.6/fsMpBurning.eval.golden | 8 +-- .../coop/test/9.6/fsMpMinting.eval.golden | 8 +-- .../test/9.6/mustBurnOwnSingleton.eval.golden | 9 +-- 12 files changed, 98 insertions(+), 101 deletions(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs index 30a213874a9..4ff5a5111df 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs @@ -24,15 +24,16 @@ import Data.Map qualified as Map import Data.Set (Set) import Data.Set qualified as Set import Data.Traversable (for) -import PlutusLedgerApi.V1.Address (pubKeyHashAddress, scriptHashAddress) -import PlutusLedgerApi.V1.Value -import PlutusLedgerApi.V2 hiding (Map) -import PlutusTx.AssocMap qualified as AssocMap +import PlutusLedgerApi.Data.V2 hiding (Map) +import PlutusLedgerApi.V1.Data.Address (pubKeyHashAddress, scriptHashAddress) +import PlutusLedgerApi.V1.Data.Value import PlutusTx.Builtins.HasOpaque (stringToBuiltinByteString) +import PlutusTx.Data.AssocMap qualified as AssocMap +import PlutusTx.Data.List qualified as Li import PlutusBenchmark.Coop.Types -import PlutusLedgerApi.V1.Interval (interval) -import PlutusLedgerApi.V2 qualified as Value +import PlutusLedgerApi.Data.V2 qualified as Value +import PlutusLedgerApi.V1.Data.Interval (interval) import PlutusTx.Prelude (Group (inv)) mkScriptContext :: ScriptPurpose -> [TxInInfo] -> [TxInInfo] -> Value -> [TxOut] -> [PubKeyHash] -> ScriptContext @@ -49,11 +50,11 @@ mkTxInfo ins refs mints outs sigs = , txInfoData = AssocMap.empty , txInfoId = "" , txInfoRedeemers = AssocMap.empty - , txInfoInputs = sortOn (\(TxInInfo i _) -> i) ins - , txInfoReferenceInputs = sortOn (\(TxInInfo i _) -> i) refs + , txInfoInputs = Li.fromSOP $ sortOn (\(TxInInfo i _) -> i) ins + , txInfoReferenceInputs = Li.fromSOP $ sortOn (\(TxInInfo i _) -> i) refs , txInfoMint = normalizeValue mints - , txInfoOutputs = outs - , txInfoSignatories = sigs + , txInfoOutputs = Li.fromSOP outs + , txInfoSignatories = Li.fromSOP sigs } setValidity :: ScriptContext -> Value.POSIXTimeRange -> ScriptContext @@ -413,14 +414,14 @@ genCorrectFsMpBurningCtx fsMpParams fsCs = do fsMintCtx <- genCorrectFsMpMintingCtx fsMpParams fsCs (otherIns, otherMint, otherOuts) <- genOthers 5 - let fsVOuts = [out | out <- txInfoOutputs . scriptContextTxInfo $ fsMintCtx, txOutAddress out == fsVAddr] + let fsVOuts = Li.fromSOP [out | out <- Li.toSOP (txInfoOutputs . scriptContextTxInfo $ fsMintCtx), txOutAddress out == fsVAddr] - fsIns <- for fsVOuts (\fsOut -> TxInInfo <$> genTxOutRef <*> pure fsOut) + fsIns <- for (Li.toSOP fsVOuts) (\fsOut -> TxInInfo <$> genTxOutRef <*> pure fsOut) - let fsDatums = [fsDat | out <- fsVOuts, OutputDatum (Datum dat) <- [txOutDatum out], fsDat <- maybe [] pure (fromBuiltinData @FsDatum dat)] - gcAfter = maximum [fs'gcAfter fsDatum | fsDatum <- fsDatums] - submitters = [fs'submitter fsDatum | fsDatum <- fsDatums] - fsBurned = mconcat [inv $ txOutValue fsVOut | fsVOut <- fsVOuts] + let fsDatums = Li.fromSOP [fsDat | out <- Li.toSOP fsVOuts, OutputDatum (Datum dat) <- [txOutDatum out], fsDat <- maybe [] pure (fromBuiltinData @FsDatum dat)] + gcAfter = maximum [fs'gcAfter fsDatum | fsDatum <- Li.toSOP fsDatums] + submitters = [fs'submitter fsDatum | fsDatum <- Li.toSOP fsDatums] + fsBurned = mconcat [inv $ txOutValue fsVOut | fsVOut <- Li.toSOP fsVOuts] ins = otherIns <> fsIns mint = otherMint <> fsBurned outs = otherOuts @@ -609,8 +610,8 @@ doMintAndPayOtherTokenName cs ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoMint = txInfoMint txInfo <> assetClassValue otherAc (toInteger . length . txInfoOutputs $ txInfo) - , txInfoOutputs = txInfoOutputs txInfo <> [out {txOutValue = assetClassValue otherAc 1 <> txOutValue out} | out <- txInfoOutputs txInfo] + { txInfoMint = txInfoMint txInfo <> assetClassValue otherAc (toInteger . Li.length . txInfoOutputs $ txInfo) + , txInfoOutputs = txInfoOutputs txInfo <> Li.fromSOP [out {txOutValue = assetClassValue otherAc 1 <> txOutValue out} | out <- Li.toSOP (txInfoOutputs txInfo)] } } @@ -623,7 +624,7 @@ doMintAndPayOtherTokenNameAddr cs addr ctx = { scriptContextTxInfo = txInfo { txInfoMint = txInfoMint txInfo <> assetClassValue otherAc 1 - , txInfoOutputs = txInfoOutputs txInfo <> [TxOut addr (assetClassValue otherAc 1) NoOutputDatum Nothing] + , txInfoOutputs = txInfoOutputs txInfo <> Li.fromSOP [TxOut addr (assetClassValue otherAc 1) NoOutputDatum Nothing] } } @@ -634,7 +635,7 @@ doRemoveOutputDatum ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoOutputs = [out {txOutDatum = NoOutputDatum} | out <- txInfoOutputs txInfo] + { txInfoOutputs = Li.fromSOP [out {txOutDatum = NoOutputDatum} | out <- Li.toSOP (txInfoOutputs txInfo)] } } @@ -645,7 +646,7 @@ doPayToOtherAddress originalAddr otherAddr ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoOutputs = [out {txOutAddress = otherAddr} | out <- txInfoOutputs txInfo, txOutAddress out == originalAddr] + { txInfoOutputs = Li.fromSOP [out {txOutAddress = otherAddr} | out <- Li.toSOP (txInfoOutputs txInfo), txOutAddress out == originalAddr] } } @@ -656,7 +657,7 @@ doRemoveInputsWithToken ac ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoInputs = [inp | inp@(TxInInfo _ inOut) <- txInfoInputs txInfo, assetClassValueOf (txOutValue inOut) ac > 0] + { txInfoInputs = Li.fromSOP [inp | inp@(TxInInfo _ inOut) <- Li.toSOP (txInfoInputs txInfo), assetClassValueOf (txOutValue inOut) ac > 0] } } @@ -667,7 +668,7 @@ doRemoveRefInputsWithCurrency cs ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoReferenceInputs = [inp | inp@(TxInInfo _ inOut) <- txInfoReferenceInputs txInfo, not . AssocMap.member cs $ getValue (txOutValue inOut)] + { txInfoReferenceInputs = Li.fromSOP [inp | inp@(TxInInfo _ inOut) <- Li.toSOP (txInfoReferenceInputs txInfo), not . AssocMap.member cs $ getValue (txOutValue inOut)] } } @@ -678,7 +679,7 @@ doRemoveInputsWithCurrency cs ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoInputs = [inp | inp@(TxInInfo _ inOut) <- txInfoInputs txInfo, not . AssocMap.member cs $ getValue (txOutValue inOut)] + { txInfoInputs = Li.fromSOP [inp | inp@(TxInInfo _ inOut) <- Li.toSOP (txInfoInputs txInfo), not . AssocMap.member cs $ getValue (txOutValue inOut)] } } @@ -692,7 +693,7 @@ doPayInsteadOfBurn addr ctx = { scriptContextTxInfo = txInfo { txInfoMint = mintedVal - , txInfoOutputs = txInfoOutputs txInfo <> [TxOut addr (inv burnedVal) NoOutputDatum Nothing] + , txInfoOutputs = txInfoOutputs txInfo <> (Li.singleton $ TxOut addr (inv burnedVal) NoOutputDatum Nothing) } } @@ -724,17 +725,17 @@ _doNothing = id -- TODO: Switch to mlabs-haskell/plutus-simple-model (that's why you need it) normalizeValue :: Value -> Value normalizeValue v = - Value . AssocMap.safeFromList . Map.toList . (AssocMap.safeFromList . Map.toList <$>) $ + Value . AssocMap.safeFromSOPList . Map.toList . (AssocMap.safeFromSOPList . Map.toList <$>) $ Map.unionsWith (Map.unionWith (+)) ( [ Map.singleton cs (Map.singleton tn q) - | (cs, tokens) <- AssocMap.toList . getValue $ v - , (tn, q) <- AssocMap.toList tokens + | (cs, tokens) <- AssocMap.toSOPList . getValue $ v + , (tn, q) <- AssocMap.toSOPList tokens ] ) -- | Creates an interval with Extended bounds -interval' :: forall a. Extended a -> Extended a -> Interval a +interval' :: (ToData a, UnsafeFromData a) => Extended a -> Extended a -> Interval a interval' from' to' = Interval (LowerBound from' False) (UpperBound to' False) hashTxInputs :: [TxInInfo] -> ByteString diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs index 0d1d9cbd907..0e2a72b42f9 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs @@ -13,21 +13,15 @@ import PlutusTx.Plugin () import PlutusTx.Prelude import Prelude () -import PlutusLedgerApi.V1.Interval (contains) -import PlutusLedgerApi.V1.Value (AssetClass (AssetClass), isZero, unAssetClass, valueOf, - withCurrencySymbol) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusLedgerApi.V2 (Datum, Extended (PosInf), Interval (Interval, ivTo), - LedgerBytes (getLedgerBytes), LowerBound (LowerBound), - ScriptContext (ScriptContext), ScriptPurpose (Minting), - TokenName (TokenName), TxId (getTxId), TxInInfo (TxInInfo), - TxInfo (TxInfo, txInfoData, txInfoInputs, txInfoMint, txInfoOutputs, txInfoReferenceInputs, txInfoSignatories, txInfoValidRange), - TxOut (TxOut, txOutAddress, txOutDatum, txOutValue), - TxOutRef (TxOutRef, txOutRefId, txOutRefIdx), UpperBound (UpperBound), - Value (Value, getValue)) -import PlutusTx.AssocMap qualified as AssocMap +import PlutusLedgerApi.Data.V2 +import PlutusLedgerApi.V1.Data.Interval (contains) +import PlutusLedgerApi.V1.Data.Value (isZero, unAssetClass, valueOf, withCurrencySymbol) +import PlutusLedgerApi.V1.Data.Value qualified as Value + import PlutusTx.Builtins.Internal qualified as BI -import PlutusTx.List (elem, find, foldl, null) +import PlutusTx.Data.AssocMap qualified as AssocMap +import PlutusTx.Data.List (cons, elem, foldl, null) +import PlutusTx.List qualified as BIList import PlutusBenchmark.Coop.Types import PlutusBenchmark.Coop.Utils @@ -113,14 +107,14 @@ fsMp' let predicate (CertDatum {..}) = 0 < valueOf txInVal ap'authTokenCs (TokenName $ getLedgerBytes cert'id) - in case find predicate validCerts of + in case BIList.find predicate validCerts of Nothing -> traceError "$AUTH must be validated with a $CERT" Just (CertDatum {..}) -> let shouldbeBurned' = shouldBeBurned <> Value.singleton ap'authTokenCs (TokenName $ getLedgerBytes cert'id) (-1) - in (txIn : validAuthInputs'', shouldbeBurned') + in (cons txIn validAuthInputs'', shouldbeBurned') else acc (validAuthInputs', authTokensToBurn) = foldl go' (mempty, mempty) txInfoInputs @@ -147,9 +141,9 @@ fsMp' in if (Value $ AssocMap.singleton ownCs ownCurrValue) == Value.singleton ownCs fsTokenName 1 then (Just fsTokenName, unusedAuthInputs'') - else (Nothing, authInput : unusedAuthInputs'') + else (Nothing, cons authInput unusedAuthInputs'') matchWithAuth (myFsTn', unusedAuthInputs'') authInput = - (myFsTn', (authInput : unusedAuthInputs'')) + (myFsTn', (cons authInput unusedAuthInputs'')) (mayFsTn, unusedAuthInputs') = foldl matchWithAuth (Nothing, mempty) unusedAuthInputs in case mayFsTn of @@ -210,7 +204,7 @@ authMp' "Must mint at least one $AUTH token:\n" <> "Must have a specified CurrencySymbol in the Value" Just tokenNameMap -> - case AssocMap.toList tokenNameMap of + case AssocMap.toSOPList tokenNameMap of [(k, v)] | k == (TokenName authId) -> errorIfFalse "Must mint at least one $AUTH token" (0 < v) _ -> @@ -231,7 +225,7 @@ certMp' let tnBytes = let - AssetClass (aaCs, aaTn) = cmp'authAuthorityAc + (aaCs, aaTn) = unAssetClass cmp'authAuthorityAc go acc@(aaVal, tnBytes'') (TxInInfo (TxOutRef {txOutRefId = txId, txOutRefIdx = txIdx}) (TxOut {txOutValue = txInVal})) = if hasCurrency aaCs txInVal then (aaVal + valueOf txInVal aaCs aaTn, tnBytes'' <> consByteString txIdx (getTxId txId)) @@ -280,7 +274,7 @@ certMp' contains (Interval (LowerBound certValidUntil False) (UpperBound PosInf True)) txInfoValidRange - AssetClass (redeemerCs, redeemerName) = cert'redeemerAc + (redeemerCs, redeemerName) = unAssetClass cert'redeemerAc inputSum = foldl (\acc (TxInInfo _ (TxOut {txOutValue})) -> acc + txOutValue) mempty txInfoInputs !_spendAtLeast = diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/TestContext.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/TestContext.hs index 0c44801b68a..4054d02c777 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/TestContext.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/TestContext.hs @@ -13,9 +13,9 @@ module PlutusBenchmark.Coop.TestContext ( correctAuthMpBurningContext, ) where -import PlutusLedgerApi.V1.Address (scriptHashAddress) -import PlutusLedgerApi.V1.Value (AssetClass, CurrencySymbol (..), TokenName (..), assetClass) -import PlutusLedgerApi.V2 (Address, ScriptContext, ScriptHash (..)) +import PlutusLedgerApi.Data.V2 (Address, ScriptContext, ScriptHash (..)) +import PlutusLedgerApi.V1.Data.Address (scriptHashAddress) +import PlutusLedgerApi.V1.Data.Value (AssetClass, CurrencySymbol (..), TokenName (..), assetClass) import Test.QuickCheck.Gen (Gen (unGen)) import Test.QuickCheck.Random (mkQCGen) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Types.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Types.hs index ce53c65fa6a..7d5cc18d453 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Types.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Types.hs @@ -8,9 +8,10 @@ module PlutusBenchmark.Coop.Types where import Prelude qualified as HS import Control.Lens (makeFields) -import PlutusLedgerApi.V1.Value (AssetClass) -import PlutusLedgerApi.V3 (Address, CurrencySymbol, Extended, LedgerBytes, POSIXTime, - POSIXTimeRange, PubKeyHash) + +import PlutusLedgerApi.Data.V2 +import PlutusLedgerApi.V1.Data.Value (AssetClass) + import PlutusTx.IsData qualified as PlutusTx import PlutusTx.Lift qualified as PlutusTx import PlutusTx.Prelude diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs index 3cfb6f4064a..cc98cbbf8fa 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs @@ -7,27 +7,24 @@ module PlutusBenchmark.Coop.Utils where import PlutusTx.Prelude import Prelude () -import PlutusLedgerApi.V1.Value (Value (Value), flattenValue, valueOf, withCurrencySymbol) -import PlutusLedgerApi.V2 (CurrencySymbol, Datum (Datum), DatumHash, - OutputDatum (NoOutputDatum, OutputDatum, OutputDatumHash), - ScriptContext (ScriptContext), ScriptPurpose (Spending), TxId (TxId), - TxInInfo (TxInInfo, txInInfoOutRef), - TxInfo (TxInfo, txInfoInputs, txInfoMint), TxOut (TxOut, txOutValue), - TxOutRef (TxOutRef)) -import PlutusTx.AssocMap (Map, lookup) -import PlutusTx.AssocMap qualified as AssocMap +import PlutusLedgerApi.V1 (Datum (Datum), DatumHash) +import PlutusLedgerApi.V1.Data.Value +import PlutusLedgerApi.V2.Data.Contexts +import PlutusLedgerApi.V2.Data.Tx import PlutusTx.Builtins.Internal qualified as BI -import PlutusTx.List (find) +import PlutusTx.Data.AssocMap (Map, lookup) +import PlutusTx.Data.AssocMap qualified as AssocMap +import PlutusTx.Data.List (List, find) -findOwnInput :: [TxInInfo] -> TxOutRef -> TxInInfo -findOwnInput inputs oref = +findOwnInput' :: List TxInInfo -> TxOutRef -> TxInInfo +findOwnInput' inputs oref = case find (\i -> txInInfoOutRef i == oref) inputs of Nothing -> traceError "findOwnInput: not found" Just x -> x mustBurnOwnSingletonValue :: ScriptContext -> BuiltinUnit mustBurnOwnSingletonValue (ScriptContext (TxInfo {..}) (Spending oref)) = - let (TxInInfo _ (TxOut {txOutValue = ownInputValue})) = findOwnInput txInfoInputs oref + let (TxInInfo _ (TxOut {txOutValue = ownInputValue})) = findOwnInput' txInfoInputs oref -- flattenValue actually reverses order. See plutus#7173. in case flattenValue ownInputValue of [(cs, tk, q), _ada] -> @@ -47,25 +44,32 @@ resolveDatum datums outputDatum = Nothing -> traceError "expected datum but given datum hash have no associated datum" Just (Datum d) -> unsafeFromBuiltinData @a d OutputDatum (Datum d) -> unsafeFromBuiltinData @a d +{-# INLINE resolveDatum #-} currencyValue :: CurrencySymbol -> Value -> Value currencyValue cs val = withCurrencySymbol cs val mempty (\v -> Value $ AssocMap.singleton cs v) +{-# INLINE currencyValue #-} -unsafeMergeMap :: AssocMap.Map k v -> AssocMap.Map k v -> AssocMap.Map k v -unsafeMergeMap x y = AssocMap.unsafeFromList (AssocMap.toList x <> AssocMap.toList y) +unsafeMergeMap :: (ToData k, ToData v, UnsafeFromData k, UnsafeFromData v) => AssocMap.Map k v -> AssocMap.Map k v -> AssocMap.Map k v +unsafeMergeMap x y = AssocMap.unsafeFromSOPList (AssocMap.toSOPList x <> AssocMap.toSOPList y) +{-# INLINE unsafeMergeMap #-} hashInput :: TxInInfo -> BuiltinByteString hashInput (TxInInfo (TxOutRef (TxId hash) idx) _) | idx < 256 = blake2b_256 (consByteString idx hash) | otherwise = traceError "hashInput: Transaction output index must fit in an octet" +{-# INLINE hashInput #-} errorIfFalse :: BuiltinString -> Bool -> BuiltinUnit errorIfFalse msg False = traceError msg errorIfFalse _ True = BI.unitval +{-# INLINE errorIfFalse #-} errorIfTrue :: BuiltinString -> Bool -> BuiltinUnit errorIfTrue msg True = traceError msg errorIfTrue _ False = BI.unitval +{-# INLINE errorIfTrue #-} hasCurrency :: CurrencySymbol -> Value -> Bool hasCurrency cs (Value val) = AssocMap.member cs val +{-# INLINE hasCurrency #-} diff --git a/plutus-benchmark/coop/test/9.6/authMpBurning.eval.golden b/plutus-benchmark/coop/test/9.6/authMpBurning.eval.golden index c07105da855..8cf7cc53433 100644 --- a/plutus-benchmark/coop/test/9.6/authMpBurning.eval.golden +++ b/plutus-benchmark/coop/test/9.6/authMpBurning.eval.golden @@ -1,6 +1,6 @@ -CPU: 275_949_863 -Memory: 1_044_479 -Term Size: 1_908 -Flat Size: 5_925 +CPU: 22_532_179 +Memory: 58_279 +Term Size: 908 +Flat Size: 4_859 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/authMpMinting.eval.golden b/plutus-benchmark/coop/test/9.6/authMpMinting.eval.golden index 665d1820291..735f864379f 100644 --- a/plutus-benchmark/coop/test/9.6/authMpMinting.eval.golden +++ b/plutus-benchmark/coop/test/9.6/authMpMinting.eval.golden @@ -1,6 +1,6 @@ -CPU: 595_852_740 -Memory: 2_373_857 -Term Size: 1_908 -Flat Size: 7_322 +CPU: 321_845_423 +Memory: 852_311 +Term Size: 908 +Flat Size: 6_260 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpBurning.eval.golden b/plutus-benchmark/coop/test/9.6/certMpBurning.eval.golden index d756645ca9f..0a7bdb0eb0a 100644 --- a/plutus-benchmark/coop/test/9.6/certMpBurning.eval.golden +++ b/plutus-benchmark/coop/test/9.6/certMpBurning.eval.golden @@ -1,6 +1,6 @@ -CPU: 2_041_041_180 -Memory: 11_330_335 -Term Size: 3_698 -Flat Size: 8_707 +CPU: 7_153_841_977 +Memory: 23_035_266 +Term Size: 3_856 +Flat Size: 8_833 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpMinting.eval.golden b/plutus-benchmark/coop/test/9.6/certMpMinting.eval.golden index 12656f7bfe9..d018b96dfb1 100644 --- a/plutus-benchmark/coop/test/9.6/certMpMinting.eval.golden +++ b/plutus-benchmark/coop/test/9.6/certMpMinting.eval.golden @@ -1,6 +1,6 @@ -CPU: 628_642_273 -Memory: 2_544_349 -Term Size: 3_698 -Flat Size: 9_230 +CPU: 450_505_963 +Memory: 1_349_628 +Term Size: 3_856 +Flat Size: 9_355 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/fsMpBurning.eval.golden b/plutus-benchmark/coop/test/9.6/fsMpBurning.eval.golden index 295e8f3e904..74bd020a315 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpBurning.eval.golden +++ b/plutus-benchmark/coop/test/9.6/fsMpBurning.eval.golden @@ -1,6 +1,6 @@ -CPU: 326_409_675 -Memory: 1_384_322 -Term Size: 4_267 -Flat Size: 8_243 +CPU: 368_329_758 +Memory: 1_344_639 +Term Size: 4_474 +Flat Size: 8_576 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/fsMpMinting.eval.golden b/plutus-benchmark/coop/test/9.6/fsMpMinting.eval.golden index 48818b7d2c2..971a3f5e30e 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpMinting.eval.golden +++ b/plutus-benchmark/coop/test/9.6/fsMpMinting.eval.golden @@ -1,6 +1,6 @@ -CPU: 783_914_853 -Memory: 3_572_506 -Term Size: 4_267 -Flat Size: 10_061 +CPU: 1_189_413_270 +Memory: 3_881_682 +Term Size: 4_474 +Flat Size: 10_394 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.eval.golden b/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.eval.golden index 74c38d5893d..1c1ef919814 100644 --- a/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.eval.golden +++ b/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.eval.golden @@ -1,6 +1,3 @@ -CPU: 189_313_355 -Memory: 733_370 -Term Size: 1_687 -Flat Size: 4_341 - -(con unit ()) \ No newline at end of file +An error has occurred: +The machine terminated because of an error, either from a built-in function or from an explicit use of 'error'. +Caused by: error \ No newline at end of file From df88c973d08782653116ac3b8ac35f56cb33aabc Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Thu, 24 Jul 2025 09:18:19 -0500 Subject: [PATCH 2/6] fix ci --- plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs index 4ff5a5111df..9858b997351 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Gen.hs @@ -610,7 +610,7 @@ doMintAndPayOtherTokenName cs ctx = in ctx { scriptContextTxInfo = txInfo - { txInfoMint = txInfoMint txInfo <> assetClassValue otherAc (toInteger . Li.length . txInfoOutputs $ txInfo) + { txInfoMint = txInfoMint txInfo <> assetClassValue otherAc (Li.length . txInfoOutputs $ txInfo) , txInfoOutputs = txInfoOutputs txInfo <> Li.fromSOP [out {txOutValue = assetClassValue otherAc 1 <> txOutValue out} | out <- Li.toSOP (txInfoOutputs txInfo)] } } From e80c5f20041671e370d492940e69e5134206d035 Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Wed, 5 Nov 2025 11:59:28 -0600 Subject: [PATCH 3/6] optimize --- .../coop/src/PlutusBenchmark/Coop/Scripts.hs | 15 +++++++++------ .../coop/test/9.6/authMpBurning.golden.eval | 8 ++++---- .../coop/test/9.6/authMpMinting.golden.eval | 8 ++++---- .../coop/test/9.6/certMpBurning.golden.eval | 8 ++++---- .../coop/test/9.6/certMpMinting.golden.eval | 8 ++++---- .../coop/test/9.6/fsMpBurning.golden.eval | 8 ++++---- .../coop/test/9.6/fsMpMinting.golden.eval | 8 ++++---- .../test/9.6/mustBurnOwnSingleton.golden.eval | 9 +++------ 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs index 9f72d284fb0..ff5c909f070 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs @@ -6,6 +6,9 @@ {-# LANGUAGE TypeApplications #-} {-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:datatypes=BuiltinCasing #-} +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-cse-iterations=40 #-} +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-simplifier-iterations-pir=40 #-} +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-simplifier-iterations-uplc=40 #-} module PlutusBenchmark.Coop.Scripts where @@ -21,7 +24,7 @@ import PlutusLedgerApi.V1.Data.Value qualified as Value import PlutusTx.Builtins.Internal qualified as BI import PlutusTx.Data.AssocMap qualified as AssocMap -import PlutusTx.Data.List (cons, elem, foldl, null) +import PlutusTx.Data.List (elem, foldl) import PlutusTx.List qualified as BIList import PlutusBenchmark.Coop.Types @@ -115,7 +118,7 @@ fsMp' shouldbeBurned' = shouldBeBurned <> Value.singleton ap'authTokenCs (TokenName $ getLedgerBytes cert'id) (-1) - in (cons txIn validAuthInputs'', shouldbeBurned') + in (txIn : validAuthInputs'', shouldbeBurned') else acc (validAuthInputs', authTokensToBurn) = foldl go' (mempty, mempty) txInfoInputs @@ -142,17 +145,17 @@ fsMp' in if (Value $ AssocMap.singleton ownCs ownCurrValue) == Value.singleton ownCs fsTokenName 1 then (Just fsTokenName, unusedAuthInputs'') - else (Nothing, cons authInput unusedAuthInputs'') + else (Nothing, authInput : unusedAuthInputs'') matchWithAuth (myFsTn', unusedAuthInputs'') authInput = - (myFsTn', (cons authInput unusedAuthInputs'')) + (myFsTn', (authInput : unusedAuthInputs'')) - (mayFsTn, unusedAuthInputs') = foldl matchWithAuth (Nothing, mempty) unusedAuthInputs + (mayFsTn, unusedAuthInputs') = BIList.foldl matchWithAuth (Nothing, mempty) unusedAuthInputs in case mayFsTn of Nothing -> traceError "$FS must have a token name formed from a matching $AUTH input" Just fsTn -> (fsToMint' <> Value.singleton ownCs fsTn 1, unusedAuthInputs') (fsToMint, restAuths) = foldl go (mempty, validAuthInputs) txInfoOutputs - !_checkAuthUse = errorIfFalse "Auth inputs must ALL be used" $ null restAuths + !_checkAuthUse = errorIfFalse "Auth inputs must ALL be used" $ BIList.null restAuths !_checkBurn = errorIfFalse "" $ currencyValue ownCs txInfoMint == fsToMint diff --git a/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval index 60547e64ee9..33aab050dc8 100644 --- a/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 160_613_384 -Memory: 799_466 -AST Size: 1_473 -Flat Size: 5_393 +CPU: 19_234_635 +Memory: 54_569 +AST Size: 857 +Flat Size: 4_805 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval index cdfeb78707e..5da545b2d43 100644 --- a/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 369_713_157 -Memory: 1_849_456 -AST Size: 1_473 -Flat Size: 6_790 +CPU: 269_062_555 +Memory: 800_733 +AST Size: 857 +Flat Size: 6_206 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval index 427be4cbab5..e69fcfd7080 100644 --- a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 1_842_342_144 -Memory: 10_767_218 -AST Size: 3_160 -Flat Size: 8_041 +CPU: 5_743_865_277 +Memory: 21_411_540 +AST Size: 3_630 +Flat Size: 8_564 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval index b4307842ee2..022eefe357a 100644 --- a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 400_086_379 -Memory: 2_025_456 -AST Size: 3_160 -Flat Size: 8_564 +CPU: 365_489_959 +Memory: 1_237_910 +AST Size: 3_630 +Flat Size: 9_086 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval index e0475dac4f7..77d1200b366 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 221_694_924 -Memory: 1_160_575 -AST Size: 3_571 -Flat Size: 7_405 +CPU: 286_275_825 +Memory: 1_244_096 +AST Size: 4_244 +Flat Size: 8_326 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval index 8fb9b7701f2..a3090cb3f39 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 568_150_641 -Memory: 3_047_567 -AST Size: 3_571 -Flat Size: 9_223 +CPU: 960_572_025 +Memory: 3_607_342 +AST Size: 4_244 +Flat Size: 10_144 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.golden.eval b/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.golden.eval index e9f325aa3e5..1c1ef919814 100644 --- a/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.golden.eval +++ b/plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.golden.eval @@ -1,6 +1,3 @@ -CPU: 114_113_035 -Memory: 579_805 -AST Size: 1_274 -Flat Size: 3_833 - -(con unit ()) \ No newline at end of file +An error has occurred: +The machine terminated because of an error, either from a built-in function or from an explicit use of 'error'. +Caused by: error \ No newline at end of file From 8da21188e3fcaaea4a637f3b3720cd6b63a8d31d Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Wed, 5 Nov 2025 12:04:59 -0600 Subject: [PATCH 4/6] optimize --- .../coop/src/PlutusBenchmark/Coop/Scripts.hs | 16 ++++++---------- .../coop/test/9.6/authMpBurning.golden.eval | 8 ++++---- .../coop/test/9.6/authMpMinting.golden.eval | 8 ++++---- .../coop/test/9.6/certMpBurning.golden.eval | 4 ++-- .../coop/test/9.6/certMpMinting.golden.eval | 8 ++++---- 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs index ff5c909f070..f8ffe484169 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs @@ -6,9 +6,6 @@ {-# LANGUAGE TypeApplications #-} {-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:datatypes=BuiltinCasing #-} -{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-cse-iterations=40 #-} -{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-simplifier-iterations-pir=40 #-} -{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:max-simplifier-iterations-uplc=40 #-} module PlutusBenchmark.Coop.Scripts where @@ -22,6 +19,7 @@ import PlutusLedgerApi.V1.Data.Interval (contains) import PlutusLedgerApi.V1.Data.Value (isZero, unAssetClass, valueOf, withCurrencySymbol) import PlutusLedgerApi.V1.Data.Value qualified as Value +import PlutusTx.Builtins qualified as Builtins import PlutusTx.Builtins.Internal qualified as BI import PlutusTx.Data.AssocMap qualified as AssocMap import PlutusTx.Data.List (elem, foldl) @@ -208,13 +206,11 @@ authMp' "Must mint at least one $AUTH token:\n" <> "Must have a specified CurrencySymbol in the Value" Just tokenNameMap -> - case AssocMap.toSOPList tokenNameMap of - [(k, v)] | k == (TokenName authId) -> - errorIfFalse "Must mint at least one $AUTH token" (0 < v) - _ -> - traceError $ - "Must mint at least one $AUTH token: \n" - <> "Must have exactly one TokenName under specified CurrencySymbol" + let + (kv, rest) = Builtins.unsafeUncons (AssocMap.toBuiltinList tokenNameMap) + k = BI.unsafeDataAsB $ BI.fst kv + v = BI.unsafeDataAsI $ BI.snd kv + in errorIfFalse "Must mint at least one $AUTH token" (0 < v && BI.null rest && k == authId) authMp' _ _ _ = traceError "incorrect purpose" {-# INLINE authMp' #-} diff --git a/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval index 33aab050dc8..7420c3f1c7d 100644 --- a/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 19_234_635 -Memory: 54_569 -AST Size: 857 -Flat Size: 4_805 +CPU: 19_042_635 +Memory: 53_369 +AST Size: 831 +Flat Size: 4_680 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval index 5da545b2d43..9e487fa4faa 100644 --- a/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 269_062_555 -Memory: 800_733 -AST Size: 857 -Flat Size: 6_206 +CPU: 269_125_801 +Memory: 799_729 +AST Size: 831 +Flat Size: 6_081 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval index e69fcfd7080..9260fdecffc 100644 --- a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval @@ -1,6 +1,6 @@ CPU: 5_743_865_277 Memory: 21_411_540 -AST Size: 3_630 -Flat Size: 8_564 +AST Size: 3_627 +Flat Size: 8_562 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval index 022eefe357a..df27ad0b028 100644 --- a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 365_489_959 -Memory: 1_237_910 -AST Size: 3_630 -Flat Size: 9_086 +CPU: 365_441_959 +Memory: 1_237_610 +AST Size: 3_627 +Flat Size: 9_084 (con unit ()) \ No newline at end of file From 7d1d291517a038f95192a270da2bdf5a1987f842 Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Wed, 5 Nov 2025 12:09:56 -0600 Subject: [PATCH 5/6] optimize --- plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs | 4 ++-- plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval | 8 ++++---- plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs index f8ffe484169..44b4c36605e 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Scripts.hs @@ -264,6 +264,8 @@ certMp' (Minting ownCs) ) = let + inputSum = + foldl (\acc (TxInInfo _ (TxOut {txOutValue})) -> acc + txOutValue) mempty txInfoInputs go shouldBurn' (TxInInfo _ (TxOut {txOutValue = txInVal, txOutDatum = txOutDatum})) = if hasCurrency ownCs txInVal then @@ -275,8 +277,6 @@ certMp' (Interval (LowerBound certValidUntil False) (UpperBound PosInf True)) txInfoValidRange (redeemerCs, redeemerName) = unAssetClass cert'redeemerAc - inputSum = - foldl (\acc (TxInInfo _ (TxOut {txOutValue})) -> acc + txOutValue) mempty txInfoInputs !_spendAtLeast = errorIfFalse "Not have at least one token specified by redeemer spent" diff --git a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval index 9260fdecffc..b5cb384cc23 100644 --- a/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 5_743_865_277 -Memory: 21_411_540 -AST Size: 3_627 -Flat Size: 8_562 +CPU: 1_597_882_373 +Memory: 5_951_548 +AST Size: 3_630 +Flat Size: 8_564 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval index df27ad0b028..022eefe357a 100644 --- a/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 365_441_959 -Memory: 1_237_610 -AST Size: 3_627 -Flat Size: 9_084 +CPU: 365_489_959 +Memory: 1_237_910 +AST Size: 3_630 +Flat Size: 9_086 (con unit ()) \ No newline at end of file From 33c44bb66e5aac336cbc6baca5a3f3e6fbb58b83 Mon Sep 17 00:00:00 2001 From: Seungheon Oh Date: Wed, 5 Nov 2025 14:39:44 -0600 Subject: [PATCH 6/6] optimize --- plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs | 5 +++-- plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval | 8 ++++---- plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs index cc98cbbf8fa..814fad60017 100644 --- a/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs +++ b/plutus-benchmark/coop/src/PlutusBenchmark/Coop/Utils.hs @@ -11,6 +11,7 @@ import PlutusLedgerApi.V1 (Datum (Datum), DatumHash) import PlutusLedgerApi.V1.Data.Value import PlutusLedgerApi.V2.Data.Contexts import PlutusLedgerApi.V2.Data.Tx +import PlutusTx.BuiltinList qualified as BIList import PlutusTx.Builtins.Internal qualified as BI import PlutusTx.Data.AssocMap (Map, lookup) import PlutusTx.Data.AssocMap qualified as AssocMap @@ -50,8 +51,8 @@ currencyValue :: CurrencySymbol -> Value -> Value currencyValue cs val = withCurrencySymbol cs val mempty (\v -> Value $ AssocMap.singleton cs v) {-# INLINE currencyValue #-} -unsafeMergeMap :: (ToData k, ToData v, UnsafeFromData k, UnsafeFromData v) => AssocMap.Map k v -> AssocMap.Map k v -> AssocMap.Map k v -unsafeMergeMap x y = AssocMap.unsafeFromSOPList (AssocMap.toSOPList x <> AssocMap.toSOPList y) +unsafeMergeMap :: AssocMap.Map k v -> AssocMap.Map k v -> AssocMap.Map k v +unsafeMergeMap x y = AssocMap.unsafeFromBuiltinList (BIList.append (AssocMap.toBuiltinList x) (AssocMap.toBuiltinList y)) {-# INLINE unsafeMergeMap #-} hashInput :: TxInInfo -> BuiltinByteString diff --git a/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval b/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval index 77d1200b366..c8508e4b9f8 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval +++ b/plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval @@ -1,6 +1,6 @@ -CPU: 286_275_825 -Memory: 1_244_096 -AST Size: 4_244 -Flat Size: 8_326 +CPU: 264_362_305 +Memory: 1_114_236 +AST Size: 4_129 +Flat Size: 8_212 (con unit ()) \ No newline at end of file diff --git a/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval b/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval index a3090cb3f39..178a0f5da66 100644 --- a/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval +++ b/plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval @@ -1,6 +1,6 @@ -CPU: 960_572_025 -Memory: 3_607_342 -AST Size: 4_244 -Flat Size: 10_144 +CPU: 960_284_025 +Memory: 3_605_542 +AST Size: 4_129 +Flat Size: 10_030 (con unit ()) \ No newline at end of file