Summary
authCommitteeHot and resignCommitteeCold store their redeemer under cert:{coldCredentialHash}, but the assembly loop only matches certificates on stakeCredential and drepCredential. committeeColdCredential is never checked, so the lookup always fails, logs a warning, and skips the redeemer.
A Plutus-script committee cold credential therefore produces a transaction with no redeemer for its certificate, which the node rejects. Native-script cold credentials are unaffected, since #494 made those require no redeemer.
Affected
- packages/evolution/src/sdk/builders/internal/txBuilder.ts:613-631 (loop checks only stakeCredential and drepCredential)
- packages/evolution/src/sdk/builders/internal/txBuilder.ts:632-635 (unresolved index logs a warning and continues)
- packages/evolution/src/sdk/builders/operations/Governance.ts:260, 323 (redeemer keyed by coldCredential)
Fix
- Add a
committeeColdCredential branch to the assembly loop.
- Consider failing instead of warning when a cert redeemer cannot be resolved. Building a transaction that is known to be missing a required redeemer is not a useful default.
Test
Add coverage asserting a Plutus-script authCommitteeHot emits a redeemer at the certificate's index.
Summary
authCommitteeHotandresignCommitteeColdstore their redeemer undercert:{coldCredentialHash}, but the assembly loop only matches certificates onstakeCredentialanddrepCredential.committeeColdCredentialis never checked, so the lookup always fails, logs a warning, and skips the redeemer.A Plutus-script committee cold credential therefore produces a transaction with no redeemer for its certificate, which the node rejects. Native-script cold credentials are unaffected, since #494 made those require no redeemer.
Affected
Fix
committeeColdCredentialbranch to the assembly loop.Test
Add coverage asserting a Plutus-script
authCommitteeHotemits a redeemer at the certificate's index.