Skip to main content

lotus_tokenfactory/
mint.rs

1use std::str::FromStr;
2
3use anybuf::{Anybuf, Bufany};
4use cosmwasm_schema::cw_serde;
5use cosmwasm_std::{Addr, Coin, CosmosMsg, StdResult, Uint128};
6
7use crate::common::EncodeMessage;
8use crate::common::{create_msg, MsgTypes};
9
10/// Returns the MsgMint Stargate message
11pub fn mint(sender: Addr, coin: Coin, mint_to_address: String) -> CosmosMsg {
12    let message_data = MsgMint {
13        sender: sender.to_string(),
14        amount: coin,
15        mint_to_address,
16    };
17
18    create_msg(message_data, MsgTypes::Mint.as_str())
19}
20
21#[cw_serde]
22pub struct MsgMint {
23    pub sender: String,
24    pub amount: Coin,
25    pub mint_to_address: String,
26}
27
28impl EncodeMessage for MsgMint {
29    fn encode(data: Self) -> Vec<u8> {
30        let coin_buf = Anybuf::new()
31            .append_string(1, data.amount.denom)
32            .append_string(2, data.amount.amount.to_string());
33
34        Anybuf::new()
35            .append_string(1, data.sender)
36            .append_message(2, &coin_buf)
37            .append_string(3, &data.mint_to_address)
38            .into_vec()
39    }
40
41    fn decode(data: Vec<u8>) -> StdResult<Self>
42    where
43        Self: Sized,
44    {
45        let deserialized = Bufany::deserialize(&data).unwrap();
46
47        let coin_msg = deserialized.message(2).unwrap();
48        let coin = Coin {
49            denom: coin_msg.string(1).unwrap(),
50            amount: Uint128::from_str(coin_msg.string(2).unwrap().as_str()).unwrap(),
51        };
52
53        Ok(Self {
54            sender: deserialized.string(1).unwrap(),
55            amount: coin,
56            mint_to_address: deserialized.string(3).unwrap(),
57        })
58    }
59}