Skip to content

improvement: scriptRef size double-counted when UTxO appears in both spent and reference inputs #180

@solidsnakedev

Description

@solidsnakedev

Summary

calculateReferenceScriptFee receives [...state.selectedUtxos, ...state.referenceInputs]. If the same UTxO appears in both arrays (e.g. spent via collectFrom and also listed via readFrom), its scriptRef size is counted twice.

The Cardano node deduplicates using Set.union before scanning:

-- eras/conway/impl/src/Cardano/Ledger/Conway/UTxO.hs
txNonDistinctRefScriptsSize utxo tx = ...
  where
    inputs = (tx ^. bodyTxL . referenceInputsTxBodyL)
      `Set.union` (tx ^. bodyTxL . inputsTxBodyL)  -- union deduplicates

Impact

Only affects the edge case where the same UTxO is both spent and read. Over-charges the ref script fee for that UTxO. Safe (node accepts fees above minimum) but imprecise.

Fix

Deduplicate by UTxO output reference before scanning:

const seen = new Set<string>()
const deduped = [...state.selectedUtxos, ...state.referenceInputs].filter(utxo => {
  const key = `${utxo.txHash}#${utxo.outputIndex}`
  if (seen.has(key)) return false
  seen.add(key)
  return true
})

Affected File

packages/evolution/src/sdk/builders/phases/FeeCalculation.ts — the call site that builds the utxo array passed to calculateReferenceScriptFee

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions