Тест трюфеля не может вызвать базовую функцию, хочет переопределить

У меня есть расширенный контракт ERC20 с функциями ERC827, которые переопределяют ERC20 с дополнительным параметром обратного вызова.

У меня есть две пары базовых/переопределяющих функций:

База:

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

Переопределить:

    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;
}

База:

    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;
    }

Переопределить:

    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;
    }

Модульный тест:

    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);
    });

Когда в unint test я делаю вызов approveс двумя аргументами, он работает нормально, но когда я делаю вызов increaseApprovalс двумя аргументами, он выдает следующую ошибку:

Ошибка: Недопустимое количество аргументов для функции Solidity в Object.InvalidNumberOfSolidityArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:25 :1) в SolidityFunction.validateArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:74:1) в SolidityFunction. toPayload (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:90:1) в SolidityFunction.sendTransaction (/Users/user /.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:163:1) в SolidityFunction.execute (/Users/user/.local/share/ npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:256:1) в /Users/user/.local/share/npm/lib/node_modules/truffle/build/ веб-пакет:/~/трюфель-контракт/contract.js:202:1 в /Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/truffle-contract/contract.js:155:1 в process._tickCallback (internal/process/next_tick.js :109:7)

Но если я вызываю его с тремя аргументами (как при его переопределении), он работает нормально.

Любые идеи, почему approveможно вызвать базовую функцию (с двумя аргументами), но increaseApprovalс двумя аргументами она не работает и требует три (как в переопределении)

Фактический код находится здесь: https://github.com/path-foundation/path-token/blob/master/contracts/PathToken.sol .

И модульные тесты здесь: https://github.com/path-foundation/path-token/blob/master/test/TestPathToken.js .

Можете ли вы добавить свой код модульного тестирования?
@RomanFrolov - добавил. Спасибо за внимание, Роман!
Это работает, если вы удалите { from: user1Address }? Возможно, эта библиотека путается с параметром options.
@ivicaa - все еще не работает

Ответы (1)

Я также получаю это, используя Open Zeppelin ERC721BasicToken.sol.

Есть:

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

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } Этот вызов не работает:

const tokenId = await sampleNFT.safeTransferFrom.call(alice, composable.address, 1, 1); С этой ошибкой:

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

Недостаточно места для добавления в качестве комментария, извините, ответ еще не найден.
Привет, Мэтт :) Итак, проблема в том, что трюфель использует более старую версию web3 (<1.0), которая не поддерживает переопределение функций. Ребята из Truffle сказали мне, что это будет исправлено в следующем основном обновлении версии, но у них нет ETA, так как web3 v 1.0 ломает много вещей.
Один из способов преодолеть это в то же время — всегда вызывать функцию переопределения и передавать 0x0 в качестве аргумента данных.