token配置

token配置

ERC-20 TOKEN STANDARD

token具有以下定义标准

1
2
3
4
5
6
7
8
9
10
11
12
13
// Methods
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
// Events
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

token定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string public name = "CysToken"; // tokenname
string public symbol = "CYST"; // token标志
uint256 public decimals = 18; // ERC20标准 1eth = 10 ** 18 wei
uint256 public totalSupply; // 总供应量
mapping(address => uint256) public balanceOf; // mapping address->token
/**
授权映射
{
user1_address:{
exchange_address:number,
dexchange_address:number
},
user2_address:{
exchange_address:number
dexchange_address:number
}
}
*/
mapping(address => mapping(address => uint256)) public allowanceBalance;

合约事件

Transfer

当代币从一个地址转移到另一个地址时触发。

1
event Transfer(address indexed _from, address indexed _to, uint256 _value);
  • _from:发送代币的地址。
  • _to:接收代币的地址。
  • _value:转移的代币数量。

Approval

当用户授权其他地址代表自己转移代币时触发。

1
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
  • _owner:授权代币的所有者地址。
  • _spender:被授权的地址。
  • _value:授权的代币数量。

合约方法

constructor

构造函数,用于初始化代币的总供应量,并将所有代币分配给合约的创建者。

1
2
3
4
5
6
7
constructor() {
// totalSupply = 1000000 * (10 ** decimals);
// 全部给创建账户 此msg.sender是创建的账号
// balanceOf[msg.sender] = totalSupply;
totalSupply = 1000000 * (10 ** decimals);
balanceOf[msg.sender] = totalSupply;
}

_transfer

内部方法,用于执行代币转账。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建转账方法 internal 只能合约内部调用
function _transfer(address _from, address _to, uint256 _value) internal {
// 检查地址不为0
require(_to != address(0), "Invalid recipient address");
// 检查发送者余额充足
require(balanceOf[_from] >= _value, "Insufficient value");
// 检查接受者余额不会溢出
require(
balanceOf[_to] + _value >= balanceOf[_to],
"Reipient balance overflow"
);

// 执行转账
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
// 触发转账事件
emit Transfer(_from, _to, _value);
}
  • _from:发送代币的地址。
  • _to:接收代币的地址。
  • _value:转移的代币数量。

transfer

公开方法,用于将代币从调用者的地址转移到另一个地址。

1
2
3
4
5
// 创建转账方法
function transfer(address _to, uint256 _value) public returns (bool success) {
_transfer(msg.sender, _to, _value);
return true;
}
  • _to:接收代币的地址。
  • _value:转移的代币数量。
  • success:返回 true 表示转账成功。

approve

授权当前账号给spender的额度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 授权 当前网页登录的账号
function approve(
address _spender,
uint256 _value
) public returns (bool success) {
// msg.sender 当前网页登录的账号
// _spender 第三方账号
// _value 授权数量
require(_spender != address(0));
allowanceBalance[msg.sender][_spender] = _value;
// 触发事件 记录log
emit Approval(msg.sender, _spender, _value);
return true;
}
  • _spender:授权地址。
  • _value:授权额度。
  • success:成功返回状态 true。

allowance

授权额度查询

1
2
3
4
5
6
7
// 返回授权账户仍能被提取的金额,eg:owner授权了spender 100 此时remaining = 100 然后 spender转了30 此时remaining = 70
function allowance(
address _owner,
address _spender
) public view returns (uint256 remaining) {
return allowanceBalance[_owner][_spender];
}
  • _owner: 查询账号。
  • _spender: 授权账号。

transferFrom

第三方转账

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 允许第三方转账
function transferFrom(
address _from,
address _to,
uint256 _value
) public returns (bool success) {
// 检查发送者是否已经发送完授权的余额
// msg.sender 第三方地址
// _from 授权过的地址
// _to 收款地址
require(
allowanceBalance[_from][msg.sender] >= _value,
"yi chu ke jiao yi yu e"
);
allowanceBalance[_from][msg.sender] -= _value;

_transfer(_from, _to, _value);

return true;
}
  • _from:提款地址。
  • _to:收款地址。
  • _value: 数量。