{"record":{"id":"be6b004234176174","repo":"nautechsystems/nautilus_trader","slug":"invalid-unixnanos-for-start","errorCode":null,"errorMessage":"Invalid `UnixNanos` for 'start'","messagePattern":"Invalid `UnixNanos` for 'start'","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/model/src/data/mod.rs","lineNumber":926,"sourceCode":"    /// - The `venue` value contained in the metadata is invalid.\n    #[must_use]\n    pub fn venue(&self) -> Option<Venue> {\n        let metadata = self.metadata.as_ref()?;\n        let venue_str = metadata.get_str(\"venue\")?;\n        Some(Venue::from(venue_str))\n    }\n\n    /// Returns an [`Option<UnixNanos>`] parsed from the metadata `start` field.\n    ///\n    /// # Panics\n    ///\n    /// This function panics if:\n    /// - The `start` value contained in the metadata is invalid.\n    #[must_use]\n    pub fn start(&self) -> Option<UnixNanos> {\n        let metadata = self.metadata.as_ref()?;\n        let start_str = metadata.get_str(\"start\")?;\n        Some(UnixNanos::from_str(start_str).expect(\"Invalid `UnixNanos` for 'start'\"))\n    }\n\n    /// Returns an [`Option<UnixNanos>`] parsed from the metadata `end` field.\n    ///\n    /// # Panics\n    ///\n    /// This function panics if:\n    /// - The `end` value contained in the metadata is invalid.\n    #[must_use]\n    pub fn end(&self) -> Option<UnixNanos> {\n        let metadata = self.metadata.as_ref()?;\n        let end_str = metadata.get_str(\"end\")?;\n        Some(UnixNanos::from_str(end_str).expect(\"Invalid `UnixNanos` for 'end'\"))\n    }\n\n    /// Returns an [`Option<usize>`] parsed from the metadata `limit` field.\n    ///\n    /// # Panics","sourceCodeStart":908,"sourceCodeEnd":944,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/model/src/data/mod.rs#L908-L944","documentation":"`Data::start` reads the metadata \"start\" key and parses it as `UnixNanos`, panicking with \"Invalid `UnixNanos` for 'start'\" if the string is not a valid nanosecond-epoch value. The method returns `Option::None` when the key is absent; the panic occurs only for a present but malformed value. This enforces that temporal metadata stored as strings stays canonical.","triggerScenarios":"Setting metadata[\"start\"] to a non-numeric or out-of-range string (e.g. ISO date string \"2024-01-01\", float \"1.5\", negative or enormous value) and then calling `.start()` on the Data object.","commonSituations":"Python adapters storing human-readable dates instead of Unix nanoseconds; serialization round-trips that changed the type; copy-paste of timestamp values in milliseconds instead of nanoseconds.","solutions":["Store start as a string of Unix nanoseconds, e.g. metadata[\"start\"] = str(int(dt.timestamp() * 1e9))","Pre-convert with pd.Timestamp/UnixNanos helpers instead of raw strings","Audit adapter code writing \"start\" metadata for unit mistakes (ms vs ns, ISO vs epoch)"],"exampleFix":"// before\nmetadata[\"start\"] = \"2024-01-01T00:00:00Z\"  // ISO string, not UnixNanos\n// after\nmetadata[\"start\"] = str(int(pd.Timestamp(\"2024-01-01T00:00:00Z\").value))  // e.g. \"1704067200000000000\"","handlingStrategy":"validation","validationCode":"def validate_start_metadata(metadata: dict) -> None:\n    raw = metadata.get(\"start\")\n    if raw is not None:\n        int(raw)  # raises ValueError if not a valid integer string\n        if int(raw) < 0:\n            raise ValueError(\"start must be a non-negative Unix-nanosecond value\")","typeGuard":"def is_unix_nanos_str(s: str) -> bool:\n    try:\n        return int(s) >= 0\n    except (ValueError, TypeError):\n        return False","tryCatchPattern":"try:\n    start = data.start()\nexcept Exception as e:\n    logger.error(f\"malformed 'start' metadata: {metadata.get('start')!r}\")\n    raise","preventionTips":["Store epoch values as nanosecond integer strings, never ISO dates","Convert with pd.Timestamp(...).value or library helpers","Watch for ms-vs-ns mistakes when integrating external data"],"tags":["rust","panic","timestamp","metadata","parsing"],"backgroundTag":"invalid-argument-format","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"}