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 view
función de estilo, -1
en realidad no se ve como un número negativo.
¿Hay algo especial en las view
funciones que haría que esto sucediera, o soy un chivo expiatorio?
Bien, así que resolví esto. La u
entrada uint
está 'sin firmar' (duh), por lo que cuando javascript envía -1
Solidity 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.
Thanh-Quy Nguyen
Dave Sagitario