Build your own protocol
In the following sections, we will guide you through the process of building your own IBC protocol. We will cover how to establish a channel between two chains, send and receive packets and how to handle timeouts and acknowledgements.
Entrypoints
To get an IBC-enabled contract, you need to implement a few IBC-specific entrypoints.
Three for the channel lifecycle:
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_channel_open(
deps: DepsMut,
env: Env,
msg: IbcChannelOpenMsg
) -> StdResult<IbcChannelOpenResponse> {
Ok(None)
}
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_channel_connect(
deps: DepsMut,
env: Env,
msg: IbcChannelConnectMsg,
) -> StdResult<IbcBasicResponse> {
Ok(IbcBasicResponse::new())
}
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_channel_close(
deps: DepsMut,
env: Env,
msg: IbcChannelCloseMsg,
) -> StdResult<IbcBasicResponse> {
Ok(IbcBasicResponse::new())
}
And three for the packet lifecycle:
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_packet_receive(
deps: DepsMut,
env: Env,
msg: IbcPacketReceiveMsg,
) -> StdResult<IbcReceiveResponse> {
Ok(IbcReceiveResponse::new(b""))
}
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_packet_ack(
deps: DepsMut,
env: Env,
msg: IbcPacketAckMsg,
) -> StdResult<IbcBasicResponse> {
Ok(IbcBasicResponse::new())
}
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn ibc_packet_timeout(
_deps: DepsMut,
_env: Env,
_msg: IbcPacketTimeoutMsg,
) -> StdResult<IbcBasicResponse> {
Ok(IbcBasicResponse::new())
}
We will explain what these are for in the next sections, but it is important to understand that you need to implement all of these entrypoints to get a working IBC contract. You can always return errors in some of them if that makes sense for your protocol, but you need to have them all.