{"record":{"id":"29f8fa1b0c8bb59b","repo":"unionlabs/union","slug":"not-implemented-29f8fa","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cosmwasm/lightclient/state-lens-ics23-smt/src/client.rs","lineNumber":65,"sourceCode":"        let client_state = ctx.read_self_client_state()?;\n        let consensus_state = ctx.read_self_consensus_state(height)?;\n        verify_membership(\n            &key,\n            consensus_state.state_root,\n            AccountAddress(client_state.extra.table_handle),\n            storage_proof,\n            &value,\n        )\n        .map_err(Into::into)\n    }\n\n    fn verify_non_membership(\n        _ctx: IbcClientCtx<Self>,\n        _height: u64,\n        _key: Vec<u8>,\n        _storage_proof: Self::StorageProof,\n    ) -> Result<(), IbcClientError<Self>> {\n        unimplemented!()\n    }\n\n    fn get_timestamp(consensus_state: &Self::ConsensusState) -> Timestamp {\n        consensus_state.timestamp\n    }\n\n    fn get_latest_height(client_state: &Self::ClientState) -> u64 {\n        client_state.l2_latest_height\n    }\n\n    fn get_counterparty_chain_id(client_state: &Self::ClientState) -> String {\n        client_state.l2_chain_id.clone()\n    }\n\n    fn status(ctx: IbcClientCtx<Self>, client_state: &Self::ClientState) -> Status {\n        ctx.status(client_state.l1_client_id)\n            .unwrap_or(Status::Frozen)\n    }","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/cosmwasm/lightclient/state-lens-ics23-smt/src/client.rs#L47-L83","documentation":"The state-lens ICS23 SMT light client implements verify_membership (including proof-with-value handling) but leaves verify_non_membership as unimplemented!(). Any proof-of-absence submitted against this client type traps with \"not implemented\" and the message reverts.","triggerScenarios":"A relayer submits a non-membership proof (absence of a key in the counterparty L2 state) to a state-lens-ics23-smt union client — e.g., proving a channel or association does not exist during cleanup/error-handling flows that require absence proofs.","commonSituations":"Relayer flows ported from client types with absence-proof support; spec-conformance tests that exercise the whole trait; newer relayer logic that opportunistically submits non-membership proofs.","solutions":["Gate absence-proof flows off for state-lens SMT clients in the relayer","Upgrade the deployed client wasm when verify_non_membership is implemented (SMT null-leaf proofs make this feasible)","If you maintain the contract, implement the null-leaf verification path instead of the stub","Check the union spec/contract version deployed on both ends of the channel"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const NO_NON_MEMBERSHIP = new Set([\"movement\", \"state-lens-ics23-smt\", \"sui\"])\nif (msg.kind === \"nonMembership\" && NO_NON_MEMBERSHIP.has(clientType)) {\n  throw new Error(`${clientType} does not implement verify_non_membership`)\n}","typeGuard":"const supportsNonMembership = (clientType: string) =>\n  !new Set([\"movement\", \"state-lens-ics23-smt\", \"sui\"]).has(clientType)","tryCatchPattern":null,"preventionTips":["Port relayer flows per client type — do not assume EVM/Comet capabilities apply to state-lens clients","Keep the absence-proof requirement in mind for channel error paths before enabling flows","Redeploy updated client wasm as implementations land","Assert capability maps in relayer integration tests"],"tags":["ibc","light-client","state-lens","ics23","smt","cosmwasm","unimplemented","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}