lotus_tokenfactory/
burn.rs

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