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);
};
Su contrato no tiene una payable
función de respaldo. La única payable
función que tiene es la pledge
función que no es una función alternativa.
Por lo tanto, si solo intenta enviar Ether al contrato sin llamar explícitamente a la pledge
función, su transacción fallará ya que el contrato no puede aceptar Ether sin una llamada explícita a la pledge
funció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í:
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.
Su amount
puede no ser equivalente al msg.value
. Recuerde, msg.value
está en Wei, por lo que si está tratando de enviar 1 Ether, entonces msg.value == 1000000000000000000
Wei. 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.value
en la línea debajo de ella?
require
estado de cuenta, puede agregar amount = amount * 1 ether
, siempre que la cantidad que ingrese siempre estará en Ether. (ver aquí )
Utgarda
Utgarda
cris