{"record":{"id":"978be47fe3e8e782","repo":"nautechsystems/nautilus_trader","slug":"order-side-not-set","errorCode":null,"errorMessage":"Order side not set","messagePattern":"Order side not set","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/dydx/src/grpc/order.rs","lineNumber":420,"sourceCode":"        self\n    }\n\n    /// Set order's expiration.\n    #[must_use]\n    pub fn until(mut self, gtof: OrderGoodUntil) -> Self {\n        self.until = Some(gtof);\n        self\n    }\n\n    /// Build the order.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the order parameters are invalid.\n    pub fn build(self) -> Result<Order, anyhow::Error> {\n        let side = self\n            .side\n            .ok_or_else(|| anyhow::anyhow!(\"Order side not set\"))?;\n        let size = self\n            .size\n            .ok_or_else(|| anyhow::anyhow!(\"Order size not set\"))?;\n\n        // Quantize size\n        let quantums = self.market_params.quantize_quantity(size)?;\n\n        // Build order ID\n        let order_id = Some(OrderId {\n            subaccount_id: Some(SubaccountId {\n                owner: self.subaccount_owner.clone(),\n                number: self.subaccount_number,\n            }),\n            client_id: self.client_id,\n            order_flags: match self.flags {\n                OrderFlags::ShortTerm => 0,\n                OrderFlags::LongTerm => 64,\n                OrderFlags::Conditional => 32,","sourceCodeStart":402,"sourceCodeEnd":438,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/dydx/src/grpc/order.rs#L402-L438","documentation":"OrderBuilder::build requires side to be explicitly set before constructing the proto Order; dYdX orders must declare BUY or SELL. The error is thrown when the builder's optional side field is still None.","triggerScenarios":"Calling build() (e.g. via build_conditional_order) without having called the builder's side setter, or a code path that conditionally sets side and skips it.","commonSituations":"Conditional order construction where side is derived from trigger logic and a branch forgets to set it; refactoring that renamed/moved the side() call; passing an OrderSide that failed to map and defaulted to None.","solutions":["Always call .side(...) on the builder before .build()","Ensure the side-mapping from your internal order type to OrderSide cannot fall through to unset","Add a validation check on the caller side before invoking build"],"exampleFix":"// before\nlet builder = OrderBuilder::new(params).size(size).until(until);\nlet order = builder.build()?;\n// after\nlet builder = OrderBuilder::new(params)\n    .side(side) // must be set before build\n    .size(size)\n    .until(until);\nlet order = builder.build()?;","handlingStrategy":"validation","validationCode":"anyhow::ensure!(side.is_some(), \"side must be set before build()\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use a builder API that takes required fields in the constructor (side, size)","Add unit tests for every order-type build path","Centralize order construction so all required setters are always called"],"tags":["dydx","builder-pattern","missing-field","order-construction"],"backgroundTag":"missing-required-argument","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}