Contrato de crowdfunding como Kickstarter

Estaba siguiendo un tutorial para un contrato inteligente de crowdfunding que actúa como Kickstarter de Programtheblockchain, sin embargo, siempre recibo un error de MetaMask que dice "Excepción lanzada en el código del contrato" cuando intento enviar Ether al contrato. Se compila y se despliega muy bien, pero no puedo enviarle Ether. ¿Es posible que el código esté desactualizado o estoy haciendo algo mal por mi parte?

pragma solidity ^0.4.19;

contract Crowdfunding {
    address owner;
    uint256 deadline;
    uint256 goal;
    mapping(address => uint256) public pledgeOf;

    function Crowdfunding(uint256 numberOfDays, uint256 _goal) public {
        owner = msg.sender;
        deadline = now + (numberOfDays * 1 days);
        goal = _goal;
    }

    function pledge(uint256 amount) public payable {
        require(now < deadline);                // in the fundraising period
        require(msg.value == amount);

        pledgeOf[msg.sender] += amount;
    }

    function claimFunds() public {
        require(address(this).balance >= goal); // funding goal met
        require(now >= deadline);               // in the withdrawal period
        require(msg.sender == owner);

        msg.sender.transfer(address(this).balance);
    }

    function getRefund() public {
        require(address(this).balance < goal);  // funding goal not met
        require(now >= deadline);               // in the withdrawal period

        uint256 amount = pledgeOf[msg.sender];
        pledgeOf[msg.sender] = 0;
        msg.sender.transfer(amount);
    }
}

Y mi código de implementación

var Crowdfunding = artifacts.require("Crowdfunding");

module.exports = function(deployer){
    const numberOfDays = 1;
    const goal = web3.toWei(10, 'ether');   
deployer.deploy(Crowdfunding, numberOfDays, goal);
};
¿Dónde exactamente despliegas el contrato y dónde está conectada tu Metamask? ¿Es Mainnet, Rinkeby o un entorno de desarrollo local?
Genial, parece que estamos llegando a alguna parte :) Recuerdo recibir mensajes de error como este cuando olvidé actualizar los archivos relacionados con el contrato en la aplicación web después de actualizar y volver a implementar el contrato.
Por ahora, solo estoy usando la combinación Ganache + MetaMask para probar el contrato, por lo que todavía no tengo una aplicación web, ¿o qué quieres decir con la aplicación web? Tal vez estoy malinterpretando algo aquí :) Pero sí, he visto este tipo de errores y se pueden solucionar reiniciando la cuenta en MetaMask o volviendo a compilar/desplegar, pero esta vez, lamentablemente, nada parece solucionar el problema.

Respuestas (2)

Su contrato no tiene una payablefunción de respaldo. La única payablefunción que tiene es la pledgefunción que no es una función alternativa.

Por lo tanto, si solo intenta enviar Ether al contrato sin llamar explícitamente a la pledgefunción, su transacción fallará ya que el contrato no puede aceptar Ether sin una llamada explícita a la pledgefunción.

Puede leer más sobre la función de respaldo aquí: https://www.bitdegree.org/learn/solidity-fallback-functions/

Hay algunas cosas que pueden estar saliendo mal aquí:

  1. Si solo está enviando Ether (sin agregar ningún dato adicional), no funcionará porque no tiene una función de respaldo ( function ()). Sugiero agregar una función alternativa a su código.

  2. Su amountpuede no ser equivalente al msg.value. Recuerde, msg.valueestá en Wei, por lo que si está tratando de enviar 1 Ether, entonces msg.value == 1000000000000000000Wei. En una nota al margen, ¿hay alguna razón por la que tiene la línea require(msg.value == amount);, en lugar de simplemente usarla msg.valueen la línea debajo de ella?

Sí. Antes del requireestado de cuenta, puede agregar amount = amount * 1 ether, siempre que la cantidad que ingrese siempre estará en Ether. (ver aquí )