{"record":{"id":"598fa4164fd266c1","repo":"nautechsystems/nautilus_trader","slug":"eip-712-signing-failed-e","errorCode":null,"errorMessage":"EIP-712 signing failed: {e}","messagePattern":"EIP-712 signing failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/execution/order_builder.rs","lineNumber":429,"sourceCode":"            salt,\n            maker: self.maker_address.clone(),\n            signer: self.order_signer_address(),\n            token_id: Ustr::from(token_id),\n            maker_amount,\n            taker_amount,\n            side,\n            signature_type: self.signature_type,\n            expiration: expiration.to_string(),\n            timestamp: timestamp_ms.to_string(),\n            metadata: ZERO_BYTES32.to_string(),\n            builder: POLYMARKET_NAUTILUS_BUILDER_CODE.to_string(),\n            signature: SecretString::default(),\n        };\n\n        let signature = self\n            .order_signer\n            .sign_order(&poly_order, neg_risk)\n            .map_err(|e| anyhow::anyhow!(\"EIP-712 signing failed: {e}\"))?;\n        poly_order.signature = SecretString::from(signature);\n\n        Ok(poly_order)\n    }\n\n    fn order_signer_address(&self) -> String {\n        match self.signature_type {\n            SignatureType::Poly1271 => self.maker_address.clone(),\n            _ => self.signer_address.clone(),\n        }\n    }\n}\n\nfn validation_failed(detail: impl Into<String>) -> OrderDeniedReason {\n    OrderDeniedReason::ValidationFailed {\n        detail: detail.into(),\n    }\n}","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/execution/order_builder.rs#L411-L447","documentation":"build_and_sign assembles the Polymarket order and then signs it with the EIP-712 order signer via order_signer.sign_order. Any failure from the signer (invalid private key, wallet/secp256k1 errors, malformed signing payload) is wrapped as \"EIP-712 signing failed: {e}\".","triggerScenarios":"Calling build_limit_order, build_limit_order_from_collateral, or build_market_order when the configured private key is invalid/empty, the key cannot produce a secp256k1 signature, or the order payload encoding fails inside sign_order.","commonSituations":"Missing or malformed POLYMARKET private key in env/config (wrong length, not hex, placeholder value); key does not match the configured maker/signer address; dependency or chain-id mismatch producing an unencodable payload.","solutions":["Inspect the wrapped {e} message; it distinguishes key-decoding failures from payload-encoding failures.","Verify the signing private key is a valid 32-byte hex secret and matches the maker/signer address configured on the builder.","Confirm environment/config supplies the key (e.g. private key env var set and not a placeholder) before initializing the execution client."],"exampleFix":"// before\nPOLYMARKET_PRIVATE_KEY=\"changeme\"  // invalid hex -> signing fails\n// after\nPOLYMARKET_PRIVATE_KEY=\"0x<64 hex chars>\"  // valid secp256k1 key matching maker address","handlingStrategy":"validation","validationCode":"let key = std::env::var(\"POLYMARKET_PRIVATE_KEY\")?;\nlet key = key.trim_start_matches(\"0x\");\nhex::decode(key).map_err(|e| format!(\"invalid private key hex: {e}\"))?;\nif key.len() != 64 { return Err(\"private key must be 64 hex chars\".into()); }","typeGuard":"fn is_valid_private_key(s: &str) -> bool {\n    let s = s.trim_start_matches(\"0x\");\n    s.len() == 64 && s.chars().all(|c| c.is_ascii_hexdigit())\n}","tryCatchPattern":"let signed = match builder.build_limit_order(&order, ...) {\n    Ok(o) => o,\n    Err(e) if e.to_string().contains(\"EIP-712 signing failed\") => {\n        tracing::error!(\"signing failed, check wallet key/config: {e:#}\");\n        return Err(e);\n    }\n    Err(e) => return Err(e),\n};","preventionTips":["Validate the private key (hex, 32 bytes, matches maker address) at client startup, not at first order.","Keep key material in a secret store, not inline config.","Test signing once during initialization with a dry-run payload."],"tags":["polymarket","eip712","signing","private-key"],"backgroundTag":"signature-generation-failed","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"}