如何解决如何在此 ERC20 合约中设置总供应量?
我从 openzeppelin 复制并粘贴了示例 ERC20 合约,但由于某种原因,我无法找到可以设置 TotalSupply 的位置。
pragma solidity >=0.6.0 <0.8.0;
import "../../GSN/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
contract ERC20 is Context,IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
constructor (string memory name_,string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient,uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(),recipient,amount);
return true;
}
function allowance(address owner,address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender,uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(),spender,amount);
return true;
}
function transferFrom(address sender,address recipient,uint256 amount) public virtual override returns (bool) {
_transfer(sender,amount);
_approve(sender,_msgSender(),_allowances[sender][_msgSender()].sub(amount,"ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender,uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(),_allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender,uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(),_allowances[_msgSender()][spender].sub(subtractedValue,"ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender,uint256 amount) internal virtual {
require(sender != address(0),"ERC20: transfer from the zero address");
require(recipient != address(0),"ERC20: transfer to the zero address");
_beforeTokenTransfer(sender,amount);
_balances[sender] = _balances[sender].sub(amount,"ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender,amount);
}
function _mint(address account,uint256 amount) internal virtual {
require(account != address(0),"ERC20: mint to the zero address");
_beforeTokenTransfer(address(0),account,amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0),amount);
}
function _burn(address account,"ERC20: burn from the zero address");
_beforeTokenTransfer(account,address(0),amount);
_balances[account] = _balances[account].sub(amount,"ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account,amount);
}
function _approve(address owner,address spender,uint256 amount) internal virtual {
require(owner != address(0),"ERC20: approve from the zero address");
require(spender != address(0),"ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner,amount);
}
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
function _beforeTokenTransfer(address from,address to,uint256 amount) internal virtual { }
}
我可以设置 TokenName 和 Symbol 以及 Decimals 但我不能设置总供应量
我也遇到无法导入“math/SafeMath.sol”的问题:找不到文件 我不明白他们为什么发布甚至不起作用的代码? 有人可以帮我解决这个问题
解决方法
关于SafeMath
:
Openzeppelin 在他们的项目中实现了 SafeMath
,所以如果你只是复制了 ERC20
,你就错过了 SafeMath
的实现。如果你克隆整个项目,这个问题就解决了。
关于totalSupply
:
这个实现是一个 ERC20 可铸代币。如果您检查函数 _mint
,您会看到每次调用此函数时 _totalSupply
都会增加。您从 0 开始,那么如果您铸造 10,您的总供应量将是 10,依此类推。
如果您想设置您的总供应量,您可以更改构造函数以允许您设置 _totalSupply
:
constructor (string memory name_,string memory symbol_,uint256 totalSupply_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
_totalSupply = totalSupply_;
_balances[msg.sender] = totalSupply_;
emit Transfer(address(0),msg.sender,totalSupply_); // Optional
}
您还可以通过删除 _mint
函数来防止铸造以增加总供应量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。