En resumen, cuando el usuario hace clic en un botón de envío desde la interfaz de usuario, debe pasar un precio fijo _price
para que pay()
funcione (hay opciones para elegir un precio fijo en la interfaz de usuario, por ejemplo: 0.01, 0.02, 0.03). En la función, verifica si msg.value
es igual a la cantidad pasada desde la interfaz de usuario. Luego, el remitente envía ese precio a la dirección del contrato y se suma al saldo total del contrato. Cuando lo depuro con remix, da un mensaje de error cuando golpearequire(_price == msg.value)
transacción a Test.pay con error: error de VM: revertir. revert La transacción ha sido revertida al estado inicial. Nota: El constructor debe pagar si envía valor. Depure la transacción para obtener más información.
contract Test {
function Test() {
owner = msg.sender;
}
function pay(uint _price) payable returns (bool) {
//...
require(_price == msg.value); // Check ether sent is matching with the price
address(this).transfer(msg.value); // Send price to the contract address
balanceOfContract[address(this)] += msg.value; // Store price to current contract balance
LogDeposit(msg.sender, msg.value);
return true;
}
}
Aumenté el límite de gas por si acaso, pero todavía me da el error. ¡Se agradece la ayuda!
Resumiendo los hallazgos en el hilo de comentarios:
El problema era que el _price
paso a la pay
función se especificaba en ether en lugar de en wei. msg.value
siempre está en wei, por lo que require
estaba fallando.
usuario19510
_price
ymsg.value
son diferentes. :-) ¿Está escribiendo exactamente el mismo número en el campo "valor" en la parte superior de Remix y en el campo junto al botón "pagar"?usuario19510
address(this).transfer(msg.value)
no tiene mucho sentido Eso no tiene ningún efecto, ya que transfiere ether de contrato a contrato, por lo que no hay necesidad de esa línea. Además, fallará si no tiene una función de respaldo pagable.bbusdriver
require
línea. Yo borréaddress(this).transfer(msg.value)
usuario19510
address owner;
y eliminé todopay
excepto elrequire
y lareturn
línea. Luego implementé el contrato usando la VM de JavaScript, ingresé5
tanto en el campo "valor" (con la unidad establecida en "wei") como en el campo junto al botón rojo "pagar". Luego presioné el botón "pagar" y no hubo ningún error.bbusdriver
usuario19510
pay
. (msg.value
siempre está en wei.)