Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Redeemers: toScriptDataHash ignores the codec options when encoding datums

Open Beginner friendly
#579 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
88/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
blockchain

Research direction

Start in packages/evolution/src/Redeemers.ts, focusing on encodeDatumsTaggedSet and both toScriptDataHash branches. Add regression coverage for canonical options with and without redeemers, plus the default-options control; the tests are done when the canonical hash matches the node oracle and the existing default hash remains unchanged.

Written by the indexing model from the issue text.

Description

Summary

Redeemers.toScriptDataHash(redeemers, costModels, datums, options) applies options to the redeemers but always encodes the datums with CML_DATA_DEFAULT_OPTIONS. Asked for a canonical hash, it returns the hash over indefinite-length datums:

const d = Data.fromCBORHex("d8799f019f02ffff")
Data.toCBORHex(d, CBOR.CANONICAL_OPTIONS)            // d87982018102, the bytes in the witness set
Redeemers.toScriptDataHash(empty, costModels, [d], CBOR.CANONICAL_OPTIONS)
// 80dbaeaf…, the hash over d8799f019f02ffff; expected ac4817df…

The ledger hashes the datums exactly as they appear in the witness set: cardano-ledger Alonzo/Tx.hs L318-321 builds the script integrity bytes from originalBytes of the redeemers and datums. A transaction whose witness set carries canonical datums therefore needs the hash over canonical datums.

Affected

packages/evolution/src/Redeemers.ts

  • encodeDatumsTaggedSet (L548-555) defaults to CML_DATA_DEFAULT_OPTIONS
  • toScriptDataHash calls it without options in both branches: datums with no redeemers (L600) and redeemers with datums (L612)

The builder is not affected today: it computes the hash with default options and does not add witness datums.

Fix

Pass the caller's options through to encodeDatumsTaggedSet when the caller gives them. When options is left at its default, keep encoding datums with CML_DATA_DEFAULT_OPTIONS, so today's default hashes do not change.

Regression test

Oracle is the node.

  • given: datum d8799f019f02ffff, no redeemers, CANONICAL_OPTIONS
  • before fix: 80dbaeaf…
  • after fix: ac4817df…, blake2b-256 of a0 d9010281 d87982018102 a0
  • same check for the branch with redeemers and datums
  • control: with default options the hash is unchanged

Devnet, raw submission through Ogmios. The witness set carries d87982018102, and the output holds its datum hash:

  • script data hash from toScriptDataHash(..., CANONICAL_OPTIONS): rejected with 3113, provided 80dbaeaf…, computed ac4817df…
  • script data hash ac4817df…: accepted

Must FAIL on main today and PASS after the fix.

Dominant language
TypeScript
Stars
22
Forks
31
Avg merge
3d 4h
Merged PRs (30d)
27

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from IntersectMBO/evolution-sdk

All issues in IntersectMBO/evolution-sdk

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.