diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 6c3aed341..19a117b4e 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -814,28 +814,6 @@ BOOST_AUTO_TEST_CASE(constructor) ) } -BOOST_AUTO_TEST_CASE(blockchain) -{ - char const* sourceCode = R"( - contract test { - constructor() payable {} - function someInfo() public payable returns (uint256 value, address coinbase, uint256 blockNumber) { - value = msg.value; - coinbase = block.coinbase; - blockNumber = block.number; - } - } - )"; - m_evmcHost->tx_context.block_coinbase = EVMHost::convertToEVMC(h160("0x1212121212121212121212121212121212121212")); - m_evmcHost->newBlock(); - m_evmcHost->newBlock(); - m_evmcHost->newBlock(); - m_evmcHost->newBlock(); - m_evmcHost->newBlock(); - compileAndRun(sourceCode, 27); - ABI_CHECK(callContractFunctionWithValue("someInfo()", 28), encodeArgs(28, u256("0x1212121212121212121212121212121212121212"), 7)); -} - BOOST_AUTO_TEST_CASE(send_ether) { char const* sourceCode = R"( @@ -898,25 +876,6 @@ BOOST_AUTO_TEST_CASE(transfer_ether) ) } -BOOST_AUTO_TEST_CASE(uncalled_blockhash) -{ - char const* code = R"( - contract C { - function f() public view returns (bytes32) - { - return (blockhash)(block.number - 1); - } - } - )"; - ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(code, 0, "C"); - bytes result = callContractFunction("f()"); - BOOST_REQUIRE_EQUAL(result.size(), 32); - BOOST_CHECK(result[0] != 0 || result[1] != 0 || result[2] != 0); - ) -} - BOOST_AUTO_TEST_CASE(log0) { char const* sourceCode = R"( @@ -1507,41 +1466,6 @@ BOOST_AUTO_TEST_CASE(contracts_as_addresses) BOOST_REQUIRE(callContractFunction("getBalance()") == encodeArgs(u256(20 - 5), u256(5))); } -BOOST_AUTO_TEST_CASE(gaslimit) -{ - char const* sourceCode = R"( - contract C { - function f() public returns (uint) { - return block.gaslimit; - } - } - )"; - ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - - compileAndRun(sourceCode); - auto result = callContractFunction("f()"); - ABI_CHECK(result, encodeArgs(gasLimit())); - ) -} - -BOOST_AUTO_TEST_CASE(gasprice) -{ - char const* sourceCode = R"( - contract C { - function f() public returns (uint) { - return tx.gasprice; - } - } - )"; - ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - - compileAndRun(sourceCode); - ABI_CHECK(callContractFunction("f()"), encodeArgs(gasPrice())); - ) -} - BOOST_AUTO_TEST_CASE(blockhash) { char const* sourceCode = R"( diff --git a/test/libsolidity/semanticTests/state/block_coinbase.sol b/test/libsolidity/semanticTests/state/block_coinbase.sol new file mode 100644 index 000000000..45cb64c5d --- /dev/null +++ b/test/libsolidity/semanticTests/state/block_coinbase.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (address payable) { + return block.coinbase; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x7878787878787878787878787878787878787878 +// f() -> 0x7878787878787878787878787878787878787878 +// f() -> 0x7878787878787878787878787878787878787878 diff --git a/test/libsolidity/semanticTests/state/block_difficulty.sol b/test/libsolidity/semanticTests/state/block_difficulty.sol new file mode 100644 index 000000000..1b5966fb0 --- /dev/null +++ b/test/libsolidity/semanticTests/state/block_difficulty.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (uint) { + return block.difficulty; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 200000000 +// f() -> 200000000 +// f() -> 200000000 diff --git a/test/libsolidity/semanticTests/state/block_gaslimit.sol b/test/libsolidity/semanticTests/state/block_gaslimit.sol new file mode 100644 index 000000000..7fb313825 --- /dev/null +++ b/test/libsolidity/semanticTests/state/block_gaslimit.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (uint) { + return block.gaslimit; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 20000000 +// f() -> 20000000 +// f() -> 20000000 diff --git a/test/libsolidity/semanticTests/state/block_number.sol b/test/libsolidity/semanticTests/state/block_number.sol new file mode 100644 index 000000000..a08261b92 --- /dev/null +++ b/test/libsolidity/semanticTests/state/block_number.sol @@ -0,0 +1,12 @@ +contract C { + constructor() {} + function f() public returns (uint) { + return block.number; + } +} +// ==== +// compileViaYul: also +// ---- +// constructor() +// f() -> 2 +// f() -> 3 diff --git a/test/libsolidity/semanticTests/state/block_timestamp.sol b/test/libsolidity/semanticTests/state/block_timestamp.sol new file mode 100644 index 000000000..4b4bba38d --- /dev/null +++ b/test/libsolidity/semanticTests/state/block_timestamp.sol @@ -0,0 +1,12 @@ +contract C { + constructor() {} + function f() public returns (uint) { + return block.timestamp; + } +} +// ==== +// compileViaYul: also +// ---- +// constructor() # This is the 1st block # +// f() -> 0x1e # This is the 2nd block (each block is "15 seconds") # +// f() -> 0x2d # This is the 3rd block # diff --git a/test/libsolidity/semanticTests/state/blockhash_basic.sol b/test/libsolidity/semanticTests/state/blockhash_basic.sol new file mode 100644 index 000000000..528c8aea6 --- /dev/null +++ b/test/libsolidity/semanticTests/state/blockhash_basic.sol @@ -0,0 +1,23 @@ +contract C { + bytes32 public genesisHash; + bytes32 public currentHash; + constructor() { + require(block.number == 1); + genesisHash = blockhash(0); + currentHash = blockhash(1); + } + function f(uint blockNumber) public returns (bytes32) { + return blockhash(blockNumber); + } +} +// ==== +// compileViaYul: also +// ---- +// constructor() +// genesisHash() -> 0x3737373737373737373737373737373737373737373737373737373737373737 +// currentHash() -> 0 +// f(uint256): 0 -> 0x3737373737373737373737373737373737373737373737373737373737373737 +// f(uint256): 1 -> 0x3737373737373737373737373737373737373737373737373737373737373738 +// f(uint256): 255 -> 0x00 +// f(uint256): 256 -> 0x00 +// f(uint256): 257 -> 0x00 diff --git a/test/libsolidity/semanticTests/state/gasleft.sol b/test/libsolidity/semanticTests/state/gasleft.sol new file mode 100644 index 000000000..0339ff17a --- /dev/null +++ b/test/libsolidity/semanticTests/state/gasleft.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (bool) { + return gasleft() > 0; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> true +// f() -> true +// f() -> true diff --git a/test/libsolidity/semanticTests/state/msg_data.sol b/test/libsolidity/semanticTests/state/msg_data.sol new file mode 100644 index 000000000..6217da3b6 --- /dev/null +++ b/test/libsolidity/semanticTests/state/msg_data.sol @@ -0,0 +1,13 @@ +contract C { + function f() public returns (bytes calldata) { + return msg.data; + } + function g(uint,bool) public returns (bytes calldata) { + return msg.data; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x20, 4, 17219911917854084299749778639755835327755045716242581057573779540915269926912 +// g(uint256,bool): 1234, true -> 0x20, 0x44, 35691323728519381642872894128098848782337736632589179916067422734266033766400, 33268574187263889506619096617382224251268236217415066441681855047532544, 26959946667150639794667015087019630673637144422540572481103610249216 diff --git a/test/libsolidity/semanticTests/state/msg_sender.sol b/test/libsolidity/semanticTests/state/msg_sender.sol new file mode 100644 index 000000000..6348bb477 --- /dev/null +++ b/test/libsolidity/semanticTests/state/msg_sender.sol @@ -0,0 +1,9 @@ +contract C { + function f() public returns (address payable) { + return msg.sender; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x1212121212121212121212121212120000000012 diff --git a/test/libsolidity/semanticTests/state/msg_sig.sol b/test/libsolidity/semanticTests/state/msg_sig.sol new file mode 100644 index 000000000..e7c7b1b75 --- /dev/null +++ b/test/libsolidity/semanticTests/state/msg_sig.sol @@ -0,0 +1,13 @@ +contract C { + function f() public returns (bytes4) { + return msg.sig; + } + function g() public returns (bytes4) { + return msg.sig; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 +// g() -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/state/msg_value.sol b/test/libsolidity/semanticTests/state/msg_value.sol new file mode 100644 index 000000000..fa7ca3db6 --- /dev/null +++ b/test/libsolidity/semanticTests/state/msg_value.sol @@ -0,0 +1,10 @@ +contract C { + function f() public payable returns (uint) { + return msg.value; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0 +// f(), 12 ether -> 12000000000000000000 diff --git a/test/libsolidity/semanticTests/state/tx_gasprice.sol b/test/libsolidity/semanticTests/state/tx_gasprice.sol new file mode 100644 index 000000000..321e2f55e --- /dev/null +++ b/test/libsolidity/semanticTests/state/tx_gasprice.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (uint) { + return tx.gasprice; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 3000000000 +// f() -> 3000000000 +// f() -> 3000000000 diff --git a/test/libsolidity/semanticTests/state/tx_origin.sol b/test/libsolidity/semanticTests/state/tx_origin.sol new file mode 100644 index 000000000..caa27d180 --- /dev/null +++ b/test/libsolidity/semanticTests/state/tx_origin.sol @@ -0,0 +1,11 @@ +contract C { + function f() public returns (address payable) { + return tx.origin; + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x9292929292929292929292929292929292929292 +// f() -> 0x9292929292929292929292929292929292929292 +// f() -> 0x9292929292929292929292929292929292929292 diff --git a/test/libsolidity/semanticTests/state/uncalled_blockhash.sol b/test/libsolidity/semanticTests/state/uncalled_blockhash.sol new file mode 100644 index 000000000..9a964335d --- /dev/null +++ b/test/libsolidity/semanticTests/state/uncalled_blockhash.sol @@ -0,0 +1,9 @@ +contract C { + function f() public returns (bytes32) { + return (blockhash)(block.number - 1); + } +} +// ==== +// compileViaYul: also +// ---- +// f() -> 0x3737373737373737373737373737373737373737373737373737373737373738 diff --git a/test/libsolidity/syntaxTests/types/magic_block.sol b/test/libsolidity/syntaxTests/types/magic_block.sol new file mode 100644 index 000000000..d0eae923b --- /dev/null +++ b/test/libsolidity/syntaxTests/types/magic_block.sol @@ -0,0 +1,16 @@ +contract C { + function f() public view returns (address payable) { + return block.coinbase; + } + function g() public view returns (uint) { + return block.difficulty; + } + function h() public view returns (uint) { + return block.gaslimit; + } + function i() public view returns (uint) { + return block.timestamp; + } +} +// ==== +// EVMVersion: =istanbul