{"record":{"id":"22176c842071e814","repo":"nautechsystems/nautilus_trader","slug":"context-verification-is-retryable","errorCode":null,"errorMessage":"{context} verification is retryable","messagePattern":"(.+?) verification is retryable","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":1980,"sourceCode":"\nfn verified_value<T>(outcome: VerificationOutcome<T>, context: &str) -> anyhow::Result<T> {\n    required_verification(outcome, context).map(|verified| verified.value)\n}\n\nfn required_verification<T>(\n    outcome: VerificationOutcome<T>,\n    context: &str,\n) -> anyhow::Result<Verified<T>> {\n    match outcome {\n        VerificationOutcome::Verified(verified) => Ok(verified),\n        VerificationOutcome::Disagreement(_) => {\n            anyhow::bail!(\"{context} verification disagreed\")\n        }\n        VerificationOutcome::Unavailable(_) => {\n            anyhow::bail!(\"{context} verification is unavailable\")\n        }\n        VerificationOutcome::Retryable(_) => {\n            anyhow::bail!(\"{context} verification is retryable\")\n        }\n        VerificationOutcome::LocallyInvalid(_) => {\n            anyhow::bail!(\"{context} verification is locally invalid\")\n        }\n    }\n}\n\nfn validate_transaction_authorization(\n    authorization: Option<&TransactionAuthorization>,\n    to: Address,\n    value: U256,\n    input: &[u8],\n) -> anyhow::Result<()> {\n    match authorization {\n        None => Ok(()),\n        Some(TransactionAuthorization::Wrap { weth }) => {\n            anyhow::ensure!(\n                to == *weth && !value.is_zero() && input == WETH9::depositCall::SELECTOR,","sourceCodeStart":1962,"sourceCodeEnd":1998,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L1962-L1998","documentation":"Raised when the verification outcome is Retryable: verification could not complete but the failure is transient, so the caller may retry. The helper surfaces this as an error so callers can distinguish transient verification failures from hard disagreements.","triggerScenarios":"VerificationOutcome::Retryable returned by a verification check — e.g. temporary network error, node timeout, or provider throttling while fetching the verification data.","commonSituations":"Transient RPC timeouts under load; provider rate limits during bursts of submissions; brief node restarts mid-verification.","solutions":["Retry the verification (and transaction flow) with exponential backoff","Reduce submission rate or add client-side throttling to avoid provider limits","Configure a more reliable verification provider or multiple endpoints","Check network connectivity between the client and the RPC endpoint"],"exampleFix":"// before\nmatch client.submit_order(order).await {\n    Err(e) if e.to_string().contains(\"verification is retryable\") => (), // gave up\n    r => r?,\n}\n// after\nfor attempt in 0..3 {\n    match client.submit_order(order).await {\n        Err(e) if e.to_string().contains(\"verification is retryable\") => {\n            tokio::time::sleep(Duration::from_millis(200 * 2u64.pow(attempt))).await;\n            continue;\n        }\n        r => { r?; break; }\n    }\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt in 0..max_retries {\n    match client.submit_order(order).await {\n        Err(e) if e.to_string().contains(\"verification is retryable\") => {\n            backoff(attempt).await;\n            continue;\n        }\n        r => { r?; break; }\n    }\n}","preventionTips":["Implement exponential backoff around submission calls","Throttle submission rate to stay under provider limits","Distinguish retryable vs permanent verification failures in error handling"],"tags":["verification","retry","transient"],"backgroundTag":"request-timeout","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"}