diff --git a/src/proxy.sol b/src/proxy.sol index 4f475bc..1cc8768 100644 --- a/src/proxy.sol +++ b/src/proxy.sol @@ -58,6 +58,11 @@ contract DSProxy is DSAuth, DSNote { returns (bytes memory response) { require(_target != address(0), "ds-proxy-target-address-required"); + uint csize; + assembly { + csize := extcodesize(_target) + } + require(csize > 0, "ds-proxy-target-invalid-address"); // call contract in current context assembly { diff --git a/src/proxy.t.sol b/src/proxy.t.sol index ddf6cbf..a359514 100644 --- a/src/proxy.t.sol +++ b/src/proxy.t.sol @@ -319,6 +319,19 @@ contract DSProxyTest is DSTest { assertEq(address(this).balance, myBalance + 5); } + ///test 14 - check failure when an address without code is used as target + function testFail_executeNonContract() public { + bytes memory data = abi.encodeWithSignature("test()"); + proxy.execute(address(0x1), data); + } + + ///test 15 - check failure when a non existing function is called + function testFail_executeNonFunction() public { + address testContract = address(new TestContract()); + bytes memory data = abi.encodeWithSignature("nonExistingFunction()"); + proxy.execute(testContract, data); + } + function() external payable { } }