{"record":{"id":"90d053a955d00f92","repo":"unionlabs/union","slug":"not-implemented-90d053","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cosmwasm/lightclient/movement/src/client.rs","lineNumber":71,"sourceCode":"        // let consensus_state = ctx.read_self_consensus_state(height)?;\n        // verify_membership(\n        //     &key,\n        //     consensus_state.state_root,\n        //     client_state.table_handle,\n        //     storage_proof,\n        //     &value,\n        // )\n        // .map_err(Into::into)\n        Ok(())\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.latest_block_num\n    }\n\n    fn get_counterparty_chain_id(client_state: &Self::ClientState) -> String {\n        client_state.chain_id.clone()\n    }\n\n    fn status(ctx: IbcClientCtx<Self>, client_state: &Self::ClientState) -> Status {\n        let _ = ctx;\n\n        if client_state.frozen_height.height() != 0 {","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/cosmwasm/lightclient/movement/src/client.rs#L53-L89","documentation":"The Movement 08-wasm light client implements the union IBC client trait, but verify_non_membership is left as unimplemented!(). The trait requires the method, so any submitted proof-of-absence against a Movement client traps with \"not implemented\" inside the cosmwasm contract, reverting that message.","triggerScenarios":"A relayer submits a non-membership proof (proof that a counterparty key/value is absent — used in some channel/client handshake error paths and absence-based flows) to a union light client of the Movement type. The wasm host calls the stub and the panic aborts execution.","commonSituations":"Relayer configurations or flows written for client types that do support absence proofs reused against Movement clients; newer relayer versions emitting non-membership messages; test suites exercising the full trait surface.","solutions":["Do not submit non-membership proofs for Movement clients — configure the relayer to skip absence-proof flows for this client type","Upgrade the deployed movement light-client wasm once an implementation lands (SMT/Move-state absence proof)","If you need it now, implement verify_non_membership in the contract and redeploy","Check the union IBC spec version the deployed contract targets to confirm the method is expected to be supported"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Relayer-side gate before submitting proofs\nconst NO_NON_MEMBERSHIP = new Set([\"movement\", \"state-lens-ics23-smt\", \"sui\"])\nexport function canSubmitNonMembershipProof(clientType: string): boolean {\n  return !NO_NON_MEMBERSHIP.has(clientType)\n}\n// usage:\nif (!canSubmitNonMembershipProof(counterpartyClientType)) {\n  throw new Error(`${counterpartyClientType} 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":["Know each deployed union client's supported proof kinds before relaying","Keep a client-type capability map in relayer configuration","Upgrade deployed light-client wasm when implementations land","In contract tests, skip unimplemented trait methods rather than exercising them"],"tags":["ibc","light-client","movement","cosmwasm","unimplemented","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}