evaluateTransaction

Evaluate script execution costs for a transaction

Evaluate the execution cost of Plutus scripts in a transaction without submitting it. This is essential for setting correct execution unit budgets and calculating accurate fees.

Request

{
  "jsonrpc": "2.0",
  "method": "evaluateTransaction",
  "params": {
    "transaction": {
      "cbor": "84a400818258203e40d0530281df85e08fb0c5ac7a44c8cd94cabae4b6d32f0c29ab05dcfc79e600..."
    },
    "additionalUtxo": [
      {
        "transaction": { "id": "abc123..." },
        "index": 0,
        "address": "addr1...",
        "value": { "ada": { "lovelace": 10000000 } }
      }
    ]
  }
}

Parameters

ParameterTypeRequiredDescription
transaction.cborstringYesTransaction in CBOR hex format
additionalUtxoarrayNoAdditional UTxOs to include in evaluation context

The transaction doesn't need to be signed for evaluation. This allows you to calculate costs before signing.

Loading...

Response

{
  "jsonrpc": "2.0",
  "method": "evaluateTransaction",
  "result": [
    {
      "validator": {
        "purpose": "spend",
        "index": 0
      },
      "budget": {
        "memory": 1234567,
        "cpu": 987654321
      }
    },
    {
      "validator": {
        "purpose": "mint",
        "index": 0
      },
      "budget": {
        "memory": 234567,
        "cpu": 123456789
      }
    }
  ]
}

Response Fields

FieldTypeDescription
validator.purposestringScript purpose: spend, mint, withdraw, publish
validator.indexnumberIndex in the transaction inputs/mints/etc.
budget.memorynumberMemory units required
budget.cpunumberCPU steps required

Code Examples

async function evaluateTransaction(txCbor, additionalUtxos = []) {
const response = await fetch('https://api.nacho.builders/v1/ogmios', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'apikey': process.env.NACHO_API_KEY
  },
  body: JSON.stringify({
    jsonrpc: '2.0',
    method: 'evaluateTransaction',
    params: {
      transaction: { cbor: txCbor },
      additionalUtxo: additionalUtxos
    }
  })
});

const data = await response.json();

if (data.error) {
  console.error('Evaluation failed:', data.error.message);
  throw new Error(data.error.message);
}

return data.result;
}

// Calculate total execution units
function getTotalExUnits(evaluationResult) {
return evaluationResult.reduce((acc, item) => ({
  memory: acc.memory + item.budget.memory,
  cpu: acc.cpu + item.budget.cpu
}), { memory: 0, cpu: 0 });
}

const result = await evaluateTransaction(txCbor);
const total = getTotalExUnits(result);
console.log('Total memory:', total.memory);
console.log('Total CPU:', total.cpu);

Error Responses

Invalid Script

{
  "error": {
    "code": 3100,
    "message": "Script execution failed",
    "data": {
      "validationError": "ExUnitsTooBig",
      "scriptHash": "abc123...",
      "reason": "Exceeded maximum execution units"
    }
  }
}

Missing Datum

{
  "error": {
    "code": 3101,
    "message": "Missing datum",
    "data": {
      "datumHash": "abc123..."
    }
  }
}

Missing Redeemer

{
  "error": {
    "code": 3102,
    "message": "Missing redeemer",
    "data": {
      "scriptHash": "abc123..."
    }
  }
}

Workflow: Build → Evaluate → Submit

async function buildAndSubmitTx() {
  // 1. Build transaction (without execution units)
  const txDraft = buildTransaction({
    inputs: [...],
    outputs: [...],
    collateral: [...],
    // Don't include exUnits yet
  });

  // 2. Evaluate to get execution units
  const evaluation = await evaluateTransaction(txDraft.toCbor());

  // 3. Update transaction with execution units
  const txWithUnits = txDraft.setExUnits(evaluation);

  // 4. Calculate final fee
  const fee = calculateFee(txWithUnits, protocolParams);
  const txWithFee = txWithUnits.setFee(fee);

  // 5. Sign and submit
  const signedTx = sign(txWithFee, signingKey);
  const txHash = await submitTransaction(signedTx.toCbor());

  return txHash;
}

Always add a small buffer (10-20%) to evaluated execution units to account for variance in actual execution.

Additional UTxOs

Use additionalUtxo when evaluating transactions that depend on UTxOs not yet on-chain (e.g., in a multi-transaction workflow):

// Transaction B depends on UTxO from Transaction A (not yet submitted)
const evaluation = await evaluateTransaction(txBCbor, [
  {
    transaction: { id: txAHash },
    index: 0,
    address: "addr1...",
    value: { ada: { lovelace: 10000000 } },
    datum: "d8799f..." // If script requires datum
  }
]);

Use Cases

  • Fee calculation - Determine exact fees before signing
  • Script debugging - Validate scripts work correctly
  • Cost estimation - Show users expected costs
  • Budget optimization - Ensure scripts fit within limits

Full Ogmios API Reference

Was this page helpful?