{"record":{"id":"8a9e8b476523d7aa","repo":"unionlabs/union","slug":"not-implemented-8a9e8b","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cosmwasm/lightclient/sui/src/client.rs","lineNumber":68,"sourceCode":"            key.into(),\n            value.into(),\n            storage_proof.object,\n            storage_proof.transaction_effects,\n            storage_proof.checkpoint_contents,\n            consensus_state.content_digest,\n        )\n        .map_err(Into::<Error>::into)?;\n\n        Ok(())\n    }\n\n    fn verify_non_membership(\n        _ctx: IbcClientCtx<Self>,\n        _height: u64,\n        _key: Vec<u8>,\n        _storage_proof: Self::StateProof,\n    ) -> Result<(), IbcClientError<Self>> {\n        unimplemented!()\n    }\n\n    fn get_timestamp(consensus_state: &Self::ConsensusState) -> Timestamp {\n        Timestamp::from_nanos(consensus_state.timestamp)\n    }\n\n    fn get_latest_height(client_state: &Self::ClientState) -> u64 {\n        let ClientState::V1(client_state) = client_state;\n        client_state.latest_checkpoint\n    }\n\n    fn get_counterparty_chain_id(client_state: &Self::ClientState) -> String {\n        let ClientState::V1(cs) = client_state;\n        cs.chain_id.clone()\n    }\n\n    fn status(_ctx: IbcClientCtx<Self>, client_state: &Self::ClientState) -> Status {\n        let ClientState::V1(cs) = client_state;","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/unionlabs/union/blob/031785bb6dc6b957c624e62bc64c184409c97d7b/cosmwasm/lightclient/sui/src/client.rs#L50-L86","documentation":"The Sui light client implements membership verification but leaves verify_non_membership as unimplemented!(). Any non-membership (proof-of-absence) message against a Sui union client traps with \"not implemented\" and reverts; the Sui client state (latest checkpoint) is untouched.","triggerScenarios":"A relayer submits a proof that a key is absent in Sui state — e.g., absence proofs used when proving a channel or object does not exist — to a union light client of the Sui type.","commonSituations":"Uniform relayer configs applied to all client types including Sui; ported flows from EVM/Comet clients where absence proofs are routine.","solutions":["Skip non-membership proof flows for Sui clients in the relayer","Upgrade the deployed Sui light-client wasm when the method is implemented","If implementing in a fork, model absence via Sui state proofs appropriate to the checkpoint data model","Confirm the deployed contract version supports the message types your relayer emits"],"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":["Do not assume absence proofs work uniformly across union client types","Maintain per-client capability checks in relayer message builders","Upgrade the deployed Sui client wasm when support lands","Cover capability gates in relayer integration tests"],"tags":["ibc","light-client","sui","cosmwasm","unimplemented","rust"],"backgroundTag":null,"analyzedSha":"031785bb6dc6b957c624e62bc64c184409c97d7b","analyzedAt":"2026-08-16T06:24:09.996Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}