mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
interface Identity {
 | 
						|
    function selectorAndAppendValue(uint value) external pure returns (uint);
 | 
						|
}
 | 
						|
interface ReturnMoreData {
 | 
						|
    function f(uint value) external pure returns (uint, uint, uint);
 | 
						|
}
 | 
						|
contract C {
 | 
						|
    Identity constant i = Identity(address(0x0004));
 | 
						|
    function testHighLevel() external pure returns (bool) {
 | 
						|
        // Works because the extcodesize check is skipped
 | 
						|
        // and the precompiled contract returns actual data.
 | 
						|
        i.selectorAndAppendValue(5);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    function testHighLevel2() external pure returns (uint, uint, uint) {
 | 
						|
        // Fails because the identity contract does not return enough data.
 | 
						|
        return ReturnMoreData(address(4)).f(2);
 | 
						|
    }
 | 
						|
    function testLowLevel() external view returns (uint value) {
 | 
						|
        (bool success, bytes memory ret) =
 | 
						|
            address(4).staticcall(
 | 
						|
                abi.encodeWithSelector(Identity.selectorAndAppendValue.selector, uint(5))
 | 
						|
            );
 | 
						|
        value = abi.decode(ret, (uint));
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
// ====
 | 
						|
// EVMVersion: >=constantinople
 | 
						|
// ----
 | 
						|
// testHighLevel() -> true
 | 
						|
// testLowLevel() -> 0xc76596d400000000000000000000000000000000000000000000000000000000
 | 
						|
// testHighLevel2() -> FAILURE
 |