{"record":{"id":"0906366bbc288132","repo":"unionlabs/union","slug":"wait-for-update-client-failed","errorCode":null,"errorMessage":"wait_for_update_client failed: {:?}","messagePattern":"wait_for_update_client failed: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"tools/union-test/src/lib.rs","lineNumber":1008,"sourceCode":"            }\n            Err(e) => {\n                anyhow::bail!(\"send_ibc_transaction failed: {:?}\", e);\n            }\n        };\n        println!(\n            \"Packet sent from {} to {} with hash: {} and with height: {}\",\n            source_chain.chain_id(),\n            destination_chain.chain_id(),\n            packet_hash,\n            height\n        );\n\n        let update_client_result: anyhow::Result<helpers::UpdateClient> = match destination_chain\n            .wait_for_update_client(height, timeout)\n            .await\n        {\n            Ok(evt) => Ok(evt),\n            Err(e) => anyhow::bail!(\"wait_for_update_client failed: {:?}\", e),\n        };\n        println!(\"Update client event received: {:?}\", update_client_result);\n\n        Ok(update_client_result.unwrap().height)\n    }\n\n    pub async fn send_and_expect_revert<Src: ChainEndpoint, Dst: ChainEndpoint>(\n        &self,\n        source_chain: &Src,\n        contract: Src::Contract,\n        msg: Src::Msg,\n        expected_revert_code: u32,\n        signer: &Src::ProviderType,\n    ) -> anyhow::Result<()> {\n        match source_chain\n            .send_ibc_transaction(contract.clone(), msg.clone(), signer)\n            .await\n        {","sourceCodeStart":990,"sourceCodeEnd":1026,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/tools/union-test/src/lib.rs#L990-L1026","documentation":"After a successful send, send_and_get_height waits on the destination chain for the update-client event tied to the send height via destination_chain.wait_for_update_client(height, timeout). This error means no such update-client event was observed within the timeout: typically the relayer did not push a new consensus/client update covering that height, or the query for the event failed. The helper then cannot report the client update height and bails.","triggerScenarios":"No relayer running to submit client updates for the destination's client of the source chain, the update-client message skipped because the client was already current but the event query targets the wrong height, or the timeout is shorter than the relayer's update cadence.","commonSituations":"Test harness started chains but not the relayer; relayer's client-update frequency configured too low for the test window; expired/allow-update misconfigured client; wrong height passed because the send returned the block of a different node view.","solutions":["Confirm the relayer is running and submitting update-client msgs for the source→destination client pair.","Increase the timeout so it covers the relayer's update cadence plus block times on both chains.","Check the destination client is active (not expired) so updates are accepted.","Verify the height used for the query is the block height the send tx was included in (printed in the 'with height: {}' log)."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// confirm the destination client of src is active before waiting\nlet status = dst.query_client_status(src.chain_id()).await?;\nanyhow::ensure!(status == ClientStatus::Active, \"client not active: {status:?} — updates will not land\");","typeGuard":null,"tryCatchPattern":"let upd = dst.wait_for_update_client(height, timeout)\n    .await\n    .with_context(|| format!(\"no update-client event covering height {height} within {timeout:?}\"))?;","preventionTips":["Trigger one update-client before the test so you know the relayer cadence; size the wait from it.","Keep both chains producing blocks during the wait (devnets sometimes stall when idle)."],"tags":["ibc","relayer","client-update","timeout","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}