unionlabs/union · error
not implemented
Error message
not implemented
What it means
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.
Source
Thrown at cosmwasm/lightclient/movement/src/client.rs:71
// let consensus_state = ctx.read_self_consensus_state(height)?;
// verify_membership(
// &key,
// consensus_state.state_root,
// client_state.table_handle,
// storage_proof,
// &value,
// )
// .map_err(Into::into)
Ok(())
}
fn verify_non_membership(
_ctx: IbcClientCtx<Self>,
_height: u64,
_key: Vec<u8>,
_storage_proof: Self::StorageProof,
) -> Result<(), IbcClientError<Self>> {
unimplemented!()
}
fn get_timestamp(consensus_state: &Self::ConsensusState) -> Timestamp {
consensus_state.timestamp
}
fn get_latest_height(client_state: &Self::ClientState) -> u64 {
client_state.latest_block_num
}
fn get_counterparty_chain_id(client_state: &Self::ClientState) -> String {
client_state.chain_id.clone()
}
fn status(ctx: IbcClientCtx<Self>, client_state: &Self::ClientState) -> Status {
let _ = ctx;
if client_state.frozen_height.height() != 0 {View on GitHub (pinned to 031785bb6d)
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
Defensive patterns
Strategy: validation
Validate before calling
// Relayer-side gate before submitting proofs
const NO_NON_MEMBERSHIP = new Set(["movement", "state-lens-ics23-smt", "sui"])
export function canSubmitNonMembershipProof(clientType: string): boolean {
return !NO_NON_MEMBERSHIP.has(clientType)
}
// usage:
if (!canSubmitNonMembershipProof(counterpartyClientType)) {
throw new Error(`${counterpartyClientType} does not implement verify_non_membership`)
} Type guard
const supportsNonMembership = (clientType: string) => !new Set(["movement", "state-lens-ics23-smt", "sui"]).has(clientType)
Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
AI-assisted analysis of unionlabs/union@031785bb6d (2026-08-16).
Data as JSON: /api/errors/90d053a955d00f92.
Report an issue: GitHub.