diff --git a/crates/integration/contracts/CallGas.sol b/crates/integration/contracts/CallGas.sol new file mode 100644 index 0000000..0321c1d --- /dev/null +++ b/crates/integration/contracts/CallGas.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8; + +// Use a non-zero call gas that works with call gas clipping but not with a truncate. + +/* runner.json +{ + "differential": true, + "actions": [ + { + "Upload": { + "code": { + "Solidity": { + "contract": "Other" + } + } + } + }, + { + "Instantiate": { + "code": { + "Solidity": { + "contract": "CallGas" + } + }, + "data": "1000000000000000000000000000000000000000000000000000000000000001" + } + } + ] +} +*/ + +contract Other { + address public last; + uint public foo; + + fallback() external { + last = msg.sender; + foo += 1; + } +} + +contract CallGas { + constructor(uint _gas) payable { + Other other = new Other(); + address(other).call{ gas: _gas }(hex""); + assert(other.last() == address(this)); + } +} diff --git a/crates/integration/src/tests.rs b/crates/integration/src/tests.rs index ad19961..a70f72e 100644 --- a/crates/integration/src/tests.rs +++ b/crates/integration/src/tests.rs @@ -66,6 +66,7 @@ test_spec!(add_mod_mul_mod, "AddModMulModTester", "AddModMulMod.sol"); test_spec!(memory_bounds, "MemoryBounds", "MemoryBounds.sol"); test_spec!(selfdestruct, "Selfdestruct", "Selfdestruct.sol"); test_spec!(clz, "CountLeadingZeros", "CountLeadingZeros.sol"); +test_spec!(call_gas, "CallGas", "CallGas.sol"); fn instantiate(path: &str, contract: &str) -> Vec { vec![Instantiate {