Ethereum 无法创建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

您好,我有一个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 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的社区经理