#pragma once
#include <eosiolib/eosio.hpp> //大部分智能合约所要用到的接口库,包含一些基础文件、定义文件
#include <eosiolib/asset.hpp> //定义了资产(数和量的资产 数:多少, 量:种类(ETH,BTC等))
#include <string>
namespace eosiosystem {
class system_contract;
}
namespace eosio {
using std::string;
//定义类,该类继承自contract类
class token : public contract {
//注意:智能合约的名字与类没有关系,智能合约在eos系统你上传的时候规定的这个智能合约属于哪个账户,这个智能合约就叫那个名字
public:
token( account_name self ):contract(self){}//构造函数
/*
*函数名: create
*作 用: 创建资产
*说 明: 申明一个action(动作) ,让别人(账户)在我们的智能合约中创建一个资产。把资产数据保存到我们的智能合约的账户中。
* 别人就不需要为发一个资产再开发一个智能合约了,只需要在我们这个智能合约账户里面新建一个资产。
*参数说明:
*issuer 发币人
*maximum_supply 发币的最大量
*issuer_can_freeze 发币人是否冻结
*issuer_can_recall 发币人是否可以召回
*issuer_can_whitelist 发币人是否可以设置白名单, 有的币是发给特定的人。*/
void create( account_name issuer,
asset maximum_supply,
uint8_t issuer_can_freeze,
uint8_t issuer_can_recall,
uint8_t issuer_can_whitelist);
/*
*函数名: issue
*作 用: 发布资产
*参数说明:
*to 发给谁
*quantity 发送数量
*memo 发行代币时的备注信息
*/
void issue( account_name to, asset quantity, string memo );
/*
*函数名: transfer
*作 用: 交易资产
*参数说明:
*from 谁转出来
*to 转给谁
*quantity 数量
*memo 转账时的备注信息
*/
void transfer( account_name from,
account_name to,
asset quantity,
string memo );
/* 内联函数声明 */
inline asset get_supply( symbol_name sym )const; //获取某种类型的资产总量
inline asset get_balance( account_name owner, symbol_name sym )const;;//获取某用户的某种资产的总量
private:
/*说明:定义资产持有人资料,结构体存放每一个拥有这个合约里资产的人(账户)的资料(账户名,是不是被冻结了,是不是在白名单里,
如果要存在数据库里还需要一个主键primary_key)
* 参数说明:
balance 资产余额
froze 是否被冻结 默认否
whitelist 是否在白名单 默认是
primary_key 主键
*/
struct account {
asset balance;
bool frozen = false;
bool whitelist =true;
uint64_t primary_key()const { return balance.symbol.name(); }
};
/*
*说明:资产的资料
*参数说明:
supply 供应量(供应了多少)
max_supply 最大供应量
issuer 资产发行人
can_freeze 能不能冻结 默认是
can_recall 能不能召回 默认是
can_whitelist 能不能设置白名单 默认是
is_frozen 是不是已经被冻结 默认否 不冻结
enforce_whitelist 是不是已经使用了白名单 默认否, 未使用白名单
primary_key 主键
*/
struct currency_stats {
asset supply;
asset max_supply;
account_name issuer;
bool can_freeze =true;
bool can_recall = true;
bool can_whitelist=true;
bool is_frozen=false;
bool enforce_whitelist=false;
uint64_t primary_key()const { return supply.symbol.name(); }
};
//eosio::multi_index 是在boost::multi_index的基础上开发的自己的multi_index
typedef eosio::multi_index<N(accounts), account> accounts; //资产持有人列表类型
typedef eosio::multi_index<N(stat), currency_stats> stats; //资产列表类型
//定义资产持有人资料和资产的资料放到multi_index 列表里,方便增删改查。
/*
*说明:减少资产
*参数说明:
* owner 资产的拥有者
* value 减少的资产值
* st 该资产目前的状态
*/
void sub_balance( account_name owner, asset value, const currency_stats& st );
/*
*说明:增加资产
*参数说明:
* owner 资产的拥有者
* value 增加的资产值
* st 该资产目前的状态
* ram_payer 为这个活动支付拥有系统内存的人, 在EOS系统中,智能合约处理数据的时候,是要占用系统内存的。
* 这个系统内存空间是谁提供的呢?所以要定义一个ram_payer,让特定的人给系统运行提供内存。
*/
void add_balance( account_name owner, asset value,const currency_stats& st, account_name ram_payer );
public:
struct transfer_args {
account_name from; //从哪
account_name to; //到哪
asset quantity; //数量
string memo; //备注
};
};
//实现内联函数
asset token::get_supply( symbol_name sym )const
{
stats statstable( _self, sym );
const auto& st = statstable.get( sym );
return st.supply;
}
asset token::get_balance( account_name owner, symbol_name sym )const
{
accounts accountstable( _self, owner );
const auto& ac = accountstable.get( sym );
return ac.balance;
}
} /// namespace eosio