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
- Provide at least one non-empty asset in event_slug_builder.assets (e.g. ["BTC"])
- Trim/validate asset strings in config before building slugs
- 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
- Trim and filter asset strings when loading config
- Require at least one asset in config schema validation
- Avoid sourcing assets from possibly-empty env vars without defaults
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
- event_slug_builder.interval_mins must be positive
- event_slug_builder.periods must be positive
- event_slug_builder offset resolves before the Unix epoch
- Polymarket {signature_type:?} signature type requires a fund
- PolymarketFeeModel requires fee schedule exponent 1, was {}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/8e1a044744e0bb7f.
Report an issue: GitHub.