Ethereum 无法创建ERC223令牌
您好,我有一个ERC223令牌的简单实现。我使用此存储库: 这是我的合同代码:Ethereum 无法创建ERC223令牌,ethereum,solidity,Ethereum,Solidity,您好,我有一个ERC223令牌的简单实现。我使用此存储库: 这是我的合同代码: pragma solidity ^0.5.8; import "./ERC223-token-standard-development/token/ERC223/ERC223Burnable.sol"; import "./ERC223-token-standard-development/token/ERC223/ERC223Mintable.sol"; contract MyToken is ERC223Bu
pragma solidity ^0.5.8;
import "./ERC223-token-standard-development/token/ERC223/ERC223Burnable.sol";
import "./ERC223-token-standard-development/token/ERC223/ERC223Mintable.sol";
contract MyToken is ERC223Burnable, ERC223Mintable{
}
第一件奇怪的事情是,我在编译时收到了以下警告:
Warning: Function state mutability can be restricted to view
function mint(address account, uint256 amount) public onlyMinter returns (bool) {
^ (Relevant source part starts here and spans across multiple lines).
我认为这很奇怪,因为据我理解,它改变了合同的状态,不应该是一个视图函数
但是,在创建我的合同并使用mint
函数后,即使ismiter(myaddr)
返回true
,总供应量仍然为0。我以为我只是在truffle测试文件中做了一些错误的事情,但在我将代码推入混音后,我仍然得到了相同的警告,总供应量仍然为0
我希望您能帮助我解决这个问题。谢谢您的问题,它看起来像是您功能中的一个bug:
function mint(address account, uint256 amount) public onlyMinter returns (bool) {
_totalSupply.add(amount);
balances[msg.sender].add(amount);
return true;
}
让我们看看lib的add
方法是如何工作的:
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
首先是它的功能,它不改变合同的状态。它只返回加法的量。因此,这是代码的预期行为,因为您不保存结果
但是,如果您查看\u mint
方法,它们会更改合同的状态
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
我认为最好使用OpenZeppelin的合同进行开发,因为他们有很多审计员
另外,在您的实现中,您不使用
\u mint()
中的地址帐户
变量,并且始终将金额
添加到msg.sender
(您自己)中谢谢您的问题,它看起来像是您函数中的一个bug:
function mint(address account, uint256 amount) public onlyMinter returns (bool) {
_totalSupply.add(amount);
balances[msg.sender].add(amount);
return true;
}
让我们看看lib的add
方法是如何工作的:
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
首先是它的功能,它不改变合同的状态。它只返回加法的量。因此,这是代码的预期行为,因为您不保存结果
但是,如果您查看\u mint
方法,它们会更改合同的状态
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
我认为最好使用OpenZeppelin的合同进行开发,因为他们有很多审计员
另外,在您的实现中,您不使用
\u mint()
中的地址帐户
变量,并且始终将金额
添加到msg.sender
(您自己)或者您可以考虑创建ERC777令牌。有关详细信息,请参阅文档:如果您对使用OpenZeppelin有疑问,可以在社区论坛中提问:披露:我是OpenZeppelina的社区经理。另外,您可以考虑创建ERC777代币。有关详细信息,请参阅文档:如果您对使用OpenZeppelin有疑问,可以在社区论坛中提问:披露:我是OpenZeppelin的社区经理