简体   繁体   中英

Solidity compile error. (Contract should be marked as abstract.)

I have two questions.

1) I am getting the following error:

TypeError: Contract "MyToken" should be marked as abstract.
 --> contracts/MyToken.sol:8:1:

According to my understanding, contract should be abstract when there is a unimplemented function. Here I have the function foo. But still getting this error?

2) Also I want write a constructor which passes totalSupply_ to the contract. Is it possible to implement in the way I have done?

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

//import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

contract MyToken is ERC20 {

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    constructor(string memory name_,string memory symbol_, uint totalSupply_ ) {
        _name = name_;
        _symbol = symbol_;
        _totalSupply = totalSupply_;
    }

    function foo() external  returns (uint) {
        uint temp;
        temp = 1+1;
        return temp;
    }
}

You are inheriting from ERC20 but you are not calling its constructor

constructor(string memory name_,string memory symbol_,uint totalSupply_)ERC20("name","SYM") {
     _name = name_;
    _symbol = symbol_;
    _totalSupply = totalSupply_;
}

In your case you have to call ERC20("name","SYM") because ERC20 is inheriting from an abstract Context class.

contract ERC20 is Context, IERC20, IERC20Metadata {

if you did not inherit from Context you would not have to call ERC20("name","SYM")

contract ERC20 is IERC20, IERC20Metadata {

Since you are calling ERC20("name","SYM") you are actually setting name and symbol so you dont have to set them in MyToken constructor:

uint256 private _totalSupply;
constructor(uint totalSupply_ )ERC20("name","SYM") {
    _totalSupply = totalSupply_;
}

Try this:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

//import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

contract MyToken is ERC20 {

    uint256 private _totalSupply;
    constructor(string memory name_,string memory symbol_, uint totalSupply_ )  ERC20(name_, symbol_) {
        _totalSupply = totalSupply_;
    }

    function foo() external  returns (uint) {
      uint temp;
      temp = 1+1;
      return temp;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM