{"record":{"id":"27b6ddebf084c14f","repo":"nautechsystems/nautilus_trader","slug":"unsupported-hour-step-step","errorCode":null,"errorMessage":"Unsupported hour step: {step}","messagePattern":"Unsupported hour step: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/coinbase/src/common/parse.rs","lineNumber":144,"sourceCode":"        bar_type.aggregation_source() == AggregationSource::External,\n        \"Only EXTERNAL aggregation is supported\"\n    );\n\n    let step = spec.step.get();\n\n    match spec.aggregation {\n        BarAggregation::Minute => match step {\n            1 => Ok(CoinbaseGranularity::OneMinute),\n            5 => Ok(CoinbaseGranularity::FiveMinute),\n            15 => Ok(CoinbaseGranularity::FifteenMinute),\n            30 => Ok(CoinbaseGranularity::ThirtyMinute),\n            _ => anyhow::bail!(\"Unsupported minute step: {step}\"),\n        },\n        BarAggregation::Hour => match step {\n            1 => Ok(CoinbaseGranularity::OneHour),\n            2 => Ok(CoinbaseGranularity::TwoHour),\n            6 => Ok(CoinbaseGranularity::SixHour),\n            _ => anyhow::bail!(\"Unsupported hour step: {step}\"),\n        },\n        BarAggregation::Day => match step {\n            1 => Ok(CoinbaseGranularity::OneDay),\n            _ => anyhow::bail!(\"Unsupported day step: {step}\"),\n        },\n        other => anyhow::bail!(\"Unsupported aggregation: {other}\"),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use rstest::rstest;\n\n    use super::*;\n\n    #[rstest]\n    #[case(\n        \"BTC-USD.COINBASE-1-MINUTE-LAST-EXTERNAL\",","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/coinbase/src/common/parse.rs#L126-L162","documentation":"Validation branch in bar_type_to_granularity rejecting HOUR steps other than 1/2/6/24-equivalents supported by Coinbase: the requested hourly step has no matching Coinbase granularity, so the bar type cannot be requested.","triggerScenarios":"Requesting bars (via `request_bars`) with a `BarType` like `...-4-HOUR` or `...-12-HOUR`; Coinbase simply does not offer those granularities.","commonSituations":"Config reuse from exchanges with richer hour granularity sets (e.g. Binance supports 4h/8h/12h); copy-pasted bar specifications across adapters.","solutions":["Switch the BarType to a supported hour step: 1, 2, or 6 hours.","Build larger windows locally by aggregating 1-hour bars.","Source those bars from an adapter whose exchange supports the desired hour step."],"exampleFix":"// before\n\"ETH-USD.COINBASE-4-HOUR.INTERNAL\"\n// after\n\"ETH-USD.COINBASE-6-HOUR.INTERNAL\"","handlingStrategy":"validation","validationCode":"const COINBASE_HOUR_STEPS: [u64; 3] = [1, 2, 6];\nassert!(COINBASE_HOUR_STEPS.contains(&bar_type.spec().step.get()),\n    \"Coinbase supports hour steps: 1, 2, 6\");","typeGuard":null,"tryCatchPattern":"match bar_type_to_granularity(&bar_type) {\n    Ok(g) => request_candles(g),\n    Err(e) if e.to_string().contains(\"Unsupported hour step\") => {\n        request_candles(CoinbaseGranularity::OneHour); // aggregate locally\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Use only 1h/2h/6h hour bar types with Coinbase","Do not copy Binance-style 4h/8h/12h specs into Coinbase configs","Validate aggregation specs at strategy startup"],"tags":["coinbase","bars","granularity","configuration"],"backgroundTag":"invalid-argument-value","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"}