Pig
简介
具体参数解释
// 单纯的常量,用于计算份额
uint256 private constant MAX = ~uint256(0);
// 代币总量
uint256 private _tTotal = 1000000000 * 10**6 * 10**9;
// 份额总量,其实就是一个极大的值,但是又不超限溢出的目的
uint256 private _rTotal = (MAX - (MAX % _tTotal));
// 真实表示用于的份额,然后乘以总量就是他的余额
mapping (address => uint256) private _rOwned;
// 被排除掉不需要手续费的用户余额,因此每一次切换用户手续费收取的时候,
// 这里都要重新更新 _rOwned 和 _tOwned 值
mapping (address => uint256) private _tOwned;
// balanceOf定义:
// 如果是不需要手续费用户,直接调用 _tOwned数据
// 否则调用 tokenFromReflection 取
function balanceOf(address account) public view override returns (uint256) {
if (_isExcluded[account]) return _tOwned[account];
return tokenFromReflection(_rOwned[account]);
}
// 含义就是 rOwned占用总份额再乘以总量,其实也就是余额了
// 这里 getRate比较复杂,是因为要计算总份额,里面有包含不需要手续费账户
// 具体可以去源码看,粗略看理解含义即可
function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
require(rAmount <= _rTotal, "Amount must be less than total reflections");
uint256 currentRate = _getRate();
return rAmount.div(currentRate);
}
// 这里贴一个 To 不需要手续费的例子,方便理解
// 由于from是需要手续费,因此from直接减掉份额的
// 需要将它加上不需要手续费列表的时候,直接清掉份额同时计算汇率即可,具体见: includeInReward 函数
// 而to不需要手续费,因此直接加余额到 tOwned
// 但由于未来to可能要被挪掉手续费权限,因此他也备份计算了一个 rOwned(但读取余额时不用)
// 挪掉的时候直接去除权限,然后取 rOwned 值即可,具体见: excludeFromReward 函数
function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
_rOwned[sender] = _rOwned[sender].sub(rAmount);
_tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
_rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
// 获取本次转账实际份额
// t系列用于tOwned也就是排除手续费的用户金额计算
// r系列用于rOwned也就是正常需要扣除手续费的用户份额(金额)计算
// 相当于全部换算好汇率了,这样子transfer的时候就可以直接算了
function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
}建议
参考资料
最后更新于