Problema con la prueba de desbordamiento de enteros

¡Buenas tardes!

Tengo una pregunta sobre la prueba de desbordamientos de enteros con trufa.

El método de contrato es:

function sumNumbers(uint256 numberA, uint256 numberB) public view returns(uint256) {
    return numberA.add(numberB);
}


Mi código de prueba es el siguiente:

    it('the sum should not overflow', async () => {
        try {
            // Trying to sum 2^256 + 5, which should overflow and throw an exception in the best case
            const sumResult = await _erc20.sumNumbers(2e256, 5);
            assert.ok(false, 'The contract should throw an exception to avoid overflowing and thus making bad calculations')
        } catch(error) {
            assert.ok(true, 'The contract is throwing which is the expected behaviour when you try to overflow')
            console.log(error);
        }
    }) 


El resultado de la prueba es el siguiente:

RangeError: Invalid array length
at Object.padLeft (/app/node_modules/truffle/build/webpack:/~/web3/lib/utils/utils.js:81:1)
at SolidityTypeUInt.formatInputInt [as _inputFormatter] (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/formatters.js:40:1)
at SolidityTypeUInt.SolidityType.encode (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/type.js:188:1)
at /app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/coder.js:91:1
at Array.map (<anonymous>)
at SolidityCoder.encodeParams (/app/node_modules/truffle/build/webpack:/~/web3/lib/solidity/coder.js:90:1)
at SolidityFunction.toPayload (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:92:1)
at SolidityFunction.call (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:131:1)
at SolidityFunction.execute (/app/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:260:1)
at /app/node_modules/truffle/build/webpack:/packages/truffle-contract/contract.js:135:1
at new Promise (<anonymous>)
at /app/node_modules/truffle/build/webpack:/packages/truffle-contract/contract.js:126:1


Simplemente no puedo entender qué es lo que va mal, excepto cuando cambio el valor 2e256 a un valor mucho más bajo, digamos 5, no obtengo este error.

¿Alguien puede ayudarme con este caso?

2e256sería 2 * 10**256, ¿verdad? El valor más grande que puede pasar por a uint256sería 2**256-1. JavaScript no es bueno para representar tales números, por lo que probablemente desee pasar un BN/ BigNumbero usar una cadena.

Respuestas (1)

El argumento numberAde una función sumNumberstiene un tipo de datos uint256. El valor máximo que numberApuede almacenar es 2^256-1.

Como numberAno puede almacenar un número mayor que 2^256-1, está recibiendo el error.

Como @smax señaló correctamente en javascript 2e10es 20000000000. Debe usar bignumber.jspara pasar un valor como argumento a una función.

Gracias por tu respuesta. Intenté lo siguiente: const sumResult = await _erc20.sumNumbers('2e255', 5); Pero me da el mismo error... que estoy haciendo mal?
'2e255' es un número demasiado grande que 2^255
oh chico... ahora veo... arruiné las matemáticas :) ¿Puedes darme un ejemplo de cómo pasar 2^256-1 como una cadena?
Debe pasar un argumento como este new BigNumber(2).toExponential(255)