Add return data to bare calls.

This commit is contained in:
Daniel Kirchner
2018-09-04 13:31:10 +02:00
parent f27d7edfd6
commit 82f512a7d4
12 changed files with 269 additions and 119 deletions
@@ -1,13 +1,17 @@
contract C {
function f() public {
require(address(this).call());
require(address(this).call(bytes4(0x12345678)));
require(address(this).call(uint(1)));
require(address(this).call(uint(1), uint(2)));
(bool success,) = address(this).call();
require(success);
(success,) = address(this).call(bytes4(0x12345678));
require(success);
(success,) = address(this).call(uint(1));
require(success);
(success,) = address(this).call(uint(1), uint(2));
require(success);
}
}
// ----
// TypeError: (55-75): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (113-131): Invalid type for argument in function call. Invalid implicit conversion from bytes4 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (170-177): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (197-233): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (65-85): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (153-171): Invalid type for argument in function call. Invalid implicit conversion from bytes4 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (240-247): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (297-333): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
@@ -1,11 +1,14 @@
contract C {
function f() public {
require(address(this).callcode());
require(address(this).callcode(uint(1)));
require(address(this).callcode(uint(1), uint(2)));
(bool success,) = address(this).callcode();
require(success);
(success,) = address(this).callcode(uint(1));
require(success);
(success,) = address(this).callcode(uint(1), uint(2));
require(success);
}
}
// ----
// TypeError: (55-79): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (121-128): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (148-188): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (65-89): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (161-168): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (218-258): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
@@ -1,11 +1,14 @@
contract C {
function f() public {
require(address(this).delegatecall());
require(address(this).delegatecall(uint(1)));
require(address(this).delegatecall(uint(1), uint(2)));
(bool success,) = address(this).delegatecall();
require(success);
(success,) = address(this).delegatecall(uint(1));
require(success);
(success,) = address(this).delegatecall(uint(1), uint(2));
require(success);
}
}
// ----
// TypeError: (55-83): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (129-136): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (156-200): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (65-93): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
// TypeError: (169-176): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
// TypeError: (226-270): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
@@ -2,11 +2,11 @@ contract C {
function f() public {
address addr;
uint balance = addr.balance;
bool callRet = addr.call("");
bool delegatecallRet = addr.delegatecall("");
(bool callSuc,) = addr.call("");
(bool delegatecallSuc,) = addr.delegatecall("");
bool sendRet = addr.send(1);
addr.transfer(1);
balance; callRet; delegatecallRet; sendRet;
balance; callSuc; delegatecallSuc; sendRet;
}
}
// ----
@@ -1,13 +1,13 @@
contract C {
function f() public pure {
bool a = address(this).call(abi.encode(address(this).delegatecall, super));
bool b = address(this).delegatecall(abi.encode(log0, tx, mulmod));
a; b;
(bool a,) = address(this).call(abi.encode(address(this).delegatecall, super));
(a,) = address(this).delegatecall(abi.encode(log0, tx, mulmod));
a;
}
}
// ----
// TypeError: (91-117): This type cannot be encoded.
// TypeError: (119-124): This type cannot be encoded.
// TypeError: (183-187): This type cannot be encoded.
// TypeError: (189-191): This type cannot be encoded.
// TypeError: (193-199): This type cannot be encoded.
// TypeError: (94-120): This type cannot be encoded.
// TypeError: (122-127): This type cannot be encoded.
// TypeError: (184-188): This type cannot be encoded.
// TypeError: (190-192): This type cannot be encoded.
// TypeError: (194-200): This type cannot be encoded.
@@ -3,8 +3,10 @@ contract C {
address(this).transfer(1);
require(address(this).send(2));
selfdestruct(address(this));
require(address(this).delegatecall(""));
require(address(this).call(""));
(bool success,) = address(this).delegatecall("");
require(success);
(success,) = address(this).call("");
require(success);
}
function g() pure public {
bytes32 x = keccak256("abc");
@@ -9,15 +9,17 @@ contract C {
selfdestruct(address(this));
}
function i() view public {
require(address(this).delegatecall(""));
(bool success,) = address(this).delegatecall("");
require(success);
}
function j() view public {
require(address(this).call(""));
(bool success,) = address(this).call("");
require(success);
}
}
// ----
// TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (132-153): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (201-228): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (283-313): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (369-391): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (293-323): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (414-436): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.