From 3106ff14a0a93a2154993c711311f440c866f7b3 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 7 Jul 2021 12:17:06 +0200 Subject: [PATCH] Visualize stack too deep. --- libyul/backends/evm/StackLayoutGenerator.cpp | 5 +- test/libyul/StackLayoutGeneratorTest.cpp | 40 +- test/libyul/yulStackLayout/deposit.yul | 605 +++++++++++++++ .../yulStackLayout/deposit_creation.yul | 711 ++++++++++++++++++ 4 files changed, 1354 insertions(+), 7 deletions(-) create mode 100644 test/libyul/yulStackLayout/deposit.yul create mode 100644 test/libyul/yulStackLayout/deposit_creation.yul diff --git a/libyul/backends/evm/StackLayoutGenerator.cpp b/libyul/backends/evm/StackLayoutGenerator.cpp index 9d11b1742..1c07c9fd7 100644 --- a/libyul/backends/evm/StackLayoutGenerator.cpp +++ b/libyul/backends/evm/StackLayoutGenerator.cpp @@ -450,8 +450,9 @@ void StackLayoutGenerator::stitchConditionalJumps(CFG::BasicBlock const& _block) }); } -void StackLayoutGenerator::fixStackTooDeep(CFG::BasicBlock const& _block) +void StackLayoutGenerator::fixStackTooDeep(CFG::BasicBlock const&) { +#if 0 // This is just an initial proof of concept. Doing this in a clever way and in all cases will take some doing. // It might be enough to keep it at fixing inner-block issues and leave inter-block issues to the stack limit // evader. @@ -553,8 +554,8 @@ void StackLayoutGenerator::fixStackTooDeep(CFG::BasicBlock const& _block) [&](CFG::BasicBlock::FunctionReturn const&) {}, [&](CFG::BasicBlock::Terminated const&) { }, }, _block->exit); - }); +#endif } StackLayout StackLayoutGenerator::run(CFG const& _dfg) diff --git a/test/libyul/StackLayoutGeneratorTest.cpp b/test/libyul/StackLayoutGeneratorTest.cpp index f7910190d..ccdf00fc4 100644 --- a/test/libyul/StackLayoutGeneratorTest.cpp +++ b/test/libyul/StackLayoutGeneratorTest.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -29,7 +30,9 @@ #include #include +#include #include +#include #ifdef ISOLTEST #include @@ -151,7 +154,23 @@ private: auto const& blockInfo = m_stackLayout.blockInfos.at(&_block); m_stream << stackToString(blockInfo.entryLayout) << "\\l\\\n"; - for (auto const& operation: _block.operations) + vector nextLayouts; + for (auto const& operation: _block.operations | ranges::views::drop(1)) + nextLayouts.emplace_back(m_stackLayout.operationEntryLayout.at(&operation)); + nextLayouts.emplace_back(blockInfo.exitLayout); + bool hasUnreachable = false; + if (!_block.operations.empty()) + { + Stack firstLayout = m_stackLayout.operationEntryLayout.at(&_block.operations.front()); + auto unreachable = OptimizedEVMCodeTransform::tryCreateStackLayout(blockInfo.entryLayout, firstLayout); + if (!unreachable.empty()) + { + m_stream << "UNREACHABLE: " << stackToString(unreachable) << "\\l\\\n"; + hasUnreachable = true; + } + + } + for (auto&& [operation, nextLayout]: ranges::zip_view(_block.operations, nextLayouts)) { auto entryLayout = m_stackLayout.operationEntryLayout.at(&operation); m_stream << stackToString(m_stackLayout.operationEntryLayout.at(&operation)) << "\\l\\\n"; @@ -171,13 +190,24 @@ private: }, operation.operation); m_stream << "\\l\\\n"; soltestAssert(operation.input.size() <= entryLayout.size(), "Invalid Stack Layout."); + Stack exitLayout = entryLayout; for (size_t i = 0; i < operation.input.size(); ++i) - entryLayout.pop_back(); - entryLayout += operation.output; - m_stream << stackToString(entryLayout) << "\\l\\\n"; + exitLayout.pop_back(); + exitLayout += operation.output; + m_stream << stackToString(exitLayout); + auto unreachable = OptimizedEVMCodeTransform::tryCreateStackLayout(exitLayout, nextLayout); + if (!unreachable.empty()) + { + m_stream << " UNREACHABLE: " << stackToString(unreachable); + hasUnreachable = true; + } + m_stream << "\\l\\\n"; } m_stream << stackToString(blockInfo.exitLayout) << "\\l\\\n"; - m_stream << "\"];\n"; + if (hasUnreachable) + m_stream << "\" color=red fontcolor=red];\n"; + else + m_stream << "\"];\n"; std::visit(util::GenericVisitor{ [&](CFG::BasicBlock::MainExit const&) { diff --git a/test/libyul/yulStackLayout/deposit.yul b/test/libyul/yulStackLayout/deposit.yul new file mode 100644 index 000000000..a44042e2e --- /dev/null +++ b/test/libyul/yulStackLayout/deposit.yul @@ -0,0 +1,605 @@ + object "DepositContract_541_deployed" { + code { + { + mstore(64, 128) + if iszero(lt(calldatasize(), 4)) + { + let _1 := 0 + switch shr(224, calldataload(_1)) + case 0x01ffc9a7 { + if callvalue() { revert(_1, _1) } + return(128, add(abi_encode_bool(fun_supportsInterface(abi_decode_bytes4(calldatasize()))), not(127))) + } + case 0x22895118 { + let param, param_1, param_2, param_3, param_4, param_5, param_6 := abi_decode_bytes_calldatat_bytes_calldatat_bytes_calldatat_bytes32(calldatasize()) + fun_deposit(param, param_1, param_2, param_3, param_4, param_5, param_6) + return(mload(64), _1) + } + case 0x621fd130 { + if callvalue() { revert(_1, _1) } + abi_decode(calldatasize()) + let ret := fun_to_little_endian(convert_uint256_to_uint64(sload(0x20))) + let memPos := mload(64) + return(memPos, sub(abi_encode_bytes(memPos, ret), memPos)) + } + case 0xc5f2892f { + if callvalue() { revert(_1, _1) } + abi_decode(calldatasize()) + let ret_1 := fun_get_deposit_root() + let memPos_1 := mload(64) + return(memPos_1, sub(abi_encode_bytes32(memPos_1, ret_1), memPos_1)) + } + } + revert(0, 0) + } + function abi_decode_bytes_calldata(offset, end) -> arrayPos, length + { + if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) } + length := calldataload(offset) + if gt(length, 0xffffffffffffffff) { revert(0, 0) } + arrayPos := add(offset, 0x20) + if gt(add(add(offset, length), 0x20), end) { revert(0, 0) } + } + function abi_decode(dataEnd) + { + if slt(add(dataEnd, not(3)), 0) { revert(0, 0) } + } + function abi_decode_bytes4(dataEnd) -> value0 + { + if slt(add(dataEnd, not(3)), 32) { revert(0, 0) } + let value := calldataload(4) + if iszero(eq(value, and(value, shl(224, 0xffffffff)))) { revert(0, 0) } + value0 := value + } + function abi_decode_bytes_calldatat_bytes_calldatat_bytes_calldatat_bytes32(dataEnd) -> value0, value1, value2, value3, value4, value5, value6 + { + if slt(add(dataEnd, not(3)), 128) { revert(0, 0) } + let offset := calldataload(4) + let _1 := 0xffffffffffffffff + if gt(offset, _1) { revert(0, 0) } + let value0_1, value1_1 := abi_decode_bytes_calldata(add(4, offset), dataEnd) + value0 := value0_1 + value1 := value1_1 + let offset_1 := calldataload(36) + if gt(offset_1, _1) { revert(0, 0) } + let value2_1, value3_1 := abi_decode_bytes_calldata(add(4, offset_1), dataEnd) + value2 := value2_1 + value3 := value3_1 + let offset_2 := calldataload(68) + if gt(offset_2, _1) { revert(0, 0) } + let value4_1, value5_1 := abi_decode_bytes_calldata(add(4, offset_2), dataEnd) + value4 := value4_1 + value5 := value5_1 + value6 := calldataload(100) + } + function abi_encode_bytes_calldata_ptr(start, length, pos) -> end + { + mstore(pos, length) + calldatacopy(add(pos, 0x20), start, length) + mstore(add(add(pos, length), 0x20), 0) + end := add(add(pos, and(add(length, 31), not(31))), 0x20) + } + function abi_encode_bytes_calldata(start, length, pos) -> end + { + calldatacopy(pos, start, length) + let _1 := add(pos, length) + mstore(_1, 0) + end := _1 + } + function abi_encode_bytes_to_bytes(value, pos) -> end + { + let length := mload(value) + mstore(pos, length) + copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length) + end := add(add(pos, and(add(length, 31), not(31))), 0x20) + } + function abi_encode_bytes_memory_ptr(value, pos) -> end + { + let length := mload(value) + copy_memory_to_memory(add(value, 0x20), pos, length) + end := add(pos, length) + } + function abi_encode_packed_bytes32_bytes32(pos, value0, value1) -> end + { + mstore(pos, value0) + mstore(add(pos, 32), value1) + end := add(pos, 64) + } + function abi_encode_packed_bytes32_bytes_calldata(pos, value0, value1, value2) -> end + { + mstore(pos, value0) + calldatacopy(add(pos, 32), value1, value2) + let _1 := add(add(pos, value2), 32) + mstore(_1, 0) + end := _1 + } + function abi_encode_packed_bytes32_bytes_bytes24(pos, value0, value1) -> end + { + mstore(pos, value0) + let length := mload(value1) + copy_memory_to_memory(add(value1, 32), add(pos, 32), length) + let _1 := add(pos, length) + mstore(add(_1, 32), 0) + end := add(_1, 56) + } + function abi_encode_packed_bytes_calldata_slice_bytes32(pos, value0, value1) -> end + { + calldatacopy(pos, value0, value1) + let _1 := add(pos, value1) + mstore(_1, 0x00) + mstore(_1, 0x00) + end := add(_1, 32) + } + function abi_encode_packed_bytes_calldata_bytes16(pos, value0, value1) -> end + { + calldatacopy(pos, value0, value1) + let _1 := add(pos, value1) + mstore(_1, 0) + mstore(_1, 0) + end := add(_1, 16) + } + function abi_encode_packed_bytes_bytes24_bytes32(pos, value0, value2) -> end + { + let length := mload(value0) + copy_memory_to_memory(add(value0, 0x20), pos, length) + let end_1 := add(pos, length) + mstore(end_1, 0) + mstore(add(end_1, 24), value2) + end := add(end_1, 56) + } + function abi_encode_bool(value0) -> tail + { + tail := 160 + mstore(128, iszero(iszero(value0))) + } + function abi_encode_bytes32(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, value0) + } + function abi_encode_bytes_calldata_bytes_calldata_bytes_bytes_calldata_bytes(headStart, value0, value1, value2, value3, value4, value5, value6, value7) -> tail + { + mstore(headStart, 160) + let tail_1 := abi_encode_bytes_calldata_ptr(value0, value1, add(headStart, 160)) + mstore(add(headStart, 32), sub(tail_1, headStart)) + let tail_2 := abi_encode_bytes_calldata_ptr(value2, value3, tail_1) + mstore(add(headStart, 64), sub(tail_2, headStart)) + let tail_3 := abi_encode_bytes_to_bytes(value4, tail_2) + mstore(add(headStart, 96), sub(tail_3, headStart)) + let tail_4 := abi_encode_bytes_calldata_ptr(value5, value6, tail_3) + mstore(add(headStart, 128), sub(tail_4, headStart)) + tail := abi_encode_bytes_to_bytes(value7, tail_4) + } + function abi_encode_bytes(headStart, value0) -> tail + { + mstore(headStart, 32) + tail := abi_encode_bytes_to_bytes(value0, add(headStart, 32)) + } + function assert_helper() + { + mstore(0x00, shl(224, 0x4e487b71)) + mstore(4, 1) + revert(0x00, 0x24) + } + function calldata_array_index_range_access_bytes_calldata(offset, length) -> offsetOut, lengthOut + { + if gt(64, length) { revert(0x00, 0x00) } + offsetOut := offset + lengthOut := 64 + } + function calldata_array_index_range_access_bytes_calldata_3133(offset, length, endIndex) -> offsetOut, lengthOut + { + if gt(64, endIndex) { revert(0, 0) } + if gt(endIndex, length) { revert(0, 0) } + offsetOut := add(offset, 64) + lengthOut := add(endIndex, not(63)) + } + function checked_add_uint256(x) -> sum + { + if gt(x, not(1)) { panic_error_0x11() } + sum := add(x, 0x01) + } + function convert_uint256_to_uint64(value) -> converted + { + converted := and(value, 0xffffffffffffffff) + } + function copy_memory_to_memory(src, dst, length) + { + let i := 0 + for { } lt(i, length) { i := add(i, 32) } + { + mstore(add(dst, i), mload(add(src, i))) + } + if gt(i, length) { mstore(add(dst, length), 0) } + } + function extract_from_storage_value_dynamict_bytes32(slot_value, offset) -> value + { + value := shr(shl(3, offset), slot_value) + } + function finalize_allocation(memPtr, size) + { + let newFreePtr := add(memPtr, and(add(size, 31), not(31))) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function fun_deposit(var_pubkey_offset, var_pubkey_length, var_withdrawal_credentials_offset, var_withdrawal_credentials_length, var_signature_offset, var_signature_length, var_deposit_data_root) + { + require_helper_stringliteral_c3b5(eq(var_pubkey_length, 0x30)) + let _1 := 0x20 + require_helper_stringliteral(eq(var_withdrawal_credentials_length, _1)) + require_helper_stringliteral_e15d(eq(var_signature_length, 0x60)) + require_helper_stringliteral_d4d9(iszero(lt(callvalue(), 0x0de0b6b3a7640000))) + require_helper_stringliteral_7db0(iszero(mod(callvalue(), 0x3b9aca00))) + let _2 := 0xffffffffffffffff + require_helper_stringliteral_c445(iszero(gt(div(callvalue(), 0x3b9aca00), _2))) + let expr_279_mpos := fun_to_little_endian(and(div(callvalue(), 0x3b9aca00), _2)) + let _3 := sload(_1) + let expr_291_mpos := fun_to_little_endian(and(_3, _2)) + let _4 := mload(64) + log1(_4, sub(abi_encode_bytes_calldata_bytes_calldata_bytes_bytes_calldata_bytes(_4, var_pubkey_offset, var_pubkey_length, var_withdrawal_credentials_offset, var_withdrawal_credentials_length, expr_279_mpos, var_signature_offset, var_signature_length, expr_291_mpos), _4), 0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5) + let expr_304_mpos := mload(64) + let _5 := sub(abi_encode_packed_bytes_calldata_bytes16(add(expr_304_mpos, _1), var_pubkey_offset, var_pubkey_length), expr_304_mpos) + let _6 := not(31) + mstore(expr_304_mpos, add(_5, _6)) + finalize_allocation(expr_304_mpos, _5) + let _7 := mload(64) + let _8 := sub(abi_encode_bytes_memory_ptr(expr_304_mpos, _7), _7) + if iszero(staticcall(gas(), 2, _7, _8, 0x00, _1)) { revert_forward() } + let _9 := mload(0x00) + let expr_317_offset, expr_length := calldata_array_index_range_access_bytes_calldata(var_signature_offset, var_signature_length) + let expr_mpos := mload(64) + let _10 := sub(abi_encode_bytes_calldata(expr_317_offset, expr_length, add(expr_mpos, _1)), expr_mpos) + mstore(expr_mpos, add(_10, _6)) + finalize_allocation(expr_mpos, _10) + let _11 := mload(64) + if iszero(staticcall(gas(), 2, _11, sub(abi_encode_bytes_memory_ptr(expr_mpos, _11), _11), 0x00, _1)) { revert_forward() } + let _12 := mload(0x00) + let expr_offset, expr_325_length := calldata_array_index_range_access_bytes_calldata_3133(var_signature_offset, var_signature_length, var_signature_length) + let expr_330_mpos := mload(64) + let _13 := sub(abi_encode_packed_bytes_calldata_slice_bytes32(add(expr_330_mpos, _1), expr_offset, expr_325_length), expr_330_mpos) + mstore(expr_330_mpos, add(_13, _6)) + finalize_allocation(expr_330_mpos, _13) + let _14 := mload(64) + if iszero(staticcall(gas(), 2, _14, sub(abi_encode_bytes_memory_ptr(expr_330_mpos, _14), _14), 0x00, _1)) { revert_forward() } + let _15 := mload(0x00) + let expr_332_mpos := mload(64) + let _16 := sub(abi_encode_packed_bytes32_bytes32(add(expr_332_mpos, _1), _12, _15), expr_332_mpos) + mstore(expr_332_mpos, add(_16, _6)) + finalize_allocation(expr_332_mpos, _16) + let _17 := mload(64) + if iszero(staticcall(gas(), 2, _17, sub(abi_encode_bytes_memory_ptr(expr_332_mpos, _17), _17), 0x00, _1)) { revert_forward() } + let _18 := mload(0x00) + let expr_345_mpos := mload(64) + let _19 := sub(abi_encode_packed_bytes32_bytes_calldata(add(expr_345_mpos, _1), _9, var_withdrawal_credentials_offset, var_withdrawal_credentials_length), expr_345_mpos) + mstore(expr_345_mpos, add(_19, _6)) + finalize_allocation(expr_345_mpos, _19) + let _20 := mload(64) + if iszero(staticcall(gas(), 2, _20, sub(abi_encode_bytes_memory_ptr(expr_345_mpos, _20), _20), 0x00, _1)) { revert_forward() } + let _21 := mload(0x00) + let expr_356_mpos := mload(64) + let _22 := sub(abi_encode_packed_bytes_bytes24_bytes32(add(expr_356_mpos, _1), expr_279_mpos, _18), expr_356_mpos) + mstore(expr_356_mpos, add(_22, _6)) + finalize_allocation(expr_356_mpos, _22) + let _23 := mload(64) + if iszero(staticcall(gas(), 2, _23, sub(abi_encode_bytes_memory_ptr(expr_356_mpos, _23), _23), 0x00, _1)) { revert_forward() } + let _24 := mload(0x00) + let expr_358_mpos := mload(64) + let _25 := sub(abi_encode_packed_bytes32_bytes32(add(expr_358_mpos, _1), _21, _24), expr_358_mpos) + mstore(expr_358_mpos, add(_25, _6)) + finalize_allocation(expr_358_mpos, _25) + let _26 := mload(64) + if iszero(staticcall(gas(), 2, _26, sub(abi_encode_bytes_memory_ptr(expr_358_mpos, _26), _26), 0x00, _1)) { revert_forward() } + let var_node := mload(0x00) + require_helper_stringliteral_18a6(eq(var_node, var_deposit_data_root)) + require_helper_stringliteral_122a(lt(_3, 0xffffffff)) + update_storage_value_offsett_uint256_to_uint256(checked_add_uint256(_3)) + let var_size := sload(_1) + let var_height := 0x00 + for { } + lt(var_height, _1) + { + var_height := increment_uint256(var_height) + } + { + if eq(and(var_size, 0x01), 0x01) + { + let _27, _28 := storage_array_index_access_bytes_3138(var_height) + update_storage_value_bytes32_to_bytes32(_27, _28, var_node) + leave + } + let _29, _30 := storage_array_index_access_bytes_3138(var_height) + let _31 := extract_from_storage_value_dynamict_bytes32(sload(_29), _30) + let expr_416_mpos := mload(64) + let _32 := sub(abi_encode_packed_bytes32_bytes32(add(expr_416_mpos, _1), _31, var_node), expr_416_mpos) + mstore(expr_416_mpos, add(_32, _6)) + finalize_allocation(expr_416_mpos, _32) + let _33 := mload(64) + if iszero(staticcall(gas(), 2, _33, sub(abi_encode_bytes_memory_ptr(expr_416_mpos, _33), _33), 0x00, _1)) { revert_forward() } + var_node := mload(0x00) + var_size := shr(0x01, var_size) + } + assert_helper() + } + function fun_get_deposit_root() -> var + { + let var_node := 0 + let _1 := 0x20 + let var_size := sload(_1) + let var_size_1 := var_size + let var_height := var_node + for { } + lt(var_height, _1) + { + var_height := increment_uint256(var_height) + } + { + let _2 := 0x01 + switch eq(and(var_size, _2), _2) + case 0 { + let _3, _4 := storage_array_index_access_bytes_3142(var_height) + let _5 := extract_from_storage_value_dynamict_bytes32(sload(_3), _4) + let _6 := 64 + let expr_157_mpos := mload(_6) + let _7 := sub(abi_encode_packed_bytes32_bytes32(add(expr_157_mpos, _1), var_node, _5), expr_157_mpos) + mstore(expr_157_mpos, add(_7, not(31))) + finalize_allocation(expr_157_mpos, _7) + let _8 := mload(_6) + if iszero(staticcall(gas(), 0x02, _8, sub(abi_encode_bytes_memory_ptr(expr_157_mpos, _8), _8), 0, _1)) { revert_forward() } + var_node := mload(0) + } + default { + let _9, _10 := storage_array_index_access_bytes(var_height) + let _11 := extract_from_storage_value_dynamict_bytes32(sload(_9), _10) + let _12 := 64 + let expr_145_mpos := mload(_12) + let _13 := sub(abi_encode_packed_bytes32_bytes32(add(expr_145_mpos, _1), _11, var_node), expr_145_mpos) + mstore(expr_145_mpos, add(_13, not(31))) + finalize_allocation(expr_145_mpos, _13) + let _14 := mload(_12) + if iszero(staticcall(gas(), 0x02, _14, sub(abi_encode_bytes_memory_ptr(expr_145_mpos, _14), _14), 0, _1)) { revert_forward() } + var_node := mload(0) + } + var_size := shr(_2, var_size) + } + let expr_177_mpos := fun_to_little_endian(and(var_size_1, 0xffffffffffffffff)) + let expr_182_mpos := mload(64) + let _15 := sub(abi_encode_packed_bytes32_bytes_bytes24(add(expr_182_mpos, _1), var_node, expr_177_mpos), expr_182_mpos) + mstore(expr_182_mpos, add(_15, not(31))) + finalize_allocation(expr_182_mpos, _15) + let _16 := mload(64) + if iszero(staticcall(gas(), 0x02, _16, sub(abi_encode_bytes_memory_ptr(expr_182_mpos, _16), _16), 0, _1)) { revert_forward() } + var := mload(0) + } + function fun_supportsInterface(var_interfaceId) -> var_ + { + let _1 := and(var_interfaceId, shl(224, 0xffffffff)) + let expr := eq(_1, shl(224, 0x01ffc9a7)) + if iszero(expr) + { + expr := eq(_1, shl(224, 0x85640907)) + } + var_ := expr + } + function fun_to_little_endian(var_value) -> var_ret_mpos + { + let memPtr := mload(64) + let newFreePtr := add(memPtr, 64) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + mstore(memPtr, 0x08) + calldatacopy(add(memPtr, 0x20), calldatasize(), 0x20) + var_ret_mpos := memPtr + let expr := and(shl(192, var_value), shl(192, 0xffffffffffffffff)) + mstore8(memory_array_index_access_bytes_3147(memPtr), byte(0x07, expr)) + mstore8(memory_array_index_access_bytes_3148(memPtr), byte(0x06, expr)) + mstore8(memory_array_index_access_bytes_3149(memPtr), byte(0x05, expr)) + mstore8(memory_array_index_access_bytes_3150(memPtr), byte(0x04, expr)) + mstore8(memory_array_index_access_bytes_3151(memPtr), byte(0x03, expr)) + mstore8(memory_array_index_access_bytes_3152(memPtr), byte(0x02, expr)) + mstore8(memory_array_index_access_bytes_3153(memPtr), byte(1, expr)) + mstore8(memory_array_index_access_bytes(memPtr), byte(0, expr)) + } + function increment_uint256(value) -> ret + { + if eq(value, not(0)) { panic_error_0x11() } + ret := add(value, 1) + } + function memory_array_index_access_bytes_3147(baseRef) -> addr + { + if iszero(mload(baseRef)) { panic_error_0x32() } + addr := add(baseRef, 32) + } + function memory_array_index_access_bytes_3148(baseRef) -> addr + { + if iszero(lt(0x01, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 33) + } + function memory_array_index_access_bytes_3149(baseRef) -> addr + { + if iszero(lt(0x02, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 34) + } + function memory_array_index_access_bytes_3150(baseRef) -> addr + { + if iszero(lt(0x03, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 35) + } + function memory_array_index_access_bytes_3151(baseRef) -> addr + { + if iszero(lt(0x04, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 36) + } + function memory_array_index_access_bytes_3152(baseRef) -> addr + { + if iszero(lt(0x05, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 37) + } + function memory_array_index_access_bytes_3153(baseRef) -> addr + { + if iszero(lt(0x06, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 38) + } + function memory_array_index_access_bytes(baseRef) -> addr + { + if iszero(lt(0x07, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 39) + } + function panic_error_0x11() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x11) + revert(0, 0x24) + } + function panic_error_0x32() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x32) + revert(0, 0x24) + } + function panic_error_0x41() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x41) + revert(0, 0x24) + } + function require_helper_stringliteral_122a(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 33) + mstore(add(memPtr, 68), "DepositContract: merkle tree ful") + mstore(add(memPtr, 100), "l") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_18a6(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 84) + mstore(add(memPtr, 68), "DepositContract: reconstructed D") + mstore(add(memPtr, 100), "epositData does not match suppli") + mstore(add(memPtr, 132), "ed deposit_data_root") + revert(memPtr, 164) + } + } + function require_helper_stringliteral(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 54) + mstore(add(memPtr, 68), "DepositContract: invalid withdra") + mstore(add(memPtr, 100), "wal_credentials length") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_7db0(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 51) + mstore(add(memPtr, 68), "DepositContract: deposit value n") + mstore(add(memPtr, 100), "ot multiple of gwei") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_c3b5(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 38) + mstore(add(memPtr, 68), "DepositContract: invalid pubkey ") + mstore(add(memPtr, 100), "length") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_c445(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 39) + mstore(add(memPtr, 68), "DepositContract: deposit value t") + mstore(add(memPtr, 100), "oo high") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_d4d9(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 38) + mstore(add(memPtr, 68), "DepositContract: deposit value t") + mstore(add(memPtr, 100), "oo low") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_e15d(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 41) + mstore(add(memPtr, 68), "DepositContract: invalid signatu") + mstore(add(memPtr, 100), "re length") + revert(memPtr, 132) + } + } + function revert_forward() + { + let pos := mload(64) + returndatacopy(pos, 0, returndatasize()) + revert(pos, returndatasize()) + } + function storage_array_index_access_bytes_3138(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := index + offset := 0x00 + } + function storage_array_index_access_bytes_3142(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := add(0x21, index) + offset := 0 + } + function storage_array_index_access_bytes(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := index + offset := 0 + } + function update_storage_value_offsett_uint256_to_uint256(value) + { sstore(0x20, value) } + function update_storage_value_bytes32_to_bytes32(slot, offset, value) + { + let _1 := sload(slot) + let shiftBits := shl(3, offset) + let mask := shl(shiftBits, not(0)) + sstore(slot, or(and(_1, not(mask)), and(shl(shiftBits, value), mask))) + } + } + } +// ---- diff --git a/test/libyul/yulStackLayout/deposit_creation.yul b/test/libyul/yulStackLayout/deposit_creation.yul new file mode 100644 index 000000000..efe85b37a --- /dev/null +++ b/test/libyul/yulStackLayout/deposit_creation.yul @@ -0,0 +1,711 @@ + +object "DepositContract_541" { + code { + { + let _1 := 64 + mstore(_1, 128) + if callvalue() { revert(0, 0) } + let var_height := 0x00 + let var_height_1 := var_height + for { } + lt(var_height_1, 31) + { + if eq(var_height_1, not(0)) { panic_error_0x11() } + var_height_1 := add(var_height_1, 0x01) + } + { + let _2, _3 := storage_array_index_access_bytes(var_height_1) + let _4 := extract_from_storage_value_dynamict_bytes32(sload(_2), _3) + let _5, _6 := storage_array_index_access_bytes(var_height_1) + let _7 := extract_from_storage_value_dynamict_bytes32(sload(_5), _6) + let expr_mpos := mload(_1) + let _8 := 0x20 + let _9 := sub(abi_encode_packed_bytes32_bytes32(add(expr_mpos, _8), _4, _7), expr_mpos) + mstore(expr_mpos, add(_9, not(31))) + finalize_allocation(expr_mpos, _9) + let _10 := mload(_1) + if iszero(staticcall(gas(), 2, _10, sub(abi_encode_bytes(expr_mpos, _10), _10), var_height, _8)) { revert_forward() } + let _11 := mload(var_height) + let _12, _13 := storage_array_index_access_bytes(checked_add_uint256(var_height_1)) + update_storage_value_bytes32_to_bytes32(_12, _13, _11) + } + let _14 := mload(_1) + let _15 := datasize("DepositContract_541_deployed") + codecopy(_14, dataoffset("DepositContract_541_deployed"), _15) + return(_14, _15) + } + function abi_encode_bytes(value, pos) -> end + { + let length := mload(value) + let i := 0 + for { } lt(i, length) { i := add(i, 0x20) } + { + mstore(add(pos, i), mload(add(add(value, i), 0x20))) + } + if gt(i, length) { mstore(add(pos, length), 0) } + end := add(pos, length) + } + function abi_encode_packed_bytes32_bytes32(pos, value0, value1) -> end + { + mstore(pos, value0) + mstore(add(pos, 32), value1) + end := add(pos, 64) + } + function checked_add_uint256(x) -> sum + { + if gt(x, not(1)) { panic_error_0x11() } + sum := add(x, 0x01) + } + function extract_from_storage_value_dynamict_bytes32(slot_value, offset) -> value + { + value := shr(shl(3, offset), slot_value) + } + function finalize_allocation(memPtr, size) + { + let newFreePtr := add(memPtr, and(add(size, 31), not(31))) + if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x41) + revert(0, 0x24) + } + mstore(64, newFreePtr) + } + function panic_error_0x11() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x11) + revert(0, 0x24) + } + function revert_forward() + { + let pos := mload(64) + returndatacopy(pos, 0, returndatasize()) + revert(pos, returndatasize()) + } + function storage_array_index_access_bytes(index) -> slot, offset + { + if iszero(lt(index, 0x20)) + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x32) + revert(0, 0x24) + } + slot := add(0x21, index) + offset := 0 + } + function update_storage_value_bytes32_to_bytes32(slot, offset, value) + { + let _1 := sload(slot) + let shiftBits := shl(3, offset) + let mask := shl(shiftBits, not(0)) + sstore(slot, or(and(_1, not(mask)), and(shl(shiftBits, value), mask))) + } + } + object "DepositContract_541_deployed" { + code { + { + mstore(64, 128) + if iszero(lt(calldatasize(), 4)) + { + let _1 := 0 + switch shr(224, calldataload(_1)) + case 0x01ffc9a7 { + if callvalue() { revert(_1, _1) } + return(128, add(abi_encode_bool(fun_supportsInterface(abi_decode_bytes4(calldatasize()))), not(127))) + } + case 0x22895118 { + let param, param_1, param_2, param_3, param_4, param_5, param_6 := abi_decode_bytes_calldatat_bytes_calldatat_bytes_calldatat_bytes32(calldatasize()) + fun_deposit(param, param_1, param_2, param_3, param_4, param_5, param_6) + return(mload(64), _1) + } + case 0x621fd130 { + if callvalue() { revert(_1, _1) } + abi_decode(calldatasize()) + let ret := fun_to_little_endian(convert_uint256_to_uint64(sload(0x20))) + let memPos := mload(64) + return(memPos, sub(abi_encode_bytes(memPos, ret), memPos)) + } + case 0xc5f2892f { + if callvalue() { revert(_1, _1) } + abi_decode(calldatasize()) + let ret_1 := fun_get_deposit_root() + let memPos_1 := mload(64) + return(memPos_1, sub(abi_encode_bytes32(memPos_1, ret_1), memPos_1)) + } + } + revert(0, 0) + } + function abi_decode_bytes_calldata(offset, end) -> arrayPos, length + { + if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) } + length := calldataload(offset) + if gt(length, 0xffffffffffffffff) { revert(0, 0) } + arrayPos := add(offset, 0x20) + if gt(add(add(offset, length), 0x20), end) { revert(0, 0) } + } + function abi_decode(dataEnd) + { + if slt(add(dataEnd, not(3)), 0) { revert(0, 0) } + } + function abi_decode_bytes4(dataEnd) -> value0 + { + if slt(add(dataEnd, not(3)), 32) { revert(0, 0) } + let value := calldataload(4) + if iszero(eq(value, and(value, shl(224, 0xffffffff)))) { revert(0, 0) } + value0 := value + } + function abi_decode_bytes_calldatat_bytes_calldatat_bytes_calldatat_bytes32(dataEnd) -> value0, value1, value2, value3, value4, value5, value6 + { + if slt(add(dataEnd, not(3)), 128) { revert(0, 0) } + let offset := calldataload(4) + let _1 := 0xffffffffffffffff + if gt(offset, _1) { revert(0, 0) } + let value0_1, value1_1 := abi_decode_bytes_calldata(add(4, offset), dataEnd) + value0 := value0_1 + value1 := value1_1 + let offset_1 := calldataload(36) + if gt(offset_1, _1) { revert(0, 0) } + let value2_1, value3_1 := abi_decode_bytes_calldata(add(4, offset_1), dataEnd) + value2 := value2_1 + value3 := value3_1 + let offset_2 := calldataload(68) + if gt(offset_2, _1) { revert(0, 0) } + let value4_1, value5_1 := abi_decode_bytes_calldata(add(4, offset_2), dataEnd) + value4 := value4_1 + value5 := value5_1 + value6 := calldataload(100) + } + function abi_encode_bytes_calldata_ptr(start, length, pos) -> end + { + mstore(pos, length) + calldatacopy(add(pos, 0x20), start, length) + mstore(add(add(pos, length), 0x20), 0) + end := add(add(pos, and(add(length, 31), not(31))), 0x20) + } + function abi_encode_bytes_calldata(start, length, pos) -> end + { + calldatacopy(pos, start, length) + let _1 := add(pos, length) + mstore(_1, 0) + end := _1 + } + function abi_encode_bytes_to_bytes(value, pos) -> end + { + let length := mload(value) + mstore(pos, length) + copy_memory_to_memory(add(value, 0x20), add(pos, 0x20), length) + end := add(add(pos, and(add(length, 31), not(31))), 0x20) + } + function abi_encode_bytes_memory_ptr(value, pos) -> end + { + let length := mload(value) + copy_memory_to_memory(add(value, 0x20), pos, length) + end := add(pos, length) + } + function abi_encode_packed_bytes32_bytes32(pos, value0, value1) -> end + { + mstore(pos, value0) + mstore(add(pos, 32), value1) + end := add(pos, 64) + } + function abi_encode_packed_bytes32_bytes_calldata(pos, value0, value1, value2) -> end + { + mstore(pos, value0) + calldatacopy(add(pos, 32), value1, value2) + let _1 := add(add(pos, value2), 32) + mstore(_1, 0) + end := _1 + } + function abi_encode_packed_bytes32_bytes_bytes24(pos, value0, value1) -> end + { + mstore(pos, value0) + let length := mload(value1) + copy_memory_to_memory(add(value1, 32), add(pos, 32), length) + let _1 := add(pos, length) + mstore(add(_1, 32), 0) + end := add(_1, 56) + } + function abi_encode_packed_bytes_calldata_slice_bytes32(pos, value0, value1) -> end + { + calldatacopy(pos, value0, value1) + let _1 := add(pos, value1) + mstore(_1, 0x00) + mstore(_1, 0x00) + end := add(_1, 32) + } + function abi_encode_packed_bytes_calldata_bytes16(pos, value0, value1) -> end + { + calldatacopy(pos, value0, value1) + let _1 := add(pos, value1) + mstore(_1, 0) + mstore(_1, 0) + end := add(_1, 16) + } + function abi_encode_packed_bytes_bytes24_bytes32(pos, value0, value2) -> end + { + let length := mload(value0) + copy_memory_to_memory(add(value0, 0x20), pos, length) + let end_1 := add(pos, length) + mstore(end_1, 0) + mstore(add(end_1, 24), value2) + end := add(end_1, 56) + } + function abi_encode_bool(value0) -> tail + { + tail := 160 + mstore(128, iszero(iszero(value0))) + } + function abi_encode_bytes32(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, value0) + } + function abi_encode_bytes_calldata_bytes_calldata_bytes_bytes_calldata_bytes(headStart, value0, value1, value2, value3, value4, value5, value6, value7) -> tail + { + mstore(headStart, 160) + let tail_1 := abi_encode_bytes_calldata_ptr(value0, value1, add(headStart, 160)) + mstore(add(headStart, 32), sub(tail_1, headStart)) + let tail_2 := abi_encode_bytes_calldata_ptr(value2, value3, tail_1) + mstore(add(headStart, 64), sub(tail_2, headStart)) + let tail_3 := abi_encode_bytes_to_bytes(value4, tail_2) + mstore(add(headStart, 96), sub(tail_3, headStart)) + let tail_4 := abi_encode_bytes_calldata_ptr(value5, value6, tail_3) + mstore(add(headStart, 128), sub(tail_4, headStart)) + tail := abi_encode_bytes_to_bytes(value7, tail_4) + } + function abi_encode_bytes(headStart, value0) -> tail + { + mstore(headStart, 32) + tail := abi_encode_bytes_to_bytes(value0, add(headStart, 32)) + } + function assert_helper() + { + mstore(0x00, shl(224, 0x4e487b71)) + mstore(4, 1) + revert(0x00, 0x24) + } + function calldata_array_index_range_access_bytes_calldata(offset, length) -> offsetOut, lengthOut + { + if gt(64, length) { revert(0x00, 0x00) } + offsetOut := offset + lengthOut := 64 + } + function calldata_array_index_range_access_bytes_calldata_3133(offset, length, endIndex) -> offsetOut, lengthOut + { + if gt(64, endIndex) { revert(0, 0) } + if gt(endIndex, length) { revert(0, 0) } + offsetOut := add(offset, 64) + lengthOut := add(endIndex, not(63)) + } + function checked_add_uint256(x) -> sum + { + if gt(x, not(1)) { panic_error_0x11() } + sum := add(x, 0x01) + } + function convert_uint256_to_uint64(value) -> converted + { + converted := and(value, 0xffffffffffffffff) + } + function copy_memory_to_memory(src, dst, length) + { + let i := 0 + for { } lt(i, length) { i := add(i, 32) } + { + mstore(add(dst, i), mload(add(src, i))) + } + if gt(i, length) { mstore(add(dst, length), 0) } + } + function extract_from_storage_value_dynamict_bytes32(slot_value, offset) -> value + { + value := shr(shl(3, offset), slot_value) + } + function finalize_allocation(memPtr, size) + { + let newFreePtr := add(memPtr, and(add(size, 31), not(31))) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function fun_deposit(var_pubkey_offset, var_pubkey_length, var_withdrawal_credentials_offset, var_withdrawal_credentials_length, var_signature_offset, var_signature_length, var_deposit_data_root) + { + require_helper_stringliteral_c3b5(eq(var_pubkey_length, 0x30)) + let _1 := 0x20 + require_helper_stringliteral(eq(var_withdrawal_credentials_length, _1)) + require_helper_stringliteral_e15d(eq(var_signature_length, 0x60)) + require_helper_stringliteral_d4d9(iszero(lt(callvalue(), 0x0de0b6b3a7640000))) + require_helper_stringliteral_7db0(iszero(mod(callvalue(), 0x3b9aca00))) + let _2 := 0xffffffffffffffff + require_helper_stringliteral_c445(iszero(gt(div(callvalue(), 0x3b9aca00), _2))) + let expr_279_mpos := fun_to_little_endian(and(div(callvalue(), 0x3b9aca00), _2)) + let _3 := sload(_1) + let expr_291_mpos := fun_to_little_endian(and(_3, _2)) + let _4 := mload(64) + log1(_4, sub(abi_encode_bytes_calldata_bytes_calldata_bytes_bytes_calldata_bytes(_4, var_pubkey_offset, var_pubkey_length, var_withdrawal_credentials_offset, var_withdrawal_credentials_length, expr_279_mpos, var_signature_offset, var_signature_length, expr_291_mpos), _4), 0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5) + let expr_304_mpos := mload(64) + let _5 := sub(abi_encode_packed_bytes_calldata_bytes16(add(expr_304_mpos, _1), var_pubkey_offset, var_pubkey_length), expr_304_mpos) + let _6 := not(31) + mstore(expr_304_mpos, add(_5, _6)) + finalize_allocation(expr_304_mpos, _5) + let _7 := mload(64) + let _8 := sub(abi_encode_bytes_memory_ptr(expr_304_mpos, _7), _7) + if iszero(staticcall(gas(), 2, _7, _8, 0x00, _1)) { revert_forward() } + let _9 := mload(0x00) + let expr_317_offset, expr_length := calldata_array_index_range_access_bytes_calldata(var_signature_offset, var_signature_length) + let expr_mpos := mload(64) + let _10 := sub(abi_encode_bytes_calldata(expr_317_offset, expr_length, add(expr_mpos, _1)), expr_mpos) + mstore(expr_mpos, add(_10, _6)) + finalize_allocation(expr_mpos, _10) + let _11 := mload(64) + if iszero(staticcall(gas(), 2, _11, sub(abi_encode_bytes_memory_ptr(expr_mpos, _11), _11), 0x00, _1)) { revert_forward() } + let _12 := mload(0x00) + let expr_offset, expr_325_length := calldata_array_index_range_access_bytes_calldata_3133(var_signature_offset, var_signature_length, var_signature_length) + let expr_330_mpos := mload(64) + let _13 := sub(abi_encode_packed_bytes_calldata_slice_bytes32(add(expr_330_mpos, _1), expr_offset, expr_325_length), expr_330_mpos) + mstore(expr_330_mpos, add(_13, _6)) + finalize_allocation(expr_330_mpos, _13) + let _14 := mload(64) + if iszero(staticcall(gas(), 2, _14, sub(abi_encode_bytes_memory_ptr(expr_330_mpos, _14), _14), 0x00, _1)) { revert_forward() } + let _15 := mload(0x00) + let expr_332_mpos := mload(64) + let _16 := sub(abi_encode_packed_bytes32_bytes32(add(expr_332_mpos, _1), _12, _15), expr_332_mpos) + mstore(expr_332_mpos, add(_16, _6)) + finalize_allocation(expr_332_mpos, _16) + let _17 := mload(64) + if iszero(staticcall(gas(), 2, _17, sub(abi_encode_bytes_memory_ptr(expr_332_mpos, _17), _17), 0x00, _1)) { revert_forward() } + let _18 := mload(0x00) + let expr_345_mpos := mload(64) + let _19 := sub(abi_encode_packed_bytes32_bytes_calldata(add(expr_345_mpos, _1), _9, var_withdrawal_credentials_offset, var_withdrawal_credentials_length), expr_345_mpos) + mstore(expr_345_mpos, add(_19, _6)) + finalize_allocation(expr_345_mpos, _19) + let _20 := mload(64) + if iszero(staticcall(gas(), 2, _20, sub(abi_encode_bytes_memory_ptr(expr_345_mpos, _20), _20), 0x00, _1)) { revert_forward() } + let _21 := mload(0x00) + let expr_356_mpos := mload(64) + let _22 := sub(abi_encode_packed_bytes_bytes24_bytes32(add(expr_356_mpos, _1), expr_279_mpos, _18), expr_356_mpos) + mstore(expr_356_mpos, add(_22, _6)) + finalize_allocation(expr_356_mpos, _22) + let _23 := mload(64) + if iszero(staticcall(gas(), 2, _23, sub(abi_encode_bytes_memory_ptr(expr_356_mpos, _23), _23), 0x00, _1)) { revert_forward() } + let _24 := mload(0x00) + let expr_358_mpos := mload(64) + let _25 := sub(abi_encode_packed_bytes32_bytes32(add(expr_358_mpos, _1), _21, _24), expr_358_mpos) + mstore(expr_358_mpos, add(_25, _6)) + finalize_allocation(expr_358_mpos, _25) + let _26 := mload(64) + if iszero(staticcall(gas(), 2, _26, sub(abi_encode_bytes_memory_ptr(expr_358_mpos, _26), _26), 0x00, _1)) { revert_forward() } + let var_node := mload(0x00) + require_helper_stringliteral_18a6(eq(var_node, var_deposit_data_root)) + require_helper_stringliteral_122a(lt(_3, 0xffffffff)) + update_storage_value_offsett_uint256_to_uint256(checked_add_uint256(_3)) + let var_size := sload(_1) + let var_height := 0x00 + for { } + lt(var_height, _1) + { + var_height := increment_uint256(var_height) + } + { + if eq(and(var_size, 0x01), 0x01) + { + let _27, _28 := storage_array_index_access_bytes_3138(var_height) + update_storage_value_bytes32_to_bytes32(_27, _28, var_node) + leave + } + let _29, _30 := storage_array_index_access_bytes_3138(var_height) + let _31 := extract_from_storage_value_dynamict_bytes32(sload(_29), _30) + let expr_416_mpos := mload(64) + let _32 := sub(abi_encode_packed_bytes32_bytes32(add(expr_416_mpos, _1), _31, var_node), expr_416_mpos) + mstore(expr_416_mpos, add(_32, _6)) + finalize_allocation(expr_416_mpos, _32) + let _33 := mload(64) + if iszero(staticcall(gas(), 2, _33, sub(abi_encode_bytes_memory_ptr(expr_416_mpos, _33), _33), 0x00, _1)) { revert_forward() } + var_node := mload(0x00) + var_size := shr(0x01, var_size) + } + assert_helper() + } + function fun_get_deposit_root() -> var + { + let var_node := 0 + let _1 := 0x20 + let var_size := sload(_1) + let var_size_1 := var_size + let var_height := var_node + for { } + lt(var_height, _1) + { + var_height := increment_uint256(var_height) + } + { + let _2 := 0x01 + switch eq(and(var_size, _2), _2) + case 0 { + let _3, _4 := storage_array_index_access_bytes_3142(var_height) + let _5 := extract_from_storage_value_dynamict_bytes32(sload(_3), _4) + let _6 := 64 + let expr_157_mpos := mload(_6) + let _7 := sub(abi_encode_packed_bytes32_bytes32(add(expr_157_mpos, _1), var_node, _5), expr_157_mpos) + mstore(expr_157_mpos, add(_7, not(31))) + finalize_allocation(expr_157_mpos, _7) + let _8 := mload(_6) + if iszero(staticcall(gas(), 0x02, _8, sub(abi_encode_bytes_memory_ptr(expr_157_mpos, _8), _8), 0, _1)) { revert_forward() } + var_node := mload(0) + } + default { + let _9, _10 := storage_array_index_access_bytes(var_height) + let _11 := extract_from_storage_value_dynamict_bytes32(sload(_9), _10) + let _12 := 64 + let expr_145_mpos := mload(_12) + let _13 := sub(abi_encode_packed_bytes32_bytes32(add(expr_145_mpos, _1), _11, var_node), expr_145_mpos) + mstore(expr_145_mpos, add(_13, not(31))) + finalize_allocation(expr_145_mpos, _13) + let _14 := mload(_12) + if iszero(staticcall(gas(), 0x02, _14, sub(abi_encode_bytes_memory_ptr(expr_145_mpos, _14), _14), 0, _1)) { revert_forward() } + var_node := mload(0) + } + var_size := shr(_2, var_size) + } + let expr_177_mpos := fun_to_little_endian(and(var_size_1, 0xffffffffffffffff)) + let expr_182_mpos := mload(64) + let _15 := sub(abi_encode_packed_bytes32_bytes_bytes24(add(expr_182_mpos, _1), var_node, expr_177_mpos), expr_182_mpos) + mstore(expr_182_mpos, add(_15, not(31))) + finalize_allocation(expr_182_mpos, _15) + let _16 := mload(64) + if iszero(staticcall(gas(), 0x02, _16, sub(abi_encode_bytes_memory_ptr(expr_182_mpos, _16), _16), 0, _1)) { revert_forward() } + var := mload(0) + } + function fun_supportsInterface(var_interfaceId) -> var_ + { + let _1 := and(var_interfaceId, shl(224, 0xffffffff)) + let expr := eq(_1, shl(224, 0x01ffc9a7)) + if iszero(expr) + { + expr := eq(_1, shl(224, 0x85640907)) + } + var_ := expr + } + function fun_to_little_endian(var_value) -> var_ret_mpos + { + let memPtr := mload(64) + let newFreePtr := add(memPtr, 64) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + mstore(memPtr, 0x08) + calldatacopy(add(memPtr, 0x20), calldatasize(), 0x20) + var_ret_mpos := memPtr + let expr := and(shl(192, var_value), shl(192, 0xffffffffffffffff)) + mstore8(memory_array_index_access_bytes_3147(memPtr), byte(0x07, expr)) + mstore8(memory_array_index_access_bytes_3148(memPtr), byte(0x06, expr)) + mstore8(memory_array_index_access_bytes_3149(memPtr), byte(0x05, expr)) + mstore8(memory_array_index_access_bytes_3150(memPtr), byte(0x04, expr)) + mstore8(memory_array_index_access_bytes_3151(memPtr), byte(0x03, expr)) + mstore8(memory_array_index_access_bytes_3152(memPtr), byte(0x02, expr)) + mstore8(memory_array_index_access_bytes_3153(memPtr), byte(1, expr)) + mstore8(memory_array_index_access_bytes(memPtr), byte(0, expr)) + } + function increment_uint256(value) -> ret + { + if eq(value, not(0)) { panic_error_0x11() } + ret := add(value, 1) + } + function memory_array_index_access_bytes_3147(baseRef) -> addr + { + if iszero(mload(baseRef)) { panic_error_0x32() } + addr := add(baseRef, 32) + } + function memory_array_index_access_bytes_3148(baseRef) -> addr + { + if iszero(lt(0x01, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 33) + } + function memory_array_index_access_bytes_3149(baseRef) -> addr + { + if iszero(lt(0x02, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 34) + } + function memory_array_index_access_bytes_3150(baseRef) -> addr + { + if iszero(lt(0x03, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 35) + } + function memory_array_index_access_bytes_3151(baseRef) -> addr + { + if iszero(lt(0x04, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 36) + } + function memory_array_index_access_bytes_3152(baseRef) -> addr + { + if iszero(lt(0x05, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 37) + } + function memory_array_index_access_bytes_3153(baseRef) -> addr + { + if iszero(lt(0x06, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 38) + } + function memory_array_index_access_bytes(baseRef) -> addr + { + if iszero(lt(0x07, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 39) + } + function panic_error_0x11() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x11) + revert(0, 0x24) + } + function panic_error_0x32() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x32) + revert(0, 0x24) + } + function panic_error_0x41() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x41) + revert(0, 0x24) + } + function require_helper_stringliteral_122a(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 33) + mstore(add(memPtr, 68), "DepositContract: merkle tree ful") + mstore(add(memPtr, 100), "l") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_18a6(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 84) + mstore(add(memPtr, 68), "DepositContract: reconstructed D") + mstore(add(memPtr, 100), "epositData does not match suppli") + mstore(add(memPtr, 132), "ed deposit_data_root") + revert(memPtr, 164) + } + } + function require_helper_stringliteral(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 54) + mstore(add(memPtr, 68), "DepositContract: invalid withdra") + mstore(add(memPtr, 100), "wal_credentials length") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_7db0(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 51) + mstore(add(memPtr, 68), "DepositContract: deposit value n") + mstore(add(memPtr, 100), "ot multiple of gwei") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_c3b5(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 38) + mstore(add(memPtr, 68), "DepositContract: invalid pubkey ") + mstore(add(memPtr, 100), "length") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_c445(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 39) + mstore(add(memPtr, 68), "DepositContract: deposit value t") + mstore(add(memPtr, 100), "oo high") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_d4d9(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 38) + mstore(add(memPtr, 68), "DepositContract: deposit value t") + mstore(add(memPtr, 100), "oo low") + revert(memPtr, 132) + } + } + function require_helper_stringliteral_e15d(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 41) + mstore(add(memPtr, 68), "DepositContract: invalid signatu") + mstore(add(memPtr, 100), "re length") + revert(memPtr, 132) + } + } + function revert_forward() + { + let pos := mload(64) + returndatacopy(pos, 0, returndatasize()) + revert(pos, returndatasize()) + } + function storage_array_index_access_bytes_3138(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := index + offset := 0x00 + } + function storage_array_index_access_bytes_3142(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := add(0x21, index) + offset := 0 + } + function storage_array_index_access_bytes(index) -> slot, offset + { + if iszero(lt(index, 0x20)) { panic_error_0x32() } + slot := index + offset := 0 + } + function update_storage_value_offsett_uint256_to_uint256(value) + { sstore(0x20, value) } + function update_storage_value_bytes32_to_bytes32(slot, offset, value) + { + let _1 := sload(slot) + let shiftBits := shl(3, offset) + let mask := shl(shiftBits, not(0)) + sstore(slot, or(and(_1, not(mask)), and(shl(shiftBits, value), mask))) + } + } + data ".metadata" hex"a26469706673582212202f56134a5751d05d455a5737a74bc9c657eb244486a01b94998c4346d1a507d064736f6c637826302e382e372d646576656c6f702e323032312e372e372b636f6d6d69742e30306330666361660057" + } +} +// ---- \ No newline at end of file