La prueba de trufa no llama a la función base, quiere la anulación

Tengo un contrato ERC20 extendido con funciones ERC827, que son anulaciones de ERC20 con un parámetro de devolución de llamada adicional.

Tengo estos dos pares de funciones de base/anulación:

Base:

    function approve(address _spender, uint _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

Anular:

    function approve(address _spender, uint _value, bytes _data) public returns (bool) {
        require(_spender != address(this));
        super.approve(_spender, _value);
        require(_spender.call(_data));
        return true;
}

Base:

    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

Anular:

    function increaseApproval(address _spender, uint _addedValue, bytes _data) public returns (bool) {
        require(_spender != address(this));
        super.increaseApproval(_spender, _addedValue);
        require(_spender.call(_data));
        return true;
    }

Prueba de unidad:

    it ("Test increasing allowance", async () => {
        // First, transfer 1000 coins from owner to user1
        await instance.transfer(user1Address, 1000, {from: ownerAddress});
        // Allow owner to spend 420 tokens from user1 balance
        await instance.approve(ownerAddress, 420, { from: user1Address });
        // Now increase that approval by 47 tokens
        // THE ERROR HAPPENS AT THIS LINE
        await instance.increaseApproval(ownerAddress, 47, { from: user1Address });
        // Check owner's allowance for spending user1's tokens - should be 467
        const allowance = instance.allowance(user1Address, ownerAddress);

        assert.equal(allowance, 467);
    });

Cuando en la prueba unint hago una llamada approvecon dos argumentos, funciona bien, pero cuando hago una llamada increaseApprovalcon dos argumentos, arroja el siguiente error:

Error: Número no válido de argumentos para la función Solidity en Object.InvalidNumberOfSolidityArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:25 :1) en SolidityFunction.validateArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:74:1) en SolidityFunction. toPayload (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:90:1) en SolidityFunction.sendTransaction (/Users/user /.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:163:1) en SolidityFunction.execute (/Users/user/.local/share/ npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:256:1) en /Users/user/.local/share/npm/lib/node_modules/truffle/build/ paquete web:/~/trufa-contrato/contrato.js:202:1 en /Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/truffle-contract/contract.js:155:1 en process._tickCallback (interno/process/next_tick.js :109:7)

Pero si lo llamo con tres argumentos (como en su anulación) funciona bien.

Cualquier idea de por qué approvese puede llamar como la función base (con 2 argumentos) pero increaseApprovalfalla con dos argumentos y quiere tres (como en la anulación)

El código real está aquí: https://github.com/path-foundation/path-token/blob/master/contracts/PathToken.sol

Y las pruebas unitarias están aquí: https://github.com/path-foundation/path-token/blob/master/test/TestPathToken.js

¿Puedes agregar tu código de prueba unitaria?
@RomanFrolov - agregado. ¡Gracias por echar un vistazo, Román!
¿Funciona si lo quitas { from: user1Address }? Podría ser que esa biblioteca se esté confundiendo con el parámetro de opciones.
@ivicaa - todavía no funciona

Respuestas (1)

También obtengo esto usando ERC721BasicToken.sol de Open Zeppelin

Existen:

function safeTransferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) { safeTransferFrom(_from, _to, _tokenId, ""); } Y

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } Esta llamada falla:

const tokenId = await sampleNFT.safeTransferFrom.call(alice, composable.address, 1, 1); Con este error:

Contract: Composable should safeTransferFrom: Error: Invalid number of arguments to Solidity function

No hay suficiente espacio para agregar como comentario, lo siento, aún no se encontró una respuesta.
Hola, Matt :) Entonces, el problema es que truffle está usando una versión anterior de web3 (<1.0) que no admite anulaciones de funciones. Los chicos de Truffle me dijeron que se arreglará en la próxima actualización de la versión principal, pero no tienen ETA ya que web3 v 1.0 rompe muchas cosas.
Mientras tanto, una forma de superar eso es invocar siempre la función de anulación y pasar 0x0 para el argumento de datos.