gpt4 book ai didi

solidity - 契约(Contract) "Coin"应标记为摘要

转载 作者:行者123 更新时间:2023-12-05 03:34:04 27 4
gpt4 key购买 nike

我想在 ERC-20 网络上创建一个 token 。

我想继承我合约中的接口(interface)。

当我继承表单界面时,它向我显示此错误:

Contract "CpayCoin" should be marked as abstract.

solc truffle 版本:

  compilers: {
solc: {
version: "0.8.10", // Fetch exact version from solc-bin (default: truffle's version)
docker: false, // Use "0.5.1" you've installed locally with docker (default: false)
settings: { // See the solidity docs for advice about optimization and evmVersion
optimizer: {
enabled: false,
runs: 200
},
evmVersion: "byzantium"
}
}

},

有什么问题吗?我该如何解决这个问题???

这是我的界面:

    // SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

interface IERC20 {
function decimals() external view returns (uint8);

function totalSupply() external view returns (uint256);

function balanceOf(address account) external view returns (uint256);

function transfer(address recipient, uint256 amount)
external
returns (bool);

function allowance(address owner, address spender)
external
view
returns (uint256);

function approve(address spender, uint256 amount) external returns (bool);

function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);

event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}

契约(Contract):

// SPDX-License-Identifier: MIT

实用性 >=0.4.22 <0.9.0;

import "./IERC-20.sol";

contract CpayCoin is IERC20 {
//mapping
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;

//Unit256
uint256 private _totalSupply;
uint256 private _tokenPrice;

// String
string private _name;
string private _symbol;

//Address
address _minter;

constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_
) {
_minter = msg.sender;
_balances[_minter] = _totalSupply;
_tokenPrice = 10**15 wei;
_name = name_;
_symbol = symbol_;
_totalSupply = totalSupply_;
}

// Modifier
modifier onlyMinter() {
require(msg.sender == _minter, "Only Minter can Mint!");
_;
}

modifier enoughBalance(address adr, uint256 amount) {
require(_balances[adr] >= amount, "Not enough Balance!");
_;
}

modifier enoughValue(uint256 amount) {
require(msg.value == amount * _tokenPrice, "Not enough Value!");
_;
}

modifier checkZeroAddress(address adr) {
require(adr != address(0), "ERC20: mint to the zero address");
_;
}

// Functions
function name() public view virtual returns (string memory) {
return _name;
}

function symbol() public view virtual returns (string memory) {
return _symbol;
}

function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}

function balanceOf(address adr)
public
view
virtual
override
returns (uint256)
{
return _balances[adr];
}

function _mint(address account, uint256 amount)
internal
virtual
onlyMinter
checkZeroAddress(account)
{
_totalSupply += amount;
_balances[account] += amount;

emit Transfer(address(0), account, amount);
}

function _burn(address account, uint256 amount)
internal
virtual
onlyMinter
checkZeroAddress(account)
{
uint256 accountBalance = _balances[account];
unchecked {
_balances[account] = accountBalance - amount;
}

_totalSupply += amount;
emit Transfer(account, address(0), amount);
}

function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");

uint256 senderBalance = _balances[sender];
require(
senderBalance >= amount,
"ERC20: transfer amount exceeds balance"
);

unchecked {
_balances[sender] = senderBalance - amount;
}

_balances[recipient] += amount;

emit Transfer(sender, recipient, 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, spender, amount);
}
}

最佳答案

Solidity 目前 (v0.8) 没有办法判断一个类(一个合约)实现了一个接口(interface)。相反,is关键字用于标记继承,如“派生自”。

所以 CpayCoin is IERC20表达式标记 CpayCoin作为一个 child 和IERC20作为 parent - 而不是作为接口(interface)。

IERC20 (父级)定义了几个函数(例如 decimals()transfer() ), CpayCoin (child) 没有实现,这使得 CpayCoin一个抽象类。


解决方案:

CpayCoin 中实现IERC20 中定义的所有函数接口(interface)不要让它成为抽象类,并使其遵循 ERC-20 标准。然后您可以自由地删除继承,因为它变得多余。

或者只是删除继承以没有任何未实现的函数定义(但这样合约将不遵循 ERC-20 标准)。

请注意,在您当前的代码中,_transfer()内部功能无法访问。我建议实现 transfer()调用此内部函数的外部函数 _transfer() .

关于solidity - 契约(Contract) "Coin"应标记为摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70225007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com