unionlabs/union · error · anyhow::Error

no ucs03 deployment for {chain_id}

Error message

no ucs03 deployment for {chain_id}

What it means

Thrown by `u zkgm predict-wrapped-token` on the Deployment::IbcSolidity arm: the chain's deployment entry exists but no contract named `protocols/ucs03` is listed, so the zkgm contract address required to predict the wrapped (ibeuro/UCS03) token address is missing.

Source

Thrown at tools/u/src/zkgm/predict_wrapped_token.rs:211

            if address.is_some() {
                bail!("--address can only be used with `custom`");
            }

            match deployment {
                Deployment::IbcSolidity { contracts, .. } => {
                    predict_wrapped_token_ibc_solidity(
                        rpc_url.unwrap_or_else(|| {
                            format!(
                                "https://rpc.{}.{}.chain.kitchen",
                                chain_id.id(),
                                chain_id.family(),
                            )
                        }),
                        (*contracts
                            .iter()
                            .find(|(_, deployment)| deployment.name == "protocols/ucs03")
                            .as_ref()
                            .context(anyhow!("no ucs03 deployment for {chain_id}"))?
                            .0)
                            .into(),
                        args,
                    )
                    .await
                }
                Deployment::IbcCosmwasm { contracts, .. } => {
                    predict_wrapped_token_ibc_cosmwasm(
                        rpc_url.unwrap_or_else(|| {
                            format!(
                                "https://rpc.{}.{}.chain.kitchen",
                                chain_id.id(),
                                chain_id.family(),
                            )
                        }),
                        contracts
                            .iter()
                            .find(|(_, deployment)| deployment.name == "protocols/ucs03")

View on GitHub (pinned to 031785bb6d)

Solutions

  1. Run with custom endpoints/zkgm address instead of the registry-backed path, if the command's custom mode exposes them
  2. Verify the exact ucs04 chain id string
  3. Update the deployments data so the chain includes a `protocols/ucs03` contract entry
  4. Confirm the zkgm contract exists on-chain for that chain before predicting

Example fix

# before
u zkgm predict-wrapped-token <chain-id> --channel-id channel-0 ... 
# after
# pass the zkgm address explicitly via the custom flow once deployed:
u zkgm predict-wrapped-token custom --zkgm-address 0x1234...abcd --ibc-interface ibc-solidity ...
Defensive patterns

Strategy: validation

Validate before calling

if !DEPLOYMENTS[&chain_id].contracts().iter().any(|(_, d)| d.name == "protocols/ucs03") {
    anyhow::bail!("chain {chain_id} has no ucs03 deployment; pass the zkgm address via the custom flow");
}

Prevention

When it happens

Trigger: Calling `predict-wrapped-token <evm-chain-id> ...` where DEPLOYMENTS[chain_id] is IbcSolidity but its `contracts` vec lacks a `protocols/ucs03` entry. Note this path also defaults the RPC to `https://rpc.<id>.<family>.chain.kitchen`, which only matters after the deployment lookup succeeds.

Common situations: Old deployments snapshot; chain that never had zkgm deployed; typo'd chain id that happens to match another known chain; mixed-registry state after a partial upgrade.

Related errors


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