los números negativos que se pasan a las funciones de visualización se tratan de manera diferente a los números negativos que se pasan a las funciones de transacción

Usando solidity 0.4.18 tengo el siguiente contrato:

contract MyContact {

    mapping(address => uint) private balances;

    modifier positiveNumber(uint number) {
        require(number > 0);
        _;
    }

    function deposit(uint amount)
      external
      positiveNumber(amount)
    {
      balances[msg.sender] += amount;
    }

    function hasFunds(address depositor, uint amount)
        external
        view
        positiveNumber(amount)
        returns (bool)
    {
        return balances[depositor] >= amount;
    }
}

Tengo las siguientes pruebas (recortadas por relevancia)

it('punter can\'t deposit negative amount', async () => {
  await assertThrows(myContract.deposit(-1, { from: punter }))
})

it('negative amount fails', async () => {
  await assertThrows(myContract.hasFunds(punter, -1))
})

La primera prueba pasa.

La segunda prueba falla.

Si hago una prueba como

it('zero amount fails', async () => {
  await assertThrows(myContract.hasFunds(punter, 0))
})

Esa prueba pasa.

Parece que con una viewfunción de estilo, -1en realidad no se ve como un número negativo.

¿Hay algo especial en las viewfunciones que haría que esto sucediera, o soy un chivo expiatorio?

Respuestas (1)

Bien, así que resolví esto. La uentrada uintestá 'sin firmar' (duh), por lo que cuando javascript envía -1Solidity lo ve como 1.157920892373162e+77.

En mi código real tenía un modificador adicional que verificaba que la cantidad depositada fuera realmente aprobada (depositando tokens ERC20) y por eso la prueba estaba funcionando.

No hay nada como la solidez de la codificación para que uno se sienta como un novato total.

¿Entonces que hiciste? ¿Acabas de eliminar las pruebas que involucran verificar un número negativo?
@ Thanh-QuyNguyen sí