Tengo problemas con testrpc, o al menos creo que esa es la causa. Esta parte particular del código
if (now > info.deadline) {
ended = true;
refundEnabled = true;
return false;
}
nunca se ejecuta, es como si now (o block.timestamp) fuera siempre menor que la fecha límite, incluso cuando claramente no lo es. La fecha límite está en la marca de tiempo de Unix (por ejemplo, 1487399645), pero ese código no se ejecuta incluso si pongo 1.
Aquí está el contrato:
pragma solidity ^0.4.6;
contract Project {
struct projectInfo {
address projectOwner;
string name;
uint256 amountToRaise;
uint256 deadline;
}
projectInfo public info;
uint256 public amountRaised;
bool public ended;
bool public refundEnabled;
mapping(address => uint256) public contributions;
function Project(string name, uint256 amountToRaise, uint256 deadline) {
info = projectInfo(tx.origin, name, amountToRaise, deadline);
amountRaised = 0;
ended = false;
refundEnabled = false;
}
function getInfo() constant returns (address, string, uint256, uint256) {
return (info.projectOwner, info.name, info.amountToRaise, info.deadline);
}
function fund() payable returns (bool successful) {
if (ended) {
return false;
}
contributions[tx.origin] += msg.value;
amountRaised += msg.value;
if (now > info.deadline) {
ended = true;
refundEnabled = true;
return false;
}
if (amountRaised >= info.amountToRaise) {
ended = true;
payout();
}
return true;
}
function payout() private returns (bool successful) {
if (ended) {
if (!info.projectOwner.send(this.balance)) {
throw;
}
}
}
function refund() public returns (bool successful) {
if (refundEnabled) {
if (contributions[msg.sender] > 0) {
if (msg.sender.send(contributions[msg.sender])) {
contributions[msg.sender] = 0;
return true;
} else {
return false;
}
} else {
throw;
}
}
}
}
Estoy implementando el contrato de otro contrato y estoy probando fund() con esta pieza de Javascript:
function fund(address) {
project = Project.at(address);
project.fund({from: coinbase, value: 50, gas: 150000}).then(function(value) {
console.log(value);
});
}
El contrato funciona perfectamente en Browser Solidity, en TestRPC todo funciona bien excepto esa declaración if en particular. ¿Es esto un problema de TestRPC o estoy haciendo algo mal? Estoy usando TestRPC v3.0.3.
Tuve un problema similar, tal vez ayude a alguien. Caso similar al anterior, financiación con fecha límite, prueba con testrpc de javascript. Si bien la funcionalidad de fecha límite funcionaba bien en cada caso de prueba, pensé que la fecha de creación del contrato se cambiaba en cada caso de prueba. Después de un poco de 'depuración', pensé que el problema era antes de cada cierre del script de prueba: implementó un nuevo contrato para cada caso de prueba. :)
Recomiende probar usando ganache de trufa: truffleframework.com/ganache
Su aplicación basada en electrones complementa bastante bien a testrpc para este tipo de escenario.
Volviendo a la pregunta en cuestión, no se realiza minería en testrpc de forma predeterminada, por lo que el tiempo de bloqueo solo avanza si interactúa con la cadena de bloques a través de una escritura.
En mi experiencia, la marca de tiempo "ahora" en testrpc se actualiza cada vez que envío un evento de solidez. Por ejemplo, cada vez que llamo al siguiente evento dentro de mi código:
Transferir(mensaje.remitente, _a, _valor);
Cuando no tengo eventos, la marca de tiempo "ahora" siempre tiene el mismo valor inicial cuando se ejecuta en testrpc. La esperanza es precisa.
Guénole de Cadoudal
Fyde
Guénole de Cadoudal
Seetharaman GR