use crate::types::Metadata;
use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Binary, CosmosMsg, CustomMsg, StdResult, Uint128};
#[cw_serde]
pub enum TokenFactoryMsg {
CreateDenom {
subdenom: String,
metadata: Option<Metadata>,
},
ChangeAdmin {
denom: String,
new_admin_address: String,
},
MintTokens {
denom: String,
amount: Uint128,
mint_to_address: String,
},
BurnTokens {
denom: String,
amount: Uint128,
burn_from_address: String,
},
ForceTransfer {
denom: String,
amount: Uint128,
from_address: String,
to_address: String,
},
SetMetadata {
denom: String,
metadata: Metadata,
},
}
impl TokenFactoryMsg {
pub fn mint_contract_tokens(denom: String, amount: Uint128, mint_to_address: String) -> Self {
TokenFactoryMsg::MintTokens {
denom,
amount,
mint_to_address,
}
}
pub fn burn_contract_tokens(denom: String, amount: Uint128, burn_from_address: String) -> Self {
TokenFactoryMsg::BurnTokens {
denom,
amount,
burn_from_address,
}
}
pub fn force_transfer_tokens(
denom: String,
amount: Uint128,
from_address: String,
to_address: String,
) -> Self {
TokenFactoryMsg::ForceTransfer {
denom,
amount,
from_address,
to_address,
}
}
}
impl From<TokenFactoryMsg> for CosmosMsg<TokenFactoryMsg> {
fn from(msg: TokenFactoryMsg) -> CosmosMsg<TokenFactoryMsg> {
CosmosMsg::Custom(msg)
}
}
impl CustomMsg for TokenFactoryMsg {}
pub struct CreateDenomResponse {
pub new_token_denom: String,
}
impl CreateDenomResponse {
pub fn from_reply_data(data: Binary) -> StdResult<Self> {
let mut data = Vec::from(data);
let new_token_denom = copied_from_cw_utils::parse_protobuf_string(&mut data, 1)?;
Ok(CreateDenomResponse { new_token_denom })
}
pub fn encode(&self) -> StdResult<Binary> {
Ok(b"".into())
}
}
mod copied_from_cw_utils {
use cosmwasm_std::{StdError, StdResult};
const WIRE_TYPE_LENGTH_DELIMITED: u8 = 2;
const VARINT_MAX_BYTES: usize = 9;
pub fn parse_protobuf_string(data: &mut Vec<u8>, field_number: u8) -> StdResult<String> {
let str_field = parse_protobuf_length_prefixed(data, field_number)?;
Ok(String::from_utf8(str_field)?)
}
fn parse_protobuf_length_prefixed(data: &mut Vec<u8>, field_number: u8) -> StdResult<Vec<u8>> {
if data.is_empty() {
return Ok(vec![]);
};
let mut rest_1 = data.split_off(1);
let wire_type = data[0] & 0b11;
let field = data[0] >> 3;
if field != field_number {
return Err(StdError::parse_err(
"length_prefix_field",
format!(
"failed to decode Protobuf message: invalid field #{} for field #{}",
field, field_number
),
));
}
if wire_type != WIRE_TYPE_LENGTH_DELIMITED {
return Err(StdError::parse_err(
"length_prefix_field",
format!(
"failed to decode Protobuf message: field #{}: invalid wire type {}",
field_number, wire_type
),
));
}
let len = parse_protobuf_varint(&mut rest_1, field_number)?;
if rest_1.len() < len {
return Err(StdError::parse_err(
"length_prefix_field",
format!(
"failed to decode Protobuf message: field #{}: message too short",
field_number
),
));
}
*data = rest_1.split_off(len);
Ok(rest_1)
}
fn parse_protobuf_varint(data: &mut Vec<u8>, field_number: u8) -> StdResult<usize> {
let data_len = data.len();
let mut len: u64 = 0;
let mut i = 0;
while i < VARINT_MAX_BYTES {
if data_len == i {
return Err(StdError::parse_err(
"varint",
format!(
"failed to decode Protobuf message: field #{}: varint data too short",
field_number
),
));
}
len += ((data[i] & 0x7f) as u64) << (i * 7);
if data[i] & 0x80 == 0 {
break;
}
i += 1;
}
if i == VARINT_MAX_BYTES {
return Err(StdError::parse_err(
"varint",
format!(
"failed to decode Protobuf message: field #{}: varint data too long",
field_number
),
));
}
*data = data[i + 1..].to_owned();
Ok(len as usize) }
}