Una función declarada pagadera arroja un VMerror:revert en Remix

Intentaba financiar una campaña creada con un objetivo de financiación de 10000000000000000000 y un límite de financiación de 10000000000000000000 llamando al método de pago contributeMsgValuecon parámetro ["100000000000000000"]y valor 100000000000000000, pero recibo este error en Remix.

Transact to StandardCampaign.contributeMsgValue con error: error de VM: revertir. revert La transacción ha sido revertida al estado inicial.

contrato Campaña es propiedad, Campaña {
  enum Etapas {
    CrowdfundOperativo,
    Fracaso de Crowdfund,
    Crowdfundéxito
  }
  modificador atStage(Etapas _expectedStage) {
    if (etapa() != uint256(_esperadaEtapa)) {
      tirar;
    } demás {
      _;
    }
  }
  modificador contribución válida () {
    if (mensaje.valor == 0
      || cantidad recaudada + valor de mensaje > límite de financiación
      || cantidad recaudada + valor de mensaje = vencimiento
      && éxito temprano == falso
      && cantidad recaudada = vencimiento && cantidad recaudada >= objetivo de financiación)
      || éxito temprano == verdadero
      || cantidad recaudada >= límite de financiación) {
      return uint256(Stages.CrowdfundSuccess);
    }
  }
  función contribuirValorMsg(uint256[] _cantidades)
    público
    pagadero
    atStage(Stages.CrowdfundOperational)
    contribuciónvalida()
    devuelve (uint256 ID de contribución) {
    contribuciónID = contribuciones.longitud++;
    contribuciones[contributionID] = Contribución({
        remitente: msj.sender,
        valor: mensaje.valor,
        creado: bloque.número
    });
    contribucionesBySender[msg.sender].push(contributionID);
    cantidad recaudada += valor.mensaje;
    Contribución Realizada(msg.sender);
    if (mejorador.notate(mensaje.remitente, mensaje.valor, bloque.número, _cantidades)) {
      éxito temprano = verdadero;
    }
  }
  función StandardCampaign(string _name,
    uint256 _caducidad,
    uint256 _objetivo de financiación,
    uint256 _financiamientoCap,
    dirección _beneficiario,
    dirección _propietario,
    dirección _potenciador) público {
    nombre = _nombre;
    caducidad = _caducidad;
    FinanciamientoObjetivo = _financiamientoObjetivo;
    capitalización de fondos = _ capitalización de fondos;
    beneficiario = _beneficiario;
    propietario = _propietario;
    creado = bloque.numero;
    potenciador = potenciador(_potenciador);
  }
  Contribución de la estructura {
    dirección del remitente;
    uint256 valor;
    uint256 creado;
  }
  uint256[] cantidades predeterminadas;
  Potenciador potenciador público;
  bool public EarlySuccess;
  dirección pública titular;
  uint256 financiación públicaObjetivo;
  uint256 financiación públicaCap;
  uint256 cantidad pública recaudada;
  uint256 expiración pública;
  uint256 público creado;
  dirección público beneficiario;
  Contribución[] contribuciones públicas;
  mapeo (dirección => uint256 []) contribuciones públicas por remitente;
  mapeo (uint256 => dirección) public refundClaimAddress;
  mapeo (uint256 => bool) public refundsReclamed;
  cadena nombre público;
}

¿Me falta algún código aquí o estoy llamando a la función de manera incorrecta?

Respuestas (2)

De hecho, puede depurar su transacción en remix y descubrirá por qué no funciona. De alguna manera, los dos modificadores no pasan y la transacción se revierte.

Si comenta estos dos modificadores desde la función, contributeMsgValuefuncionará correctamente.

    atStage(Stages.CrowdfundOperational)
    contribuciónvalida()

solo necesita verificar el modificador y arreglarlo.

Gracias por tu respuesta. Comenté los modificadores e intenté ejecutarlo. Puedo ver que la contribución se realizó con éxito, pero el ID de contribución sigue siendo 0 y también recibo este 'Error de VM: revertir' en Remix, que está revirtiendo el estado debido a que las contribuciones se convierten en 0.
¡Resuelto! Hubo un problema con el método Enhancer.notate.

En el estado inicial (después de implementar) contribuciones.longitud = 0. La ejecución contributionID = contributions.length++;devuelve el valor 0 (establezca el ID de contribución en 0) y luego aumenta la longitud de la matriz en 1. Es por eso que la primera ID de contribución será 0.