Der Truffle-Test kann die Basisfunktion nicht aufrufen, will die Überschreibung

Ich habe einen erweiterten ERC20-Vertrag mit ERC827-Funktionen, die Überschreibungen von ERC20 mit einem zusätzlichen Callback-Parameter sind.

Ich habe diese zwei Paare von Basis-/Überschreibungsfunktionen:

Base:

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

Überschreiben:

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

Überschreiben:

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

Gerätetest:

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

Wenn ich in unint test approvemit zwei Argumenten aufrufe, funktioniert es gut, aber wenn ich mit zwei Argumenten aufrufe increaseApproval, wird der folgende Fehler ausgegeben:

Fehler: Ungültige Anzahl von Argumenten für Solidity-Funktion bei Object.InvalidNumberOfSolidityArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:25 :1) bei SolidityFunction.validateArgs (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:74:1) bei SolidityFunction. toPayload (/Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:90:1) bei SolidityFunction.sendTransaction (/Users/user /.local/share/npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:163:1) bei SolidityFunction.execute (/Users/user/.local/share/ npm/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:256:1) unter /Users/user/.local/share/npm/lib/node_modules/truffle/build/ webpack:/~/truffle-contract/contract.js:202:1 unter /Users/user/.local/share/npm/lib/node_modules/truffle/build/webpack:/~/truffle-contract/contract.js:155:1 unter process._tickCallback (internal/process/next_tick.js :109:7)

Aber wenn ich es mit drei Argumenten aufrufe (wie in seiner Überschreibung), funktioniert es gut.

Alle Ideen, warum approveals Basisfunktion aufgerufen werden können (mit 2 Argumenten), schlagen jedoch increaseApprovalmit zwei Argumenten fehl und möchten drei (wie beim Überschreiben)

Der eigentliche Code ist hier: https://github.com/path-foundation/path-token/blob/master/contracts/PathToken.sol

Und die Einheitentests sind hier: https://github.com/path-foundation/path-token/blob/master/test/TestPathToken.js

Können Sie Ihren Unit-Testing-Code hinzufügen?
@RomanFrolov - hinzugefügt. Vielen Dank für einen Blick, Roman!
Funktioniert es, wenn du es entfernst { from: user1Address }? Es könnte sein, dass diese Bibliothek mit dem Optionsparameter verwechselt wird.
@ivicaa - funktioniert immer noch nicht

Antworten (1)

Ich bekomme dies auch mit Open Zeppelins ERC721BasicToken.sol

Es gibt:

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

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } Dieser Aufruf schlägt fehl:

const tokenId = await sampleNFT.safeTransferFrom.call(alice, composable.address, 1, 1); Mit diesem Fehler:

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

Nicht genug Platz zum Hinzufügen als Kommentar, leider noch keine Antwort gefunden.
Hey Matt :) Das Problem ist also, dass Truffle eine ältere Version von web3 (<1.0) verwendet, die keine Funktionsüberschreibungen unterstützt. Truffle-Jungs sagten mir, dass es im nächsten großen Versions-Update behoben wird, aber sie haben keine ETA, da web3 v 1.0 viele Dinge kaputt macht.
Eine Möglichkeit, dies in der Zwischenzeit zu überwinden, besteht darin, immer die Override-Funktion aufzurufen und 0x0 für das Datenargument zu übergeben.