transfer转帐函数,一个比较重要的功能,调用者可以将自己的余额转给其它帐户。
_transfer为private的具体实现函数。主要是作了一些必要的检查,然后从发起帐户扣减余额,再将余额加到接收帐户。最后发送了一个转帐事件,方便开发者监听转帐功能。这里的_beforeTokenTransfer和_afterTokenTransfer并没有实现具体功能,开发中可根据实现需要做一些功能实现。
allowance、approve主要是实现授权其它帐户可以使用自己的余额,并设定使用上限。相关的授权者存储在_allowances变量中。
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = msg.sender;
_approve(owner, spender, _allowances[owner][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 substractedValue) public virtual returns (bool) {
address owner = msg.sender;
uint256 currentAllowance = _allowances[owner][spender];
require(currentAllowance >= substractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - substractedValue);
}
return true;
}
increaseAllowance、decreaseAllowance两个函数是对approve函数功能的加强,对授权额度进行增减,这两个函数关不是ERC20协议中的内容。只是作者在参考源码时觉得有用,就加入了这两个函数。
ransferFrom,_spendAllowance是在授权额度下,进行转帐的功能实现。
transferFrom函数的from参数是授权帐户,to是余额接受帐户,amount是转帐余额,该函数的功能是将from帐户的余额转移amount个数据至to用户帐户中,调用者必须是from帐户通过_approve对其进行过授权,并且还有剩余的授权额度。该函数与transfer的区别是,transfer只能转移出调用者自己的帐户余额。
_spendAllowance是在进行授权转帐时首先扣减授权额度,保证被授权都在授权额度范围内使用转帐功能。