diff --git a/plutus-ledger-api/plutus-ledger-api.cabal b/plutus-ledger-api/plutus-ledger-api.cabal index 662f40594d8..a6fdb6c5b02 100644 --- a/plutus-ledger-api/plutus-ledger-api.cabal +++ b/plutus-ledger-api/plutus-ledger-api.cabal @@ -109,6 +109,7 @@ library build-depends: , aeson , aeson-pretty + , array , base >=4.9 && <5 , base16-bytestring >=1 , bytestring diff --git a/plutus-ledger-api/src/PlutusLedgerApi/Common/SerialisedScript.hs b/plutus-ledger-api/src/PlutusLedgerApi/Common/SerialisedScript.hs index dd8853dbada..741be5ce2e9 100644 --- a/plutus-ledger-api/src/PlutusLedgerApi/Common/SerialisedScript.hs +++ b/plutus-ledger-api/src/PlutusLedgerApi/Common/SerialisedScript.hs @@ -45,7 +45,8 @@ import Control.Monad.Except (MonadError) import Data.ByteString.Lazy qualified as BSL import Data.ByteString.Short import Data.Coerce -import Data.Set as Set +import Data.Array.ST (newArray, runSTUArray, writeArray) +import Data.Array.Unboxed (UArray, (!)) import GHC.Generics import NoThunks.Class import Prettyprinter @@ -197,10 +198,14 @@ scriptCBORDecoder -> CBOR.Decoder s ScriptNamedDeBruijn scriptCBORDecoder ll pv = -- See Note [New builtins/language versions and protocol versions] - let availableBuiltins = builtinsAvailableIn ll pv + let available = builtinsAvailableIn ll pv + availableArr :: UArray DefaultFun Bool + availableArr = runSTUArray $ do + arr <- newArray (minBound, maxBound) False + mapM_ (\f -> writeArray arr f True) available + return arr flatDecoder = UPLC.decodeProgram checkBuiltin - -- TODO: optimize this by using a better datastructure e.g. 'IntSet' - checkBuiltin f | f `Set.member` availableBuiltins = Nothing + checkBuiltin f | availableArr ! f = Nothing checkBuiltin f = Just $ "Builtin function "