Skip to content

Commit

Permalink
Support ReceivePacket payload
Browse files Browse the repository at this point in the history
  • Loading branch information
soareschen committed Jul 17, 2023
1 parent e63a804 commit 3da5cc7
Show file tree
Hide file tree
Showing 9 changed files with 127 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,24 +1,52 @@
use async_trait::async_trait;
use ibc_relayer_components::chain::traits::message_builders::receive_packet::CanBuildReceivePacketMessage;
use ibc_relayer_components::chain::traits::message_builders::receive_packet::{
CanBuildReceivePacketMessage, CanBuildReceivePacketPayload,
};
use ibc_relayer_components::chain::traits::types::packets::receive::HasReceivePacketPayload;

use crate::one_for_all::traits::chain::OfaIbcChain;
use crate::one_for_all::types::chain::OfaChainWrapper;
use crate::std_prelude::*;

#[async_trait]
impl<Chain, Counterparty> CanBuildReceivePacketMessage<OfaChainWrapper<Counterparty>>
impl<Chain, Counterparty> HasReceivePacketPayload<OfaChainWrapper<Counterparty>>
for OfaChainWrapper<Chain>
where
Chain: OfaIbcChain<Counterparty>,
Counterparty: OfaIbcChain<Chain>,
{
async fn build_receive_packet_message(
type ReceivePacketPayload = Chain::ReceivePacketPayload;
}

#[async_trait]
impl<Chain, Counterparty> CanBuildReceivePacketPayload<OfaChainWrapper<Counterparty>>
for OfaChainWrapper<Chain>
where
Chain: OfaIbcChain<Counterparty>,
Counterparty: OfaIbcChain<Chain>,
{
async fn build_receive_packet_payload(
&self,
height: &Self::Height,
packet: &Self::OutgoingPacket,
) -> Result<Counterparty::Message, Self::Error> {
) -> Result<Self::ReceivePacketPayload, Self::Error> {
self.chain
.build_receive_packet_message(height, packet)
.build_receive_packet_payload(height, packet)
.await
}
}

#[async_trait]
impl<Chain, Counterparty> CanBuildReceivePacketMessage<OfaChainWrapper<Counterparty>>
for OfaChainWrapper<Chain>
where
Chain: OfaIbcChain<Counterparty>,
Counterparty: OfaIbcChain<Chain>,
{
async fn build_receive_packet_message(
&self,
payload: Counterparty::ReceivePacketPayload,
) -> Result<Self::Message, Self::Error> {
self.chain.build_receive_packet_message(payload).await
}
}
11 changes: 9 additions & 2 deletions crates/relayer-all-in-one/src/one_for_all/traits/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,8 @@ pub trait OfaChainTypes: Async {
type ChannelOpenInitEvent: Async;

type ChannelOpenTryEvent: Async;

type ReceivePacketPayload: Async;
}

#[async_trait]
Expand Down Expand Up @@ -324,11 +326,16 @@ where
sequence: &Counterparty::Sequence,
) -> Result<bool, Self::Error>;

async fn build_receive_packet_message(
async fn build_receive_packet_payload(
&self,
height: &Self::Height,
packet: &Self::OutgoingPacket,
) -> Result<Counterparty::Message, Self::Error>;
) -> Result<Self::ReceivePacketPayload, Self::Error>;

async fn build_receive_packet_message(
&self,
payload: Counterparty::ReceivePacketPayload,
) -> Result<Self::Message, Self::Error>;

async fn build_ack_packet_message(
&self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub trait CanBuildAckPacketPayload<Counterparty>:
where
Counterparty: HasIbcChainTypes<Self>,
{
async fn build_ack_packet_message(
async fn build_ack_packet_payload(
&self,
height: &Self::Height,
packet: &Self::IncomingPacket,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use async_trait::async_trait;

use crate::chain::traits::types::height::HasHeightType;
use crate::chain::traits::types::ibc::HasIbcChainTypes;
use crate::chain::traits::types::message::HasMessageType;
use crate::chain::traits::types::packet::HasIbcPacketTypes;
use crate::chain::traits::types::packets::receive::HasReceivePacketPayload;
use crate::core::traits::error::HasErrorType;
Expand All @@ -16,22 +17,20 @@ pub trait CanBuildReceivePacketPayload<Counterparty>:
where
Counterparty: HasIbcChainTypes<Self>,
{
async fn build_receive_packet_message(
async fn build_receive_packet_payload(
&self,
height: &Self::Height,
packet: &Self::OutgoingPacket,
) -> Result<Self::ReceivePacketPayload, Self::Error>;
}

#[async_trait]
pub trait CanBuildReceivePacketMessage<Counterparty>:
HasIbcPacketTypes<Counterparty> + HasHeightType + HasErrorType
pub trait CanBuildReceivePacketMessage<Counterparty>: HasMessageType + HasErrorType
where
Counterparty: HasIbcChainTypes<Self>,
Counterparty: HasReceivePacketPayload<Self>,
{
async fn build_receive_packet_message(
&self,
height: &Self::Height,
packet: &Self::OutgoingPacket,
) -> Result<Counterparty::Message, Self::Error>;
payload: Counterparty::ReceivePacketPayload,
) -> Result<Self::Message, Self::Error>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub trait CanBuildTimeoutUnorderedPacketPayload<Counterparty>:
where
Counterparty: HasIbcChainTypes<Self>,
{
async fn build_timeout_unordered_packet_message(
async fn build_timeout_unordered_packet_payload(
&self,
height: &Self::Height,
packet: &Self::IncomingPacket,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use async_trait::async_trait;

use crate::chain::traits::message_builders::receive_packet::CanBuildReceivePacketMessage;
use crate::chain::traits::message_builders::receive_packet::{
CanBuildReceivePacketMessage, CanBuildReceivePacketPayload,
};
use crate::chain::traits::types::ibc_events::write_ack::HasWriteAcknowledgementEvent;
use crate::chain::types::aliases::Height;
use crate::relay::traits::chains::HasRelayChains;
Expand All @@ -15,7 +17,8 @@ pub struct BaseReceivePacketRelayer;
#[async_trait]
impl<Relay, AckEvent> ReceivePacketRelayer<Relay> for BaseReceivePacketRelayer
where
Relay::SrcChain: CanBuildReceivePacketMessage<Relay::DstChain>,
Relay::SrcChain: CanBuildReceivePacketPayload<Relay::DstChain>,
Relay::DstChain: CanBuildReceivePacketMessage<Relay::SrcChain>,
Relay: CanSendSingleIbcMessage<DestinationTarget>,
Relay: HasRelayChains,
Relay::DstChain:
Expand All @@ -26,12 +29,18 @@ where
source_height: &Height<Relay::SrcChain>,
packet: &Packet<Relay>,
) -> Result<Option<AckEvent>, Relay::Error> {
let message = relay
let payload = relay
.src_chain()
.build_receive_packet_message(source_height, packet)
.build_receive_packet_payload(source_height, packet)
.await
.map_err(Relay::src_chain_error)?;

let message = relay
.dst_chain()
.build_receive_packet_message(payload)
.await
.map_err(Relay::dst_chain_error)?;

let events = relay.send_message(DestinationTarget, message).await?;

let ack_event = events
Expand Down
19 changes: 15 additions & 4 deletions crates/relayer-cosmos/src/impls/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ use crate::methods::connection::{
use crate::methods::consensus_state::{find_consensus_state_height_before, query_consensus_state};
use crate::methods::create_client::{build_create_client_message, build_create_client_payload};
use crate::methods::packet::{
build_ack_packet_message, build_receive_packet_message, build_timeout_unordered_packet_message,
query_is_packet_received, query_write_acknowledgement_event,
build_ack_packet_message, build_receive_packet_message, build_receive_packet_payload,
build_timeout_unordered_packet_message, query_is_packet_received,
query_write_acknowledgement_event, CosmosReceivePacketPayload,
};
use crate::methods::update_client::{build_update_client_message, build_update_client_payload};
use crate::traits::message::CosmosMessage;
Expand Down Expand Up @@ -158,6 +159,8 @@ where
type ChannelOpenInitEvent = CosmosChannelOpenInitEvent;

type ChannelOpenTryEvent = CosmosChannelOpenTryEvent;

type ReceivePacketPayload = CosmosReceivePacketPayload;
}

#[async_trait]
Expand Down Expand Up @@ -412,6 +415,7 @@ where
ChannelOpenTryPayload = CosmosChannelOpenTryPayload,
ChannelOpenAckPayload = CosmosChannelOpenAckPayload,
ChannelOpenConfirmPayload = CosmosChannelOpenConfirmPayload,
ReceivePacketPayload = CosmosReceivePacketPayload,
>,
{
fn incoming_packet_src_channel_id(packet: &Packet) -> &ChannelId {
Expand Down Expand Up @@ -523,12 +527,19 @@ where

/// Construct a receive packet to be sent to a destination Cosmos
/// chain from a source Cosmos chain.
async fn build_receive_packet_message(
async fn build_receive_packet_payload(
&self,
height: &Height,
packet: &Packet,
) -> Result<CosmosReceivePacketPayload, Error> {
build_receive_packet_payload(self, height, packet).await
}

async fn build_receive_packet_message(
&self,
payload: CosmosReceivePacketPayload,
) -> Result<Arc<dyn CosmosMessage>, Error> {
build_receive_packet_message(self, height, packet).await
build_receive_packet_message(payload).await
}

/// Construct an acknowledgement packet to be sent from a Cosmos
Expand Down
36 changes: 29 additions & 7 deletions crates/relayer-cosmos/src/methods/packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use ibc_relayer_types::core::ics04_channel::msgs::timeout::MsgTimeout;
use ibc_relayer_types::core::ics04_channel::packet::{Packet, PacketMsgType, Sequence};
use ibc_relayer_types::core::ics24_host::identifier::{ChannelId, PortId};
use ibc_relayer_types::events::IbcEvent;
use ibc_relayer_types::proofs::Proofs;
use ibc_relayer_types::tx_msg::Msg;
use ibc_relayer_types::Height;

Expand All @@ -18,11 +19,17 @@ use crate::traits::message::{wrap_cosmos_message, CosmosMessage};
use crate::types::error::{BaseError, Error};
use crate::types::message::CosmosIbcMessage;

pub async fn build_receive_packet_message<Chain: ChainHandle>(
pub struct CosmosReceivePacketPayload {
pub height: Height,
pub packet: Packet,
pub proofs: Proofs,
}

pub async fn build_receive_packet_payload<Chain: ChainHandle>(
chain: &CosmosChain<Chain>,
height: &Height,
packet: &Packet,
) -> Result<Arc<dyn CosmosMessage>, Error> {
) -> Result<CosmosReceivePacketPayload, Error> {
let height = *height;
let packet = packet.clone();

Expand All @@ -45,16 +52,31 @@ pub async fn build_receive_packet_message<Chain: ChainHandle>(

let packet = packet.clone();

let message = CosmosIbcMessage::new(Some(height), move |signer| {
Ok(MsgRecvPacket::new(packet.clone(), proofs.clone(), signer.clone()).to_any())
});

Ok(wrap_cosmos_message(message))
Ok(CosmosReceivePacketPayload {
height,
packet,
proofs,
})
})
.await
.map_err(BaseError::join)?
}

pub async fn build_receive_packet_message(
payload: CosmosReceivePacketPayload,
) -> Result<Arc<dyn CosmosMessage>, Error> {
let message = CosmosIbcMessage::new(Some(payload.height), move |signer| {
Ok(MsgRecvPacket::new(
payload.packet.clone(),
payload.proofs.clone(),
signer.clone(),
)
.to_any())
});

Ok(wrap_cosmos_message(message))
}

pub async fn build_ack_packet_message<Chain: ChainHandle>(
chain: &CosmosChain<Chain>,
height: &Height,
Expand Down
23 changes: 20 additions & 3 deletions crates/relayer-mock/src/relayer_mock/base/impls/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ use eyre::eyre;
use ibc_relayer_components::chain::traits::logs::event::CanLogChainEvent;
use ibc_relayer_components::chain::traits::logs::packet::CanLogChainPacket;
use ibc_relayer_components::chain::traits::message_builders::ack_packet::CanBuildAckPacketMessage;
use ibc_relayer_components::chain::traits::message_builders::receive_packet::CanBuildReceivePacketMessage;
use ibc_relayer_components::chain::traits::message_builders::receive_packet::{
CanBuildReceivePacketMessage, CanBuildReceivePacketPayload,
};
use ibc_relayer_components::chain::traits::message_builders::timeout_unordered_packet::CanBuildTimeoutUnorderedPacketMessage;
use ibc_relayer_components::chain::traits::message_sender::CanSendMessages;
use ibc_relayer_components::chain::traits::queries::consensus_state::CanQueryConsensusState;
Expand All @@ -33,6 +35,7 @@ use ibc_relayer_components::chain::traits::types::message::{
CanEstimateMessageSize, HasMessageType,
};
use ibc_relayer_components::chain::traits::types::packet::{HasIbcPacketFields, HasIbcPacketTypes};
use ibc_relayer_components::chain::traits::types::packets::receive::HasReceivePacketPayload;
use ibc_relayer_components::chain::traits::types::status::HasChainStatusType;
use ibc_relayer_components::chain::traits::types::timestamp::HasTimestampType;
use ibc_relayer_components::core::traits::error::HasErrorType;
Expand Down Expand Up @@ -346,9 +349,13 @@ impl CanQueryWriteAcknowledgement<MockChainContext> for MockChainContext {
}
}

impl HasReceivePacketPayload<MockChainContext> for MockChainContext {
type ReceivePacketPayload = MockMessage;
}

#[async_trait]
impl CanBuildReceivePacketMessage<MockChainContext> for MockChainContext {
async fn build_receive_packet_message(
impl CanBuildReceivePacketPayload<MockChainContext> for MockChainContext {
async fn build_receive_packet_payload(
&self,
height: &MockHeight,
packet: &PacketKey,
Expand All @@ -370,6 +377,16 @@ impl CanBuildReceivePacketMessage<MockChainContext> for MockChainContext {
}
}

#[async_trait]
impl CanBuildReceivePacketMessage<MockChainContext> for MockChainContext {
async fn build_receive_packet_message(
&self,
payload: MockMessage,
) -> Result<MockMessage, Error> {
Ok(payload)
}
}

#[async_trait]
impl CanBuildAckPacketMessage<MockChainContext> for MockChainContext {
async fn build_ack_packet_message(
Expand Down

0 comments on commit 3da5cc7

Please sign in to comment.