Skip to content

Commit

Permalink
PlutusLedgerApi.V1.withCurrencySymbol (#6636)
Browse files Browse the repository at this point in the history
* chore: cleanup imports, pragmas. Fix hlint warnings.

* withCurrencySymbol

* Property tests

* Move suppressed hlint warnings to the hlint.yaml

* Changelog entry
  • Loading branch information
Unisay authored Nov 7, 2024
1 parent 2411c01 commit 038b7c8
Show file tree
Hide file tree
Showing 10 changed files with 226 additions and 62 deletions.
2 changes: 2 additions & 0 deletions .hlint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,5 @@
- fixity: infixr 1 <=<
# first is too lazy, see: https://github.com/input-output-hk/plutus/issues/3876
- ignore: {name: Use first, within: [UntypedPlutusCore.Evaluation.Machine.Cek]}
- ignore: {name: Redundant if, within: [PlutusLedgerApi.V1.Value, PlutusLedgerApi.V1.Data.Value]}
- ignore: {name: Replace case with maybe, within: [PlutusLedgerApi.V1.Value, PlutusLedgerApi.V1.Data.Value]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Added

- `PlutusLedgerApi.V1.withCurrencySymbol`
4 changes: 4 additions & 0 deletions plutus-ledger-api/plutus-ledger-api.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ test-suite plutus-ledger-api-plugin-test
Spec.ReturnUnit.V3
Spec.ScriptSize
Spec.Value
Spec.Value.WithCurrencySymbol

if os(windows)
buildable: False
Expand All @@ -232,10 +233,13 @@ test-suite plutus-ledger-api-plugin-test
, plutus-ledger-api:plutus-ledger-api-testlib
, plutus-tx ^>=1.36
, plutus-tx-plugin ^>=1.36
, plutus-tx-test-util
, plutus-tx:plutus-tx-testlib
, prettyprinter
, QuickCheck
, tasty
, tasty-hunit
, tasty-quickcheck

-- This is a nightly test, so it is an executable instead of test-suite to avoid
-- running this in CI.
Expand Down
66 changes: 41 additions & 25 deletions plutus-ledger-api/src/PlutusLedgerApi/V1/Data/Value.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
{-# OPTIONS_GHC -fno-spec-constr #-}
{-# OPTIONS_GHC -fno-specialise #-}

{-# OPTIONS_GHC -fexpose-all-unfoldings #-}
-- We need -fexpose-all-unfoldings to compile the Marlowe validator
-- with GHC 9.6.2.
-- We need -fexpose-all-unfoldings to compile the Marlowe validator with GHC 9.6.2.
-- TODO. Look into this more closely: see https://github.com/IntersectMBO/plutus/issues/6172.

-- | Functions for working with 'Value'.
Expand All @@ -46,6 +46,7 @@ module PlutusLedgerApi.V1.Data.Value (
, Value(..)
, singleton
, valueOf
, withCurrencySymbol
, currencySymbolValueOf
, lovelaceValue
, lovelaceValueOf
Expand Down Expand Up @@ -86,6 +87,7 @@ import PlutusTx.Blueprint.Schema.Annotation (SchemaInfo (..), emptySchemaInfo)
import PlutusTx.Builtins qualified as B
import PlutusTx.Builtins.Internal (BuiltinList, BuiltinPair)
import PlutusTx.Builtins.Internal qualified as BI
import PlutusTx.Data.AssocMap (Map)
import PlutusTx.Data.AssocMap qualified as Map
import PlutusTx.Lift (makeLift)
import PlutusTx.Ord qualified as Ord
Expand Down Expand Up @@ -283,7 +285,7 @@ taken to be zero.
There is no 'Ord Value' instance since 'Value' is only a partial order, so 'compare' can't
do the right thing in some cases.
-}
newtype Value = Value { getValue :: Map.Map CurrencySymbol (Map.Map TokenName Integer) }
newtype Value = Value { getValue :: Map CurrencySymbol (Map TokenName Integer) }
deriving stock (Generic, Typeable, Haskell.Show)
deriving newtype (PlutusTx.ToData, PlutusTx.FromData, PlutusTx.UnsafeFromData)
deriving Pretty via (PrettyShow Value)
Expand Down Expand Up @@ -356,20 +358,34 @@ instance MeetSemiLattice Value where
-- | Get the quantity of the given currency in the 'Value'.
-- Assumes that the underlying map doesn't contain duplicate keys.
valueOf :: Value -> CurrencySymbol -> TokenName -> Integer
valueOf (Value mp) cur tn =
case Map.lookup cur mp of
Nothing -> 0
Just i -> case Map.lookup tn i of
valueOf value cur tn =
withCurrencySymbol cur value 0 \tokens ->
case Map.lookup tn tokens of
Nothing -> 0
Just v -> v

{-# INLINABLE currencySymbolValueOf #-}
-- | Get the total value of the currency symbol in the 'Value' map.
-- Assumes that the underlying map doesn't contain duplicate keys.
{-# INLINEABLE withCurrencySymbol #-}

{- | Apply a continuation function to the token quantities of the given currency
symbol in the value or return a default value if the currency symbol is not present
in the value.
-}
withCurrencySymbol :: CurrencySymbol -> Value -> a -> (Map TokenName Integer -> a) -> a
withCurrencySymbol currency value def k =
case Map.lookup currency (getValue value) of
Nothing -> def
Just tokenQuantities -> k tokenQuantities

{-# INLINEABLE currencySymbolValueOf #-}

{- | Get the total value of the currency symbol in the 'Value' map.
Assumes that the underlying map doesn't contain duplicate keys.
Note that each token of the currency symbol may have a value that is positive,
zero or negative.
-}
currencySymbolValueOf :: Value -> CurrencySymbol -> Integer
currencySymbolValueOf (Value mp) cur = case Map.lookup cur mp of
Nothing -> 0
Just tokens ->
currencySymbolValueOf value cur = withCurrencySymbol cur value 0 \tokens ->
-- This is more efficient than `PlutusTx.sum (Map.elems tokens)`, because
-- the latter materializes the intermediate result of `Map.elems tokens`.
Map.foldr (\amt acc -> amt + acc) 0 tokens
Expand Down Expand Up @@ -397,7 +413,7 @@ lovelaceValueOf v = Lovelace (valueOf v adaSymbol adaToken)
{-# INLINABLE assetClassValue #-}
-- | A 'Value' containing the given amount of the asset class.
assetClassValue :: AssetClass -> Integer -> Value
assetClassValue (AssetClass (c, t)) i = singleton c t i
assetClassValue (AssetClass (c, t)) = singleton c t

{-# INLINABLE assetClassValueOf #-}
-- | Get the quantity of the given 'AssetClass' class in the 'Value'.
Expand All @@ -406,7 +422,7 @@ assetClassValueOf v (AssetClass (c, t)) = valueOf v c t

{-# INLINABLE unionVal #-}
-- | Combine two 'Value' maps, assumes the well-definedness of the two maps.
unionVal :: Value -> Value -> Map.Map CurrencySymbol (Map.Map TokenName (These Integer Integer))
unionVal :: Value -> Value -> Map CurrencySymbol (Map TokenName (These Integer Integer))
unionVal (Value l) (Value r) =
let
combined = Map.union l r
Expand Down Expand Up @@ -458,7 +474,7 @@ isZero (Value xs) = Map.all (Map.all (\i -> 0 == i)) xs
checkPred :: (These Integer Integer -> Bool) -> Value -> Value -> Bool
checkPred f l r =
let
inner :: Map.Map TokenName (These Integer Integer) -> Bool
inner :: Map TokenName (These Integer Integer) -> Bool
inner = Map.all f
in
Map.all inner (unionVal l r)
Expand Down Expand Up @@ -512,7 +528,7 @@ split :: Value -> (Value, Value)
split (Value mp) = (negate (Value neg), Value pos) where
(neg, pos) = Map.mapThese splitIntl mp

splitIntl :: Map.Map TokenName Integer -> These (Map.Map TokenName Integer) (Map.Map TokenName Integer)
splitIntl :: Map TokenName Integer -> These (Map TokenName Integer) (Map TokenName Integer)
splitIntl mp' = These l r where
(l, r) = Map.mapThese (\i -> if i <= 0 then This i else That i) mp'

Expand Down Expand Up @@ -570,14 +586,14 @@ unordEqWith is0 eqV = goBoth where
-- null l2 case
(\() -> True)
-- non-null l2 case
(\ _ _ -> Map.all is0 (Map.unsafeFromBuiltinList l2 :: Map.Map BuiltinData BuiltinData))
(\ _ _ -> Map.all is0 (Map.unsafeFromBuiltinList l2 :: Map BuiltinData BuiltinData))
)
-- non-null l1 case
( \hd1 tl1 ->
B.matchList
l2
-- null l2 case
(\() -> Map.all is0 (Map.unsafeFromBuiltinList l1 :: Map.Map BuiltinData BuiltinData))
(\() -> Map.all is0 (Map.unsafeFromBuiltinList l1 :: Map BuiltinData BuiltinData))
-- non-null l2 case
( \hd2 tl2 ->
let
Expand Down Expand Up @@ -647,10 +663,10 @@ unordEqWith is0 eqV = goBoth where
--- given a function checking whether a value is zero and a function
-- checking equality of values.
eqMapOfMapsWith
:: (Map.Map TokenName Integer -> Bool)
-> (Map.Map TokenName Integer -> Map.Map TokenName Integer -> Bool)
-> Map.Map CurrencySymbol (Map.Map TokenName Integer)
-> Map.Map CurrencySymbol (Map.Map TokenName Integer)
:: (Map TokenName Integer -> Bool)
-> (Map TokenName Integer -> Map TokenName Integer -> Bool)
-> Map CurrencySymbol (Map TokenName Integer)
-> Map CurrencySymbol (Map TokenName Integer)
-> Bool
eqMapOfMapsWith is0 eqV map1 map2 =
let xs1 = Map.toBuiltinList map1
Expand All @@ -665,8 +681,8 @@ eqMapOfMapsWith is0 eqV map1 map2 =
eqMapWith
:: (Integer -> Bool)
-> (Integer -> Integer -> Bool)
-> Map.Map TokenName Integer
-> Map.Map TokenName Integer
-> Map TokenName Integer
-> Map TokenName Integer
-> Bool
eqMapWith is0 eqV map1 map2 =
let xs1 = Map.toBuiltinList map1
Expand Down
74 changes: 43 additions & 31 deletions plutus-ledger-api/src/PlutusLedgerApi/V1/Value.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
-- editorconfig-checker-disable-file
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DerivingVia #-}
Expand All @@ -8,19 +10,16 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}

-- Prevent unboxing, which the plugin can't deal with
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
{-# OPTIONS_GHC -fno-spec-constr #-}
{-# OPTIONS_GHC -fno-specialise #-}

{-# OPTIONS_GHC -fexpose-all-unfoldings #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
-- We need -fexpose-all-unfoldings to compile the Marlowe validator
-- with GHC 9.6.2.
-- TODO. Look into this more closely: see https://github.com/IntersectMBO/plutus/issues/6172.

-- | Functions for working with 'Value'.
Expand All @@ -43,6 +42,7 @@ module PlutusLedgerApi.V1.Value (
, Value(..)
, singleton
, valueOf
, withCurrencySymbol
, currencySymbolValueOf
, lovelaceValue
, lovelaceValueOf
Expand Down Expand Up @@ -74,6 +74,7 @@ import Data.Text.Encoding qualified as E
import GHC.Generics (Generic)
import PlutusLedgerApi.V1.Bytes (LedgerBytes (LedgerBytes), encodeByteString)
import PlutusTx qualified
import PlutusTx.AssocMap (Map)
import PlutusTx.AssocMap qualified as Map
import PlutusTx.Blueprint (emptySchemaInfo)
import PlutusTx.Blueprint.Class (HasBlueprintSchema (..))
Expand Down Expand Up @@ -275,7 +276,7 @@ taken to be zero.
There is no 'Ord Value' instance since 'Value' is only a partial order, so 'compare' can't
do the right thing in some cases.
-}
newtype Value = Value { getValue :: Map.Map CurrencySymbol (Map.Map TokenName Integer) }
newtype Value = Value { getValue :: Map CurrencySymbol (Map TokenName Integer) }
deriving stock (Generic, Data, Typeable, Haskell.Show)
deriving anyclass (NFData)
deriving newtype (PlutusTx.ToData, PlutusTx.FromData, PlutusTx.UnsafeFromData)
Expand Down Expand Up @@ -349,26 +350,37 @@ instance MeetSemiLattice Value where
-- | Get the quantity of the given currency in the 'Value'.
-- Assumes that the underlying map doesn't contain duplicate keys.
valueOf :: Value -> CurrencySymbol -> TokenName -> Integer
valueOf (Value mp) cur tn =
case Map.lookup cur mp of
Nothing -> 0
Just i -> case Map.lookup tn i of
Nothing -> 0
Just v -> v

{-# INLINABLE currencySymbolValueOf #-}
-- | Get the total value of the currency symbol in the 'Value' map.
-- Assumes that the underlying map doesn't contain duplicate keys.
--
-- Note that each token of the currency symbol may have a value that is positive,
-- zero or negative.
valueOf value cur tn =
withCurrencySymbol cur value 0 \tokens ->
case Map.lookup tn tokens of
Nothing -> 0
Just v -> v

{-# INLINEABLE withCurrencySymbol #-}

{- | Apply a continuation function to the token quantities of the given currency
symbol in the value or return a default value if the currency symbol is not present
in the value.
-}
withCurrencySymbol :: CurrencySymbol -> Value -> a -> (Map TokenName Integer -> a) -> a
withCurrencySymbol currency value def k =
case Map.lookup currency (getValue value) of
Nothing -> def
Just tokenQuantities -> k tokenQuantities

{-# INLINEABLE currencySymbolValueOf #-}

{- | Get the total value of the currency symbol in the 'Value' map.
Assumes that the underlying map doesn't contain duplicate keys.
Note that each token of the currency symbol may have a value that is positive,
zero or negative.
-}
currencySymbolValueOf :: Value -> CurrencySymbol -> Integer
currencySymbolValueOf (Value mp) cur = case Map.lookup cur mp of
Nothing -> 0
Just tokens ->
-- This is more efficient than `PlutusTx.sum (Map.elems tokens)`, because
-- the latter materializes the intermediate result of `Map.elems tokens`.
PlutusTx.List.foldr (\(_, amt) acc -> amt + acc) 0 (Map.toList tokens)
currencySymbolValueOf value cur = withCurrencySymbol cur value 0 \tokens ->
-- This is more efficient than `PlutusTx.sum (Map.elems tokens)`, because
-- the latter materializes the intermediate result of `Map.elems tokens`.
PlutusTx.List.foldr (\(_, amt) acc -> amt + acc) 0 (Map.toList tokens)

{-# INLINABLE symbols #-}
-- | The list of 'CurrencySymbol's of a 'Value'.
Expand All @@ -393,7 +405,7 @@ lovelaceValueOf v = Lovelace (valueOf v adaSymbol adaToken)
{-# INLINABLE assetClassValue #-}
-- | A 'Value' containing the given amount of the asset class.
assetClassValue :: AssetClass -> Integer -> Value
assetClassValue (AssetClass (c, t)) i = singleton c t i
assetClassValue (AssetClass (c, t)) = singleton c t

{-# INLINABLE assetClassValueOf #-}
-- | Get the quantity of the given 'AssetClass' class in the 'Value'.
Expand All @@ -402,7 +414,7 @@ assetClassValueOf v (AssetClass (c, t)) = valueOf v c t

{-# INLINABLE unionVal #-}
-- | Combine two 'Value' maps, assumes the well-definedness of the two maps.
unionVal :: Value -> Value -> Map.Map CurrencySymbol (Map.Map TokenName (These Integer Integer))
unionVal :: Value -> Value -> Map CurrencySymbol (Map TokenName (These Integer Integer))
unionVal (Value l) (Value r) =
let
combined = Map.union l r
Expand Down Expand Up @@ -454,7 +466,7 @@ isZero (Value xs) = Map.all (Map.all (\i -> 0 == i)) xs
checkPred :: (These Integer Integer -> Bool) -> Value -> Value -> Bool
checkPred f l r =
let
inner :: Map.Map TokenName (These Integer Integer) -> Bool
inner :: Map TokenName (These Integer Integer) -> Bool
inner = Map.all f
in
Map.all inner (unionVal l r)
Expand Down Expand Up @@ -508,7 +520,7 @@ split :: Value -> (Value, Value)
split (Value mp) = (negate (Value neg), Value pos) where
(neg, pos) = Map.mapThese splitIntl mp

splitIntl :: Map.Map TokenName Integer -> These (Map.Map TokenName Integer) (Map.Map TokenName Integer)
splitIntl :: Map TokenName Integer -> These (Map TokenName Integer) (Map TokenName Integer)
splitIntl mp' = These l r where
(l, r) = Map.mapThese (\i -> if i <= 0 then This i else That i) mp'

Expand Down Expand Up @@ -584,7 +596,7 @@ unordEqWith is0 eqV = goBoth where
-- | Check equality of two 'Map's given a function checking whether a value is zero and a function
-- checking equality of values.
eqMapWith ::
forall k v. Eq k => (v -> Bool) -> (v -> v -> Bool) -> Map.Map k v -> Map.Map k v -> Bool
forall k v. Eq k => (v -> Bool) -> (v -> v -> Bool) -> Map k v -> Map k v -> Bool
eqMapWith is0 eqV (Map.toList -> xs1) (Map.toList -> xs2) = unordEqWith is0 eqV xs1 xs2

{-# INLINABLE eq #-}
Expand Down
2 changes: 2 additions & 0 deletions plutus-ledger-api/test-plugin/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Spec.ReturnUnit.V2 qualified
import Spec.ReturnUnit.V3 qualified
import Spec.ScriptSize qualified
import Spec.Value qualified
import Spec.Value.WithCurrencySymbol qualified

import Test.Tasty

Expand All @@ -26,4 +27,5 @@ tests =
, Spec.ReturnUnit.V3.tests
, Spec.ScriptSize.tests
, Spec.Value.test_EqValue
, Spec.Value.WithCurrencySymbol.tests
]
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ let
True : Bool
False : Bool
in
\(ds :
\(value :
(\k v -> List (Tuple2 k v))
bytestring
((\k v -> List (Tuple2 k v)) bytestring integer))
Expand Down Expand Up @@ -76,4 +76,4 @@ in
{all dead. dead}))
{all dead. dead}
in
go ds
go value
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ let
Just : a -> Maybe a
Nothing : Maybe a
in
\(ds :
\(value :
(\k a -> list (pair data data))
bytestring
((\k a -> list (pair data data)) bytestring integer))
Expand Down Expand Up @@ -57,7 +57,7 @@ in
(/\dead -> go)
{all dead. dead})
in
go ds)
go value)
{integer}
(\(a : data) ->
let
Expand Down
Loading

1 comment on commit 038b7c8

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Plutus Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.05.

Benchmark suite Current: 038b7c8 Previous: 2411c01 Ratio
validation-future-pay-out-1 273.5 μs 258.6 μs 1.06
validation-game-sm-success_1-4 335.2 μs 233 μs 1.44
validation-game-sm-success_2-1 549 μs 400.9 μs 1.37
validation-game-sm-success_2-2 220.3 μs 207.7 μs 1.06
validation-game-sm-success_2-3 750.1 μs 661.2 μs 1.13
validation-game-sm-success_2-4 334.4 μs 243.4 μs 1.37
validation-game-sm-success_2-5 906.9 μs 664.3 μs 1.37
validation-game-sm-success_2-6 334.8 μs 243.8 μs 1.37
validation-multisig-sm-1 561.6 μs 410.3 μs 1.37
validation-multisig-sm-2 547.6 μs 399.1 μs 1.37
validation-multisig-sm-3 554.7 μs 402.3 μs 1.38
validation-multisig-sm-4 561.1 μs 410.8 μs 1.37
validation-multisig-sm-10 737.4 μs 697.7 μs 1.06
validation-decode-auction_2-2 600.8 μs 565.9 μs 1.06
validation-decode-auction_2-4 610.5 μs 565.6 μs 1.08
validation-decode-auction_2-5 277.9 μs 201.6 μs 1.38
validation-decode-crowdfunding-success-1 339.1 μs 245.8 μs 1.38
validation-decode-crowdfunding-success-2 338.8 μs 305.3 μs 1.11
validation-decode-future-increase-margin-1 272.9 μs 241.3 μs 1.13
validation-decode-future-increase-margin-4 843.9 μs 696.3 μs 1.21
validation-decode-future-increase-margin-5 940.3 μs 716.6 μs 1.31
validation-decode-future-pay-out-1 340.8 μs 240.5 μs 1.42
validation-decode-future-pay-out-2 433.7 μs 330.6 μs 1.31
validation-decode-future-pay-out-3 452.9 μs 329.5 μs 1.37
validation-decode-game-sm-success_2-1 678.5 μs 543.2 μs 1.25
validation-decode-game-sm-success_2-2 235.7 μs 170.2 μs 1.38
validation-decode-game-sm-success_2-3 758 μs 551 μs 1.38
validation-decode-game-sm-success_2-4 235.7 μs 168.4 μs 1.40
validation-decode-game-sm-success_2-5 756.3 μs 549.9 μs 1.38
validation-decode-game-sm-success_2-6 196.7 μs 170.5 μs 1.15
validation-decode-multisig-sm-7 664.1 μs 585.5 μs 1.13
validation-decode-multisig-sm-8 691.3 μs 589.4 μs 1.17
validation-decode-ping-pong-2 589.5 μs 494.4 μs 1.19
validation-decode-ping-pong_2-1 702.5 μs 487.1 μs 1.44
validation-decode-prism-1 230.6 μs 161.4 μs 1.43
validation-decode-prism-2 750.7 μs 529 μs 1.42
validation-decode-prism-3 344.7 μs 241.5 μs 1.43
validation-decode-pubkey-1 236.2 μs 165.5 μs 1.43
validation-decode-stablecoin_1-1 1229 μs 872.8 μs 1.41
validation-decode-stablecoin_1-2 235 μs 164.2 μs 1.43
validation-decode-stablecoin_1-3 1228 μs 871 μs 1.41
validation-decode-stablecoin_1-4 235.6 μs 164.3 μs 1.43
validation-decode-stablecoin_1-5 1227 μs 871.3 μs 1.41
validation-decode-stablecoin_1-6 236.1 μs 164.3 μs 1.44
validation-decode-stablecoin_2-1 1230 μs 853.1 μs 1.44
validation-decode-stablecoin_2-2 236.1 μs 163.7 μs 1.44
validation-decode-stablecoin_2-3 1231 μs 871 μs 1.41
validation-decode-stablecoin_2-4 235.9 μs 173.8 μs 1.36
validation-decode-uniswap-2 251.2 μs 236 μs 1.06
validation-decode-uniswap-5 772.1 μs 732.4 μs 1.05
nofib-queens5x5/bm 89840 μs 85090 μs 1.06
marlowe-role-payout/4fbcfdb577a56b842d6f6938187a783f71d9da7519353e3da3ef0c564e1eb344 291 μs 235.3 μs 1.24
marlowe-role-payout/5a0725d49c733130eda8bc6ed5234f7f6ff8c9dd2d201e8806125e5fbcc081f9 275.1 μs 204.2 μs 1.35
marlowe-role-payout/5a2aae344e569a2c644dd9fa8c7b1f129850937eb562b7748c275f9e40bed596 242.9 μs 191 μs 1.27
marlowe-role-payout/5ade103e9530dd0d572fe1b053ea65ad925c6ebbe321e873ace8b804363fa82c 364 μs 262.3 μs 1.39
marlowe-role-payout/5d4c62a0671c65a14f6a15093e3efc4f1816d95a5a58fd92486bedaae8d9526b 300.7 μs 221.4 μs 1.36
marlowe-role-payout/5efe992e306e31cc857c64a62436ad2f9325acc5b4a74a8cebccdfd853ce63d2 234.3 μs 197.2 μs 1.19
marlowe-role-payout/6d66bddb4269bdf77392d3894da5341cf019d39787522af4f83f01285991e93c 261.5 μs 193.1 μs 1.35
marlowe-role-payout/73f044f34a30f26639c58bafe952047f74c7bf1eafebab5aadf5b73cfb9024ed 260.3 μs 191.5 μs 1.36
marlowe-role-payout/7b1dd76edc27f00eb382bf996378155baf74d6a7c6f3d5ec837c39d29784aade 262.3 μs 190.8 μs 1.37
marlowe-role-payout/803eae94d62e2afc0e835c204af8362170301bc329e2d849d5f5a47dddf479ec 292.8 μs 211.4 μs 1.39
marlowe-role-payout/87167fc5469adac97c1be749326fa79a6b7862ce68aa4abcb438e3c034bd0899 307.5 μs 227.3 μs 1.35
marlowe-role-payout/8c0fa5d9d6724c5c72c67e055d4bfc36a385ded7c3c81c08cdbd8705829af6e6 309.4 μs 224.6 μs 1.38
marlowe-role-payout/962c2c658b19904372984a56409707401e64e9b03c1986647134cfd329ec5139 282.3 μs 205 μs 1.38
marlowe-role-payout/996804e90f2c75fe68886fc8511304b8ab9b36785f8858f5cb098e91c159dde9 265.9 μs 197.6 μs 1.35
marlowe-role-payout/a004a989c005d59043f996500e110fa756ad1b85800b889d5815a0106388e1d7 275.4 μs 201 μs 1.37
marlowe-role-payout/a0fba5740174b5cd24036c8b008cb1efde73f1edae097b9325c6117a0ff40d3b 289 μs 214.7 μs 1.35
marlowe-role-payout/a1b25347409c3993feca1a60b6fcaf93d1d4bbaae19ab06fdf50cedc26cee68d 250 μs 181.3 μs 1.38

This comment was automatically generated by workflow using github-action-benchmark.

CC: @IntersectMBO/plutus-core

Please sign in to comment.