Release Notes
Added
- 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
Changed
- 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
Fixed
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
Documentation
- Documentation: https://scalus.org/docs
- Getting started: https://scalus.org/docs/get-started
Contributors
![]() @nau |
![]() @rssh |
![]() @sae3023 |
![]() @fernweh0 |



