- CIP-57 blueprints embedded in the packaged JAR (
META-INF/scalus/blueprints/<Contract>.json) onpackage, with a skip opt-out (SCALUS_SKIP_BLUEPRINT/blueprint / skip) eject-examplestool turns any bundled example into a standalone sbt project (build, compiler plugin,sbt blueprint/deploywired up)- profiling:
profile.jsonin the Full report set; Scala 3 syntax highlighting in the annotated-source HTML
scalus.jspublished as an ES module (droppedscalajs-bundler), with@noblecrypto inlined and minification enabledScalusBlueprintPluginrenamed toScalusSbtPlugin(old name kept as a back-compat alias);scalus-sbt-plugincross-built for sbt 1 and sbt 2- default LTS moved to Scala 3.3.8 (plugin still cross-builds 3.3.7/3.3.8/3.8.4); Scala Native unified on 3.8.4
scalus-testkitpackages the shared test helpers it exposes (e.g.KeyPairGenerator) so downstream projects compile- dependency updates: esbuild 0.28.1, dompurify 3.4.11, magnolia, jsoniter-scala, jackson-databind
- security-hardening sweep across the example validators (Cardano Blueprint rosetta set) — amm drain, auction/lottery/vault/editablenft/crowdfunding/escrow and others
Eqno longer warns on===for anEqreceived as a using parameter, and JVM-module compiler warnings are cleared
- Protocol Version 11 (van Rossem) evaluator support, matching
cardano-node11.0.1 / Plutus 1.63.0.0. Adds builtin semantics variantsD(PlutusV1/V2) andE(PlutusV3/V4) for PV11, plus cost models for the new builtins —expModInteger,dropList, the array operations,bls12_381_G1/G2_multiScalarMul, and theValuebuiltins (insertCoin,lookupCoin,unionValue,valueContains,valueData,unValueData,scaleValue) — wired to protocol parameters. PV11 semantics: UTF-8-byte-length text costing forappendString/equalsString/encodeUtf8, theconsByteString[0,255]range check,Int64-boundedshiftByteString/rotateByteString, andabove_and_below_diagonalCPU costing fordivideInteger/modInteger. When a pre-PV11 cost model is supplied for a PV11 evaluation, the new builtins fall back to the vendored Plutus reference cost model instead of a placeholder cost - CEK profiling data is now exposed through
scalus.js(the interactive HTML report renderer stays JVM-side) - UPLC text parser now accepts Haskell ASCII control-code escape mnemonics (
\NUL…\DEL) and raw control characters inside string literals, matching Plutus'scharLiteral
scalus-coreandscalus-cardano-ledgerbuild against Plutus 1.63.0.0; the bundled Plutus conformance suite is the 1.63 corpus, evaluated under semantics variant E- the Plutus conformance test discovers every evaluation case in the corpus at compile time and runs
them all by default, skipping only an explicit, documented ignore list (so new corpus cases are
picked up automatically). Only 3 cases remain skipped — the
bls12_381_*_hashToGroupDST-length cases blocked by a blst Java-binding bug (supranational/blst#232) - MiMa compatibility baseline (
scalusStableVersion) bumped to 0.18.0, and the now-obsolete MiMa problem filters removed - dependency updates: sbt 1.12.12
bls12_381_G1/G2_multiScalarMulrejects scalars outside the signed 4096-bit (512-byte) range, as Plutus does, instead of silently reducing them modulo the group orderunValueDatais costed by the inputData's node count (matching PlutusDataNodeCount) rather than its full memory usage — it was over-charging by roughly 3× — and now rejects non-canonicalValueencodings (currency symbols and token names must be strictly ascending, inner maps non-empty, no zero quantities) instead of silently normalizing them- corrected a swapped
intercept/slopein theunValueDatamemory cost inbuiltinCostModelC.json
- Scala 3 cross-build:
scalus-pluginandscalus-corenow compile on both Scala 3.3.7 (LTS) and 3.8.x. The plugin isolates the one diverging compiler-API call (phase registration) behind a version-specificPluginCompattrait; the remaining ~9.4k lines of dotty-internal API usage compile unchanged. The Native platform targets 3.8.3 while JVM/JS stay on 3.8.4, with version-conditional budget/size baselines for the cross-build - V3
==now routes to structural equality: non-structural types (Rational,AssocMap) are excluded from theEqsystem (theirgiven Eqis replaced with acompiletime.errorand the plugin errors onRational ==/AssocMap ==, withRationalEq/AssocMapEqfor explicit comparison), so every remainingEqis structural; the V3List/Optionintrinsics (contains,indexOf,deleteFirst,distinct,diff,Option.contains) drop their deadEqargument and compare viaequalsRepr - Conway certificate mutators in
scalus-cardano-ledger:StakePoolCertificatesMutator(Shelley/Conway POOL transitions — registration, re-registration intofutureStakePoolParams, retirement) andVotingCertificatesMutator(Conway GOVCERT DRep register/unregister/update with deposit validation).SlotConfiggainsepochLength/zeroEpochplusepochOf/firstSlotOfEpochso the current epoch is derived from the slot (mainnetzeroEpoch=208, preprod4, preview 1-day epochs) instead of treating the slot number as an epoch EvaluatorReportConfig— typed configuration forPlutusScriptEvaluatordiagnostic output (output directory, artifact selection, profile level/outputs), overridable via theSCALUS_DUMP,SCALUS_DUMP_DIR, andSCALUS_PROFILE*environment variables; newPlutusScriptEvaluator.applyoverload accepting it. The legacydebugDumpFilesForTesting: Booleanconstructors are retained and map onto it- profiling integrated into
PlutusScriptEvaluator: when enabled (SCALUS_PROFILE=summary|full,SCALUS_PROFILE_OUT=…, orEvaluatorReportConfig.profile), each script's profile is rendered to the console or to per-script files. Output formats: a compact text summary, CSV, JSON, and a self-contained interactive HTML report — a tabbed UI with sortable/filterable tables and %-of-CPU bars, a "By Source Location" view with full source-position attribution and a recursive incoming-call tree, a call graph with inclusive (call-stack) cost and a Hot Paths tree showing where the budget flows from the entry point, a per-line cost-annotated source view (cross-linked from the location tables), and a transition-matrix heatmap with cost-weighted edges and a hot-edges table; the report title and per-entry fee are included ProfileFormatter.toCsv/toJson/summary, andtoHtml(data, sources)with source annotation;platform.createDirectoriesandplatform.fileExistsfor cross-platform file I/O
- Evaluator debug dumps now use stable, overwriting filenames
(
<scriptHash>-<language>-<tag>-<index>.flat) instead of the volatilescript-<txid>-…names, so fee-balancing re-evaluations overwrite rather than accumulate duplicate files; the per-builtin budget log is truncated once per evaluation (previously appended without bound) and renamed tobudget.log; amanifest.jsondescribing every dumped script is written alongside (#93) - dependency updates: Yaci DevKit 0.4.4, cardano-client-lib/backend-blockfrost 0.7.2,
jsoniter-scala 2.38.14, dotty-cps-async 1.3.3, jackson-databind 2.21.4, Scala Native libs 0.5.12,
sttp client4 4.0.25, slf4j 2.0.18; security bumps for brace-expansion (CVE-2026-45149) and vitest
(CVE-2026-47429) in
scalus-site
EtaReducefree-variable check had no cases forCase/Constrterms, soλx.(f x)was eta-reduced even whenfreferencedxinside aCase/Constr— dropping the binder and leavingxunbound; it now uses the canonicalTermAnalysis.freeVars. Surfaced on Scala 3.8.x (KnightsdepthSearchlowering); latent on 3.3.x where the shape did not ariseTxBuildernow accepts permissionless script stake-credential registration (registration is witness-free in the Conway ledger) instead of rejecting it as a credential/witness-type mismatch, while still honoring an explicitly attached script/native witness- conformance vectors now run in cardano-ledger's Imp slot/epoch environment
@UplcReprannotation system for fine-grained UPLC type representation control: opt types into nativeUplcConstrrepresentation, propagate the annotation through lambda parameters/return types, intrinsic return types,genSelectfield types, andIfThenElse/Applytarget-type propagation; honored byFromData/ToDataderivation- native
UplcConstrintrinsics: equality (Eqdispatch viaequalsRepr),Optionoperations (isDefined,isEmpty,get,getOrElse,map,flatMap,filter,exists,forall), listappendedAll(eliminates per-element re-encoding when concatenating@UplcRepr(UplcConstr)lists, used byQueuein the Knights benchmark) - Common Subexpression Elimination (CSE) UPLC optimizer pass — extracts repeated subterms into
shared lets with descriptive names (also extracts
Force(Builtin)andForce(Force(Builtin))) - Common Context Extraction (CCE) UPLC optimizer pass — generalized to any single-hole position; extracts shared lambdas with descriptive names
Options.uplcOptimizersfor custom optimizer chain configuration- CEK machine profiler: per-source-location and per-builtin-function breakdowns plus a state
transition matrix;
optimize-contractskill drives budget optimization workflow UtxoFlowframework for multi-transaction off-chain flows (Phase 1): branching, recursion/loop support for local tail-recursive functions, parameterized flows (DataParameterizedFlowCellValidator), compile-time checks for async closures and non-tail recursionCellValidatorwith fullUtxoCelllifecycle:CellContext,TxBuilderintegration,transitionSpend/transitionMinthelpers, hardened against V011/V005/V016/V024 vulnerability patterns;AuctionCellreference example;Factorypattern for the Cardano UTxO modelscalus-blueprint-pluginv0.1 — sbt plugin for CIP-57 blueprint generation, withsbtn deployandsbtn blueprintcommands- Scalus plugin and example ejector (
#252) — eject contract examples into standalone projects with cross-version sbt plugin support - recursive auction contract example with
Bindpattern handling fix - agent-based testing model in
scalus-testkit(ContractTestActor) - opaque-type support in
FromData/ToDataderivation and the compiler plugin; top-level opaque types resolved via$packagemodule scanning;SIRModuleAnnotationmarker trait andModule.annsfield - variadic factory intrinsics for
Map.singletonandMap.empty;List.unboxedNil[A]for unboxed empty list creation Options.noWarnto silence SIR lowering warningsMiniBF-compatible Blockfrost API endpoints;UtxoSource.FromAssetinBlockfrostProvider- emulator preconfig support: pre-initialize from JSON files, allow custom datums, extended JS
API (
tick,hasTx,getDelegation,getDatum,withState) assertEvalWithBudgetsandPlutusV3.withOptionsfor dual-budget testing across modes- optional Scalus on-chain identification tag marker (spec + implementation)
DynJsonutility for dot-syntax JSON navigation- gated CEK diagnostic assertions for representation/arity mismatches
(
-Dscalus.assert.apply.data.to.uc=1):[APPLY-DATA-TO-NATIVE-UC],[APPLY-VCONSTR-ARITY-MISMATCH],[CASE-VCONSTR-ARITY-MISMATCH],[CASE-DATA-ARITY-MISMATCH] - documentation: Advanced Optimisations chapter, Authenticated Collections (Merkle Trees, MPF, Bilinear Accumulators) split into static/incremental pages, Ledger Framework architecture, TxBuilder close-out report, unit/property/TDD testing pages, thorough Lottery and Auction example READMEs, Profiling page
- BREAKING: removed deprecated APIs marked
@deprecatedsince 0.14.x (including bloxbean CCL APIs); MiMa filters added for the removed surface SumDataList/SumDataPairListunified into parameterizedSumBuiltinList(elementRepr);SumPairBuiltinListseparated for pair-element listsPairDataandArrayDataaliases removed in favor of parameterizedProdBuiltinPair(fstRepr, sndRepr)andProdBuiltinArray(elementRepr)carried throughout the loweringPairListintrinsic providers added;SumDataPairListhead representation fixed- forced builtins naming convention updated from
__builtin_Nameto__Name cachedTopLevelHelperscache keys discriminate by call-site env capture and resolvedTypeVarbindings (captureFingerprint(tps)plustypeUnifyEnv.filledTypes), so two callers with the same SIR shape but different repr environments get separate helperspendingTopLevelLetRecsscoped per compile unit (no cross-compile leakage); only letrec bindings reachable from the lowering root are wrappedstableKeyincludes structural repr info to reduceSumReprProxyidentity leaks acrosscachedTopLevelHelperslookupsProductCaseUplcConstrSirTypeGenerator.upcastOnedispatches oninput.representationrather than relabeling unconditionally — closes the unsafe-Data-as-UC relabel surface that produced 4-arg native selectors against Data scrutineesgenConstrLoweredis the canonical Constr-dispatch API;precomputedValuesremoved and the dispatch chain pushed down into generatorsTypeVarKindsimplified toTransparent/Fixed;nativeTypeVarRepresentationandnativeListElementsflags removed (the@UplcReprmachinery keeps native representations end-to-end, eliminating dual lowering paths and per-testif/elsebudget snapshots)typeProxyreplaced withtypeProxyReprfor explicit representation control- removed
MerklePatriciaForestryradix-2/64 variants, keeping only the MPF-16 implementation;Fork.neighborHashreduced to a single slice+blake2b - non-derived
Eqinstances now produce a warning;Eq.keyPairEqdeprecated scalus-pluginpublished withCrossVersion.fullto allow per-Scala-version publishing
ProdDataConstr/DataConstr.isCompatibleOn(_, TypeVarRepresentation(_))was unconditionally permissive: any TypeVar kind matched. For@UplcRepr(UplcConstr)types whose default rep is native Constr, a Data →TypeVarRepresentation(Unwrapped)"compat" returned true, producing a pure relabel and leaving Data bytes labeled as Unwrapped. DownstreamgenSelectthen emitted a 4-arg native-UC selector against a 2-argData.Constrscrutinee, leaving a 2-arg residual lambda and aMultiplyInteger Apply LamAbsruntime crash. Fix: discriminateTypeVarKind—Transparent/Fixedstay compatible;Unwrappedonly whenlctx.typeGenerator(tp).defaultRepresentation(tp) == this- KnightsTest:475 heisenbug: output
TypeVarleak via wrongeqClassinheritance and non-deterministic tie-break inchooseCommonRepresentation - intrinsic binding internal
TypeVars no longer leak across dispatches; rebound at unify time rather than stripped on merge-back FixedTypeVarinUplcConstrfields falls back to default rep instead of leaking abstract Data marker;FixedTypeVarno longer leaks intoProdBuiltinPair/SumUplcConstrfieldReprs- representations propagate through
TypeVarandFreeUnificatorwidenings so structural unification doesn't drop the caller's repr context optTargetTypepropagates throughIfThenElseto branches;lvApplypreserves@UplcReprparam reprs; CSE guarded against partial-builtin helpers- lazy
Casebranch evaluation in JIT to match CEK semantics - CEK and JIT evaluation of Plutus benchmark use-case scripts
- recursive enum derivation: allow unfilled type proxies in
AppliedTypeargs - non-recursive let bindings scoping; opaque types with type alias returns filter the full inline proxy chain
- pair pattern variables added to scope in PV11
genMatchPairData - UTxO query errors propagate as
TxBuilderException.UtxoQueryException slotToTimeuses.toLongfor Scala.jsBigIntcompatibility- CI JVM heap capped at 7GB to prevent OOM on GitHub Actions runners
- compile-time partial evaluation in UPLC optimizer with occurrence analysis for smarter inlining
- source positions in UPLC Term and CEK error reporting for precise error diagnostics
- diagnostic replay for release scripts —
DebugScriptAPI re-evaluates stripped scripts with full traces for debugging strip trace/logstatements for release buildsPairListtype to avoidSumDataList/SumDataPairListper-element conversions, used internally inSortedMapandValue.zerofor cheaper on-chain operationslovelaceAmountonValuefor efficient lovelace extraction viaPairList.headLinkedListlibrary implementation with on-chain validator and off-chain utilities- Merkle Patricia Forestry variants (mpfb, mpfo) with on-chain
verifyMembership/verifyNonMembership, off-chain trie operations, and Aiken cross-implementation compatibility FrontierMerkleTree,MerkleTree,MembershipTokendata structuresIncrementalMerkleTree(formerly AppendOnlyMerkleTree) with path-byte encoding optimization- bilinear accumulator allowlist validator with
scalus-ethereum-kzg-ceremonysubproject - Pippenger MSM optimization for BLS12-381 with allocation-free Montgomery NTT
- constant product AMM contract example
- multi-pool DEX example with multiple withdraw-zero scripts
- anonymous data contract with on-chain reading via reference inputs
DecentralizedIdentityon-chain contract withCompiledPlutusmint and required signers- upgradable proxy validator
- CAPE two-party escrow benchmark with factorial and fibonacci benchmarks
payTooverloads forCompiledPlutusinTxBuildercheckTransaction,pollForConfirmation, andsubmitAndPollonBlockchainProviderProtocolParams.diffandCardanoInfo.verifyUtxoEnvDefaultsfor inlined protocol parameters- emulator stake state pre-initialization with
Map[Address, Coin]and JS APIs ->operator support in Scalus compiler pluginassertEvalWithBudgetlambda overload to prevent constant folding in budget tests- builtin totality annotations for improved dead code elimination
- Cardano protocol parameters updated to epoch 616
datumBuilderfor outputs with datums that depend on the final transaction shape
- reorganized crypto packages —
crypto/trie,crypto/tree,crypto/accumulator; flattenedbls12_381 - moved off-chain crypto from
cardano.offchain.cryptotoscalus.crypto - renamed
MerklePatriciaTrietoMerklePatriciaForestry,BinaryMerklePatriciaTrietoFusedMerklePatriciaForestry - merged
Compiled[A]trait intoCompiledPlutus[A] requiredSignersis now a transaction-wide concept; per-steprequiredSignersAPIs deprecated- replaced
PlutusV4withPlutusV3+targetProtocolVersion - replaced
sourcePoswithUplcAnnotationin UPLC Term - optimized
List.atwith direct tail-recursive traversal List.singleandPairList.singleare nowinlinefor cheaper on-chain operations- use
TaggedSortedSet.applyinstead ofTaggedSortedSet.fromfor zero-cost wrapping of SortedSets - removed deprecated code from 0.13.x and earlier
- removed unused
scalusPluginTestsproject
- UPLC optimizer now uses position-ignoring equality to avoid false mismatches
Force(Delay)elimination after inner optimization in Inliner- free variable tracking in
substituteto avoid name capture Constrwith value args recognized as WHNF inisValueForm- unsaturated builtin applications recognized as WHNF
- propagate
inlinedFromincompileThrowExceptionfor inlinerequire Math.sqrtoptimized withlog2/exp2initial guess- deterministic validator iteration order using
SortedSet - validate seed
TxOutRefon-chain and harden off-chain helpers - propagate spent budget through CEK/emulator error chain
- ignore zero-amount entries in assets map during minting
- fetch Yaci DevKit slot config from admin API instead of hardcoding
- Merkle Patricia Forestry data structure for on-chain Merkle proofs
- variadic
logfunction with auto-show for trace diagnostics offsetOf[A]compile-time macro for case class field indicesBuiltinListpattern matching and optional Nil branch inCaseList(con value ...)syntax support in UPLC parser/printerFuture/Scenarioconversion andEmulatorBaseAPI
- simplified
ScenarioandContractScalaCheckCommandsAPIs - updated MaryEraValue builtin cost models to match Plutus 1.58.0.0 reference
- extracted dependency versions into build.sbt variables and bumped dependencies
- count native reference scripts towards minFee calculation
- use
Timelock.toCborfor native ref script size instead ofCbor.encode(Script) - account for sponsor VKey witness in fee estimation
- handle exceptions in
Scenariomonad and filter extra VKey witnesses inTxBuilder.sign - filter auction UTxO by NFT asset to prevent spam UTxO attacks
- fix MaryEraValue builtins and pool retirement validation
- all new builtins for protocol version 11 hard fork
- JavaScript Emulator support for cross-platform testing
- HD wallet implementation with BIP-39 mnemonic, BIP32-Ed25519 key derivation, and CIP-1852 account
- Conway era ledger state rules:
DELEGandPOOLtransitions for stake delegation and pool registration management TxBuilder.draftmethod for unbalanced transaction assemblytxBuilderfunction withCardanoInfocontext parameter- type-safe
UtxoQueryDSL with parallel execution and rate limiting for UTxO queries Transaction.scriptContextsextension method for easier script context accessMaryEraValuesupport (CIP-0153)expModIntegerbuiltin (CIP-109) for modular exponentiationbls12_381_G1_multiScalarMulandbls12_381_G2_multiScalarMulbuiltins (CIP-0109)g1andg2string interpolators for BLS12-381 elements- use
dropListfor case class field selection at index >= 2 on PlutusV4 Prettytypeclass with automatic derivation for ADTs and Cardano ledger typesEq.derivedfor automatic equality typeclass derivation- design patterns documentation: Merkelized Validators, Parameter Validation, OptimizedPaymentSplitter
- Crowdfunding, English Auction, Lottery, and PriceBet smart contract examples
- multi-environment integration testing infrastructure with Yaci DevKit consolidation
- comprehensive
scalus-testkitAPI withEvalTestKitandScalusTestbase classes Outputtype alias forTransactionOutputfetchScriptmethod to retrieve scripts from Blockfrost- 5 ADA threshold for collateral return optimization
- reorganized package structure -
scalus.builtintypes andscalus.preludemoved to new locations CompileandIgnoreannotations moved toscalus.compilerpackageValidatortraits moved frompreludetov3packageProviderdeprecated in favor ofBlockchainProvider- simplified
BlockfrostProviderAPI with platform-specific backends - BLS12-381 classes moved to
scalus.uplc.builtin.bls12_381package with shorter names - optimized
toDatafor constantByteString,String,Boolean, andIntegervalues - optimized
mkNilDatabuiltin to constant - optimized
Eq.derivedto use direct field access - improved PlutusV3 match lowering to reduce script size
- renamed
__z_combinatorto__Z - deprecated
Contracttrait - removed deprecated code from 0.12.x
- suppress false warnings for type tests on enum variants
- handle inline accessors in compiler plugin
- ensure error messages appear in UPLC traces
ByteStringnow extendsSerializable- security improvements for example validators: AuctionValidator, BettingValidator, Crowdfunding, VaultValidator, VestingValidator
- use Conway-style certificates for script-based stake registration
- platform-specific
modPowfor Scala.js and Scala Native compatibility
- BLS12-381 cryptographic operations for Scala Native via FFI bindings to blst library, enabling full Plutus V3 support on Native platform
- pure Scala implementations of cryptographic hash functions for Native platform:
- Keccak-256 and SHA3-256 (replaces Rust tiny_keccak_wrapper)
- RIPEMD-160 (enables ripemd_160 builtin on Native)
- type-safe
Blueprint.plutusV3factory methods with automatic schema derivation for CIP-57 blueprints PlutusV3.withErrorTracesmethod for debug builds with error tracesToDataandFromDatainstances for Conway era protocol parameters to support governance actions in Plutus V3 scriptsscalus-secp256k1-jniproject with custom secp256k1 JNI bindings (replaces bitcoin-s dependency)Inputtype alias forTransactionInputto improve code readability- missing Plutus conformance tests for 100% coverage (108 new tests)
- documentation for builtin functions, protocol parameters, emulator, and TxBuilder
- replaced bitcoin-s secp256k1 with scalus-secp256k1-jni using secp256k1 0.6.0
TransactionInputcomparison now uses efficient ByteString ordering instead of hex string conversion- slot configuration variables renamed to camelCase with deprecation warnings
- deprecated old
Blueprint.applymethod in favor of type-safeBlueprint.plutusV3methods - updated nixpkgs to version 25.11 and JDK to version 25
- collateral sufficiency check in
FeesOkException - error handling in
SIRCompiler - ECDSA signature component validation in secp256k1 on JavaScript platform
- overflow in
NonNegativeIntervalarithmetic with large denominators - empty list handling in
Data.Maplowering - reward account conversion in
ProposalProceduretranslation for V3 ScriptDataHashGenerator.computeScriptDataHash"no such element" exception- native access for BLST JNI library on Java 22+
- blst-java JNI symbol conflict with nix blst library
- CIP-0153 MaryEraValue (BuiltinValue) support with 7 builtin functions:
insertCoin,lookupCoin,unionValue,valueContains,valueData,unValueData,scaleValue - TypeScript tests for Scalus NPM package
- Yaci DevKit integration tests for TxBuilder
- native script minting integration test
- browser tests for NPM package
- NPM bundle renamed to
scalus.js - removed pattern matching restrictions (guards section)
- documentation updated for new TxBuilder API
- include proposal deposits in
TxBalance.producedcalculation BuiltinValuetype parameter support in SIR lowering- JSON parsing for
ProtocolParamsto handle both string and number formats
- Plutus V4 language support with Case instructions on boolean, integer, list, Data, and Pair types
- CIP-0138 Plutus Core Builtin Type Array implementation
- CIP-0156 Plutus Core Builtin Function
multiIndexArray - JIT compiler with 6x speedup over CEK interpreter
TxBuilder.completewith iterative balancing, automatic UTxO selection, and async supportTxBuilderstaking and governance implementation with delegation, DRep registration, and votingDatapattern matching supportcopymethod support for case classes in Scalus scriptsdropListbuiltin implementation with saturating CostingInteger arithmetic- cross-platform Ed25519 signing with type-safe opaque types (VerificationKey, Signature, SigningKey)
addrandstakestring interpolators for bech32 address parsingByteString.utf8string interpolator support in SIR compilerBlueprint.fromJson(InputStream)overload for efficient parsingTransaction.utxosmethod for transaction chainingEmulatorfor transaction testingStrictIfoptimization for if-then-else expressionspreprodandpreviewconstants inCardanoInfo- SIR function application operator
$with comprehensive test suite - collateral with native tokens support per Babbage specification
- delayed redeemer support for minting operations
TermSanitizerto sanitize variable names in UPLC terms- field selection for Data subtypes (I, B, List, Map, Constr)
toLedgerValuemethod for Value conversionSortedMap.fromandValue.unsafeFromSortedMapmethodsMultiAsset.onlyPositivemethod- Plutus conformance tests updated from 1.40.0.0 to 1.53.0.0
- comprehensive ledger rules validation tests
- BREAKING:
mintAPI unified - usemint(script, assets, redeemer)for attached scripts,mint(policyId, assets, redeemer)for reference scripts - BREAKING:
Providerconsolidated to async-only,AsyncProviderrenamed toProvider - BREAKING:
scalus.sirpackage moved toscalus.compiler.sir - BREAKING:
builtin.Datausesscalus.prelude.Listinstead ofscala.collection.immutable.List - BREAKING:
ChangeOutputDiffHandlernow acceptsValueinstead ofCoin - renamed
NodeEmulatortoEmulatorand moved to scalus-cardano-ledger - renamed
AsyncBlockfrostProvidertoBlockfrostProvider - renamed
LucidEvolutionKeyPairtoLucidKeyPair TxBuilderasync methods renamed:completeAsynctocomplete(returnsFuture[TxBuilder])- deprecated
Environmenttype alias in favor ofCardanoInfo - deprecated
PaymentBuilderin favor ofTxBuilder - deprecated
mintAndAttachin favor ofmint(script, assets, redeemer) - deprecated
SpendWithDelayedRedeemerin favor ofSpendwith delayed redeemer witness - migrated sttp from v3 to v4
- updated jsoniter-scala-core to 2.38.6
- updated bcprov-jdk18on to 1.83
- updated pprint to 0.9.6
- optimized CEK machine with mutable HashMap for builtins initialization
- optimized list transformations using view for better performance
- JIT compiler eliminates VCon allocations for cost-calculating builtins
- floor division edge case on Scala.js for
Long.MinValue / -1 - redeemer index recalculation after adding inputs in
TxBuilder.complete - collateral calculation precision in
calculateRequiredCollateral - inline datum handling for PlutusV1 scripts
- deterministic ordering in topological sort during SIR lowering
- wildcard case generation for product types in pattern matching
TransactionSignerpreserves existing witnesses when signing- delayed redeemers recomputed after
completeadds inputs Interop.toScalusDatapreserves order in Map- zero-ada change output kept if it contains assets
SIRType.showdeterministic by removing hashcodes from type variable display- collateral index output calculation in
PlutusScriptsTransactionMutator - various ledger rule validators:
ValueNotConservedUTxO,MissingRequiredDatums,MissingOrExtraScriptHashes,FeesOk,OutputsHaveNotEnoughCoins balanceFeeAndChangecorrectly handling modifications that invalidate result- bootstrap address attributes size validation in transactions
- new pattern matching based on decision trees
- primitive constant pattern matching in
SimpleSirToUplcLoweringandSirToUplc110Loweringbackends - LazyVal transformation to float lazy lets closer to their usage points
- lambda barrier for let-floating optimization to prevent work duplication
evalPlutusScriptsto JScalus for JavaScript platform- LinkedList pattern implementation with initialization and de-initialization
- PlutusScriptEvaluator benchmark for performance testing
- Fibonacci lookup implementation using pre-packed ByteString
- UTXO indexers using delayed redeemers
SortedMap.getOrFailaccepts custom error messages- Ledger Rules Framework: TraitObjectScanner for automatic discovery of rule implementations
compileWithOptionsmethod accepting explicit compiler options
- updated Scala version to 3.3.7
- BREAKING: repackaged txbuilder from
scalus.cardano.ledger.txbuildertoscalus.cardano.txbuilder - BREAKING:
ProtocolParams.costModelstype changed toCostModels - BREAKING: removed
semanticVariantfromMachineParams - moved
SlotConfigto scalus-core - BREAKING: replaced
bloxbean.SlotConfigwithcardano.ledger.SlotConfig - renamed
UTxOtoUtxosfor consistency - updated jsoniter-scala-core to 2.38.3
- inheritance via inline override for validators
- updated builtin cost models to use CardanoInfo (reduces scalus-cardano-ledger-opt-bundle.js by ~ 100k)
- renamed
builtinsMeaningtogetBuiltinRuntimein Cek and PlutusVM - pre-compute TxInfo for Plutus versions to optimize redeemer evaluation
- replaced ProtocolParams instantiation with CardanoInfo for consistency
- consolidated compile method handling in compiler plugin
- made validator helper methods public to support inheritance
- replaced
BuiltinsMeaningwithCardanoBuiltins - removed deprecated methods and cleaned up code
- improved error diagnostics for wildcard case positioning
- enhanced SIRLinker debug logging and error handling
- modified base validator traits to use inline abstract methods
- disabled linker in compiler plugin (functionality moved to separate compilation phase)
- improved script witness computation and UTxO handling
- optimized ByteString handling and improved offchain method documentation
- refactored LinkedList contract to use failures instead of bools
- refactored HTLC and Vault validators for improved clarity
- Word64 flat format encoding
Term.Constr.tagencoding as unsigned Word64 type- pattern matching on primitive constants with default case
@pattern bindings in nested positions- duplicate wildcard cases in pattern match compilation
- incorrect typing of tail of list pattern
- bug in alphaEquality (case arguments may be variables)
- type substitution in constructors
Interop.getMintValueresolves all BlocksValidation fails- Boolean data representation compatibility with Plutus
- compilation on Windows
- bug with incorrect handling of
SIR.Const - non-recursive let bindings scoping bug
- performance regression in LinkedList tests
- S3LoweringDataAccess regression
- validation for non-negative integers in flat serialization
- Data CBOR encoding for large negative integers (Java adds an extra 0 byte)
- Address constructors for Credentials
- Transaction and TransactionOutput constructors
NormalizedIntervalimplementation for interval operations- ledger rules:
missingRequiredDatums,validateOutputBootAddrAttrsTooBig,hasExactSetOfRedeemers - upstream tx editor and tx builder
- additional functions to StdlibTestKit
- refactored and improved offchain MultiAsset, Coin and Value
- refactored HtlcValidator to follow scalus style
- deprecated prelude
orFail, replaced==with===in several places - simplified datum retrieval in Escrow, HelloCardano, and Vesting scripts
- refactored TransactionWitnessSet.apply
- moved BuildInfo to
scalus.utils - replaced Hex.hexToBytes calls with extension method
- rewritten patterns tests using UPLC
- not all tree is traversed during Apply handling in CaseConstrApply optimization pass
- plutus scripts error propagation to low level tx balancer
- wrong redeemers sorting in ScriptContext
- low level tx balancer fee change re-looping
- hardcoded change output values in transaction building
- budget calculation: wrong sorting order of redeemers
- Cardano ledger rules implementation and validation
- experimental UPLC JIT compiler for improved performance
Showtypeclass implementation for better debugging in smart contracts- new
Betting,EscrowandSimple transferexamples - CBOR codecs reserialize to the same bytes with
KeepRaw - experimental transaction builder with intention-based API
monocleoptics support for lens-based data manipulation- Ed25519 compatibility for Cardano key derivation and message signing
- BLS12-381 scalar field support
- property-based testing utilities with ScalaCheck integration
- enhanced plutus script evaluation on JavaScript platform
- major backwards compatible package reorganizations
- moved Cardano ledger types to
scalus.cardano.ledger - moved protocol parameters and cost models to appropriate packages
- transaction builder redesigned with cleaner intention-based API
- improved Value implementation using SortedMap
- enhanced error messages and debugging support
- updated build system and dependency management
- script data hash generation for PlutusV1 cost model serialization order
- various transaction building and balancing issues
- improved error handling in script evaluation
- better handling of native tokens in transaction building
- new more efficient UPLC codegen
- CIP-57 Blueprints support
- improved Scalus standard library and tests
PlutusScriptEvaluatorfor evaluating Plutus scripts using Scalus ledger domain typesScriptDataHashGeneratorfor computing script integrity hash- added and improved Cardano Ledger rules
- Arbitrary instances for Plutus domain types
- Vesting example
- avoid expensive G1/G2 zero/generator constants initialization
- Plutus
ValueusesSortedMapinstead ofAssocMap - improved Cardano Ledger classes
- large BigInt encoding occasionally added an extra byte to the CBOR encoding
- mint value doesn't contain 0 Ada in Plutus V3 scripts
- updated to a new Maven Central repository
- lazy cost model loading in
ScalusTransactionEvaluator
- BLS builtins serialization
- cost parameters for
divideInteger,modInteger,quotientInteger,remainderInteger
- more Cardano ledger rules
- moved Cardano Ledger domain types to scalus project
- refactor Hash types in ledger domain types
- improved Scalus standard library
- Scalus Design Patterns project
- Scalus Examples: HTLC, PaymentSplitter
- Scalus benchmarks: Knights and Clausify
- new UPLC 1.1 generation
SirToUplc110Lowering(experimental) - Cardano Ledger domain types with CBOR codecs (experimental)
- Scalus Bilinear Accumulator implementation (experimental)
- simplify
ToData/FromDataderivation allowing Scala 3derives - updated to Scala 3.3.6, Scala.js 1.19.0
- support for Scala argumentless functions in Scalus compiler
- all Plutus V3 builtins from the Plomin hard fork
- improved Scalus standard library
- support for TupleN types
- support for destructuring: val (a, b) = Foo(2, “b”)
- BLS12-381 primitives work on JVM and Javascript
- Groth16 SNARK implementation works on JVM and Javascript
- Cardano native scripts support: Timelock
- advanced UPLC optimization: case/constr instead of apply
- generate better error traces for UPLC
- PaymentSplitter example
- simple Validator trait for writing validators
- Scalus Testkit: a simple test framework for testing Plutus scripts
- better SIR code generation (remove recursivity)
- better UPLC optimizations: eta-reduce
- better error messages in the compiler
- renamed
MaybetoOptionto follow Scala naming conventions - cardano-client-lib 0.6.4
- bug with Select fields during linking of SIR
- Scalus Scala Native support with all Plutus V1/V2 builtins
- a C example using libscalus native library for script evaluation and budget calculation
- compile synthetic DataType.apply as a primary constructor
- better error messages during Scalus on-chain script compilation
- async-profiler support for profiling
- dependencies updated: Scala 3.3.5, Scala.js 1.18.2
- speedup MemoryUsage calculation
- removed unnecessary bitcoin-s-crypto dependency
- Data.unit type is Data, not Constr
- CIP-117: fail on non-unit results in Plutus V3 scripts
- OptimizingSirToUplcLowering threw an exception when generateErrorTraces was enabled
- customizable UPLC Inliner optimization pass
- Prelude List functions: single, cons, length, map2
- experimental Groth16 SNARK implementation
- Data
toCborandfromCborextensions - add generated ScalaDocs to website
- code is updated to Scala 3.5+
- use latest dependencies
- BLS12-381 G1/G2 compressed zero points encoding
Nothing changed, just pushed the wrong commit under 0.8.1.
- cost model for
integerToBytestringandbytestringToInteger - flat encoding of SIR
Datawas wrong forMapandListtypes
- initial Plutus V3 support:
- all builtins work on JVM
- V3
ScriptContextetc for script compilation - V3 script evaluation and cost calculation
- Cardano Client Lib can use
ScalusTransactionEvaluatorfor V3 script evaluation - improved
deriveEnumforToDataandFromData(see Tutorial)
- few renames and API changes in
scalus-bloxbean-cardano-client-libInteropmodule
VM.evaluateDebugwith useful info about the execution: budget, costs, builtins, logseval,evalDebug,show,showHightlightedextensions forTermandProgramtoUplcOptimizedextension forSIRto generate optimized UPLC code?tracing operator andlogfunction similar to Aiken's?operator
- don't remove top-level eta-expansions in
compilemethod
- fieldAsData/field didn't work for aliaed types
- small fix in
OptimizingSirToUplcLoweringwith tracing errors - multiple inner matches in pattern matching code generation
- implemented all Plutus V1/V2 builtins on JVM and JavaScript platforms
- passing all Plutus Conformance Tests on JVM and JavaScript platforms
OptimizingSirToUplcLoweringSIR to UPLC lowering with built-in optimizations- PlutusV3 constr/case support
Data.to*extension methods
- speedup
UplcParserby 10x
- use Java 11 on Github CI and release builds
Scalus CEK and cost calculation implementation is now feature complete.
We were able to validate transactions from whole Cardano Epoch 484 using Scalus and Cardano Client Lib.
ScalusTransactionEvaluator- Cardano Client Lib (CCL)TransactionEvaluatorimplementation. You can now use Scalus to evaluate scripts and their costs off-chain during transaction building.- SIR and UPLC optimizations:
RemoveRecursivity,EtaReduce evaluateScriptRestrictingmode- Advanced documentation
DataJSON codec
- optimized From/ToData instances to generate less code
PlutusV1Params,PlutusV2Paramsare now classes with Long fields- Removed type parameter from
Interval - bytesToHex uses lowercase hex characters
- memoryUsageInteger was wrong in certain cases
- sliceByteString wrong order of parameters
- Data CBOR encoding of large integers must be chunked by 64 byte chunks
- typo in
ConstAboveDiagonalcost calculation implementation
- compile
==,!=operators as Plutus builtins forBoolean,ByteString,StringandDatatypes ++operator,sizeandlengthfunctions forByteString
- wrong
ConstAboveDiagonalcost calculation used in division
- fast debruijned CEK machine implementation
- CEK machine benchmarking, runs on par with high performance Haskell implementation
- CEK machine execution budget calculation
- cost model for CEK machine loading from Cardano CLI and Blockfrost API JSONs
- updated to Scala 3.3.3
- updated to Scala.js 1.16.0, 3x reduction in JS bundle size
- lots of internal refactoring
- better error messages in the compiler
- Scalus Intermediate Representation (SIR) now has a version number (requires recompilation of existing SIR)
- SIR and UPLC pretty printers can print normal and syntax highlighted code using XTerm colors
- UPLC pretty printer outputs a better indented code
- added Blake2b 224 builtin implementation on JVM
- updated dependencies: Scala 3.3.2
- use uplc cli from Plutus 1.15.0.1
- moved scalus.uplc.Data to scalus.builtin.Data
- renamed scalus.builtins to scalus.builtin
- Plutus Data Map can have duplicate keys; fixed Data CBOR codec to handle this case.