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 contributeMsgValue
con 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?
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, contributeMsgValue
funcionará correctamente.
atStage(Stages.CrowdfundOperational) contribuciónvalida()
solo necesita verificar el modificador y arreglarlo.
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.
Sumukha
Sumukha