unionlabs/union · error

not implemented

Error message

not implemented

What it means

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.

Source

Thrown at cosmwasm/lightclient/sui/src/client.rs:68

            key.into(),
            value.into(),
            storage_proof.object,
            storage_proof.transaction_effects,
            storage_proof.checkpoint_contents,
            consensus_state.content_digest,
        )
        .map_err(Into::<Error>::into)?;

        Ok(())
    }

    fn verify_non_membership(
        _ctx: IbcClientCtx<Self>,
        _height: u64,
        _key: Vec<u8>,
        _storage_proof: Self::StateProof,
    ) -> Result<(), IbcClientError<Self>> {
        unimplemented!()
    }

    fn get_timestamp(consensus_state: &Self::ConsensusState) -> Timestamp {
        Timestamp::from_nanos(consensus_state.timestamp)
    }

    fn get_latest_height(client_state: &Self::ClientState) -> u64 {
        let ClientState::V1(client_state) = client_state;
        client_state.latest_checkpoint
    }

    fn get_counterparty_chain_id(client_state: &Self::ClientState) -> String {
        let ClientState::V1(cs) = client_state;
        cs.chain_id.clone()
    }

    fn status(_ctx: IbcClientCtx<Self>, client_state: &Self::ClientState) -> Status {
        let ClientState::V1(cs) = client_state;

View on GitHub (pinned to 031785bb6d)

Solutions

  1. Skip non-membership proof flows for Sui clients in the relayer
  2. Upgrade the deployed Sui light-client wasm when the method is implemented
  3. If implementing in a fork, model absence via Sui state proofs appropriate to the checkpoint data model
  4. Confirm the deployed contract version supports the message types your relayer emits
Defensive patterns

Strategy: validation

Validate before calling

const NO_NON_MEMBERSHIP = new Set(["movement", "state-lens-ics23-smt", "sui"])
if (msg.kind === "nonMembership" && NO_NON_MEMBERSHIP.has(clientType)) {
  throw new Error(`${clientType} does not implement verify_non_membership`)
}

Type guard

const supportsNonMembership = (clientType: string) =>
  !new Set(["movement", "state-lens-ics23-smt", "sui"]).has(clientType)

Prevention

When it happens

Trigger: 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.

Common situations: Uniform relayer configs applied to all client types including Sui; ported flows from EVM/Comet clients where absence proofs are routine.

Related errors


AI-assisted analysis of unionlabs/union@031785bb6d (2026-08-16). Data as JSON: /api/errors/8a9e8b476523d7aa. Report an issue: GitHub.