#cosmwasm #ibc #tendermint #light-client #ics07

no-std ibc-client-tendermint-cw

The ICS-08 CosmWasm contract implementation of the ICS-07 Tendermint light client

2 unstable releases

new 0.53.0 May 14, 2024
0.52.0 Apr 26, 2024

#2 in #light-client

Download history 93/week @ 2024-04-22 90/week @ 2024-04-29 516/week @ 2024-05-06

699 downloads per month
Used in ibc-testkit

Apache-2.0

140KB
2.5K SLoC

ibc-client-tendermint-cw crate

This crate showcases how to reuse an ibc-rs light client as a CosmWasm contract utilizing the ibc-client-cw crate.

The ibc-client-cw crate exposes the requisite types and traits needed to reuse the ibc-rs light clients. Notably, it offers a ClientType trait, which requires two associated types: ClientState and ConsensusState. These types take any type that implement the ClientStateExecution and ConsensusState traits from the ibc-core crate.

For example, to reuse the existing ibc-client-tendermint:

use ibc_client_cw::api::ClientType;
use ibc_client_tendermint::client_state::ClientState;
use ibc_client_tendermint::consensus_state::ConsensusState;

#[derive(Clone, Debug)]
pub struct TendermintClient;

impl<'a> ClientType<'a> for TendermintClient {
    type ClientState = ClientState;
    type ConsensusState = ConsensusState;
}

Once the ClientType trait is implemented, the ibc-client-cw crate can be used to complete the entry points for the CosmWasm contract:

use cosmwasm_std::{entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response};
use ibc_client_cw::context::Context;
use ibc_client_cw::types::{ContractError, InstantiateMsg, QueryMsg, SudoMsg};

pub type TendermintContext<'a> = Context<'a, TendermintClient>;

#[entry_point]
pub fn instantiate(
    deps: DepsMut<'_>,
    env: Env,
    _info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let mut ctx = TendermintContext::new_mut(deps, env)?;
    let data = ctx.instantiate(msg)?;
    Ok(Response::default().set_data(data))
}

#[entry_point]
pub fn sudo(deps: DepsMut<'_>, env: Env, msg: SudoMsg) -> Result<Response, ContractError> {
    let mut ctx = TendermintContext::new_mut(deps, env)?;
    let data = ctx.sudo(msg)?;
    Ok(Response::default().set_data(data))
}

#[entry_point]
pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result<Binary, ContractError> {
    let ctx = TendermintContext::new_ref(deps, env)?;
    ctx.query(msg)
}

The above snippets compile into a fully working CosmWasm contract that implements the Tendermint IBC light client.

Dependencies

~20MB
~410K SLoC