Make function calls throw if target does not have code.

Low-level calls still just execute and will actually report "success".
This allows `x.call.value(y)()` for x being a non-contract account.
This commit is contained in:
chriseth
2016-08-17 11:30:40 +02:00
parent e7683f4722
commit 774bb8ab3b
3 changed files with 37 additions and 0 deletions
+26
View File
@@ -6896,6 +6896,32 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input)
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0)));
}
BOOST_AUTO_TEST_CASE(calling_nonexisting_contract_throws)
{
char const* sourceCode = R"(
contract D { function g(); }
contract C {
D d = D(0x1212);
function f() returns (uint) {
d.g();
return 7;
}
function g() returns (uint) {
d.g.gas(200)();
return 7;
}
function h() returns (uint) {
d.call(); // this does not throw (low-level)
return 7;
}
}
)";
compileAndRun(sourceCode, 0, "C");
BOOST_CHECK(callContractFunction("f()") == encodeArgs());
BOOST_CHECK(callContractFunction("g()") == encodeArgs());
BOOST_CHECK(callContractFunction("h()") == encodeArgs(u256(7)));
}
BOOST_AUTO_TEST_SUITE_END()
}