taurus-api 0.1.13

Taurus helper for Cosmos-SDK
Documentation
extern crate quick_protobuf;

use base64::engine::general_purpose;
use base64::Engine;
use quick_protobuf::Writer;
use serde::Serialize;
use std::borrow::Cow;
use std::str;

pub const KIND_STRING: &str = "String";
pub const KIND_ARRAY: &str = "Array";
pub const KIND_MESSAGE: &str = "Message";
pub const KIND_BYTES: &str = "Bytes";
pub const KIND_INT: &str = "Int";

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct StringObject {
    pub string: String,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ArrayDetail {
    pub kind: String,
    pub elems: Vec<Objects>,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ArrayObject {
    pub array: ArrayDetail,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MessageObject {
    pub message: Vec<MesssageDetails>,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct BytesObject {
    pub bytes: String,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct IntObject {
    pub int: String,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(untagged)]
pub enum Objects {
    String(StringObject),
    Array(ArrayObject),
    Message(MessageObject),
    Bytes(BytesObject),
    Int(IntObject),
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MesssageDetails {
    pub kind: String,
    pub name: String,
    pub field_id: u32,
    pub value: Box<Objects>,
}

#[derive(Serialize, Clone, Debug, Eq, PartialEq)]
pub struct Message {
    pub url: String,
    pub message: Vec<MesssageDetails>,
}

impl Message {
    fn encode_proto_string(data: &str) -> String {
        let mut out = Vec::new();
        let mut writer = Writer::new(&mut out);
        writer
            .write_message(&crate::proto::authz::Authz {
                msg: Cow::Borrowed(data),
            })
            .expect("encode_proto_string error");

        let out2 = &out.as_slice()[1..];

        general_purpose::STANDARD.encode(out2)
    }

    pub fn build_authz_message(
        granter: String,
        grantee: String,
        authorization: String,
        _expiration: String,
    ) -> Message {
        Message {
            url: "/cosmos.authz.v1beta1.MsgGrant".to_string(),
            message: vec![
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "granter".to_string(),
                    field_id: 1,
                    value: Box::new(Objects::String(StringObject { string: granter })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "grantee".to_string(),
                    field_id: 2,
                    value: Box::new(Objects::String(StringObject { string: grantee })),
                },
                MesssageDetails {
                    kind: KIND_MESSAGE.to_string(),
                    name: "grant".to_string(),
                    field_id: 3,
                    value: Box::new(Objects::Message(MessageObject {
                        message: vec![
                            MesssageDetails {
                                kind: KIND_MESSAGE.to_string(),
                                name: "authorization".to_string(),
                                field_id: 1,
                                value: Box::new(Objects::Message(MessageObject {
                                    message: vec![
                                        MesssageDetails {
                                            kind: "String".to_string(),
                                            name: "type_url".to_string(),
                                            field_id: 1,
                                            value: Box::new(Objects::String(StringObject {
                                                string:
                                                    "/cosmos.authz.v1beta1.GenericAuthorization"
                                                        .to_string(),
                                            })),
                                        },
                                        MesssageDetails {
                                            kind: KIND_BYTES.to_string(),
                                            name: "value".to_string(),
                                            field_id: 2,
                                            value: Box::new(Objects::Bytes(BytesObject {
                                                bytes: Self::encode_proto_string(
                                                    authorization.as_str(),
                                                ),
                                            })),
                                        },
                                    ],
                                })),
                            },
                            MesssageDetails {
                                kind: KIND_MESSAGE.to_string(),
                                name: "timestamp".to_string(),
                                field_id: 2,
                                value: Box::new(Objects::Message(MessageObject {
                                    message: vec![
                                        MesssageDetails {
                                            kind: KIND_INT.to_string(),
                                            name: "seconds".to_string(),
                                            field_id: 1,
                                            value: Box::new(Objects::Int(IntObject {
                                                int: "1732193243".to_string(),
                                            })),
                                        },
                                        MesssageDetails {
                                            kind: KIND_INT.to_string(),
                                            name: "nanos".to_string(),
                                            field_id: 2,
                                            value: Box::new(Objects::Int(IntObject {
                                                int: "0".to_string(),
                                            })),
                                        },
                                    ],
                                })),
                            },
                        ],
                    })),
                },
            ],
        }
    }

    pub fn build_revoke_message(granter: String, grantee: String, msg_type_url: String) -> Message {
        Message {
            url: "/cosmos.authz.v1beta1.MsgRevoke".to_string(),
            message: vec![
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "granter".to_string(),
                    field_id: 1,
                    value: Box::new(Objects::String(StringObject { string: granter })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "grantee".to_string(),
                    field_id: 2,
                    value: Box::new(Objects::String(StringObject { string: grantee })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "msg_type_url".to_string(),
                    field_id: 3,
                    value: Box::new(Objects::String(StringObject {
                        string: msg_type_url,
                    })),
                },
            ],
        }
    }

    pub fn build_contract_migrate(
        sender: String,
        contract: String,
        code_id: u64,
        msg: String,
    ) -> Message {
        Message {
            url: "/cosmwasm.wasm.v1.MsgMigrateContract".to_string(),
            message: vec![
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "sender".to_string(),
                    field_id: 1,
                    value: Box::new(Objects::String(StringObject { string: sender })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "contract".to_string(),
                    field_id: 2,
                    value: Box::new(Objects::String(StringObject { string: contract })),
                },
                MesssageDetails {
                    kind: KIND_INT.to_string(),
                    name: "code_id".to_string(),
                    field_id: 3,
                    value: Box::new(Objects::Int(IntObject {
                        int: code_id.to_string(),
                    })),
                },
                MesssageDetails {
                    kind: KIND_BYTES.to_string(),
                    name: "msg".to_string(),
                    field_id: 4,
                    value: Box::new(Objects::Bytes(BytesObject { bytes: msg })),
                },
            ],
        }
    }

    pub fn build_contract_instantiate(
        sender: String,
        admin: String,
        label: String,
        code_id: u64,
        msg: String,
    ) -> Message {
        Message {
            url: "/cosmwasm.wasm.v1.MsgInstantiateContract".to_string(),
            message: vec![
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "sender".to_string(),
                    field_id: 1,
                    value: Box::new(Objects::String(StringObject { string: sender })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "admin".to_string(),
                    field_id: 2,
                    value: Box::new(Objects::String(StringObject { string: admin })),
                },
                MesssageDetails {
                    kind: KIND_INT.to_string(),
                    name: "code_id".to_string(),
                    field_id: 3,
                    value: Box::new(Objects::Int(IntObject {
                        int: code_id.to_string(),
                    })),
                },
                MesssageDetails {
                    kind: KIND_STRING.to_string(),
                    name: "label".to_string(),
                    field_id: 4,
                    value: Box::new(Objects::String(StringObject { string: label })),
                },
                MesssageDetails {
                    kind: KIND_BYTES.to_string(),
                    name: "msg".to_string(),
                    field_id: 5,
                    value: Box::new(Objects::Bytes(BytesObject { bytes: msg })),
                },
            ],
        }
    }
}