ibc_core_handler_types/
msgs.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
use ibc_core_channel_types::msgs::{
    ChannelMsg, MsgAcknowledgement, MsgChannelCloseConfirm, MsgChannelCloseInit, MsgChannelOpenAck,
    MsgChannelOpenConfirm, MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout,
    MsgTimeoutOnClose, PacketMsg, ACKNOWLEDGEMENT_TYPE_URL, CHAN_CLOSE_CONFIRM_TYPE_URL,
    CHAN_CLOSE_INIT_TYPE_URL, CHAN_OPEN_ACK_TYPE_URL, CHAN_OPEN_CONFIRM_TYPE_URL,
    CHAN_OPEN_INIT_TYPE_URL, CHAN_OPEN_TRY_TYPE_URL, RECV_PACKET_TYPE_URL,
    TIMEOUT_ON_CLOSE_TYPE_URL, TIMEOUT_TYPE_URL,
};
#[allow(deprecated)]
use ibc_core_client_types::msgs::{
    ClientMsg, MsgCreateClient, MsgSubmitMisbehaviour, MsgUpdateClient, MsgUpgradeClient,
    CREATE_CLIENT_TYPE_URL, SUBMIT_MISBEHAVIOUR_TYPE_URL, UPDATE_CLIENT_TYPE_URL,
    UPGRADE_CLIENT_TYPE_URL,
};
use ibc_core_connection_types::msgs::{
    ConnectionMsg, MsgConnectionOpenAck, MsgConnectionOpenConfirm, MsgConnectionOpenInit,
    MsgConnectionOpenTry, CONN_OPEN_ACK_TYPE_URL, CONN_OPEN_CONFIRM_TYPE_URL,
    CONN_OPEN_INIT_TYPE_URL, CONN_OPEN_TRY_TYPE_URL,
};
use ibc_core_host_types::error::DecodingError;
use ibc_primitives::prelude::*;
use ibc_proto::google::protobuf::Any;
use ibc_proto::Protobuf;

/// Enumeration of all messages that the local ICS26 module is capable of routing.
#[cfg_attr(
    feature = "borsh",
    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Clone, Debug, PartialEq, Eq, derive_more::From)]
pub enum MsgEnvelope {
    Client(ClientMsg),
    Connection(ConnectionMsg),
    Channel(ChannelMsg),
    Packet(PacketMsg),
}

#[allow(deprecated)]
impl TryFrom<Any> for MsgEnvelope {
    type Error = DecodingError;

    fn try_from(any_msg: Any) -> Result<Self, Self::Error> {
        match any_msg.type_url.as_str() {
            // ICS2 messages
            CREATE_CLIENT_TYPE_URL => {
                // Pop out the message and then wrap it in the corresponding type.
                let domain_msg = MsgCreateClient::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Client(ClientMsg::CreateClient(domain_msg)))
            }
            UPDATE_CLIENT_TYPE_URL => {
                let domain_msg = MsgUpdateClient::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Client(ClientMsg::UpdateClient(domain_msg)))
            }
            UPGRADE_CLIENT_TYPE_URL => {
                let domain_msg = MsgUpgradeClient::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Client(ClientMsg::UpgradeClient(domain_msg)))
            }
            SUBMIT_MISBEHAVIOUR_TYPE_URL => {
                let domain_msg = MsgSubmitMisbehaviour::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Client(ClientMsg::Misbehaviour(domain_msg)))
            }

            // ICS03
            CONN_OPEN_INIT_TYPE_URL => {
                let domain_msg = MsgConnectionOpenInit::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Connection(ConnectionMsg::OpenInit(domain_msg)))
            }
            CONN_OPEN_TRY_TYPE_URL => {
                let domain_msg = MsgConnectionOpenTry::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Connection(ConnectionMsg::OpenTry(domain_msg)))
            }
            CONN_OPEN_ACK_TYPE_URL => {
                let domain_msg = MsgConnectionOpenAck::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Connection(ConnectionMsg::OpenAck(domain_msg)))
            }
            CONN_OPEN_CONFIRM_TYPE_URL => {
                let domain_msg = MsgConnectionOpenConfirm::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Connection(ConnectionMsg::OpenConfirm(
                    domain_msg,
                )))
            }

            // ICS04 channel messages
            CHAN_OPEN_INIT_TYPE_URL => {
                let domain_msg = MsgChannelOpenInit::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::OpenInit(domain_msg)))
            }
            CHAN_OPEN_TRY_TYPE_URL => {
                let domain_msg = MsgChannelOpenTry::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::OpenTry(domain_msg)))
            }
            CHAN_OPEN_ACK_TYPE_URL => {
                let domain_msg = MsgChannelOpenAck::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::OpenAck(domain_msg)))
            }
            CHAN_OPEN_CONFIRM_TYPE_URL => {
                let domain_msg = MsgChannelOpenConfirm::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::OpenConfirm(domain_msg)))
            }
            CHAN_CLOSE_INIT_TYPE_URL => {
                let domain_msg = MsgChannelCloseInit::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::CloseInit(domain_msg)))
            }
            CHAN_CLOSE_CONFIRM_TYPE_URL => {
                let domain_msg = MsgChannelCloseConfirm::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Channel(ChannelMsg::CloseConfirm(domain_msg)))
            }
            // ICS04 packet messages
            RECV_PACKET_TYPE_URL => {
                let domain_msg = MsgRecvPacket::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Packet(PacketMsg::Recv(domain_msg)))
            }
            ACKNOWLEDGEMENT_TYPE_URL => {
                let domain_msg = MsgAcknowledgement::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Packet(PacketMsg::Ack(domain_msg)))
            }
            TIMEOUT_TYPE_URL => {
                let domain_msg = MsgTimeout::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Packet(PacketMsg::Timeout(domain_msg)))
            }
            TIMEOUT_ON_CLOSE_TYPE_URL => {
                let domain_msg = MsgTimeoutOnClose::decode_vec(&any_msg.value)?;
                Ok(MsgEnvelope::Packet(PacketMsg::TimeoutOnClose(domain_msg)))
            }

            _ => Err(DecodingError::UnknownTypeUrl(any_msg.type_url))?,
        }
    }
}