/*
*函数说明:发行资产
参数:
to 给谁
quantity 数量
memo 备注
*/
void token::issue(account_name to, asset quantity, string memo) //注意:从函数表面看是直接发到to账户,在底层,还是发给创建者账户,然后再给to 账户加上资产
{
print("issue"); //先print一下,告诉系统,开始发资产了。
auto sym = quantity.symbol.name(); //先定义一个变量储存资产的名字
//新建一个资产资料列表
stats stastable(_self, sym);
const auto st =stastable.get(sym); //在多索引列表中找该资产。
require_auth(st.issuer); //只能由创建者来发币,不能由别人发币(资产)。
eosio_assert(st.is_valid()," invalid name"); //这种资产符号是不是合法的,如果不符合,报错信息: invalid name
eosio_assert(quantity.amount>0,"must issue posivive quantity");//这种资产最大的发行量必须必须大于0
eosio_assert(quantity<=st.max_supply-st.supply,"quantity exceeds availbe supply");//还能发行的资产要小于等于最大可以发行的资产减去已经发行的
stastable.modify(st,0,[&](auto &s){
s.supply += quantity; //增发的资产数量
});
/*调用add_balance()函数
*参数说明:
tp 给谁
quantity 数量
st 增加的资产状态
st.ssuer 支付RAM的人(发币人)
//这样处理不是很好 add_balance(to, quantity,st, st.issuer);
//add_balance以上的操作有点问题,EOS官方不是这样实现的,这样实现会给某人(to)无声无息的在列表中给这个人增加了资产,但不会通知到被增发的账户的。 除非被增发的账户不断的去查询。
//发行资产如何通知到被增发的账户呢?先不直接给需要被增发的账户to 增发,而是先给发起资产发行人增发。然后让资产发行人再转给需要被增发的账户(to )。调用SEND_INLINE_ACTION()这个宏。
*/
add_balance(st.issuer, quantity,st,st.ssuer);
if(to!=issuer)//不是给issuer自己增发
{
SEND_INLINE_ACTION(*this,transfer,{st.issuer,N(active)},{st.issuer,to,quanity, memo});//特别注意:如果给issuer自己增发资产,这句代码就不用了。
// SEND_INLINE_ACTION在一个ACTION中再嵌套一个ACTION(掉用了transfer),这样就可以通知到被增发的账户to知道自己被增发了。
//* this 就是本智能合约
// transfer 就是要发起的ACTION函数
// 需要的st.issuer的active 权限
// 就是传入transfer 的函数 参数说明,1 是发行人转出 2 转给谁, 3 转的数量 4 交易备注。
}
}