引言
学习了sui move中的动态字段,table,bag,作为练习,我准备使用它们模拟solidity中的映射类型,在sui move实现一个类似erc20的同质化代币作为之前学习的实践与巩固。本文分享了练习过程中的mint,和burn,balance _of,total_supply。
mint函数
public fun mint<T>(_: &TreasuryCap<T> ,balance_list: &mut BalanceList, to:address, value: u64, ctx:&mut TxContext): bool
mint函数用来铸造代币供应。只有持有TreasuryCap的地址才能进行铸币
需要传入BalanceList,铸币地址to,和铸币数量amount
- 首先检查value是否为0,如果为0,直接返回
if(value == 0){
return true
};
- 确定代币类型,检查balancelist中是否拥有此代币的余额信息(代币是否初始化),如果有,取出借用。
let type = ascii::into_bytes(type_name::into_string(type_name::get_with_original_ids<T>()));
assert!(bag::contains(&balance_list.balance_list, type), 2);
let balance_table = bag::borrow_mut< vector<u8>, BalanceData<T> >(&mut balance_list.balance_list, type);
- 检查to是否作为键存在于table中,如果没有创建table传入value,如果有,将新铸币的余额加上
if(table::contains(&balance_table.balance, to)){
let balance_to = table::borrow_mut(&mut balance_table.balance,to);
assert!(*balance_to + value >= *balance_to, 8);
*balance_to = *balance_to + value;
}else{
table::add(&mut balance_table.balance, to, value);
};
- 将总供应变更
let totalsupply = &mut balance_table.totalsupply;
assert!(*totalsupply + value >= *totalsupply, 8);
*totalsupply = *totalsupply + value;
- 最后返回true
mint函数完整代码
public fun mint<T>(_: &TreasuryCap<T> ,balance_list: &mut BalanceList, to:address, value: u64, ctx:&mut TxContext): bool{
if(value == 0){
return true
};
let type = ascii::into_bytes(type_name::into_string(type_name::get_with_original_ids<T>()));
assert!(bag::contains(&balance_list.balance_list, type), 2);
let balance_table = bag::borrow_mut< vector<u8>, BalanceData<T> >(&mut balance_list.balance_list, type);
if(table::contains(&balance_table.balance, to)){
let balance_to = table::borrow_mut(&mut balance_table.balance,to);
assert!(*balance_to + value >= *balance_to, 8);
*balance_to = *balance_to + value;
}else{
table::add(&mut balance_table.balance, to, value);
};
let totalsupply = &mut balance_table.totalsupply;
assert!(*totalsupply + value >= *totalsupply, 8);
*totalsupply = *totalsupply + value;
return true
}
burn函数
public fun burn<T>(_: &TreasuryCap<T>, balance_list: &mut BalanceList, from:address, value: u64, ctx:&mut TxContext): bool
burn函数用于销毁一个地址的代币,同样是持有TreasuryCap的地址才可以销毁
传入balancelist,要销毁代币的地址,销毁数量
- 首先检查value是否为0,如果为0,直接返回
if(value == 0){
return true
};
- 确定代币类型,检查balancelist中是否拥有此代币的余额信息(代币是否初始化),如果有,取出借用。
let type = ascii::into_bytes(type_name::into_string(type_name::get_with_original_ids<T>()));
assert!(bag::contains(&balance_list.balance_list, type), 2);
let balance_table = bag::borrow_mut< vector<u8>, BalanceData<T> >(&mut balance_list.balance_list, type);
- 检查from是否作为键存在于table中,如果不存在,将会回滚,如果有,余额是否足够销毁,如果不够将会回滚,之后变更余额信息和总供应信息
if(table::contains(&balance_table.balance, from)){
let balance_to = table::borrow_mut(&mut balance_table.balance,from);
assert!(*balance_to >= value, 8);
if(*balance_to > value){
*balance_to = *balance_to - value;
}
else{
table::remove(&mut balance_table.balance,from);
};
let totalsupply = &mut balance_table.totalsupply;
*totalsupply = *totalsupply - value;
}else{
assert!(false, 0)