Error al implementar un contrato simple: parece que esta transacción fallará. Si lo envías puede consumir todo el gas que envíes

Mi código de contrato inteligente está aquí

// To specify what version of compiler this code will compile with
pragma solidity ^0.4.11;

contract tokensale {

  // Declaring the maximum number of tokens available for sale.
  uint public maxTokens = 10000;

  // The number of tokens you can buy for one wei (Solidity converts all unitless values from ethers to wei).
  // We will keep the default currency to be wei. It will get clearer.
  uint public tokenSwap = 10;

  // This variable, initially set to zero,  stores the number of tokens that have been bought, i.e it will
  // get incremented each time someone buys tokens.
  uint public supply = 0;

  // mapping is an equivalent to associative array. We store token balances corresponding
  // to each address that buys tokens in this mapping.
  mapping (address => uint) balance;


  // A modifier checks if a condition is met before executing a function.
  // This  modifer checks if there are tokens available before the buyTokens function is called.
  modifier isTokenAvailable () {
    require (msg.value*tokenSwap + supply <= maxTokens);     // require checks the condition and the function that
    _;                                                       // follows, denoted by the '_', is only run if the condition
  }                                                                      // is satisfied.


  // A function to check the ether balance of any address.



  // To check the token balance of any address. The external keyword allows the function
  // to be called from outside the contract. If no keyword is specified, all functions are external
  // by default..
  function balanceOf (address tokenHolder) external constant returns (uint) {
    return balance[tokenHolder];
  }

  // A function to buy tokens accesible by any address
  // The payable keyword allows the contract to accept ethers
  // from the transactor. The ethers to be deposited is entered as msg.value
  // (which will get clearer when we will call the functions in browser-solidity)
  // and the corresponding tokens are stored in balance[msg.sender] mapping.
  // underflows and overflows are security consideration which are
  // not checked in the process. But lets not worry about them for now.

  function buyTokens () external
  payable 
  isTokenAvailable {
    uint tokensAmount = msg.value * tokenSwap;    // At this point, msg.value is in wei.
    balance [msg.sender] += tokensAmount;
    supply += tokensAmount;
  }
}

Cuando implemento este código me muestra el error.

parece que esta transacción fallará. Si lo envías puede consumir todo el gas que envíes

No estoy seguro de qué está mal en este código de contrato. He intentado con diferentes cantidades de gas, de menor a mayor, pero sigue teniendo el mismo error.

Aquí está la salidaingrese la descripción de la imagen aquí

Entonces, ¿falla la transacción si la ejecuta? ¿Cuál es el valor que estás pasando?
@MuhammadAltabba No, el contrato se implementa con éxito, pero cuando intento enviar algo de ETH a la dirección del contrato, la transacción falla
¿Y por qué muestra el error ROJO en el tiempo de implementación?
¿Puedes compartir el código de implementación (o cómo haces exactamente la implementación? ¿Es esto Mist?)
@MuhammadAltabba Mi código ya está en mi pregunta. Sí, estoy usando MIST
Estoy preguntando sobre el código de "implementación" (no el código de contrato inteligente), si hay alguno. Ahora entiendo que está utilizando la interfaz de usuario para realizar la implementación sin código de implementación. De acuerdo
Lo siento, no sé cómo puedo verificar el código de "implementación". @MuhammadAltabba ¿Tiene algún código de interfaz de usuario que funcione?

Respuestas (1)

  1. A su contrato le falta la función de constructor .

  2. Si envía algo de ETH con la creación del contrato, su constructor debe estar marcado como pagadero.

  3. Use este código solo con fines de aprendizaje, una buena práctica es usar la biblioteca SafeMath para agregar valores y evitar desbordamientos. En este caso, aunque esto no debería ser tan relevante.