nautechsystems/nautilus_trader · error

Signed transaction priority fee per gas {} wei exceeds max f

Error message

Signed transaction priority fee per gas {} wei exceeds max fee per gas {} wei

What it means

validate_signed_transaction enforces EIP-1559 fee sanity: the max priority fee per gas (tip) must never exceed the max fee per gas. This error fires when a signed transaction violates that invariant, which would otherwise be invalid or economically nonsensical on-chain.

Source

Thrown at crates/adapters/blockchain/src/execution/transaction.rs:314

        "Signed transaction value does not match persisted value"
    );
    anyhow::ensure!(
        tx.input == intent.input,
        "Signed transaction calldata does not match persisted calldata"
    );
    anyhow::ensure!(
        tx.gas_limit <= intent.gas_limit,
        "Signed transaction gas limit {} exceeds configured ceiling {}",
        tx.gas_limit,
        intent.gas_limit
    );
    anyhow::ensure!(
        tx.max_fee_per_gas <= u128::from(intent.max_fee_per_gas),
        "Signed transaction max fee per gas {} wei exceeds configured ceiling {} wei",
        tx.max_fee_per_gas,
        intent.max_fee_per_gas
    );
    anyhow::ensure!(
        tx.max_priority_fee_per_gas <= tx.max_fee_per_gas,
        "Signed transaction priority fee per gas {} wei exceeds max fee per gas {} wei",
        tx.max_priority_fee_per_gas,
        tx.max_fee_per_gas
    );

    Ok(())
}

/// Applies `gas_buffer_bps` over the `eth_estimateGas` result.
///
/// A buffered estimate above `gas_limit` rejects the transaction rather than clamping to the
/// ceiling: on Arbitrum the estimate folds the L1 data fee into gas units, and clamping
/// guarantees a paid-for out-of-gas revert.
///
/// # Errors
///
/// Returns an error if the buffered estimate exceeds `gas_limit` or the arithmetic overflows.

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Set tx.max_priority_fee_per_gas <= tx.max_fee_per_gas before signing
  2. Raise max_fee_per_gas so it covers the intended priority tip
  3. Use a standard fee estimator (e.g. eth_maxPriorityFeePerGas) and clamp the tip to the max fee

Example fix

// before
let max_fee_per_gas = 20_000_000_000u128;
let max_priority_fee_per_gas = 25_000_000_000u128; // tip > cap
// after
let max_priority_fee_per_gas = max_priority_fee_per_gas.min(max_fee_per_gas);
Defensive patterns

Strategy: validation

Validate before calling

assert!(tx.max_priority_fee_per_gas <= tx.max_fee_per_gas, "priority fee {} exceeds max fee {}", tx.max_priority_fee_per_gas, tx.max_fee_per_gas);

Type guard

fn fees_valid(max_fee_per_gas: u128, max_priority_fee_per_gas: u128) -> bool {
    max_priority_fee_per_gas <= max_fee_per_gas
}

Prevention

When it happens

Trigger: tx.max_priority_fee_per_gas > tx.max_fee_per_gas during validation of a signed transaction inside validate_signed_transaction; e.g. a manually built 1559 transaction where the tip cap was raised above the fee cap.

Common situations: Hand-assembled EIP-1559 transactions with inverted fee fields; signing libraries or wallets configured with a fixed tip that exceeds a lowered max fee; unit tests or tooling setting priorityFee > maxFee.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/bed710b4c2b88500. Report an issue: GitHub.