FuelLabs/fuel-core · error

estimated predicates count overflow

Error message

estimated predicates count overflow

What it means

estimated_predicates_count is incremented with checked_add after each predicate estimation round; the error fires only if the counter (a usize) overflows, i.e. after 2^64 estimation rounds on the same assembly. It is a defensive guard, not a condition a real workload can reach (the estimate_predicates_limit check trips far earlier).

Source

Thrown at crates/fuel-core/src/schema/tx/assemble_tx.rs:700

        let mut tx_to_estimate = self.tx;
        let estimated_tx = tokio_rayon::spawn_fifo(move || {
            let result = tx_to_estimate.estimate_predicates(
                &parameters,
                memory,
                read_view.as_ref(),
            );
            result.map(|_| tx_to_estimate)
        })
        .await
        .map_err(|err| anyhow::anyhow!("{:?}", err))?;

        self.tx = estimated_tx;

        self.estimated_predicates_count = self
            .estimated_predicates_count
            .checked_add(1)
            .ok_or_else(|| anyhow::anyhow!("estimated predicates count overflow"))?;

        Ok(self)
    }

    async fn estimate_script_if_possible(&mut self) -> anyhow::Result<()> {
        if !self.is_runnable_script() {
            return Ok(())
        }

        let Some(script_ref) = self.tx.as_script_mut() else {
            unreachable!("The transaction is a script, checked above; qed");
        };

        // Trick to avoid cloning `Script`
        let dummy_script = Transaction::script(
            Default::default(),
            Default::default(),
            Default::default(),

View on GitHub (pinned to b9d4d170da)

Solutions

  1. Treat this as an internal invariant failure: report it upstream with the tx and node version
  2. If you forked the node and disabled the round limit, restore a sane assemble_tx_estimate_predicates_limit
Defensive patterns

Strategy: try-catch

Try / catch

catch (e) { if (/estimated predicates count overflow/.test(e.message)) { /* internal invariant: report upstream with tx + node version */ } else throw e; }

Prevention

When it happens

Trigger: Theoretically usize::MAX estimation rounds within one assemble call; in practice unreachable because error 88's limit check fires first at the configured round limit.

Common situations: Custom forks that remove or raise estimate_predicates_limit to extreme values; otherwise never observed in the wild.

Related errors


AI-assisted analysis of FuelLabs/fuel-core@b9d4d170da (2026-08-16). Data as JSON: /api/errors/9da7f5052bc97fd1. Report an issue: GitHub.