nautechsystems/nautilus_trader · error

event_slug_builder.assets must include at least one non-empt

Error message

event_slug_builder.assets must include at least one non-empty asset

What it means

Config validation in the Polymarket event-slug builder: after filtering blank entries the assets list must still contain at least one non-empty asset symbol to build event slugs from; an all-blank list is rejected.

Source

Thrown at crates/adapters/polymarket/src/config.rs:122

        let now = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .map_err(|e| anyhow::anyhow!("system clock before Unix epoch: {e}"))?
            .as_secs();
        self.build_event_slugs_at_unix_secs(now)
    }

    fn build_event_slugs_at_unix_secs(&self, unix_secs: u64) -> anyhow::Result<Vec<String>> {
        if self.interval_mins == 0 {
            anyhow::bail!("event_slug_builder.interval_mins must be positive");
        }

        if self.periods == 0 {
            anyhow::bail!("event_slug_builder.periods must be positive");
        }

        let assets = self.normalized_assets();
        if assets.is_empty() {
            anyhow::bail!("event_slug_builder.assets must include at least one non-empty asset");
        }

        let period_secs = self
            .interval_mins
            .checked_mul(60)
            .ok_or_else(|| anyhow::anyhow!("event_slug_builder.interval_mins is too large"))?;
        let period_start = (unix_secs / period_secs) * period_secs;
        let period_secs = i128::from(period_secs);
        let period_start = i128::from(period_start);
        let mut slugs = Vec::new();

        for period in 0..self.periods {
            let period_offset = i128::from(self.start_offset_periods) + i128::from(period);
            let timestamp = period_start + period_offset * period_secs;
            if timestamp < 0 {
                anyhow::bail!("event_slug_builder offset resolves before the Unix epoch");
            }

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Provide at least one non-empty asset in event_slug_builder.assets (e.g. ["BTC"])
  2. Trim/validate asset strings in config before building slugs
  3. Check env/secret sources that feed the assets list for empty values

Example fix

// before
[event_slug_builder]
assets = []
// after
[event_slug_builder]
assets = ["BTC", "ETH"]
Defensive patterns

Strategy: validation

Validate before calling

let assets: Vec<_> = cfg.event_slug_builder.assets.iter().map(|a| a.trim()).filter(|a| !a.is_empty()).collect();
assert!(!assets.is_empty(), "assets must include at least one non-empty asset");

Try / catch

match builder.build_event_slugs() {
    Ok(slugs) => use(slugs),
    Err(e) => { log::error!("assets misconfigured: {e}"); return Err(e); }
}

Prevention

When it happens

Trigger: Building event slugs where assets is empty, or every configured asset is an empty/whitespace string so normalized_assets() returns an empty vec.

Common situations: Config file with `assets = []`; assets supplied via env var that is unset; accidentally passing empty strings instead of asset symbols.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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