{"record":{"id":"b1c126e044565325","repo":"unionlabs/union","slug":"not-implemented-b1c126","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cosmwasm/lightclient/state-lens-ics23-mpt/src/client.rs","lineNumber":142,"sourceCode":"            extract_consensus_state(&header.l2_consensus_state, &client_state.extra);\n\n        let mut state_update = StateUpdate::new(header.l2_height.height(), consensus_state);\n\n        if client_state.l2_latest_height < header.l2_height.height() {\n            client_state.l2_latest_height = header.l2_height.height();\n            state_update = state_update.overwrite_client_state(client_state)\n        }\n\n        Ok(state_update)\n    }\n\n    fn misbehaviour(\n        _ctx: IbcClientCtx<Self>,\n        _caller: Addr,\n        _misbehaviour: Self::Misbehaviour,\n        _relayer: Addr,\n    ) -> Result<Self::ClientState, IbcClientError<Self>> {\n        unimplemented!()\n    }\n}\n\npub fn extract_consensus_state(\n    l2_consensus_state: &Bytes,\n    client_state_extra: &Extra,\n) -> ConsensusState {\n    // NOTE: The timestamp stored by the counterparty is expected to be in nanos.\n    let l2_timestamp = Timestamp::from_nanos(extract_uint64(\n        l2_consensus_state,\n        client_state_extra.timestamp_offset as usize,\n    ));\n\n    let l2_state_root = extract_bytes32(\n        l2_consensus_state,\n        client_state_extra.state_root_offset as usize,\n    );\n","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/cosmwasm/lightclient/state-lens-ics23-mpt/src/client.rs#L124-L160","documentation":"The state-lens ICS23 MPT light client (Movement L2 state read via a lens) implements update_state and membership checks, but its misbehaviour handler is unimplemented!(). Submitting misbehaviour evidence to a union client of this type panics in the contract with \"not implemented\".","triggerScenarios":"A relayer submits a misbehaviour message against a state-lens-ics23-mpt client. Because state updates are verified through lens-produced state proofs rather than validator-signed headers, no equivocation evidence is currently defined, and the stub traps.","commonSituations":"Relayers with misbehaviour monitoring enabled across all clients; shared relayer profiles applied uniformly to every client type in a multi-chain setup.","solutions":["Exclude state-lens MPT clients from misbehaviour submission in relayer config","Upgrade the deployed client wasm once misbehaviour support is added","If forking, return an IbcClientError (unsupported) instead of unimplemented!() so callers get a clean revert reason","Confirm the intended union IBC spec revision before wiring monitoring to this client"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const MISBEHAVIOUR_UNSUPPORTED = new Set([\"movement\", \"state-lens-ics23-mpt\", \"state-lens-ics23-smt\"])\nif (msg.kind === \"misbehaviour\" && MISBEHAVIOUR_UNSUPPORTED.has(clientType)) {\n  log.warn(`misbehaviour not implemented for ${clientType}; dropping message`)\n  return\n}","typeGuard":"const supportsMisbehaviour = (clientType: string) =>\n  !new Set([\"movement\", \"state-lens-ics23-mpt\", \"state-lens-ics23-smt\"]).has(clientType)","tryCatchPattern":null,"preventionTips":["Scope relayer misbehaviour settings per client type, not globally","Track the deployed code id per client so capability checks use real state","Re-verify capabilities after any light-client contract migration","Log dropped messages so silent capability gaps stay visible"],"tags":["ibc","light-client","state-lens","ics23","misbehaviour","cosmwasm","unimplemented","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}