lotus_tokenfactory/
burn.rs1use 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
12pub 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}