El envío de éteres con mocha.js y truffle puede resultar en sumas mayores de lo previsto

Buenos días,

Tengo un contrato General y una biblioteca GenLib.

library GenLib{
    event MoneyIn (address _from, uint256 _amount);
    function moneyIn() {
       MoneyIn(msg.sender, msg.value); <- Only call the event MoneyIn()
   } 
}

contract General{
    function getMoney () payable{
        GenLib.moneyIn();
   }
}

Ahora, la parte extraña, cuando intento enviar dinero al contrato general usando la getMoneyfunción, la cantidad que realmente se transfiere es el DOBLE de la cantidad especificada.

Ese es el archivo JS que estoy usando para verificar mi contrato:

var Gen   = artifacts.require("General");

contract('Gen', function(accounts) {

  var user = accounts[0];

  var valueP2C      = web3.toWei(2, "ether");

  it("Deploy Gen contract", function(){
    return Gen.deployed().then(function(instance){
      gen = instance;
    });
  });

  it("Gen account is empty", function(done){
    web3.eth.getBalance(gen.address, function(err, res){
      done(assert.equal(res.valueOf(), 0, ""));
    });
  });

  it("Use account is full", function(done){
    web3.eth.getBalance(user, function(err, res){
      userAmount = res.valueOf(); 
      done(assert.equal(res.valueOf(), 0, ""));
    });
  });  

  it ("Send money from user to gen", function(done){ 
    gen.getMoney({from: user, value: valueP2C}).then(function(res){
        done(assert.notEqual(res, null, ""));
      });
  });


  it("Gen recieved money", function(done){
    web3.eth.getBalance(gen.address, function(err, res){
      done(assert.equal(res.valueOf(), valueP2C, ""));
    });
  });

  it("User account is P2C lower", function(done){
    web3.eth.getBalance(user, function(err, res){
      done(assert.equal(res.valueOf(), userAmount - valueP2C, ""));
    });
  });  
}); 

Y los resultados finales:

✓ Deploy Gen contract
✓ Gen account is empty
✓ User account is full
✓ Send money from user to gen
1) Gen received money
> No events were emitted
2) User account is P2C lower
> No events were emitted


expected '4000000000000000000' to equal '2000000000000000000' <-TWICE THE AMOUNT
expected '87641250800000000000' to equal 89643554700000000000

Otra información que podría ser útil es que cada vez que elimino la llamada a la biblioteca externa, todo funciona bien.

Estoy desconcertado por este comportamiento extraño y agradecería cualquier ayuda o información que pueda tener.

Este error sigue ahí para mí con testRPC 4.0.1 ¿Alguien ha encontrado una solución?

Respuestas (2)

Tiene toda la razón en estar desconcertado: el comportamiento que observa es incorrecto.

Este es un problema abierto con testrpc y, como usted dice, está relacionado con la llamada de una función de biblioteca: https://github.com/ethereumjs/testrpc/issues/122

Lo siento, no pude ser de más ayuda. ¡Puedes estar atento al problema para cuando se solucione oficialmente!

Se ha corregido en la última versión 4.1.0