cosmos_client/client/
any_helper.rs

1use crate::error::CosmosClient;
2use cosmos_sdk_proto::cosmos::auth::v1beta1::BaseAccount;
3use cosmos_sdk_proto::cosmos::crypto::ed25519::PubKey;
4use cosmos_sdk_proto::cosmos::evidence::v1beta1::Equivocation;
5use cosmos_sdk_proto::cosmos::feegrant::v1beta1::BasicAllowance;
6use cosmos_sdk_proto::cosmos::vesting::v1beta1::ContinuousVestingAccount;
7use cosmos_sdk_proto::Any;
8use cosmrs::bank::MsgSend;
9use prost::Message;
10
11#[derive(Debug)]
12pub enum CosmosType {
13    BaseAccount(BaseAccount),
14    ContinuousVestingAccount(ContinuousVestingAccount),
15    PubKey(PubKey),
16    Equivocation(Equivocation),
17    BasicAllowance(BasicAllowance),
18    MsgSend(MsgSend),
19}
20
21/// # Errors
22///
23/// Will return `Err` if `cosmos` is an unknown cosmos msg is given or if
24/// a decode fail
25pub fn any_to_cosmos(cosmos: &Any) -> Result<CosmosType, CosmosClient> {
26    match cosmos.type_url.as_str() {
27        "/cosmos.auth.v1beta1.BaseAccount" => Ok(CosmosType::BaseAccount(BaseAccount::decode(
28            cosmos.value.as_slice(),
29        )?)),
30        "/cosmos.crypto.secp256k1.PubKey" => {
31            Ok(CosmosType::PubKey(PubKey::decode(cosmos.value.as_slice())?))
32        }
33        "/cosmos.evidence.v1beta1.Equivocation" => Ok(CosmosType::Equivocation(
34            Equivocation::decode(cosmos.value.as_slice())?,
35        )),
36        "/cosmos.feegrant.v1beta1.BasicAllowance" => Ok(CosmosType::BasicAllowance(
37            BasicAllowance::decode(cosmos.value.as_slice())?,
38        )),
39        "/cosmos.vesting.v1beta1.ContinuousVestingAccount" => {
40            Ok(CosmosType::ContinuousVestingAccount(
41                ContinuousVestingAccount::decode(cosmos.value.as_slice())?,
42            ))
43        }
44        _ => Err(CosmosClient::UnknownCosmosMsg),
45    }
46}