14
pragma solidity ^0.4.16;

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

// Initializes contract with initial supply tokens to the creator of the contract
function MyToken (
    uint256 initialSupply
) payable {
    balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
}

// Send coins
function transfer(address _to, uint256 _value) payable {
    require(balanceOf[msg.sender] >= _value);           // Check if the sender has enough
    require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
    balanceOf[msg.sender] -= _value;                    // Subtract from the sender
    balanceOf[_to] += _value;                           // Add the same to the recipient
}
}

The following error occurs when I try to run the above code in Remix to transfer a certain amount of coins to another address:

transact to browser/test.sol:MyToken.transfer errored: VM error: invalid opcode.
The constructor should be payable if you send value.
The execution might have thrown.
Debug the transaction to get more information. 

Here is the screenshot of the page : enter image description here

Please help me !! Thanks

4 Answers 4

3
pragma solidity ^0.4.1;

contract MyToken {
    mapping (address => uint) public balanceOf;
    event SenderLogger(address);
    event ValueLogger(uint);

   // Initializes contract with initial supply tokens to the creator of the 
   //contract

   constructor (uint256 initialSupply) public payable {
       // Give the creator all initial tokens 
       balanceOf[msg.sender] = initialSupply;   
   }

   // Send coins
   function transfer(address _to, uint256 _value) public payable {

    // Check if the sender has enough
    require(balanceOf[msg.sender] >= _value);

    // Check for overflows
    require(balanceOf[_to] + _value >= balanceOf[_to]); 

    // Subtract from the sender
    balanceOf[msg.sender] -= _value;     

    // Add the same to the recipient               
    balanceOf[_to] += _value;                           
}
// fallback function
function () private payable {
    emit SenderLogger(msg.sender);
}

}

1
  • 2
    Can you be more specific what is the reason? The constructor should be payable if you send value. but in your solution constructor is not payable anyway... Commented Jun 9, 2018 at 21:34
2

I'm able to reproduce the error. The error is not related to anything except the account that you've have choosen, doesn't have the funds in it. do this step by step:

  1. call deploy with 100
  2. Select a different address from the JavascriptVM & revert back to the original address from which you deployed the contract( this is the step where you fumbled)
  3. Execute transfer() with two params : address that you copies and the amount of coins that you want to transfer.
  4. it shall be successful.

Below is the reproduced error:

Code with error

This is the solution with your code only.

code without error

Thanks.

2

The error message is a bit misleading (which is typical with any blockchain tool). The main point in the error message is "transact to browser/test.sol:MyToken.transfer errored: VM error: invalid opcode".

The point about payable was completely a guess by remix compiler, which is not accurate all the time.

So the problem is that your Invalid Opcode. It probably reverts due to some require statement. Most probably it is with your require statement but you can try to debug the execution or just remove require statements until you find out which one causes the error.

1

Remove the keyword payable in your constructor function. This will solve your problem.You have to add the payable function only if you need to transfer eth to someone or you want to accept eth from someone.

1
  • Removing payable from a function won't solve the problem. It's the opposite actually. A lack of the payable modifier is what throws these errors. Commented May 31, 2018 at 1:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.