ERC20标准代码
pragma solidity ^0.4.16;//版本號(hào)//接口:tokenRecipient
interface tokenRecipient {function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public;}contract TokenERC20 {string public name;//幣種的名字string public symbol;//幣種名的簡(jiǎn)稱,比如:比特幣就是BTC// 位數(shù)18是建議的默認(rèn)值。ether和wei的轉(zhuǎn)換是10^18//如果設(shè)置為0,那么就代幣就不可分割。這樣就相當(dāng)于:比特幣里面只可以一個(gè)幣一個(gè)幣來交易u(yù)int8 public decimals = 18;uint256 public totalSupply;//設(shè)置的總發(fā)幣量//你本人給別人轉(zhuǎn)幣:每一個(gè)地址對(duì)應(yīng)一個(gè)余額mapping (address => uint256) public balanceOf;//發(fā)你授權(quán)給A,A就有權(quán)利把你的錢轉(zhuǎn)給其他人,allowance是授權(quán)額度//你是第一個(gè)address,然后你對(duì)所有人的授權(quán)【mapping (address => uint256)】//【mapping (address => uint256)】相當(dāng)于一個(gè)授權(quán)表,記錄你的授權(quán)情況mapping (address => mapping (address => uint256)) public allowance;//事件:轉(zhuǎn)賬情況event Transfer(address indexed from, address indexed to, uint256 value);//事件:授權(quán)情況event Approval(address indexed owner, address indexed spender, uint256 value);//事件:銷毀幣情況event Burn(address indexed from, uint256 value);//構(gòu)造器:確定總幣數(shù),幣種的名字,幣種的簡(jiǎn)稱function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {totalSupply = initialSupply * 10 ** uint256(decimals);balanceOf[msg.sender] = totalSupply;name = tokenName;symbol = tokenSymbol;}//合約內(nèi)部:轉(zhuǎn)幣function _transfer(address _from, address _to, uint _value) internal {require(_to != 0x0);//不可以是轉(zhuǎn)到0地址(相當(dāng)于銷毀幣)require(balanceOf[_from] >= _value);//要有足夠的幣轉(zhuǎn)出require(balanceOf[_to] + _value > balanceOf[_to]);//防止向上溢出//(*)代碼的目的:轉(zhuǎn)賬前后,轉(zhuǎn)賬兩者的錢數(shù)量不變,這是為了安全考慮uint previousBalances = balanceOf[_from] + balanceOf[_to];(*)balanceOf[_from] -= _value;//轉(zhuǎn)出錢balanceOf[_to] += _value;//轉(zhuǎn)進(jìn)錢emit Transfer(_from, _to, _value);//記錄事件assert(balanceOf[_from] + balanceOf[_to] == previousBalances);(*)}//外部調(diào)用:轉(zhuǎn)幣function transfer(address _to, uint256 _value) public returns (bool) {_transfer(msg.sender, _to, _value);return true;}//用戶授權(quán)轉(zhuǎn)出:_from是委托人(授權(quán)人),msg.sender是被委托人function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {//保證要轉(zhuǎn)出的錢小于等于授權(quán)的錢require(_value <= allowance[_from][msg.sender]);allowance[_from][msg.sender] -= _value;_transfer(_from, _to, _value);return true;}//授權(quán):委托人給被委托人一個(gè)授權(quán)金額function approve(address _spender, uint256 _value) publicreturns (bool success) {allowance[msg.sender][_spender] = _value;//委托人給被委托人一個(gè)金額授權(quán)值emit Approval(msg.sender, _spender, _value);//記錄事件:授權(quán)情況return true;}//實(shí)現(xiàn)接口:授權(quán)并且調(diào)用:授權(quán)人msg.sender,授權(quán)給_spender,function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {tokenRecipient spender = tokenRecipient(_spender);if (approve(_spender, _value)) {spender.receiveApproval(msg.sender, _value, this, _extraData);return true;}}//銷毀幣function burn(uint256 _value) public returns (bool success) {require(balanceOf[msg.sender] >= _value);//你要有足夠的幣銷毀balanceOf[msg.sender] -= _value;//將幣置為0totalSupply -= _value;//發(fā)行幣的量置為0emit Burn(msg.sender, _value);//記錄毀幣事件return true;}//授權(quán)給別人去毀幣function burnFrom(address _from, uint256 _value) public returns (bool success) {require(balanceOf[_from] >= _value);//毀幣數(shù)量足夠require(_value <= allowance[_from][msg.sender]);//授權(quán)的毀幣數(shù)滿足在授權(quán)范圍內(nèi)balanceOf[_from] -= _value;allowance[_from][msg.sender] -= _value;totalSupply -= _value;emit Burn(_from, _value);//記錄事件return true;}
}
總結(jié)
- 上一篇: nginx实现ip端口转发_nginx
- 下一篇: 国科大学习资料--最优化计算方法(王晓)