0
votes

I'm making a contract in Solidity, and upon compilation, i get the following error: 'Expected pragma, import directive or contract/interface/library definition. function MyToken() { ^' What causes this?

pragma solidity ^0.14.18;
contract MyToken {
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
}

function MyToken() {
balanceOf[msg.sender] = 21000000;
}

/* Send coins */
function transfer(address _to, uint256 _value) {
/* Add and subtract new balances */
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}

function transfer(address _to, uint256 _value) {
/* Check if sender has balance and for overflows */
require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]);
/* Add and subtract new balances */
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}

/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits) {
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
}

event Transfer(address indexed from, address indexed to, uint256 value);

/* Notify anyone listening that this transfer took place */
        Transfer(msg.sender, _to, _value);
1

1 Answers

0
votes
pragma solidity ^0.14.18;

There's no version 0.14.18, the latest is currently (June 2021) 0.8.4. I'm guessing this is just a typo and your code defines ^0.4.18, because you're using the "contract name" function as a constructor (was deprecated in favor of the constructor() function in 0.5), and because the error message "Expected pragma..." appears after fixing to ^0.4.18.


Expected pragma, import directive or contract/interface/library definition. function MyToken() { ^

It's caused by the redundant closing brace } after the mapping.

contract MyToken {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
}  // <-- here is the redundant closing brace

function MyToken() {
    balanceOf[msg.sender] = 21000000;
}

// rest of your code

You can fix it by removing the redundant closing brace } after the mapping. Or better moving it to the last line, because the contract is missing the closing brace at the end.

contract MyToken {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;

    function MyToken() {
        balanceOf[msg.sender] = 21000000;
    }

    // ... rest of your contract
}  // <-- moved to the end of the contract

Note: You have few more syntax errors in your code, pay attention to the error messages and warnings from the compiler.