---
title: Introduction
sidebar_label: Introduction
sidebar_position: 0
slug: /intro
---

import HighlightTag from '@site/src/components/HighlightTag';

# CosmWasm ICA Controller

<HighlightTag type="concepts"/><HighlightTag type="basics"/>

Welcome to the documentation for CosmWasm Interchain Accounts Controller. This document will guide you through
understanding the [ICS-27](https://github.com/cosmos/ibc/tree/main/spec/app/ics-027-interchain-accounts)
Interchain Accounts protocol and how to use `cw-ica-controller` to create and manage interchain accounts on
any IBC enabled CosmWasm chain.

The CosmWasm ICA Controller is a CosmWasm contract that implements the ICS-27 interchain accounts controller in
pure Rust. It is designed to be used by other CosmWasm contracts to create and manage interchain accounts on
the chain where the contract is deployed.

## High Level Overview

The following diagram shows how `cw-ica-controller` works at a high level.

![High Level Overview](/img/cw-ica-controller.svg)

The `cw-ica-controller` contract code is deployed on a chain that supports IBC CosmWasm. This chain does not need
to support ICS-27 interchain accounts nor does it need to support any custom IBC bindings. Then when an external
account or a contract instantiates a `cw-ica-controller` contract, the contract will initiate the ICS-27 handshake
with a chain that supports ICS-27 interchain accounts based on the options provided by the caller.

:::note

The counterparty chain need not be a CosmWasm chain. It can be any chain that uses ibc-go and supports `ICS-27`.
Such as CosmosHub, Osmosis, etc.

:::

Then the rest of the ICS-27 handshake is completed by the relayers automatically. Both the hermes relayer and the
go relayer support `ICS-27` interchain accounts. Once the handshake is complete, the `cw-ica-controller` contract
makes a callback to the callback contract if one was provided during instantiation.
