{"record":{"id":"6576ee6fa1a34cb4","repo":"nautechsystems/nautilus_trader","slug":"polymarket-signature-type-signature-type-requi","errorCode":null,"errorMessage":"Polymarket {signature_type:?} signature type requires a funder distinct from the signing address","messagePattern":"Polymarket (.+?) signature type requires a funder distinct from the signing address","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/execution/mod.rs","lineNumber":252,"sourceCode":"\nfn resolve_maker_address(\n    signature_type: SignatureType,\n    signer_address: &str,\n    funder: Option<&str>,\n) -> anyhow::Result<String> {\n    let maker_address = match signature_type {\n        SignatureType::Eoa => funder.unwrap_or(signer_address),\n        SignatureType::PolyProxy | SignatureType::PolyGnosisSafe | SignatureType::Poly1271 => {\n            funder.ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Polymarket {signature_type:?} signature type requires a funder wallet address\",\n                )\n            })?\n        }\n    };\n\n    if signature_type != SignatureType::Eoa && maker_address.eq_ignore_ascii_case(signer_address) {\n        anyhow::bail!(\n            \"Polymarket {signature_type:?} signature type requires a funder distinct from the signing address\",\n        );\n    }\n\n    Ok(maker_address.to_string())\n}\n\n#[async_trait(?Send)]\nimpl ExecutionClient for PolymarketExecutionClient {\n    fn is_connected(&self) -> bool {\n        self.core.is_connected()\n            && (!self.config.heartbeat_enabled\n                || self\n                    .heartbeat_healthy\n                    .load(std::sync::atomic::Ordering::Acquire))\n    }\n\n    fn client_id(&self) -> ClientId {","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/execution/mod.rs#L234-L270","documentation":"Polymarket proxy signature types (e.g. Email/Proxy variants) require the maker/funder address to differ from the address that signs orders. resolve_maker_address validates the resolved funder and rejects configurations where a non-EOA signature type resolves to the signer's own address, since the CLOB would reject such orders.","triggerScenarios":"Constructing the execution client (new) or tests calling resolve_maker_address when signature_type is not Eoa and the resolved maker/funder address equals the signer address case-insensitively.","commonSituations":"Config omits the funder so it falls back to the signer address while a proxy signature type is configured; copy-pasting the signer address into the funder field; environment config where POLYMARKET_FUNDER is unset.","solutions":["Set the funder address in the adapter config to the Polymarket proxy wallet address distinct from the signing key address","Verify signature_type matches your account setup (EOA for plain wallets, proxy type for email/magic wallets)","Check the funder env/config value isn't accidentally the same as the signer's","Look up your proxy wallet address from Polymarket account settings and use it as funder"],"exampleFix":"// before\nPolymarketExecClientConfig(signature_type: PolymarketSignatureType::Email, funder: signer_address)\n// after\nPolymarketExecClientConfig(signature_type: PolymarketSignatureType::Email, funder: \"0xYourProxyWalletAddress\")","handlingStrategy":"validation","validationCode":"fn funder_is_distinct(cfg: &PolymarketExecClientConfig) -> Result<(), String> {\n    if cfg.signature_type != SignatureType::Eoa\n        && cfg.funder.eq_ignore_ascii_case(&cfg.signer_address)\n    {\n        return Err(format!(\"{:?} signature type requires a funder distinct from the signer\", cfg.signature_type));\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":"match PolymarketExecutionClient::new(config).await {\n    Err(e) if e.to_string().contains(\"requires a funder distinct\") => {\n        error!(\"config error: set funder to your Polymarket proxy wallet address\");\n    }\n    Err(e) => return Err(e),\n    Ok(client) => {},\n}","preventionTips":["Always set the funder explicitly in config; never rely on fallback to signer","Validate config at startup before any network calls","Confirm your account type: EOA wallets need no funder; email/magic wallets use a proxy address","Compare addresses case-insensitively when validating"],"tags":["polymarket","config","signature","validation"],"backgroundTag":"invalid-config-value","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"}