{"record":{"id":"0f94fff5e85628db","repo":"nautechsystems/nautilus_trader","slug":"no-durable-store-configured-for-execution-reconcil","errorCode":null,"errorMessage":"No durable store configured for execution reconciliation","messagePattern":"No durable store configured for execution reconciliation","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":1126,"sourceCode":"            instrument_id,\n            pool_address,\n            router: Address::from_str(&intent.transaction_to)?,\n            factory,\n            weth: self.weth_address,\n            token_in,\n            token_out,\n            fee,\n            amount_in,\n            min_amount_out: U256::ZERO,\n            slippage_bps: 0,\n            quote_spend_ceiling: None,\n            profiler_position: None,\n        })\n    }\n\n    async fn reconcile_unresolved_execution(&self) -> anyhow::Result<()> {\n        let database = self.cache.database.clone().ok_or_else(|| {\n            anyhow::anyhow!(\"No durable store configured for execution reconciliation\")\n        })?;\n        let _payload_lease = database\n            .acquire_execution_payload_lease(self.payload_keys.as_deref().ok_or_else(|| {\n                anyhow::anyhow!(\"Protected payload keys are required for execution recovery\")\n            })?)\n            .await?;\n        let wallet_address = self.wallet_address.to_string();\n        anyhow::ensure!(\n            !database\n                .has_recoverable_signed_execution(self.chain.chain_id, &wallet_address)\n                .await?,\n            \"A recoverable execution for wallet {} retains signed transaction bytes; refusing to reuse its nonce without explicit recovery\",\n            self.wallet_address\n        );\n        let Some(intent) = database\n            .get_active_execution_intent(self.chain.chain_id, &wallet_address)\n            .await?\n        else {","sourceCodeStart":1108,"sourceCodeEnd":1144,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L1108-L1144","documentation":"reconcile_unresolved_execution, run during execution client connect, needs a durable database (cache.database) to inspect and recover persisted execution intents. If no durable store is configured, the client cannot safely detect unfinished swaps or signed transactions and fails the connect flow with this error. The library requires the durable store precisely because recovery of blockchain executions must survive process restarts.","triggerScenarios":"connect() -> reconcile_unresolved_execution is called while self.cache.database is None, i.e. the cache/database was not attached to the blockchain execution client's cache configuration. Any startup with a cache that has no database backing triggers this immediately.","commonSituations":"Running the blockchain adapter in a backtest or in-memory setup where no cache database is wired; forgetting to set the cache database config (path/connection) for live trading; explicitly disabling persistence while using an execution client that mandates recovery.","solutions":["Configure a durable cache database for the execution client (set the cache database in the client/cache config) so intents can be reconciled.","Use a live-trading node config that includes persistence; the blockchain execution client requires it by design.","If you truly need no persistence, use an execution client/mode that does not perform durable reconciliation instead of this one.","Verify the database is actually constructed and attached to the cache before the client connects (check wiring/order of component setup)."],"exampleFix":"// before (no database attached)\nCacheConfig()  # in-memory only\n// after\nCacheConfig(database=CacheDatabaseConfig(path=\"~/.nautilus/blockchain.db\"))","handlingStrategy":"validation","validationCode":"// Before connecting, assert a durable store is wired\nif cache.database.is_none() {\n    panic!(\"blockchain execution client requires a cache database for reconciliation\");\n}","typeGuard":"fn has_durable_store(cache: &Cache) -> bool {\n    cache.database.is_some()\n}","tryCatchPattern":"// Surface the misconfiguration at startup instead of mid-connect\nmatch client.connect().await {\n    Err(e) if e.to_string().contains(\"No durable store configured\") => {\n        configure_cache_database()?; client.connect().await?;\n    }\n    result => result?,\n}","preventionTips":["Always configure a cache database for live blockchain execution clients","Add a startup config check that database is present before connect","Do not reuse backtest/in-memory cache configs for live trading","Log the database path at boot to confirm wiring"],"tags":["persistence","missing-config","reconciliation","startup"],"backgroundTag":"missing-required-config-field","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}