Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: add readme to cw-contract crate #1219

Merged
merged 6 commits into from
May 10, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions ibc-clients/ics07-tendermint/cw-contract/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# `ibc-client-tendermint-cw` crate

This crate showcases how to reuse an `ibc-rs` light client as a
[CosmWasm contract](https://github.com/cosmos/ibc/blob/main/spec/client/ics-008-wasm-client/README.md)
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`](https://docs.rs/ibc-client-cw/latest/ibc_client_cw/api/trait.ClientType.html)
trait, which requires two associated types: `ClientState` and `ConsensusState`.
These types take any type that implement the
[`ClientStateExecution`](https://docs.rs/ibc-core/latest/ibc_core/client/context/client_state/trait.ClientStateExecution.html)
and
[`ConsensusState`](https://docs.rs/ibc-core/latest/ibc_core/client/context/consensus_state/trait.ConsensusState.html)
traits from the `ibc-core` crate.

For example, to reuse the existing
[`ibc-client-tendermint`](https://docs.rs/ibc-client-tendermint/latest/ibc_client_tendermint/):

```rs
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:

```rs
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.
Loading