contract A1 { constructor() {} }
contract B1 is A1 {}

contract A2 { constructor() payable {} }
contract B2 is A2 {}

contract B3 {}

contract B4 { constructor() {} }

contract C {
	function createWithValue(bytes memory c, uint256 value) public payable returns (bool) {
		uint256 y = 0;
		assembly { y := create(value, add(c, 0x20), mload(c)) }
		return y != 0;
	}
	function f(uint256 value) public payable returns (bool) {
		return createWithValue(type(B1).creationCode, value);
	}
	function g(uint256 value) public payable returns (bool) {
		return createWithValue(type(B2).creationCode, value);
	}
	function h(uint256 value) public payable returns (bool) {
		return createWithValue(type(B3).creationCode, value);
	}
	function i(uint256 value) public payable returns (bool) {
		return createWithValue(type(B4).creationCode, value);
	}
}
// ====
// EVMVersion: >homestead
// ----
// f(uint256), 2000 ether: 0 -> true
// f(uint256), 2000 ether: 100 -> false
// g(uint256), 2000 ether: 0 -> true
// g(uint256), 2000 ether: 100 -> false
// h(uint256), 2000 ether: 0 -> true
// h(uint256), 2000 ether: 100 -> false
// i(uint256), 2000 ether: 0 -> true
// i(uint256), 2000 ether: 100 -> false
