{"record":{"id":"4a1251a174097ac1","repo":"nautechsystems/nautilus_trader","slug":"no-durable-store-configured-refusing-to-submit-a-4a1251","errorCode":null,"errorMessage":"No durable store configured; refusing to submit a {} transaction","messagePattern":"No durable store configured; refusing to submit a (.+?) transaction","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":1533,"sourceCode":"                unreachable!(\"swap intents restore a swap plan\")\n            }\n        }\n    }\n\n    fn ensure_transaction_ready(&self, purpose: TransactionPurpose) -> anyhow::Result<()> {\n        if !self.core.is_connected() {\n            anyhow::bail!(\"Blockchain execution client is not connected\");\n        }\n\n        {\n            let slot = self.in_flight.lock();\n            if let Some(in_flight) = *slot {\n                return Err(in_flight_limit_error(&in_flight));\n            }\n        }\n\n        if !self.cache.has_database() {\n            anyhow::bail!(\n                \"No durable store configured; refusing to submit a {} transaction\",\n                purpose.as_str()\n            );\n        }\n        Ok(())\n    }\n\n    /// Validates a submit-order command against the configured policy and builds the swap plan.\n    ///\n    /// Local checks run first: pool resolution, order semantics, allowlists, amount and\n    /// slippage limits, and the quote derived from the live pool profiler. Infrastructure\n    /// readiness (connection, in-flight slot, durable store, signer) follows. Chain state is\n    /// verified in the spawned task before signing.\n    fn prepare_swap(&self, cmd: &SubmitOrder, order: &OrderAny) -> anyhow::Result<SwapPlan> {\n        let instrument_id = order.instrument_id();\n        let pool = self.resolve_pool(&instrument_id)?;\n\n        if order.order_type() != OrderType::Market {","sourceCodeStart":1515,"sourceCodeEnd":1551,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L1515-L1551","documentation":"ensure_transaction_ready refuses to submit any transaction when the execution client has no durable (database-backed) store configured. The durable store is required to persist in-flight transaction state so transactions can be recovered and tracked across restarts. Without it the client deliberately refuses to broadcast rather than risk untracked transactions.","triggerScenarios":"Calling submit_order (via prepare_swap), approve, or wrap when `self.cache.has_database()` returns false — i.e. the cache was constructed without a database backing store.","commonSituations":"Running the blockchain execution client in-memory for backtests or quick tests and then submitting live transactions; forgetting to configure the database/cache path in the adapter config; a misconfigured environment where the cache database fails to initialize silently.","solutions":["Configure a durable database-backed cache for the execution client (e.g. set the cache/database path in the adapter/live config) before submitting transactions.","If running in a non-persistence context intentionally, use a dry-run or backtest execution path that does not call submit_order/approve/wrap.","Verify has_database() at startup and fail fast with a clear config error instead of at trade time."],"exampleFix":"// before\nlet client = BlockchainExecutionClient::new(cache, exec_client_config(None));\nclient.submit_order(cmd)?; // panics/errors: no durable store\n// after\nlet client = BlockchainExecutionClient::new(\n    cache,\n    exec_client_config(Some(DatabaseConfig::with_path(\"./data/live.db\"))),\n);\nclient.submit_order(cmd)?;","handlingStrategy":"validation","validationCode":"// Rust\nif !client.cache_has_database() {\n    return Err(anyhow::anyhow!(\n        \"durable store not configured; configure a database-backed cache before trading\"\n    ));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always configure a database-backed cache in live trading configs.","Add a startup assertion that has_database() is true before the client starts accepting commands.","Use dry-run/backtest modes for in-memory setups."],"tags":["blockchain","configuration","persistence","transaction"],"backgroundTag":"missing-required-config","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"}