{"record":{"id":"75be60765b7c79f8","repo":"nautechsystems/nautilus_trader","slug":"event-slug-builder-interval-mins-is-too-large","errorCode":null,"errorMessage":"event_slug_builder.interval_mins is too large","messagePattern":"event_slug_builder\\.interval_mins is too large","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/config.rs","lineNumber":128,"sourceCode":"\n    fn build_event_slugs_at_unix_secs(&self, unix_secs: u64) -> anyhow::Result<Vec<String>> {\n        if self.interval_mins == 0 {\n            anyhow::bail!(\"event_slug_builder.interval_mins must be positive\");\n        }\n\n        if self.periods == 0 {\n            anyhow::bail!(\"event_slug_builder.periods must be positive\");\n        }\n\n        let assets = self.normalized_assets();\n        if assets.is_empty() {\n            anyhow::bail!(\"event_slug_builder.assets must include at least one non-empty asset\");\n        }\n\n        let period_secs = self\n            .interval_mins\n            .checked_mul(60)\n            .ok_or_else(|| anyhow::anyhow!(\"event_slug_builder.interval_mins is too large\"))?;\n        let period_start = (unix_secs / period_secs) * period_secs;\n        let period_secs = i128::from(period_secs);\n        let period_start = i128::from(period_start);\n        let mut slugs = Vec::new();\n\n        for period in 0..self.periods {\n            let period_offset = i128::from(self.start_offset_periods) + i128::from(period);\n            let timestamp = period_start + period_offset * period_secs;\n            if timestamp < 0 {\n                anyhow::bail!(\"event_slug_builder offset resolves before the Unix epoch\");\n            }\n\n            for asset in &assets {\n                slugs.push(format!(\n                    \"{asset}-updown-{}m-{timestamp}\",\n                    self.interval_mins\n                ));\n            }","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/config.rs#L110-L146","documentation":"build_event_slugs_at_unix_secs computes the period length as interval_mins * 60 seconds using checked_mul. This error is thrown when interval_mins is so large that multiplying by 60 overflows u64, meaning the configured interval is nonsensical and no slug grid can be built.","triggerScenarios":"Constructing an UpDownEventSlugConfig (PolymarketConfig's slug builder) with an interval_mins value greater than u64::MAX/60 (~3.07e17 minutes) and calling build_event_slugs_at_unix_secs (directly or via build_event_slugs).","commonSituations":"A typo or bad deserialization placing a huge number (or u64::MAX sentinel) into interval_mins; a config file with garbage values; unit tests probing overflow behavior.","solutions":["Set interval_mins to a realistic period length (e.g. 1, 5, 15 minutes as Polymarket up/down markets use).","Validate interval_mins bounds in config deserialization/FromStr before constructing the builder.","Trace where the oversized value comes from (env var, JSON config) and fix the source value.","Add a checked constructor returning a config error for intervals beyond a sane maximum."],"exampleFix":"// before: config.json\n{\"interval_mins\": 18446744073709551615}\n// after\n{\"interval_mins\": 15}","handlingStrategy":"validation","validationCode":"// Rust: bound-check interval_mins before constructing the slug config\nconst MAX_INTERVAL_MINS: u64 = 525_600; // one year\nfn interval_mins_ok(v: u64) -> bool {\n    v > 0 && v <= MAX_INTERVAL_MINS\n}","typeGuard":null,"tryCatchPattern":"match config.build_event_slugs() {\n    Ok(slugs) => use(slugs),\n    Err(e) if e.to_string().contains(\"too large\") => {\n        return Err(ConfigError::InvalidField(\"interval_mins\"));\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Validate interval_mins range in config deserialization (positive and bounded).","Use realistic periods (1/5/15 min) matching Polymarket up/down markets.","Add a constructor-time check so bad configs fail fast at load, not at slug build."],"tags":["config","overflow","polymarket","interval"],"backgroundTag":"value-out-of-range","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}