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 approve
mit 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 approve
als Basisfunktion aufgerufen werden können (mit 2 Argumenten), schlagen jedoch increaseApproval
mit 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
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
Roman Frolow
Andrej
ivicaa
{ from: user1Address }
? Es könnte sein, dass diese Bibliothek mit dem Optionsparameter verwechselt wird.Andrej