diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt index fde673e3d..e512a1b9b 100644 --- a/libyul/CMakeLists.txt +++ b/libyul/CMakeLists.txt @@ -71,6 +71,8 @@ add_library(yul backends/evm/EVMObjectCompiler.h backends/evm/EVMMetrics.cpp backends/evm/EVMMetrics.h + backends/evm/DirectStackLayoutGenerator.cpp + backends/evm/DirectStackLayoutGenerator.h backends/evm/NoOutputAssembly.h backends/evm/NoOutputAssembly.cpp backends/evm/OptimizedEVMCodeTransform.cpp diff --git a/libyul/backends/evm/DirectStackLayoutGenerator.cpp b/libyul/backends/evm/DirectStackLayoutGenerator.cpp new file mode 100644 index 000000000..7a84dd2d6 --- /dev/null +++ b/libyul/backends/evm/DirectStackLayoutGenerator.cpp @@ -0,0 +1,84 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +// SPDX-License-Identifier: GPL-3.0 +/** + * Stack layout generator for Yul to EVM code generation. + */ + +#include + +#include + +#include +#include + +using namespace solidity; +using namespace solidity::yul; +using namespace std; + +void DirectStackLayoutGenerator::run(Block const& _block) +{ + yulAssert(_block.statements.size() > 0, ""); + yulAssert(holds_alternative(_block.statements.front()), ""); + + { + DirectStackLayoutGenerator generator; + generator(get(_block.statements.front())); + } + for (Statement const& statement: _block.statements | ranges::views::drop_exactly(1)) + { + FunctionDefinition const* functionDefinition = get_if(&statement); + yulAssert(functionDefinition, ""); + DirectStackLayoutGenerator generator; + generator(*functionDefinition); + } +} + +void DirectStackLayoutGenerator::operator()(Block const& _block) +{ + for (Statement const& statement: _block.statements | ranges::views::reverse) + visit(statement); +} + +void DirectStackLayoutGenerator::operator()(VariableDeclaration const& _variableDeclaration) +{ + +} + +void DirectStackLayoutGenerator::operator()(Assignment const& _assignment) +{ + +} + +void DirectStackLayoutGenerator::operator()(ExpressionStatement const& _expressionStatement) +{ + +} + +void DirectStackLayoutGenerator::operator()(If const& _if) +{ +} +void DirectStackLayoutGenerator::operator()(Switch const& _switch) +{ +} +void DirectStackLayoutGenerator::operator()(ForLoop const& _forLoop) +{ +} + +void DirectStackLayoutGenerator::operator()(FunctionDefinition const& _functionDefinition) +{ +} \ No newline at end of file diff --git a/libyul/backends/evm/DirectStackLayoutGenerator.h b/libyul/backends/evm/DirectStackLayoutGenerator.h new file mode 100644 index 000000000..352051e66 --- /dev/null +++ b/libyul/backends/evm/DirectStackLayoutGenerator.h @@ -0,0 +1,67 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +// SPDX-License-Identifier: GPL-3.0 +/** + * Stack layout generator for Yul to EVM code generation. + */ + +#pragma once + +#include + +#include + +namespace solidity::yul +{ + +struct StackLayout +{ + struct StackInfo + { + Stack entry; + Stack exit; + }; + std::map blockInfos; + std::map statementInfos; +}; + +class DirectStackLayoutGenerator: public ASTWalker +{ +public: + static void run(Block const& _ast); + + virtual void operator()(Literal const&) {} + virtual void operator()(Identifier const&) {} + virtual void operator()(FunctionCall const& _funCall); + virtual void operator()(ExpressionStatement const& _statement); + virtual void operator()(Assignment const& _assignment); + virtual void operator()(VariableDeclaration const& _varDecl); + virtual void operator()(If const& _if); + virtual void operator()(Switch const& _switch); + virtual void operator()(ForLoop const&); + virtual void operator()(FunctionDefinition const&); + virtual void operator()(Break const&); + virtual void operator()(Continue const&); + virtual void operator()(Leave const&); + virtual void operator()(Block const& _block); + +private: + DirectStackLayoutGenerator() {} + Stack m_stack; +}; + +} diff --git a/test/libyul/evmCodeTransform/test.yul b/test/libyul/evmCodeTransform/test.yul new file mode 100644 index 000000000..bb8895b51 --- /dev/null +++ b/test/libyul/evmCodeTransform/test.yul @@ -0,0 +1,2361 @@ +{ + { + let _1 := 64 + mstore(_1, 128) + if iszero(lt(calldatasize(), 4)) + { + let _2 := 0 + switch shr(224, calldataload(_2)) + case 0x37fe974a { + if callvalue() { revert(_2, _2) } + let ret := fun_computeLiquidity(abi_decode_tuple_address(calldatasize())) + let memPos := mload(_1) + return(memPos, sub(abi_encode_tuple_struct_LiquidityStatus(memPos, ret), memPos)) + } + case 0x41976e09 { + if callvalue() { revert(_2, _2) } + let ret_1, ret_2 := fun_getPrice(abi_decode_tuple_address(calldatasize())) + let memPos_1 := mload(_1) + return(memPos_1, sub(abi_encode_uint256_uint256(memPos_1, ret_1, ret_2), memPos_1)) + } + case 0x69a92ea3 { + if callvalue() { revert(_2, _2) } + abi_decode_12552(calldatasize()) + let memPos_2 := mload(_1) + return(memPos_2, sub(abi_encode_bytes32(memPos_2, loadimmutable("3064")), memPos_2)) + } + case 0x8eddcd92 { + if callvalue() { revert(_2, _2) } + let ret_3 := fun_getNewMarketParameters(abi_decode_tuple_address(calldatasize())) + let memPos_3 := mload(_1) + return(memPos_3, sub(abi_encode_struct_NewMarketParameters(memPos_3, ret_3), memPos_3)) + } + case 0x9693fa6b { + if callvalue() { revert(_2, _2) } + let ret_4, ret_5, ret_6 := fun_getPriceFull(abi_decode_tuple_address(calldatasize())) + let memPos_4 := mload(_1) + return(memPos_4, sub(abi_encode_uint256_uint256_uint256(memPos_4, ret_4, ret_5, ret_6), memPos_4)) + } + case 0xa1308f27 { + if callvalue() { revert(_2, _2) } + abi_decode_12552(calldatasize()) + let memPos_5 := mload(_1) + return(memPos_5, sub(abi_encode_bytes32(memPos_5, loadimmutable("3062")), memPos_5)) + } + case 0xc39b543a { + if callvalue() { revert(_2, _2) } + fun_requireLiquidity(abi_decode_tuple_address(calldatasize())) + return(mload(_1), _2) + } + case 0xebd7ba19 { + if callvalue() { revert(_2, _2) } + let ret_7 := fun_computeAssetLiquidities(abi_decode_tuple_address(calldatasize())) + let memPos_6 := mload(_1) + return(memPos_6, sub(abi_encode_array_struct_AssetLiquidity_dyn(memPos_6, ret_7), memPos_6)) + } + case 0xf70c2fde { + if callvalue() { revert(_2, _2) } + let param, param_1 := abi_decode_struct_AssetCachet_struct_AssetConfig(calldatasize()) + let var_twap, var_twapPeriod := modifier_FREEMEM(param, param_1) + let memPos_7 := mload(_1) + return(memPos_7, sub(abi_encode_uint256_uint256(memPos_7, var_twap, var_twapPeriod), memPos_7)) + } + } + revert(0, 0) + } + function cleanup_address(value) -> cleaned + { + cleaned := and(value, sub(shl(160, 1), 1)) + } + function validator_revert_address(value) + { + if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) } + } + function abi_decode_address() -> value + { + value := calldataload(4) + validator_revert_address(value) + } + function abi_decode_tuple_address(dataEnd) -> value0 + { + if slt(add(dataEnd, not(3)), 32) { revert(0, 0) } + let value := calldataload(4) + validator_revert_address(value) + value0 := value + } + function cleanup_bool(value) -> cleaned + { + cleaned := iszero(iszero(value)) + } + function abi_encode_struct_LiquidityStatus(value, pos) + { + mstore(pos, mload(value)) + mstore(add(pos, 0x20), mload(add(value, 0x20))) + mstore(add(pos, 0x40), mload(add(value, 0x40))) + mstore(add(pos, 0x60), iszero(iszero(mload(add(value, 0x60))))) + } + function abi_encode_tuple_struct_LiquidityStatus(headStart, value0) -> tail + { + tail := add(headStart, 128) + abi_encode_struct_LiquidityStatus(value0, headStart) + } + function abi_encode_uint256_uint256(headStart, value0, value1) -> tail + { + tail := add(headStart, 64) + mstore(headStart, value0) + mstore(add(headStart, 32), value1) + } + function abi_decode_12552(dataEnd) + { + if slt(add(dataEnd, not(3)), 0) { revert(0, 0) } + } + function abi_decode(headStart, dataEnd) + { + if slt(sub(dataEnd, headStart), 0) { revert(0, 0) } + } + function abi_encode_bytes32(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, value0) + } + function cleanup_uint32(value) -> cleaned + { + cleaned := and(value, 0xffffffff) + } + function cleanup_uint24(value) -> cleaned + { + cleaned := and(value, 0xffffff) + } + function abi_encode_struct_NewMarketParameters(headStart, value0) -> tail + { + tail := add(headStart, 224) + mstore(headStart, and(mload(value0), 0xffff)) + let _1 := 0xffffffff + mstore(add(headStart, 0x20), and(mload(add(value0, 0x20)), _1)) + let memberValue0 := mload(add(value0, 0x40)) + mstore(add(headStart, 0x40), and(mload(memberValue0), sub(shl(160, 1), 1))) + mstore(add(headStart, 96), iszero(iszero(mload(add(memberValue0, 0x20))))) + mstore(add(headStart, 128), and(mload(add(memberValue0, 0x40)), _1)) + mstore(add(headStart, 160), and(mload(add(memberValue0, 96)), _1)) + mstore(add(headStart, 192), and(mload(add(memberValue0, 128)), 0xffffff)) + } + function abi_encode_uint256_uint256_uint256(headStart, value0, value1, value2) -> tail + { + tail := add(headStart, 96) + mstore(headStart, value0) + mstore(add(headStart, 32), value1) + mstore(add(headStart, 64), value2) + } + function abi_encode_array_struct_AssetLiquidity_dyn(headStart, value0) -> tail + { + let _1 := 32 + let tail_1 := add(headStart, _1) + mstore(headStart, _1) + let pos := tail_1 + let length := mload(value0) + mstore(tail_1, length) + pos := add(headStart, 64) + let srcPtr := add(value0, _1) + let i := 0 + for { } lt(i, length) { i := add(i, 1) } + { + let _2 := mload(srcPtr) + mstore(pos, and(mload(_2), sub(shl(160, 1), 1))) + let memberValue0 := mload(add(_2, _1)) + abi_encode_struct_LiquidityStatus(memberValue0, add(pos, _1)) + pos := add(pos, 160) + srcPtr := add(srcPtr, _1) + } + tail := pos + } + function panic_error_0x41() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x41) + revert(0, 0x24) + } + function finalize_allocation_12563(memPtr) + { + let newFreePtr := add(memPtr, 160) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_12670(memPtr) + { + let newFreePtr := add(memPtr, 64) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_22851(memPtr) + { + let newFreePtr := add(memPtr, 128) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_22852(memPtr) + { + let newFreePtr := add(memPtr, 96) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + 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 allocate_memory_12562() -> memPtr + { + memPtr := mload(64) + let newFreePtr := add(memPtr, 0x01e0) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function allocate_memory() -> memPtr + { + memPtr := mload(64) + finalize_allocation_22851(memPtr) + } + function cleanup_uint112(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffffffff) + } + function abi_decode_uint112() -> value + { + value := calldataload(36) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint144(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffffffffffffffff) + } + function abi_decode_uint144() -> value + { + value := calldataload(68) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint96(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffff) + } + function abi_decode_uint96() -> value + { + value := calldataload(100) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint40(value) -> cleaned + { + cleaned := and(value, 0xffffffffff) + } + function abi_decode_uint40() -> value + { + value := calldataload(164) + if iszero(eq(value, and(value, 0xffffffffff))) { revert(0, 0) } + } + function validator_revert_uint8(value) + { + if iszero(eq(value, and(value, 0xff))) { revert(0, 0) } + } + function abi_decode_uint8() -> value + { + value := calldataload(196) + validator_revert_uint8(value) + } + function validator_revert_uint32(value) + { + if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) } + } + function abi_decode_uint32_22844() -> value + { + value := calldataload(228) + validator_revert_uint32(value) + } + function abi_decode_uint32_22846() -> value + { + value := calldataload(292) + validator_revert_uint32(value) + } + function abi_decode_uint32() -> value + { + value := calldataload(356) + validator_revert_uint32(value) + } + function cleanup_int96(value) -> cleaned + { + cleaned := signextend(11, value) + } + function abi_decode_int96() -> value + { + value := calldataload(260) + if iszero(eq(value, signextend(11, value))) { revert(0, 0) } + } + function validator_revert_uint16(value) + { + if iszero(eq(value, and(value, 0xffff))) { revert(0, 0) } + } + function abi_decode_uint16() -> value + { + value := calldataload(324) + validator_revert_uint16(value) + } + function validator_revert_bool(value) + { + if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) } + } + function abi_decode_struct_AssetConfig(end) -> value + { + if slt(add(end, not(483)), 0xa0) { revert(0, 0) } + let memPtr := mload(64) + let newFreePtr := add(memPtr, 0xa0) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + value := memPtr + let value_1 := calldataload(484) + validator_revert_address(value_1) + mstore(memPtr, value_1) + let value_2 := calldataload(516) + validator_revert_bool(value_2) + mstore(add(memPtr, 32), value_2) + let value_3 := calldataload(548) + validator_revert_uint32(value_3) + mstore(add(memPtr, 64), value_3) + let value_4 := calldataload(580) + validator_revert_uint32(value_4) + mstore(add(memPtr, 96), value_4) + let value_5 := calldataload(612) + if iszero(eq(value_5, and(value_5, 0xffffff))) { revert(0, 0) } + mstore(add(memPtr, 128), value_5) + } + function abi_decode_struct_AssetCachet_struct_AssetConfig(dataEnd) -> value0, value1 + { + let _1 := add(dataEnd, not(3)) + if slt(_1, 640) { revert(0, 0) } + if slt(_1, 0x01e0) { revert(0, 0) } + let value := allocate_memory_12562() + mstore(value, abi_decode_address()) + mstore(add(value, 32), abi_decode_uint112()) + mstore(add(value, 64), abi_decode_uint144()) + mstore(add(value, 96), abi_decode_uint96()) + mstore(add(value, 128), calldataload(132)) + mstore(add(value, 160), abi_decode_uint40()) + mstore(add(value, 192), abi_decode_uint8()) + mstore(add(value, 224), abi_decode_uint32_22844()) + mstore(add(value, 256), abi_decode_int96()) + mstore(add(value, 288), abi_decode_uint32_22846()) + mstore(add(value, 320), abi_decode_uint16()) + mstore(add(value, 352), abi_decode_uint32()) + mstore(add(value, 384), calldataload(388)) + mstore(add(value, 416), calldataload(420)) + mstore(add(value, 448), calldataload(452)) + value0 := value + value1 := abi_decode_struct_AssetConfig(dataEnd) + } + function allocate_and_zero_memory_struct_struct_AssetConfig() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_12563(memPtr_1) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), 0) + mstore(add(memPtr_1, 96), 0) + mstore(add(memPtr_1, 128), 0) + } + function allocate_and_zero_memory_struct_struct_NewMarketParameters() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 96) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), allocate_and_zero_memory_struct_struct_AssetConfig()) + } + function write_to_memory_bool(memPtr) + { mstore(memPtr, 0x01) } + function write_to_memory_uint32_12567(memPtr) + { mstore(memPtr, 0xffffffff) } + function write_to_memory_uint32_12631(memPtr) + { mstore(memPtr, 0x42c1d800) } + function write_to_memory_uint32(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffff)) + } + function write_to_memory_uint24_12568(memPtr) + { mstore(memPtr, 16777215) } + function write_to_memory_uint24_12571(memPtr) + { mstore(memPtr, 3000) } + function write_to_memory_uint24_12572(memPtr) + { mstore(memPtr, 10000) } + function write_to_memory_uint24_12573(memPtr) + { mstore(memPtr, 500) } + function write_to_memory_uint24_12574(memPtr) + { mstore(memPtr, 100) } + function write_to_memory_uint24(memPtr) + { mstore(memPtr, 1800) } + function mapping_index_access_mapping_address_address_of_address_12569(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x0b) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12580(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x08) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12628(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x09) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12656(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x07) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address(slot, key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, slot) + dataSlot := keccak256(0, 0x40) + } + function read_from_storage_split_offset_address(slot) -> value + { + value := and(sload(slot), sub(shl(160, 1), 1)) + } + function panic_error_0x11() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x11) + revert(0, 0x24) + } + function increment_uint256(value) -> ret + { + if eq(value, not(0)) { panic_error_0x11() } + ret := add(value, 1) + } + function panic_error_0x32() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x32) + revert(0, 0x24) + } + function memory_array_index_access_uint24(baseRef, index) -> addr + { + if iszero(lt(index, 0x04)) { panic_error_0x32() } + addr := add(baseRef, shl(5, index)) + } + function read_from_memoryt_uint24(ptr) -> returnValue + { + returnValue := and(mload(ptr), 0xffffff) + } + function abi_decode_address_fromMemory(headStart, dataEnd) -> value0 + { + if slt(sub(dataEnd, headStart), 32) { revert(0, 0) } + let value := mload(headStart) + validator_revert_address(value) + value0 := value + } + function abi_encode_address_address_uint24(headStart, value0, value1, value2) -> tail + { + tail := add(headStart, 96) + let _1 := sub(shl(160, 1), 1) + mstore(headStart, and(value0, _1)) + mstore(add(headStart, 32), and(value1, _1)) + mstore(add(headStart, 64), and(value2, 0xffffff)) + } + function revert_forward() + { + let pos := mload(64) + returndatacopy(pos, 0, returndatasize()) + revert(pos, returndatasize()) + } + function abi_decode_uint128_fromMemory(headStart, dataEnd) -> value0 + { + if slt(sub(dataEnd, headStart), 32) { revert(0, 0) } + let value := mload(headStart) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffff))) { revert(0, 0) } + value0 := value + } + function require_helper_stringliteral_15dc(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 23) + mstore(add(memPtr, 68), "e/no-uniswap-pool-avail") + revert(memPtr, 100) + } + } + function require_helper_stringliteral_cad5(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 23) + mstore(add(memPtr, 68), "e/bad-uniswap-pool-addr") + revert(memPtr, 100) + } + } + function write_to_memory_uint16_12575(memPtr) + { mstore(memPtr, 2) } + function write_to_memory_uint16_12577(memPtr) + { mstore(memPtr, 3) } + function write_to_memory_uint16_12581(memPtr) + { mstore(memPtr, 1) } + function write_to_memory_uint16(memPtr, value) + { + mstore(memPtr, and(value, 0xffff)) + } + function abi_encode_uint16_to_uint16(headStart) -> tail + { + tail := add(headStart, 32) + mstore(headStart, 10) + } + function abi_encode_uint16(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, and(value0, 0xffff)) + } + function return_data_selector() -> sig + { + if gt(returndatasize(), 3) + { + returndatacopy(0, 0, 4) + sig := shr(224, mload(0)) + } + } + function try_decode_error_message() -> ret + { + if lt(returndatasize(), 0x44) { leave } + let data := mload(64) + let _1 := not(3) + returndatacopy(data, 4, add(returndatasize(), _1)) + let offset := mload(data) + let _2 := returndatasize() + let _3 := 0xffffffffffffffff + if or(gt(offset, _3), gt(add(offset, 0x24), _2)) { leave } + let msg := add(data, offset) + let length := mload(msg) + if gt(length, _3) { leave } + if gt(add(add(msg, length), 0x20), add(add(data, returndatasize()), _1)) { leave } + finalize_allocation(data, add(add(offset, length), 0x20)) + ret := msg + } + function abi_encode_stringliteral(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 30) + mstore(add(headStart, 64), "e/risk/uniswap-pool-not-inited") + tail := add(headStart, 96) + } + function abi_encode_stringliteral_92b3(pos) -> end + { + mstore(pos, "e/risk/uniswap/") + end := add(pos, 15) + } + 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 abi_encode_string_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_string(headStart, value0) -> tail + { + mstore(headStart, 32) + let length := mload(value0) + mstore(add(headStart, 32), length) + copy_memory_to_memory(add(value0, 32), add(headStart, 64), length) + tail := add(add(headStart, and(add(length, 31), not(31))), 64) + } + function extract_returndata() -> data + { + switch returndatasize() + case 0 { data := 96 } + default { + let _1 := returndatasize() + if gt(_1, 0xffffffffffffffff) { panic_error_0x41() } + let memPtr := mload(64) + finalize_allocation(memPtr, add(and(add(_1, 31), not(31)), 0x20)) + mstore(memPtr, _1) + data := memPtr + returndatacopy(add(memPtr, 0x20), 0, returndatasize()) + } + } + function read_from_storage_split_offset_uint32(slot) -> value + { + value := and(shr(168, sload(slot)), 0xffffffff) + } + /// @ast-id 10602 + function fun_getNewMarketParameters(var_underlying) -> var_p_mpos + { + var_p_mpos := allocate_and_zero_memory_struct_struct_NewMarketParameters() + let _1 := 64 + let _2 := add(var_p_mpos, _1) + let _3 := 32 + write_to_memory_bool(add(mload(_2), _3)) + let _4 := 0 + mstore(add(mload(_2), _1), _4) + write_to_memory_uint32_12567(add(mload(_2), 96)) + write_to_memory_uint24_12568(add(mload(_2), 128)) + let _5 := loadimmutable("10268") + let _6 := sub(shl(160, 1), 1) + switch eq(and(var_underlying, _6), and(_5, _6)) + case 0 { + switch iszero(iszero(and(read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(var_underlying)), _6))) + case 0 { + let var_pool := _4 + let var_fee := _4 + let expr_10439_mpos := allocate_memory() + write_to_memory_uint24_12571(expr_10439_mpos) + write_to_memory_uint24_12572(add(expr_10439_mpos, _3)) + write_to_memory_uint24_12573(add(expr_10439_mpos, _1)) + write_to_memory_uint24_12574(add(expr_10439_mpos, 96)) + let var_bestLiquidity := _4 + let var_i := _4 + let _7 := and(loadimmutable("10270"), _6) + for { } + 1 + { + var_i := increment_uint256(var_i) + } + { + let _8 := 4 + if iszero(lt(var_i, _8)) { break } + let _9 := read_from_memoryt_uint24(memory_array_index_access_uint24(expr_10439_mpos, var_i)) + let _10 := mload(_1) + mstore(_10, shl(225, 0x0b4c7741)) + let _11 := staticcall(gas(), _7, _10, sub(abi_encode_address_address_uint24(add(_10, _8), var_underlying, _5, _9), _10), _10, _3) + if iszero(_11) { revert_forward() } + let expr := _4 + if _11 + { + finalize_allocation(_10, returndatasize()) + expr := abi_decode_address_fromMemory(_10, add(_10, returndatasize())) + } + let _12 := and(expr, _6) + if iszero(_12) { continue } + let _13 := mload(_1) + mstore(_13, shl(225, 0x0d343281)) + let _14 := staticcall(gas(), _12, _13, _8, _13, _3) + if iszero(_14) { revert_forward() } + let expr_1 := _4 + if _14 + { + finalize_allocation(_13, returndatasize()) + expr_1 := abi_decode_uint128_fromMemory(_13, add(_13, returndatasize())) + } + let expr_2 := iszero(and(var_pool, _6)) + if iszero(expr_2) + { + let _15 := 0xffffffffffffffffffffffffffffffff + expr_2 := gt(and(expr_1, _15), and(var_bestLiquidity, _15)) + } + if expr_2 + { + var_pool := expr + var_fee := read_from_memoryt_uint24(memory_array_index_access_uint24(expr_10439_mpos, var_i)) + var_bestLiquidity := expr_1 + } + } + let _16 := and(var_pool, _6) + require_helper_stringliteral_15dc(iszero(iszero(_16))) + require_helper_stringliteral_cad5(eq(cleanup_address(fun_computeUniswapPoolAddress(var_underlying, var_fee)), _16)) + write_to_memory_uint16_12575(var_p_mpos) + write_to_memory_uint32(add(var_p_mpos, _3), and(var_fee, 16777215)) + if iszero(extcodesize(_16)) { revert(_4, _4) } + let _17 := mload(_1) + mstore(_17, shl(224, 0x32148f67)) + let trySuccessCondition := call(gas(), _16, _4, _17, sub(abi_encode_uint16_to_uint16(add(_17, 4)), _17), _17, _4) + if trySuccessCondition + { + finalize_allocation(_17, returndatasize()) + abi_decode(_17, add(_17, returndatasize())) + } + switch iszero(trySuccessCondition) + case 0 { } + default { + let _18 := 1 + if eq(147028384, return_data_selector()) + { + let _19 := try_decode_error_message() + if _19 + { + _18 := _4 + if eq(keccak256(add(_19, _3), mload(_19)), 0xe01ebc6b01bbf458b3d355b6e649efe64599751670c5d19175619893ecf97529) + { + let _20 := mload(_1) + mstore(_20, shl(229, 4594637)) + revert(_20, sub(abi_encode_stringliteral(add(_20, 4)), _20)) + } + let expr_10582_mpos := mload(_1) + let _21 := sub(abi_encode_string_memory_ptr(_19, abi_encode_stringliteral_92b3(add(expr_10582_mpos, _3))), expr_10582_mpos) + mstore(expr_10582_mpos, add(_21, not(31))) + finalize_allocation(expr_10582_mpos, _21) + let _22 := mload(_1) + mstore(_22, shl(229, 4594637)) + revert(_22, sub(abi_encode_string(add(_22, 4), expr_10582_mpos), _22)) + } + } + if _18 + { + fun_revertBytes(extract_returndata()) + } + } + } + default { + write_to_memory_uint16_12577(var_p_mpos) + mstore(add(var_p_mpos, _3), _4) + write_to_memory_uint32(add(mload(_2), _1), read_from_storage_split_offset_uint32(mapping_index_access_mapping_address_address_of_address_12580(read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(var_underlying))))) + } + } + default { + write_to_memory_uint16_12581(var_p_mpos) + mstore(add(var_p_mpos, _3), _4) + } + } + /// @ast-id 164 + function fun_revertBytes(var_errMsg_mpos) + { + let expr := mload(var_errMsg_mpos) + if iszero(iszero(expr)) + { + revert(add(32, var_errMsg_mpos), expr) + } + let _1 := mload(64) + mstore(_1, shl(229, 4594637)) + mstore(add(_1, 4), 32) + mstore(add(_1, 36), 13) + mstore(add(_1, 68), "e/empty-error") + revert(_1, 100) + } + /// @ast-id 10658 + function fun_computeUniswapPoolAddress(var_underlying, var_fee) -> var + { + let var_tokenA := var_underlying + let var_tokenB := loadimmutable("10268") + let var_tokenB_1 := var_tokenB + let _1 := sub(shl(160, 1), 1) + if gt(and(var_underlying, _1), and(var_tokenB, _1)) + { + var_tokenB := var_underlying + var_tokenA := var_tokenB_1 + } + let expr_10648_mpos := mload(64) + let _2 := add(expr_10648_mpos, 0x20) + let _3 := sub(abi_encode_address_address_uint24(_2, var_tokenA, var_tokenB, var_fee), expr_10648_mpos) + mstore(expr_10648_mpos, add(_3, not(31))) + finalize_allocation(expr_10648_mpos, _3) + let expr := keccak256(_2, mload(expr_10648_mpos)) + let expr_10651_mpos := mload(64) + let _4 := add(expr_10651_mpos, 0x20) + mstore(_4, shl(248, 255)) + mstore(add(expr_10651_mpos, 33), and(shl(96, loadimmutable("10270")), not(0xffffffffffffffffffffffff))) + mstore(add(expr_10651_mpos, 53), expr) + mstore(add(expr_10651_mpos, 85), loadimmutable("10272")) + mstore(expr_10651_mpos, 85) + finalize_allocation_22851(expr_10651_mpos) + var := cleanup_address(cleanup_address(keccak256(_4, mload(expr_10651_mpos)))) + } + /// @ast-id 147 + function modifier_FREEMEM(var_assetCache_mpos, var_config_mpos) -> _1, _2 + { + let _3 := 0x40 + let var_origFreeMemPtr := mload(_3) + let var_twap := 0 + let var_twapPeriod := var_twap + var_twap := var_twap + var_twapPeriod := 0 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(var_assetCache_mpos, var_config_mpos) + let _4 := 0xffff + let _5 := and(expr_component_1, _4) + switch eq(_5, 0x01) + case 0 { + switch eq(_5, 0x02) + case 0 { + let _6 := mload(_3) + mstore(_6, shl(229, 4594637)) + revert(_6, sub(abi_encode_stringliteral_ee51(add(_6, 4)), _6)) + } + default { + let _7 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _7)) + let var_ago := and(expr_component_3, _7) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), var_twapPeriod) + let expr_mpos_1 := mload(_3) + let _8 := add(expr_mpos_1, 0x20) + let _9 := shl(224, 0x883bdbfd) + mstore(_8, _9) + let _10 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _11 := not(31) + mstore(expr_mpos_1, add(_10, _11)) + finalize_allocation(expr_mpos_1, _10) + let expr_component_4 := staticcall(gas(), expr, _8, mload(expr_mpos_1), var_twapPeriod, var_twapPeriod) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, 0x20), mload(var_data_mpos)) + let expr_mpos_2 := mload(_3) + let _12 := add(expr_mpos_2, 0x20) + mstore(_12, shl(229, 4594637)) + let _13 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_13, _11)) + finalize_allocation(expr_mpos_2, _13) + if iszero(eq(expr_1, keccak256(_12, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _14 := and(expr, sub(shl(160, 1), 1)) + let _15 := mload(_3) + mstore(_15, shl(224, 0x3850c7bd)) + let _16 := staticcall(gas(), _14, _15, 4, _15, 224) + if iszero(_16) { revert_forward() } + let expr_component_5 := var_twapPeriod + let expr_component_6 := var_twapPeriod + let expr_component_7 := var_twapPeriod + if _16 + { + finalize_allocation(_15, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_15, add(_15, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _17 := mload(_3) + let _18 := shl(224, 0x252c09d7) + mstore(_17, _18) + let _19 := staticcall(gas(), _14, _17, sub(abi_encode_uint16(add(_17, 4), expr_2), _17), _17, 128) + if iszero(_19) { revert_forward() } + let expr_component_15 := var_twapPeriod + let expr_component_16 := var_twapPeriod + if _19 + { + finalize_allocation(_17, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_17, add(_17, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _20 := mload(_3) + mstore(_20, _18) + let _21 := staticcall(gas(), _14, _20, sub(abi_encode_rational_by(add(_20, 4)), _20), _20, 128) + if iszero(_21) { revert_forward() } + let expr_component_21 := var_twapPeriod + if _21 + { + finalize_allocation(_20, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _22 := and(expr_component_6, _4) + let expr_3 := eq(_22, and(expr_component_7, _4)) + if expr_3 { expr_3 := lt(_22, _4) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_14)) + { + revert(var_twapPeriod, var_twapPeriod) + } + let _23 := mload(_3) + mstore(_23, shl(224, 0x32148f67)) + let _24 := call(gas(), _14, var_twapPeriod, _23, sub(abi_encode_uint16(add(_23, 4), expr_4), _23), _23, var_twapPeriod) + if iszero(_24) { revert_forward() } + if _24 + { + finalize_allocation(_23, returndatasize()) + abi_decode(_23, add(_23, returndatasize())) + } + } + let _25 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _25)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _25)) + let expr_mpos_3 := mload(_3) + let _26 := add(expr_mpos_3, 0x20) + mstore(_26, _9) + let _27 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_27, _11)) + finalize_allocation(expr_mpos_3, _27) + let expr_component_26 := staticcall(gas(), expr, _26, mload(expr_mpos_3), var_twapPeriod, var_twapPeriod) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, 0x20), add(add(var_data_mpos, mload(var_data_mpos)), 0x20)) + let _28 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_28, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(var_assetCache_mpos, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod := var_ago + var_twap := var + } + } + default { + var_twap := 0x0de0b6b3a7640000 + var_twapPeriod := and(expr_component_3, 0xffffff) + } + _1 := var_twap + _2 := var_twapPeriod + mstore(_3, var_origFreeMemPtr) + } + /// @ast-id 147 + function modifier_FREEMEM_12660(var_assetCache_mpos, var_config_mpos) -> _1, _2 + { + let _3 := 0x40 + let var_origFreeMemPtr := mload(_3) + let var_twap := 0x00 + let var_twapPeriod := var_twap + var_twap := var_twap + var_twapPeriod := 0x00 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(var_assetCache_mpos, var_config_mpos) + let _4 := 0xffff + let _5 := and(expr_component_1, _4) + switch eq(_5, 0x01) + case 0 { + switch eq(_5, 0x02) + case 0 { + let _6 := mload(_3) + mstore(_6, shl(229, 4594637)) + revert(_6, sub(abi_encode_stringliteral_ee51(add(_6, 4)), _6)) + } + default { + let _7 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _7)) + let var_ago := and(expr_component_3, _7) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), var_twapPeriod) + let expr_mpos_1 := mload(_3) + let _8 := add(expr_mpos_1, 0x20) + let _9 := shl(224, 0x883bdbfd) + mstore(_8, _9) + let _10 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _11 := not(31) + mstore(expr_mpos_1, add(_10, _11)) + finalize_allocation(expr_mpos_1, _10) + let expr_component_4 := staticcall(gas(), expr, _8, mload(expr_mpos_1), var_twapPeriod, var_twapPeriod) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, 0x20), mload(var_data_mpos)) + let expr_mpos_2 := mload(_3) + let _12 := add(expr_mpos_2, 0x20) + mstore(_12, shl(229, 4594637)) + let _13 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_13, _11)) + finalize_allocation(expr_mpos_2, _13) + if iszero(eq(expr_1, keccak256(_12, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _14 := and(expr, sub(shl(160, 1), 1)) + let _15 := mload(_3) + mstore(_15, shl(224, 0x3850c7bd)) + let _16 := staticcall(gas(), _14, _15, 4, _15, 224) + if iszero(_16) { revert_forward() } + let expr_component_5 := var_twapPeriod + let expr_component_6 := var_twapPeriod + let expr_component_7 := var_twapPeriod + if _16 + { + finalize_allocation(_15, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_15, add(_15, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _17 := mload(_3) + let _18 := shl(224, 0x252c09d7) + mstore(_17, _18) + let _19 := staticcall(gas(), _14, _17, sub(abi_encode_uint16(add(_17, 4), expr_2), _17), _17, 128) + if iszero(_19) { revert_forward() } + let expr_component_15 := var_twapPeriod + let expr_component_16 := var_twapPeriod + if _19 + { + finalize_allocation(_17, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_17, add(_17, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _20 := mload(_3) + mstore(_20, _18) + let _21 := staticcall(gas(), _14, _20, sub(abi_encode_rational_by(add(_20, 4)), _20), _20, 128) + if iszero(_21) { revert_forward() } + let expr_component_21 := var_twapPeriod + if _21 + { + finalize_allocation(_20, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _22 := and(expr_component_6, _4) + let expr_3 := eq(_22, and(expr_component_7, _4)) + if expr_3 { expr_3 := lt(_22, _4) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_14)) + { + revert(var_twapPeriod, var_twapPeriod) + } + let _23 := mload(_3) + mstore(_23, shl(224, 0x32148f67)) + let _24 := call(gas(), _14, var_twapPeriod, _23, sub(abi_encode_uint16(add(_23, 4), expr_4), _23), _23, var_twapPeriod) + if iszero(_24) { revert_forward() } + if _24 + { + finalize_allocation(_23, returndatasize()) + abi_decode(_23, add(_23, returndatasize())) + } + } + let _25 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _25)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _25)) + let expr_mpos_3 := mload(_3) + let _26 := add(expr_mpos_3, 0x20) + mstore(_26, _9) + let _27 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_27, _11)) + finalize_allocation(expr_mpos_3, _27) + let expr_component_26 := staticcall(gas(), expr, _26, mload(expr_mpos_3), var_twapPeriod, var_twapPeriod) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, 0x20), add(add(var_data_mpos, mload(var_data_mpos)), 0x20)) + let _28 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_28, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(var_assetCache_mpos, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod := var_ago + var_twap := var + } + } + default { + var_twap := 0x0de0b6b3a7640000 + var_twapPeriod := and(expr_component_3, 0xffffff) + } + _1 := var_twap + _2 := var_twapPeriod + mstore(_3, var_origFreeMemPtr) + } + function abi_encode_stringliteral_ee51(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 22) + mstore(add(headStart, 64), "e/unknown-pricing-type") + tail := add(headStart, 96) + } + function array_allocation_size_array_uint32_dyn(length) -> size + { + if gt(length, 0xffffffffffffffff) { panic_error_0x41() } + size := add(shl(5, length), 0x20) + } + function allocate_and_zero_memory_array_array_uint32_dyn() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_22852(memPtr_1) + mstore(memPtr_1, 0x02) + memPtr := memPtr_1 + calldatacopy(add(memPtr_1, 0x20), calldatasize(), 64) + } + function memory_array_index_access_uint32_dyn_12584(baseRef) -> addr + { + if iszero(mload(baseRef)) { panic_error_0x32() } + addr := add(baseRef, 32) + } + function memory_array_index_access_uint32_dyn_12585(baseRef) -> addr + { + if iszero(lt(0x01, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 64) + } + function memory_array_index_access_uint32_dyn(baseRef, index) -> addr + { + if iszero(lt(index, mload(baseRef))) { panic_error_0x32() } + addr := add(add(baseRef, shl(5, index)), 32) + } + function abi_encode_array_uint32_dyn(headStart, value0) -> tail + { + let _1 := 32 + let tail_1 := add(headStart, _1) + mstore(headStart, _1) + let pos := tail_1 + let length := mload(value0) + mstore(tail_1, length) + pos := add(headStart, 64) + let srcPtr := add(value0, _1) + let i := 0 + for { } lt(i, length) { i := add(i, 1) } + { + mstore(pos, and(mload(srcPtr), 0xffffffff)) + pos := add(pos, _1) + srcPtr := add(srcPtr, _1) + } + tail := pos + } + function abi_encode_stringliteral_d30c(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 3) + mstore(add(headStart, 64), "OLD") + tail := add(headStart, 96) + } + function abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6 + { + if slt(sub(dataEnd, headStart), 224) { revert(0, 0) } + let value := mload(headStart) + validator_revert_address(value) + value0 := value + let value_1 := mload(add(headStart, 32)) + if iszero(eq(value_1, signextend(2, value_1))) { revert(0, 0) } + value1 := value_1 + let value_2 := mload(add(headStart, 64)) + validator_revert_uint16(value_2) + value2 := value_2 + let value_3 := mload(add(headStart, 96)) + validator_revert_uint16(value_3) + value3 := value_3 + let value_4 := mload(add(headStart, 128)) + validator_revert_uint16(value_4) + value4 := value_4 + let value_5 := mload(add(headStart, 160)) + validator_revert_uint8(value_5) + value5 := value_5 + let value_6 := mload(add(headStart, 192)) + validator_revert_bool(value_6) + value6 := value_6 + } + function checked_add_uint16(x) -> sum + { + let x_1 := and(x, 0xffff) + if gt(x_1, 65534) { panic_error_0x11() } + sum := add(x_1, 1) + } + function panic_error_0x12() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x12) + revert(0, 0x24) + } + function mod_uint16(x, y) -> r + { + let _1 := 0xffff + let y_1 := and(y, _1) + if iszero(y_1) { panic_error_0x12() } + r := mod(and(x, _1), y_1) + } + function abi_decode_int56_fromMemory(offset) -> value + { + value := mload(offset) + if iszero(eq(value, signextend(6, value))) { revert(0, 0) } + } + function abi_decode_uint32t_int56t_uint160t_bool_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3 + { + if slt(sub(dataEnd, headStart), 128) { revert(0, 0) } + let value := mload(headStart) + validator_revert_uint32(value) + value0 := value + value1 := abi_decode_int56_fromMemory(add(headStart, 32)) + let value_1 := mload(add(headStart, 64)) + validator_revert_address(value_1) + value2 := value_1 + let value_2 := mload(add(headStart, 96)) + validator_revert_bool(value_2) + value3 := value_2 + } + function abi_encode_rational_by(headStart) -> tail + { + tail := add(headStart, 32) + mstore(headStart, 0) + } + function checked_sub_uint256(x, y) -> diff + { + if lt(x, y) { panic_error_0x11() } + diff := sub(x, y) + } + function abi_decode_array_int56_dyn_fromMemory(headStart, dataEnd) -> value0 + { + let _1 := 32 + if slt(sub(dataEnd, headStart), _1) { revert(0, 0) } + let offset := mload(headStart) + if gt(offset, 0xffffffffffffffff) { revert(0, 0) } + let _2 := add(headStart, offset) + if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) } + let _3 := mload(_2) + let _4 := array_allocation_size_array_uint32_dyn(_3) + let memPtr := mload(64) + finalize_allocation(memPtr, _4) + let dst := memPtr + mstore(memPtr, _3) + dst := add(memPtr, _1) + let srcEnd := add(add(_2, shl(5, _3)), _1) + if gt(srcEnd, dataEnd) { revert(0, 0) } + let src := add(_2, _1) + for { } lt(src, srcEnd) { src := add(src, _1) } + { + mstore(dst, abi_decode_int56_fromMemory(src)) + dst := add(dst, _1) + } + value0 := memPtr + } + function read_from_memoryt_int56(ptr) -> returnValue + { + returnValue := signextend(6, mload(ptr)) + } + function checked_sub_int56(x, y) -> diff + { + let x_1 := signextend(6, x) + let y_1 := signextend(6, y) + let _1 := slt(y_1, 0) + if and(iszero(_1), slt(x_1, add(not(0x7fffffffffffff), y_1))) { panic_error_0x11() } + if and(_1, sgt(x_1, add(0x7fffffffffffff, y_1))) { panic_error_0x11() } + diff := sub(x_1, y_1) + } + function checked_div_int56(x, y) -> r + { + let x_1 := signextend(6, x) + let y_1 := signextend(6, y) + if iszero(y_1) { panic_error_0x12() } + if and(eq(x_1, not(0x7fffffffffffff)), eq(y_1, not(0))) { panic_error_0x11() } + r := sdiv(x_1, y_1) + } + function convert_int56_to_int24(value) -> converted + { + converted := signextend(2, value) + } + function read_from_memoryt_address(ptr) -> returnValue + { + returnValue := and(mload(ptr), sub(shl(160, 1), 1)) + } + function checked_mul_uint256_12666(x) -> product + { + let _1 := 0xee6b2800 + if and(iszero(iszero(x)), gt(_1, div(not(0), x))) { panic_error_0x11() } + product := mul(x, _1) + } + function checked_mul_uint256(x, y) -> product + { + if and(iszero(iszero(x)), gt(y, div(not(0), x))) { panic_error_0x11() } + product := mul(x, y) + } + function checked_div_uint256_12624(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(shl(192, 1), y) + } + function checked_div_uint256_12625(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(0xc097ce7bc90715b34b9f1000000000, y) + } + function checked_div_uint256_12645(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(0xffffffffffffffffffffffffffff, y) + } + function checked_div_uint256_12649(x) -> r + { + r := div(x, 0x033b2e3c9fd0803ce8000000) + } + function checked_div_uint256_12661(x) -> r + { + r := div(x, 0x0de0b6b3a7640000) + } + function checked_div_uint256_12662(x) -> r + { r := div(x, 0xee6b2800) } + function checked_div_uint256_12692(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(not(0), y) + } + function checked_div_uint256_22855(x) -> r + { + r := div(x, 0x3782dace9d900000) + } + function checked_div_uint256(x, y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(x, y) + } + /// @ast-id 10755 + function fun_decodeSqrtPriceX96(var_assetCache_10661_mpos, var_sqrtPriceX96) -> var_price + { + let _1 := sub(shl(160, 1), 1) + let _2 := and(mload(var_assetCache_10661_mpos), _1) + switch lt(_2, and(loadimmutable("10268"), _1)) + case 0 { + let _3 := mload(add(var_assetCache_10661_mpos, 416)) + if and(1, gt(_3, 0x12725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f21)) { panic_error_0x11() } + var_price := fun_mulDiv(var_sqrtPriceX96, var_sqrtPriceX96, checked_div_uint256_12624(mul(0x0de0b6b3a7640000, _3))) + if iszero(var_price) + { + var_price := 0xc097ce7bc90715b34b9f1000000000 + leave + } + var_price := checked_div_uint256_12625(var_price) + } + default { + let expr := fun_mulDiv_22854(var_sqrtPriceX96, var_sqrtPriceX96) + var_price := checked_div_uint256(expr, mload(add(var_assetCache_10661_mpos, 416))) + } + let _4 := 0xc097ce7bc90715b34b9f1000000000 + switch gt(var_price, _4) + case 0 { + if iszero(var_price) { var_price := 1 } + } + default { var_price := _4 } + } + function require_helper_stringliteral_e566(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 25) + mstore(add(memPtr, 68), "e/nested-price-forwarding") + revert(memPtr, 100) + } + } + /// @ast-id 11067 + function fun_resolvePricingConfig(var_assetCache_10981_mpos, var_config_10984_mpos) -> var_underlying, var_pricingType, var_pricingParameters, var_twapWindow + { + let _1 := 0xffff + let cleaned := and(mload(add(var_assetCache_10981_mpos, 320)), _1) + switch eq(cleaned, 0x03) + case 0 { + var_underlying := and(mload(var_assetCache_10981_mpos), sub(shl(160, 1), 1)) + var_pricingType := cleaned + var_pricingParameters := and(mload(add(var_assetCache_10981_mpos, 352)), 0xffffffff) + var_twapWindow := and(mload(add(var_config_10984_mpos, 128)), 0xffffff) + } + default { + var_underlying := read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(cleanup_address(mload(var_assetCache_10981_mpos)))) + let expr_11011_mpos := fun_resolveAssetConfig(var_underlying) + var_twapWindow := cleanup_uint24(mload(add(expr_11011_mpos, 128))) + let _2 := sload(mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(expr_11011_mpos)))) + var_pricingType := and(shr(208, _2), _1) + var_pricingParameters := shr(224, _2) + require_helper_stringliteral_e566(iszero(eq(var_pricingType, 0x03))) + } + } + function write_to_memory_address(memPtr, value) + { + mstore(memPtr, and(value, sub(shl(160, 1), 1))) + } + 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), 22) + mstore(add(memPtr, 68), "e/market-not-activated") + revert(memPtr, 100) + } + } + /// @ast-id 878 + function fun_resolveAssetConfig(var_underlying) -> var_825_mpos + { + pop(allocate_and_zero_memory_struct_struct_AssetConfig()) + let _1 := sub(shl(160, 1), 1) + mstore(0, and(var_underlying, _1)) + mstore(0x20, 0x08) + let _2 := keccak256(0, 0x40) + let memPtr := mload(0x40) + finalize_allocation_12563(memPtr) + let _3 := sload(_2) + let _4 := and(_3, _1) + mstore(memPtr, _4) + mstore(add(memPtr, 0x20), iszero(iszero(and(shr(160, _3), 0xff)))) + let _5 := 0xffffffff + mstore(add(memPtr, 0x40), and(shr(168, _3), _5)) + let _6 := add(memPtr, 96) + mstore(_6, and(shr(200, _3), _5)) + let _7 := add(memPtr, 128) + mstore(_7, shr(232, _3)) + require_helper_stringliteral(iszero(iszero(_4))) + if eq(and(cleanup_uint32(mload(_6)), _5), _5) + { + write_to_memory_uint32_12631(_6) + } + let _8 := 0xffffff + if eq(and(cleanup_uint24(mload(_7)), _8), _8) { write_to_memory_uint24(_7) } + var_825_mpos := memPtr + } + /// @ast-id 11182 + function fun_getPrice(var_underlying) -> var_twap, var_twapPeriod + { + let expr_11154_mpos := fun_resolveAssetConfig(var_underlying) + let _1 := sub(shl(160, 1), 1) + let _2 := and(mload(expr_11154_mpos), _1) + let _3 := 0 + mstore(_3, _2) + let _4 := 0x20 + mstore(_4, 0x09) + let _5 := 0x40 + let _6 := fun_loadAssetCache(var_underlying, keccak256(_3, _5)) + let var_origFreeMemPtr := mload(_5) + let var_twap_1 := _3 + let var_twapPeriod_1 := _3 + var_twap_1 := _3 + var_twapPeriod_1 := _3 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(_6, expr_11154_mpos) + let _7 := 0xffff + let _8 := and(expr_component_1, _7) + switch eq(_8, 1) + case 0 { + switch eq(_8, 0x02) + case 0 { + let _9 := mload(_5) + mstore(_9, shl(229, 4594637)) + revert(_9, sub(abi_encode_stringliteral_ee51(add(_9, 4)), _9)) + } + default { + let _10 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _10)) + let var_ago := and(expr_component_3, _10) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), _3) + let expr_mpos_1 := mload(_5) + let _11 := add(expr_mpos_1, _4) + let _12 := shl(224, 0x883bdbfd) + mstore(_11, _12) + let _13 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _14 := not(31) + mstore(expr_mpos_1, add(_13, _14)) + finalize_allocation(expr_mpos_1, _13) + let expr_component_4 := staticcall(gas(), expr, _11, mload(expr_mpos_1), _3, _3) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, _4), mload(var_data_mpos)) + let expr_mpos_2 := mload(_5) + let _15 := add(expr_mpos_2, _4) + mstore(_15, shl(229, 4594637)) + let _16 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_16, _14)) + finalize_allocation(expr_mpos_2, _16) + if iszero(eq(expr_1, keccak256(_15, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _17 := and(expr, _1) + let _18 := mload(_5) + mstore(_18, shl(224, 0x3850c7bd)) + let _19 := staticcall(gas(), _17, _18, 4, _18, 224) + if iszero(_19) { revert_forward() } + let expr_component_5 := _3 + let expr_component_6 := _3 + let expr_component_7 := _3 + if _19 + { + finalize_allocation(_18, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_18, add(_18, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _20 := mload(_5) + let _21 := shl(224, 0x252c09d7) + mstore(_20, _21) + let _22 := staticcall(gas(), _17, _20, sub(abi_encode_uint16(add(_20, 4), expr_2), _20), _20, 128) + if iszero(_22) { revert_forward() } + let expr_component_15 := _3 + let expr_component_16 := _3 + if _22 + { + finalize_allocation(_20, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _23 := mload(_5) + mstore(_23, _21) + let _24 := staticcall(gas(), _17, _23, sub(abi_encode_rational_by(add(_23, 4)), _23), _23, 128) + if iszero(_24) { revert_forward() } + let expr_component_21 := _3 + if _24 + { + finalize_allocation(_23, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_23, add(_23, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _25 := and(expr_component_6, _7) + let expr_3 := eq(_25, and(expr_component_7, _7)) + if expr_3 { expr_3 := lt(_25, _7) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_17)) { revert(_3, _3) } + let _26 := mload(_5) + mstore(_26, shl(224, 0x32148f67)) + let _27 := call(gas(), _17, _3, _26, sub(abi_encode_uint16(add(_26, 4), expr_4), _26), _26, _3) + if iszero(_27) { revert_forward() } + if _27 + { + finalize_allocation(_26, returndatasize()) + abi_decode(_26, add(_26, returndatasize())) + } + } + let _28 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _28)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _28)) + let expr_mpos_3 := mload(_5) + let _29 := add(expr_mpos_3, _4) + mstore(_29, _12) + let _30 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_30, _14)) + finalize_allocation(expr_mpos_3, _30) + let expr_component_26 := staticcall(gas(), expr, _29, mload(expr_mpos_3), _3, _3) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, _4), add(add(var_data_mpos, mload(var_data_mpos)), _4)) + let _31 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_31, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(_6, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod_1 := var_ago + var_twap_1 := var + } + } + default { + var_twap_1 := 0x0de0b6b3a7640000 + var_twapPeriod_1 := and(expr_component_3, 0xffffff) + } + mstore(_5, var_origFreeMemPtr) + var_twapPeriod := var_twapPeriod_1 + var_twap := var_twap_1 + } + function allocate_and_zero_memory_struct_struct_AssetCache() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 480) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + let _1 := 0 + mstore(memPtr_1, _1) + mstore(add(memPtr_1, 32), _1) + mstore(add(memPtr_1, 64), _1) + mstore(add(memPtr_1, 96), _1) + mstore(add(memPtr_1, 128), _1) + mstore(add(memPtr_1, 160), _1) + mstore(add(memPtr_1, 192), _1) + mstore(add(memPtr_1, 224), _1) + mstore(add(memPtr_1, 256), _1) + mstore(add(memPtr_1, 288), _1) + mstore(add(memPtr_1, 320), _1) + mstore(add(memPtr_1, 352), _1) + mstore(add(memPtr_1, 384), _1) + mstore(add(memPtr_1, 416), _1) + mstore(add(memPtr_1, 448), _1) + } + function update_storage_value_offsett_uint96_to_uint96(slot, value) + { + let _1 := sload(slot) + sstore(slot, or(and(_1, sub(shl(160, 1), 1)), and(shl(160, value), shl(160, 0xffffffffffffffffffffffff)))) + } + function update_storage_value_offsett_uint112_to_uint112(slot, value) + { + sstore(slot, or(and(sload(slot), not(0xffffffffffffffffffffffffffff)), and(value, 0xffffffffffffffffffffffffffff))) + } + function update_storage_value_offsett_uint144_to_uint144(slot, value) + { + let _1 := sload(slot) + sstore(slot, or(and(_1, 0xffffffffffffffffffffffffffff), and(shl(112, value), not(0xffffffffffffffffffffffffffff)))) + } + /// @ast-id 1304 + function fun_loadAssetCache(var_underlying, var_assetStorage_1248_slot) -> var_assetCache_1252_mpos + { + var_assetCache_1252_mpos := allocate_and_zero_memory_struct_struct_AssetCache() + if fun_initAssetCache(var_underlying, var_assetStorage_1248_slot, var_assetCache_1252_mpos) + { + sstore(var_assetStorage_1248_slot, or(and(sload(var_assetStorage_1248_slot), not(0xffffffffff)), and(mload(add(var_assetCache_1252_mpos, 160)), 0xffffffffff))) + let cleaned := and(mload(var_assetCache_1252_mpos), sub(shl(160, 1), 1)) + let _1 := add(var_assetStorage_1248_slot, 1) + sstore(_1, or(and(sload(_1), shl(160, 0xffffffffffffffffffffffff)), cleaned)) + update_storage_value_offsett_uint96_to_uint96(_1, cleanup_uint96(mload(add(var_assetCache_1252_mpos, 96)))) + let _2 := cleanup_uint112(mload(add(var_assetCache_1252_mpos, 32))) + let _3 := add(var_assetStorage_1248_slot, 3) + update_storage_value_offsett_uint112_to_uint112(_3, _2) + update_storage_value_offsett_uint144_to_uint144(_3, cleanup_uint144(mload(add(var_assetCache_1252_mpos, 64)))) + sstore(add(var_assetStorage_1248_slot, 4), mload(add(var_assetCache_1252_mpos, 128))) + } + } + function write_to_memory_uint40(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffff)) + } + function write_to_memory_uint8(memPtr, value) + { + mstore(memPtr, and(value, 0xff)) + } + function write_to_memory_int96(memPtr, value) + { + mstore(memPtr, signextend(11, value)) + } + function extract_from_storage_value_offsett_uint96(slot_value) -> value + { value := shr(160, slot_value) } + function write_to_memory_uint96(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffff)) + } + function read_from_storage_split_offset_uint112(slot) -> value + { + value := and(sload(slot), 0xffffffffffffffffffffffffffff) + } + function write_to_memory_uint112(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffffffff)) + } + function read_from_storage_split_offset_uint144(slot) -> value + { + value := shr(112, sload(slot)) + } + function write_to_memory_uint144(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffffffffffffffff)) + } + function checked_add_int256(x) -> sum + { + let _1 := slt(x, 0) + let _2 := 0x033b2e3c9fd0803ce8000000 + if and(iszero(_1), sgt(_2, sub(sub(shl(255, 1), 1), x))) { panic_error_0x11() } + if and(_1, slt(_2, sub(shl(255, 1), x))) { panic_error_0x11() } + sum := add(x, _2) + } + function checked_add_uint256(x, y) -> sum + { + if gt(x, not(y)) { panic_error_0x11() } + sum := add(x, y) + } + /// @ast-id 1243 + function fun_initAssetCache(var_underlying, var_assetStorage_slot, var_assetCache_917_mpos) -> var_dirty + { + var_dirty := 0x00 + write_to_memory_address(var_assetCache_917_mpos, var_underlying) + let _1 := sload(var_assetStorage_slot) + let _2 := add(var_assetCache_917_mpos, 160) + let _3 := 0xffffffffff + write_to_memory_uint40(_2, and(_1, _3)) + let _4 := and(shr(40, _1), 0xff) + write_to_memory_uint8(add(var_assetCache_917_mpos, 192), _4) + let _5 := 0xffffffff + write_to_memory_uint32(add(var_assetCache_917_mpos, 224), and(shr(48, _1), _5)) + let _6 := add(var_assetCache_917_mpos, 256) + write_to_memory_int96(_6, signextend(11, shr(80, _1))) + let _7 := add(var_assetCache_917_mpos, 288) + write_to_memory_uint32(_7, and(shr(176, _1), _5)) + write_to_memory_uint16(add(var_assetCache_917_mpos, 320), and(shr(208, _1), 0xffff)) + write_to_memory_uint32(add(var_assetCache_917_mpos, 352), shr(224, _1)) + let _8 := extract_from_storage_value_offsett_uint96(sload(add(var_assetStorage_slot, 1))) + let _9 := add(var_assetCache_917_mpos, 96) + write_to_memory_uint96(_9, _8) + let _10 := sload(add(var_assetStorage_slot, 3)) + let _11 := add(var_assetCache_917_mpos, 32) + let _12 := 0xffffffffffffffffffffffffffff + write_to_memory_uint112(_11, and(_10, _12)) + let _13 := add(var_assetCache_917_mpos, 64) + write_to_memory_uint144(_13, shr(112, _10)) + let _14 := sload(add(var_assetStorage_slot, 4)) + let _15 := add(var_assetCache_917_mpos, 128) + mstore(_15, _14) + let expr := exp(0x0a, and(sub(0x12, _4), 0xff)) + let _16 := add(var_assetCache_917_mpos, 416) + mstore(_16, expr) + let expr_1 := checked_div_uint256_12645(expr) + let _17 := add(var_assetCache_917_mpos, 448) + mstore(_17, expr_1) + let expr_2 := modifier_FREEMEM_12646(var_assetCache_917_mpos, address()) + switch iszero(gt(expr_2, mload(_17))) + case 0 { + mstore(add(var_assetCache_917_mpos, 384), 0x00) + } + default { + mstore(add(var_assetCache_917_mpos, 384), mul(expr_2, mload(_16))) + } + let _18 := cleanup_uint40(cleanup_uint40(mload(_2))) + if iszero(eq(timestamp(), _18)) + { + var_dirty := 1 + let expr_3 := fun_rpow(checked_add_int256(cleanup_int96(cleanup_int96(mload(_6)))), checked_sub_uint256(timestamp(), _18)) + let expr_4 := checked_div_uint256_12649(checked_mul_uint256(expr_3, mload(_15))) + let expr_5 := checked_mul_uint256(cleanup_uint144(cleanup_uint144(mload(_13))), expr_4) + let expr_6 := checked_div_uint256(expr_5, mload(_15)) + let var_newReserveBalance := cleanup_uint96(cleanup_uint96(mload(_9))) + let var_newTotalBalances := cleanup_uint112(cleanup_uint112(mload(_11))) + let expr_7 := checked_sub_uint256(expr_6, cleanup_uint144(cleanup_uint144(mload(_13)))) + let _19 := cleanup_uint32(mload(_7)) + let expr_8 := 0x00 + switch eq(and(_19, _5), _5) + case 0 { expr_8 := _19 } + default { expr_8 := 0x36d61600 } + let expr_9 := checked_div_uint256_22855(checked_mul_uint256(expr_7, and(expr_8, _5))) + if iszero(iszero(expr_9)) + { + let _20 := mload(add(var_assetCache_917_mpos, 384)) + let expr_10 := checked_add_uint256(_20, div(expr_6, 0x3b9aca00)) + let expr_11 := checked_mul_uint256(expr_10, var_newTotalBalances) + var_newTotalBalances := checked_div_uint256(expr_11, checked_sub_uint256(expr_10, expr_9)) + var_newReserveBalance := checked_add_uint256(var_newReserveBalance, checked_sub_uint256(var_newTotalBalances, cleanup_uint112(cleanup_uint112(mload(_11))))) + } + let expr_12 := iszero(gt(var_newTotalBalances, _12)) + if expr_12 + { + expr_12 := iszero(gt(expr_6, 0xffffffffffffffffffffffffffffffffffff)) + } + if expr_12 + { + write_to_memory_uint144(_13, fun_encodeDebtAmount(expr_6)) + mstore(_15, expr_4) + write_to_memory_uint40(_2, and(timestamp(), _3)) + if iszero(eq(var_newTotalBalances, cleanup_uint112(cleanup_uint112(mload(_11))))) + { + write_to_memory_uint96(_9, fun_encodeSmallAmount(var_newReserveBalance)) + write_to_memory_uint112(_11, fun_encodeAmount(var_newTotalBalances)) + } + } + } + } + /// @ast-id 1369 + function fun_encodeAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 28) + mstore(add(memPtr, 68), "e/amount-too-large-to-encode") + revert(memPtr, 100) + } + var := and(var_amount, _1) + } + /// @ast-id 1389 + function fun_encodeSmallAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 34) + mstore(add(memPtr, 68), "e/small-amount-too-large-to-enco") + mstore(add(memPtr, 100), "de") + revert(memPtr, 132) + } + var := and(var_amount, _1) + } + /// @ast-id 1409 + function fun_encodeDebtAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 33) + mstore(add(memPtr, 68), "e/debt-amount-too-large-to-encod") + mstore(add(memPtr, 100), "e") + revert(memPtr, 132) + } + var := and(var_amount, _1) + } + /// @ast-id 147 + function modifier_FREEMEM_12646(var_assetCache_mpos, var_account) -> _1 + { + let var_origFreeMemPtr := mload(0x40) + _1 := fun_callBalanceOf_inner(var_assetCache_mpos, var_account) + mstore(0x40, var_origFreeMemPtr) + } + function fun_callBalanceOf_inner(var_assetCache_mpos, var_account) -> var + { + let _1 := sub(shl(160, 1), 1) + let cleaned := and(mload(var_assetCache_mpos), _1) + let expr_1542_mpos := mload(64) + let _2 := add(expr_1542_mpos, 0x20) + mstore(_2, shl(224, 0x70a08231)) + mstore(add(expr_1542_mpos, 36), and(var_account, _1)) + mstore(expr_1542_mpos, 36) + finalize_allocation_22852(expr_1542_mpos) + let expr_1543_component := staticcall(0x4e20, cleaned, _2, mload(expr_1542_mpos), 0, 0) + let expr_component_mpos := extract_returndata() + let expr := iszero(expr_1543_component) + if iszero(expr) + { + expr := lt(mload(expr_component_mpos), 0x20) + } + if expr + { + var := 0 + leave + } + if slt(sub(add(expr_component_mpos, mload(expr_component_mpos)), expr_component_mpos), 0x20) { revert(0, 0) } + var := mload(add(expr_component_mpos, 0x20)) + } + /// @ast-id 11294 + function fun_getPriceFull(var_underlying) -> var_twap, var_twapPeriod, var_currPrice + { + var_currPrice := 0 + let expr_11199_mpos := fun_resolveAssetConfig(var_underlying) + let _1 := mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(expr_11199_mpos))) + let expr_11215_mpos := fun_loadAssetCache(var_underlying, _1) + let var_twap_1, var_twapPeriod_1 := modifier_FREEMEM(expr_11215_mpos, expr_11199_mpos) + var_twapPeriod := var_twapPeriod_1 + var_twap := var_twap_1 + let expr_11235_component, expr_component, expr_component_1, expr_component_2 := fun_resolvePricingConfig(expr_11215_mpos, expr_11199_mpos) + let _2 := and(expr_component, 0xffff) + switch eq(_2, 0x01) + case 0 { + let expr := eq(_2, 0x02) + if iszero(expr) { expr := eq(_2, 0x03) } + switch expr + case 0 { + let _3 := mload(64) + mstore(_3, shl(229, 4594637)) + revert(_3, sub(abi_encode_stringliteral_ee51(add(_3, 4)), _3)) + } + default { + let expr_11258_mpos := fun_loadAssetCache(expr_11235_component, _1) + let expr_address := cleanup_address(cleanup_address(fun_computeUniswapPoolAddress(expr_11235_component, and(expr_component_1, 0xffffff)))) + let _4 := mload(64) + mstore(_4, shl(224, 0x3850c7bd)) + let _5 := staticcall(gas(), expr_address, _4, 4, _4, 224) + if iszero(_5) { revert_forward() } + let expr_component_3 := 0 + if _5 + { + finalize_allocation(_4, returndatasize()) + let expr_component_4, expr_component_5, expr_component_6, expr_component_7, expr_component_8, expr_component_9, expr_component_10 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_4, add(_4, returndatasize())) + expr_component_3 := expr_component_4 + } + var_currPrice := fun_decodeSqrtPriceX96(expr_11258_mpos, and(expr_component_3, sub(shl(160, 1), 1))) + } + } + default { + var_currPrice := 0x0de0b6b3a7640000 + } + } + function allocate_and_zero_memory_struct_struct_LiquidityStatus() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 128) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), 0) + mstore(add(memPtr_1, 96), 0) + } + /// @ast-id 11550 + function fun_computeLiquidity(var_account) -> var__mpos + { + pop(allocate_and_zero_memory_struct_struct_LiquidityStatus()) + var__mpos := fun_computeLiquidityRaw(var_account, fun_getEnteredMarketsArray(var_account)) + } + function allocate_and_zero_memory_array_array_address_dyn() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_12670(memPtr_1) + mstore(memPtr_1, 0x01) + memPtr := memPtr_1 + calldatacopy(add(memPtr_1, 0x20), calldatasize(), 0x20) + } + function storage_array_index_access_address_ptr(array, index) -> slot, offset + { + if iszero(lt(index, 0x0100000000)) { panic_error_0x32() } + slot := add(array, index) + offset := 0 + } + function extract_from_storage_value_dynamict_address(slot_value, offset) -> value + { + value := and(shr(shl(3, offset), slot_value), sub(shl(160, 1), 1)) + } + /// @ast-id 510 + function fun_getEnteredMarketsArray(var_account) -> var_438_mpos + { + let _1 := sub(shl(160, 1), 1) + mstore(0, and(var_account, _1)) + mstore(0x20, 0x06) + let value := and(shr(48, sload(keccak256(0, 0x40))), 0xffffffff) + let value_1 := and(shr(80, sload(keccak256(0, 0x40))), _1) + let _2 := array_allocation_size_array_uint32_dyn(value) + let memPtr := mload(0x40) + finalize_allocation(memPtr, _2) + mstore(memPtr, value) + calldatacopy(add(memPtr, 0x20), calldatasize(), add(array_allocation_size_array_uint32_dyn(value), not(31))) + if iszero(value) + { + var_438_mpos := memPtr + leave + } + let _3 := mapping_index_access_mapping_address_address_of_address_12656(var_account) + write_to_memory_address(memory_array_index_access_uint32_dyn_12584(memPtr), value_1) + let var_i := 1 + for { } + lt(var_i, value) + { + var_i := increment_uint256(var_i) + } + { + let _4, _5 := storage_array_index_access_address_ptr(_3, var_i) + write_to_memory_address(memory_array_index_access_uint32_dyn(memPtr, var_i), extract_from_storage_value_dynamict_address(sload(_4), _5)) + } + var_438_mpos := memPtr + } + /// @ast-id 11533 + function fun_computeLiquidityRaw(var_account, var_underlyings_mpos) -> var_status_mpos + { + var_status_mpos := allocate_and_zero_memory_struct_struct_LiquidityStatus() + mstore(var_status_mpos, 0x00) + let _1 := add(var_status_mpos, 32) + mstore(_1, 0x00) + let _2 := add(var_status_mpos, 64) + mstore(_2, 0x00) + let _3 := add(var_status_mpos, 96) + mstore(_3, 0x00) + pop(allocate_and_zero_memory_struct_struct_AssetConfig()) + let zero_struct_AssetCache_mpos := allocate_and_zero_memory_struct_struct_AssetCache() + let var_i := 0x00 + for { } + 1 + { + var_i := increment_uint256(var_i) + } + { + if iszero(lt(var_i, mload(var_underlyings_mpos))) { break } + let _4 := read_from_memoryt_address(memory_array_index_access_uint32_dyn(var_underlyings_mpos, var_i)) + let var_price := 0x00 + let var_assetCacheAndPriceInited := 0x00 + var_price := 0x00 + let var_config_mpos := fun_resolveAssetConfig(_4) + let _5 := mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(var_config_mpos))) + let var_balance := cleanup_uint112(read_from_storage_split_offset_uint112(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))) + let var_owed := cleanup_uint144(read_from_storage_split_offset_uint144(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))) + let expr := iszero(iszero(var_balance)) + if expr + { + expr := iszero(iszero(and(cleanup_uint32(mload(add(var_config_mpos, 64))), 0xffffffff))) + } + if expr + { + pop(fun_initAssetCache(_4, _5, zero_struct_AssetCache_mpos)) + let var_twap, var_twapPeriod := modifier_FREEMEM_12660(zero_struct_AssetCache_mpos, var_config_mpos) + var_price := var_twap + var_assetCacheAndPriceInited := 0x01 + let expr_1 := checked_div_uint256_12661(checked_mul_uint256(div(checked_mul_uint256(var_balance, fun_computeExchangeRate(zero_struct_AssetCache_mpos)), 0x0de0b6b3a7640000), var_twap)) + mstore(var_status_mpos, checked_add_uint256(mload(var_status_mpos), checked_div_uint256_12662(checked_mul_uint256(expr_1, cleanup_uint32(cleanup_uint32(mload(add(var_config_mpos, 64)))))))) + } + if iszero(iszero(var_owed)) + { + if iszero(var_assetCacheAndPriceInited) + { + pop(fun_initAssetCache(_4, _5, zero_struct_AssetCache_mpos)) + let var_twap_1, var_twapPeriod_1 := modifier_FREEMEM_12660(zero_struct_AssetCache_mpos, var_config_mpos) + var_price := var_twap_1 + } + mstore(_2, increment_uint256(mload(_2))) + if cleanup_bool(mload(add(var_config_mpos, 32))) { write_to_memory_bool(_3) } + let expr_2 := checked_div_uint256_12661(checked_mul_uint256(div(fun_roundUpOwed(zero_struct_AssetCache_mpos, fun_getCurrentOwedExact(_5, zero_struct_AssetCache_mpos, var_account, shr(112, sload(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))))), 0x3b9aca00), var_price)) + let _6 := add(var_config_mpos, 96) + let expr_3 := iszero(iszero(and(cleanup_uint32(mload(_6)), 0xffffffff))) + let expr_4 := 0x00 + switch expr_3 + case 0 { + expr_4 := 0xffffffffffffffffffffffffffffffffffff + } + default { + let expr_5 := checked_mul_uint256_12666(expr_2) + expr_4 := checked_div_uint256(expr_5, cleanup_uint32(cleanup_uint32(mload(_6)))) + } + mstore(_1, checked_add_uint256(mload(_1), expr_4)) + } + } + } + /// @ast-id 1440 + function fun_computeExchangeRate(var_assetCache_1412_mpos) -> var + { + let _1 := add(var_assetCache_1412_mpos, 32) + let _2 := 0xffffffffffffffffffffffffffff + if iszero(and(mload(_1), _2)) + { + var := 0x0de0b6b3a7640000 + leave + } + let _3 := mload(add(var_assetCache_1412_mpos, 384)) + let expr := checked_add_uint256(_3, div(and(mload(add(var_assetCache_1412_mpos, 64)), 0xffffffffffffffffffffffffffffffffffff), 0x3b9aca00)) + let _4 := 0x0de0b6b3a7640000 + if and(iszero(iszero(expr)), gt(_4, div(not(0), expr))) { panic_error_0x11() } + let cleaned := and(mload(_1), _2) + if iszero(cleaned) { panic_error_0x12() } + var := div(mul(expr, _4), cleaned) + } + /// @ast-id 2027 + function fun_getCurrentOwedExact(var_assetStorage_1997_slot, var_assetCache_mpos, var_account, var_owed) -> var + { + if iszero(var_owed) + { + var := 0x00 + leave + } + let expr := checked_mul_uint256(var_owed, mload(add(var_assetCache_mpos, 128))) + let _1 := sload(add(mapping_index_access_mapping_address_address_of_address(add(var_assetStorage_1997_slot, 5), var_account), 1)) + if iszero(_1) { panic_error_0x12() } + var := div(expr, _1) + } + /// @ast-id 2063 + function fun_roundUpOwed(var_assetCache_2030_mpos, var_owed) -> var_ + { + if iszero(var_owed) + { + var_ := 0x00 + leave + } + let _1 := mload(add(var_assetCache_2030_mpos, 416)) + let _2 := 0x3b9aca00 + let product := mul(_2, _1) + if iszero(product) { panic_error_0x12() } + var_ := mul(mul(div(add(add(var_owed, product), not(0)), product), _1), _2) + } + /// @ast-id 11632 + function fun_computeAssetLiquidities(var_account) -> var_mpos + { + let expr_11567_mpos := fun_getEnteredMarketsArray(var_account) + let _1 := mload(expr_11567_mpos) + let _2 := array_allocation_size_array_uint32_dyn(_1) + let _3 := 64 + let memPtr := mload(_3) + finalize_allocation(memPtr, _2) + mstore(memPtr, _1) + let _4 := add(array_allocation_size_array_uint32_dyn(_1), not(31)) + let i := 0 + let i_1 := i + for { } lt(i_1, _4) { i_1 := add(i_1, 32) } + { + let memPtr_1 := mload(_3) + finalize_allocation_12670(memPtr_1) + mstore(memPtr_1, i) + let _5 := allocate_and_zero_memory_struct_struct_LiquidityStatus() + let _6 := 32 + mstore(add(memPtr_1, _6), _5) + mstore(add(add(memPtr, i_1), _6), memPtr_1) + } + let expr_mpos := allocate_and_zero_memory_array_array_address_dyn() + let var_i := i + for { } + 0x01 + { + var_i := increment_uint256(var_i) + } + { + if iszero(lt(var_i, mload(expr_11567_mpos))) { break } + let _7 := read_from_memoryt_address(memory_array_index_access_uint32_dyn(expr_11567_mpos, var_i)) + write_to_memory_address(memory_array_index_access_uint32_dyn_12584(expr_mpos), _7) + write_to_memory_address(mload(memory_array_index_access_uint32_dyn(memPtr, var_i)), _7) + mstore(add(mload(memory_array_index_access_uint32_dyn(memPtr, var_i)), 32), fun_computeLiquidityRaw(var_account, expr_mpos)) + } + var_mpos := memPtr + } + /// @ast-id 11667 + function fun_requireLiquidity(var_account) + { + pop(allocate_and_zero_memory_struct_struct_LiquidityStatus()) + let var_mpos := fun_computeLiquidityRaw(var_account, fun_getEnteredMarketsArray(var_account)) + let expr := iszero(mload(add(var_mpos, 96))) + if iszero(expr) + { + expr := eq(mload(add(var_mpos, 64)), 0x01) + } + if iszero(expr) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 28) + mstore(add(memPtr, 68), "e/borrow-isolation-violation") + revert(memPtr, 100) + } + let _1 := mload(var_mpos) + if lt(_1, mload(add(var_mpos, 32))) + { + let memPtr_1 := mload(64) + mstore(memPtr_1, shl(229, 4594637)) + mstore(add(memPtr_1, 4), 32) + mstore(add(memPtr_1, 36), 22) + mstore(add(memPtr_1, 68), "e/collateral-violation") + revert(memPtr_1, 100) + } + } + function require_helper(condition) + { + if iszero(condition) { revert(0, 0) } + } + /// @ast-id 13238 + function fun_mulDiv_22854(var_a, var_b) -> var_result + { + let usr$mm := mulmod(var_a, var_b, not(0)) + let var_prod0 := mul(var_a, var_b) + let _1 := lt(usr$mm, var_prod0) + let _2 := sub(usr$mm, var_prod0) + let var_prod1 := sub(_2, _1) + if eq(_2, _1) + { + var_result := div(var_prod0, 0x12725dd1d243aba0e75fe645cc4873f9e6) + leave + } + let _3 := 0x12725dd1d243aba0e75fe645cc4873f9e6 + if iszero(gt(_3, var_prod1)) { revert(0, 0) } + let var_remainder := mulmod(var_a, var_b, _3) + var_result := mul(or(shr(0x01, sub(var_prod0, var_remainder)), shl(255, sub(var_prod1, gt(var_remainder, var_prod0)))), 0x80bf433070d530fec992d281993084ea0851f19952bccb6b6d6a90f542af7c3b) + } + /// @ast-id 13238 + function fun_mulDiv(var_a, var_b, var_denominator) -> var_result + { + let usr$mm := mulmod(var_a, var_b, not(0)) + let var_prod0 := mul(var_a, var_b) + let _1 := lt(usr$mm, var_prod0) + let _2 := sub(usr$mm, var_prod0) + let var_prod1 := sub(_2, _1) + if eq(_2, _1) + { + require_helper(iszero(iszero(var_denominator))) + var_result := div(var_prod0, var_denominator) + leave + } + require_helper(gt(var_denominator, var_prod1)) + let var_remainder := mulmod(var_a, var_b, var_denominator) + let expr := and(var_denominator, add(not(var_denominator), 0x01)) + let var_denominator_1 := div(var_denominator, expr) + let _3 := 0x02 + let expr_1 := xor(mul(0x03, var_denominator_1), _3) + let expr_2 := mul(expr_1, sub(_3, mul(var_denominator_1, expr_1))) + let expr_3 := mul(expr_2, sub(_3, mul(var_denominator_1, expr_2))) + let expr_4 := mul(expr_3, sub(_3, mul(var_denominator_1, expr_3))) + let expr_5 := mul(expr_4, sub(_3, mul(var_denominator_1, expr_4))) + let expr_6 := mul(expr_5, sub(_3, mul(var_denominator_1, expr_5))) + var_result := mul(or(div(sub(var_prod0, var_remainder), expr), mul(sub(var_prod1, gt(var_remainder, var_prod0)), add(div(sub(0, expr), expr), 0x01))), mul(expr_6, sub(_3, mul(var_denominator_1, expr_6)))) + } + /// @ast-id 13412 + function fun_rpow(var_x, var_n) -> var_z + { + switch var_x + case 0 { + switch var_n + case 0 { + var_z := 0x033b2e3c9fd0803ce8000000 + } + default { var_z := 0 } + } + default { + let _1 := 1 + switch and(var_n, _1) + case 0 { + var_z := 0x033b2e3c9fd0803ce8000000 + } + default { var_z := var_x } + var_n := shr(_1, var_n) + for { } var_n { var_n := shr(_1, var_n) } + { + let usr$xx := mul(var_x, var_x) + if iszero(eq(div(usr$xx, var_x), var_x)) + { + let _2 := 0 + revert(_2, _2) + } + let _3 := 0x019d971e4fe8401e74000000 + let usr$xxRound := add(usr$xx, _3) + if lt(usr$xxRound, usr$xx) + { + let _4 := 0 + revert(_4, _4) + } + let _5 := 0x033b2e3c9fd0803ce8000000 + var_x := div(usr$xxRound, _5) + if and(var_n, _1) + { + let usr$zx := mul(var_z, var_x) + if and(iszero(iszero(var_x)), iszero(eq(div(usr$zx, var_x), var_z))) + { + let _6 := 0 + revert(_6, _6) + } + let usr$zxRound := add(usr$zx, _3) + if lt(usr$zxRound, usr$zx) + { + let _7 := 0 + revert(_7, _7) + } + var_z := div(usr$zxRound, _5) + } + } + } + } + function require_helper_stringliteral_846b(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 1) + mstore(add(memPtr, 68), "T") + revert(memPtr, 100) + } + } + /// @ast-id 13812 + function fun_getSqrtRatioAtTick(var_tick) -> var_sqrtPriceX96 + { + let _1 := signextend(2, var_tick) + let expr := 0x00 + switch slt(_1, expr) + case 0 { expr := _1 } + default { expr := sub(0x00, _1) } + require_helper_stringliteral_846b(iszero(gt(expr, 887272))) + let expr_1 := 0x00 + switch iszero(iszero(and(expr, 0x01))) + case 0 { expr_1 := shl(128, 1) } + default { + expr_1 := 0xfffcb933bd6fad37aa2d162d1a594001 + } + let var_ratio := and(expr_1, 0xffffffffffffffffffffffffffffffffff) + if iszero(iszero(and(expr, 2))) + { + var_ratio := shr(128, mul(var_ratio, 0xfff97272373d413259a46990580e213a)) + } + if iszero(iszero(and(expr, 0x04))) + { + var_ratio := shr(128, mul(var_ratio, 0xfff2e50f5f656932ef12357cf3c7fdcc)) + } + if iszero(iszero(and(expr, 0x08))) + { + var_ratio := shr(128, mul(var_ratio, 0xffe5caca7e10e4e61c3624eaa0941cd0)) + } + if iszero(iszero(and(expr, 0x10))) + { + var_ratio := shr(128, mul(var_ratio, 0xffcb9843d60f6159c9db58835c926644)) + } + if iszero(iszero(and(expr, 0x20))) + { + var_ratio := shr(128, mul(var_ratio, 0xff973b41fa98c081472e6896dfb254c0)) + } + if iszero(iszero(and(expr, 0x40))) + { + var_ratio := shr(128, mul(var_ratio, 0xff2ea16466c96a3843ec78b326b52861)) + } + let _2 := 0x80 + if iszero(iszero(and(expr, _2))) + { + var_ratio := shr(_2, mul(var_ratio, 0xfe5dee046a99a2a811c461f1969c3053)) + } + if iszero(iszero(and(expr, 0x0100))) + { + var_ratio := shr(_2, mul(var_ratio, 0xfcbe86c7900a88aedcffc83b479aa3a4)) + } + if iszero(iszero(and(expr, 0x0200))) + { + var_ratio := shr(_2, mul(var_ratio, 0xf987a7253ac413176f2b074cf7815e54)) + } + if iszero(iszero(and(expr, 0x0400))) + { + var_ratio := shr(_2, mul(var_ratio, 0xf3392b0822b70005940c7a398e4b70f3)) + } + if iszero(iszero(and(expr, 0x0800))) + { + var_ratio := shr(_2, mul(var_ratio, 0xe7159475a2c29b7443b29c7fa6e889d9)) + } + if iszero(iszero(and(expr, 0x1000))) + { + var_ratio := shr(_2, mul(var_ratio, 0xd097f3bdfd2022b8845ad8f792aa5825)) + } + if iszero(iszero(and(expr, 0x2000))) + { + var_ratio := shr(_2, mul(var_ratio, 0xa9f746462d870fdf8a65dc1f90e061e5)) + } + if iszero(iszero(and(expr, 0x4000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x70d869a156d2a1b890bb3df62baf32f7)) + } + if iszero(iszero(and(expr, 0x8000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x31be135f97d08fd981231505542fcfa6)) + } + if iszero(iszero(and(expr, 0x010000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x09aa508b5b7a84e1c677de54f3e99bc9)) + } + if iszero(iszero(and(expr, 0x020000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x5d6af8dedb81196699c329225ee604)) + } + if iszero(iszero(and(expr, 0x040000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x2216e584f5fa1ea926041bedfe98)) + } + if iszero(iszero(and(expr, 0x080000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x048a170391f7dc42444e8fa2)) + } + if sgt(_1, 0x00) + { + var_ratio := checked_div_uint256_12692(var_ratio) + } + let expr_2 := 0x00 + switch iszero(and(var_ratio, 0xffffffff)) + case 0 { expr_2 := 0x01 } + default { expr_2 := 0x00 } + var_sqrtPriceX96 := and(add(shr(0x20, var_ratio), and(expr_2, 0xff)), sub(shl(160, 1), 1)) + } +} +// ==== +// stackOptimization: true +// ---- diff --git a/test/libyul/yulStackLayout/test.yul b/test/libyul/yulStackLayout/test.yul new file mode 100644 index 000000000..01babb035 --- /dev/null +++ b/test/libyul/yulStackLayout/test.yul @@ -0,0 +1,2359 @@ +{ + { + let _1 := 64 + mstore(_1, 128) + if iszero(lt(calldatasize(), 4)) + { + let _2 := 0 + switch shr(224, calldataload(_2)) + case 0x37fe974a { + if callvalue() { revert(_2, _2) } + let ret := fun_computeLiquidity(abi_decode_tuple_address(calldatasize())) + let memPos := mload(_1) + return(memPos, sub(abi_encode_tuple_struct_LiquidityStatus(memPos, ret), memPos)) + } + case 0x41976e09 { + if callvalue() { revert(_2, _2) } + let ret_1, ret_2 := fun_getPrice(abi_decode_tuple_address(calldatasize())) + let memPos_1 := mload(_1) + return(memPos_1, sub(abi_encode_uint256_uint256(memPos_1, ret_1, ret_2), memPos_1)) + } + case 0x69a92ea3 { + if callvalue() { revert(_2, _2) } + abi_decode_12552(calldatasize()) + let memPos_2 := mload(_1) + return(memPos_2, sub(abi_encode_bytes32(memPos_2, loadimmutable("3064")), memPos_2)) + } + case 0x8eddcd92 { + if callvalue() { revert(_2, _2) } + let ret_3 := fun_getNewMarketParameters(abi_decode_tuple_address(calldatasize())) + let memPos_3 := mload(_1) + return(memPos_3, sub(abi_encode_struct_NewMarketParameters(memPos_3, ret_3), memPos_3)) + } + case 0x9693fa6b { + if callvalue() { revert(_2, _2) } + let ret_4, ret_5, ret_6 := fun_getPriceFull(abi_decode_tuple_address(calldatasize())) + let memPos_4 := mload(_1) + return(memPos_4, sub(abi_encode_uint256_uint256_uint256(memPos_4, ret_4, ret_5, ret_6), memPos_4)) + } + case 0xa1308f27 { + if callvalue() { revert(_2, _2) } + abi_decode_12552(calldatasize()) + let memPos_5 := mload(_1) + return(memPos_5, sub(abi_encode_bytes32(memPos_5, loadimmutable("3062")), memPos_5)) + } + case 0xc39b543a { + if callvalue() { revert(_2, _2) } + fun_requireLiquidity(abi_decode_tuple_address(calldatasize())) + return(mload(_1), _2) + } + case 0xebd7ba19 { + if callvalue() { revert(_2, _2) } + let ret_7 := fun_computeAssetLiquidities(abi_decode_tuple_address(calldatasize())) + let memPos_6 := mload(_1) + return(memPos_6, sub(abi_encode_array_struct_AssetLiquidity_dyn(memPos_6, ret_7), memPos_6)) + } + case 0xf70c2fde { + if callvalue() { revert(_2, _2) } + let param, param_1 := abi_decode_struct_AssetCachet_struct_AssetConfig(calldatasize()) + let var_twap, var_twapPeriod := modifier_FREEMEM(param, param_1) + let memPos_7 := mload(_1) + return(memPos_7, sub(abi_encode_uint256_uint256(memPos_7, var_twap, var_twapPeriod), memPos_7)) + } + } + revert(0, 0) + } + function cleanup_address(value) -> cleaned + { + cleaned := and(value, sub(shl(160, 1), 1)) + } + function validator_revert_address(value) + { + if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) } + } + function abi_decode_address() -> value + { + value := calldataload(4) + validator_revert_address(value) + } + function abi_decode_tuple_address(dataEnd) -> value0 + { + if slt(add(dataEnd, not(3)), 32) { revert(0, 0) } + let value := calldataload(4) + validator_revert_address(value) + value0 := value + } + function cleanup_bool(value) -> cleaned + { + cleaned := iszero(iszero(value)) + } + function abi_encode_struct_LiquidityStatus(value, pos) + { + mstore(pos, mload(value)) + mstore(add(pos, 0x20), mload(add(value, 0x20))) + mstore(add(pos, 0x40), mload(add(value, 0x40))) + mstore(add(pos, 0x60), iszero(iszero(mload(add(value, 0x60))))) + } + function abi_encode_tuple_struct_LiquidityStatus(headStart, value0) -> tail + { + tail := add(headStart, 128) + abi_encode_struct_LiquidityStatus(value0, headStart) + } + function abi_encode_uint256_uint256(headStart, value0, value1) -> tail + { + tail := add(headStart, 64) + mstore(headStart, value0) + mstore(add(headStart, 32), value1) + } + function abi_decode_12552(dataEnd) + { + if slt(add(dataEnd, not(3)), 0) { revert(0, 0) } + } + function abi_decode(headStart, dataEnd) + { + if slt(sub(dataEnd, headStart), 0) { revert(0, 0) } + } + function abi_encode_bytes32(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, value0) + } + function cleanup_uint32(value) -> cleaned + { + cleaned := and(value, 0xffffffff) + } + function cleanup_uint24(value) -> cleaned + { + cleaned := and(value, 0xffffff) + } + function abi_encode_struct_NewMarketParameters(headStart, value0) -> tail + { + tail := add(headStart, 224) + mstore(headStart, and(mload(value0), 0xffff)) + let _1 := 0xffffffff + mstore(add(headStart, 0x20), and(mload(add(value0, 0x20)), _1)) + let memberValue0 := mload(add(value0, 0x40)) + mstore(add(headStart, 0x40), and(mload(memberValue0), sub(shl(160, 1), 1))) + mstore(add(headStart, 96), iszero(iszero(mload(add(memberValue0, 0x20))))) + mstore(add(headStart, 128), and(mload(add(memberValue0, 0x40)), _1)) + mstore(add(headStart, 160), and(mload(add(memberValue0, 96)), _1)) + mstore(add(headStart, 192), and(mload(add(memberValue0, 128)), 0xffffff)) + } + function abi_encode_uint256_uint256_uint256(headStart, value0, value1, value2) -> tail + { + tail := add(headStart, 96) + mstore(headStart, value0) + mstore(add(headStart, 32), value1) + mstore(add(headStart, 64), value2) + } + function abi_encode_array_struct_AssetLiquidity_dyn(headStart, value0) -> tail + { + let _1 := 32 + let tail_1 := add(headStart, _1) + mstore(headStart, _1) + let pos := tail_1 + let length := mload(value0) + mstore(tail_1, length) + pos := add(headStart, 64) + let srcPtr := add(value0, _1) + let i := 0 + for { } lt(i, length) { i := add(i, 1) } + { + let _2 := mload(srcPtr) + mstore(pos, and(mload(_2), sub(shl(160, 1), 1))) + let memberValue0 := mload(add(_2, _1)) + abi_encode_struct_LiquidityStatus(memberValue0, add(pos, _1)) + pos := add(pos, 160) + srcPtr := add(srcPtr, _1) + } + tail := pos + } + function panic_error_0x41() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x41) + revert(0, 0x24) + } + function finalize_allocation_12563(memPtr) + { + let newFreePtr := add(memPtr, 160) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_12670(memPtr) + { + let newFreePtr := add(memPtr, 64) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_22851(memPtr) + { + let newFreePtr := add(memPtr, 128) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function finalize_allocation_22852(memPtr) + { + let newFreePtr := add(memPtr, 96) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + 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 allocate_memory_12562() -> memPtr + { + memPtr := mload(64) + let newFreePtr := add(memPtr, 0x01e0) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + } + function allocate_memory() -> memPtr + { + memPtr := mload(64) + finalize_allocation_22851(memPtr) + } + function cleanup_uint112(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffffffff) + } + function abi_decode_uint112() -> value + { + value := calldataload(36) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint144(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffffffffffffffff) + } + function abi_decode_uint144() -> value + { + value := calldataload(68) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint96(value) -> cleaned + { + cleaned := and(value, 0xffffffffffffffffffffffff) + } + function abi_decode_uint96() -> value + { + value := calldataload(100) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffff))) { revert(0, 0) } + } + function cleanup_uint40(value) -> cleaned + { + cleaned := and(value, 0xffffffffff) + } + function abi_decode_uint40() -> value + { + value := calldataload(164) + if iszero(eq(value, and(value, 0xffffffffff))) { revert(0, 0) } + } + function validator_revert_uint8(value) + { + if iszero(eq(value, and(value, 0xff))) { revert(0, 0) } + } + function abi_decode_uint8() -> value + { + value := calldataload(196) + validator_revert_uint8(value) + } + function validator_revert_uint32(value) + { + if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) } + } + function abi_decode_uint32_22844() -> value + { + value := calldataload(228) + validator_revert_uint32(value) + } + function abi_decode_uint32_22846() -> value + { + value := calldataload(292) + validator_revert_uint32(value) + } + function abi_decode_uint32() -> value + { + value := calldataload(356) + validator_revert_uint32(value) + } + function cleanup_int96(value) -> cleaned + { + cleaned := signextend(11, value) + } + function abi_decode_int96() -> value + { + value := calldataload(260) + if iszero(eq(value, signextend(11, value))) { revert(0, 0) } + } + function validator_revert_uint16(value) + { + if iszero(eq(value, and(value, 0xffff))) { revert(0, 0) } + } + function abi_decode_uint16() -> value + { + value := calldataload(324) + validator_revert_uint16(value) + } + function validator_revert_bool(value) + { + if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) } + } + function abi_decode_struct_AssetConfig(end) -> value + { + if slt(add(end, not(483)), 0xa0) { revert(0, 0) } + let memPtr := mload(64) + let newFreePtr := add(memPtr, 0xa0) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() } + mstore(64, newFreePtr) + value := memPtr + let value_1 := calldataload(484) + validator_revert_address(value_1) + mstore(memPtr, value_1) + let value_2 := calldataload(516) + validator_revert_bool(value_2) + mstore(add(memPtr, 32), value_2) + let value_3 := calldataload(548) + validator_revert_uint32(value_3) + mstore(add(memPtr, 64), value_3) + let value_4 := calldataload(580) + validator_revert_uint32(value_4) + mstore(add(memPtr, 96), value_4) + let value_5 := calldataload(612) + if iszero(eq(value_5, and(value_5, 0xffffff))) { revert(0, 0) } + mstore(add(memPtr, 128), value_5) + } + function abi_decode_struct_AssetCachet_struct_AssetConfig(dataEnd) -> value0, value1 + { + let _1 := add(dataEnd, not(3)) + if slt(_1, 640) { revert(0, 0) } + if slt(_1, 0x01e0) { revert(0, 0) } + let value := allocate_memory_12562() + mstore(value, abi_decode_address()) + mstore(add(value, 32), abi_decode_uint112()) + mstore(add(value, 64), abi_decode_uint144()) + mstore(add(value, 96), abi_decode_uint96()) + mstore(add(value, 128), calldataload(132)) + mstore(add(value, 160), abi_decode_uint40()) + mstore(add(value, 192), abi_decode_uint8()) + mstore(add(value, 224), abi_decode_uint32_22844()) + mstore(add(value, 256), abi_decode_int96()) + mstore(add(value, 288), abi_decode_uint32_22846()) + mstore(add(value, 320), abi_decode_uint16()) + mstore(add(value, 352), abi_decode_uint32()) + mstore(add(value, 384), calldataload(388)) + mstore(add(value, 416), calldataload(420)) + mstore(add(value, 448), calldataload(452)) + value0 := value + value1 := abi_decode_struct_AssetConfig(dataEnd) + } + function allocate_and_zero_memory_struct_struct_AssetConfig() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_12563(memPtr_1) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), 0) + mstore(add(memPtr_1, 96), 0) + mstore(add(memPtr_1, 128), 0) + } + function allocate_and_zero_memory_struct_struct_NewMarketParameters() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 96) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), allocate_and_zero_memory_struct_struct_AssetConfig()) + } + function write_to_memory_bool(memPtr) + { mstore(memPtr, 0x01) } + function write_to_memory_uint32_12567(memPtr) + { mstore(memPtr, 0xffffffff) } + function write_to_memory_uint32_12631(memPtr) + { mstore(memPtr, 0x42c1d800) } + function write_to_memory_uint32(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffff)) + } + function write_to_memory_uint24_12568(memPtr) + { mstore(memPtr, 16777215) } + function write_to_memory_uint24_12571(memPtr) + { mstore(memPtr, 3000) } + function write_to_memory_uint24_12572(memPtr) + { mstore(memPtr, 10000) } + function write_to_memory_uint24_12573(memPtr) + { mstore(memPtr, 500) } + function write_to_memory_uint24_12574(memPtr) + { mstore(memPtr, 100) } + function write_to_memory_uint24(memPtr) + { mstore(memPtr, 1800) } + function mapping_index_access_mapping_address_address_of_address_12569(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x0b) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12580(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x08) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12628(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x09) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address_12656(key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, 0x07) + dataSlot := keccak256(0, 0x40) + } + function mapping_index_access_mapping_address_address_of_address(slot, key) -> dataSlot + { + mstore(0, and(key, sub(shl(160, 1), 1))) + mstore(0x20, slot) + dataSlot := keccak256(0, 0x40) + } + function read_from_storage_split_offset_address(slot) -> value + { + value := and(sload(slot), sub(shl(160, 1), 1)) + } + function panic_error_0x11() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x11) + revert(0, 0x24) + } + function increment_uint256(value) -> ret + { + if eq(value, not(0)) { panic_error_0x11() } + ret := add(value, 1) + } + function panic_error_0x32() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x32) + revert(0, 0x24) + } + function memory_array_index_access_uint24(baseRef, index) -> addr + { + if iszero(lt(index, 0x04)) { panic_error_0x32() } + addr := add(baseRef, shl(5, index)) + } + function read_from_memoryt_uint24(ptr) -> returnValue + { + returnValue := and(mload(ptr), 0xffffff) + } + function abi_decode_address_fromMemory(headStart, dataEnd) -> value0 + { + if slt(sub(dataEnd, headStart), 32) { revert(0, 0) } + let value := mload(headStart) + validator_revert_address(value) + value0 := value + } + function abi_encode_address_address_uint24(headStart, value0, value1, value2) -> tail + { + tail := add(headStart, 96) + let _1 := sub(shl(160, 1), 1) + mstore(headStart, and(value0, _1)) + mstore(add(headStart, 32), and(value1, _1)) + mstore(add(headStart, 64), and(value2, 0xffffff)) + } + function revert_forward() + { + let pos := mload(64) + returndatacopy(pos, 0, returndatasize()) + revert(pos, returndatasize()) + } + function abi_decode_uint128_fromMemory(headStart, dataEnd) -> value0 + { + if slt(sub(dataEnd, headStart), 32) { revert(0, 0) } + let value := mload(headStart) + if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffff))) { revert(0, 0) } + value0 := value + } + function require_helper_stringliteral_15dc(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 23) + mstore(add(memPtr, 68), "e/no-uniswap-pool-avail") + revert(memPtr, 100) + } + } + function require_helper_stringliteral_cad5(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 23) + mstore(add(memPtr, 68), "e/bad-uniswap-pool-addr") + revert(memPtr, 100) + } + } + function write_to_memory_uint16_12575(memPtr) + { mstore(memPtr, 2) } + function write_to_memory_uint16_12577(memPtr) + { mstore(memPtr, 3) } + function write_to_memory_uint16_12581(memPtr) + { mstore(memPtr, 1) } + function write_to_memory_uint16(memPtr, value) + { + mstore(memPtr, and(value, 0xffff)) + } + function abi_encode_uint16_to_uint16(headStart) -> tail + { + tail := add(headStart, 32) + mstore(headStart, 10) + } + function abi_encode_uint16(headStart, value0) -> tail + { + tail := add(headStart, 32) + mstore(headStart, and(value0, 0xffff)) + } + function return_data_selector() -> sig + { + if gt(returndatasize(), 3) + { + returndatacopy(0, 0, 4) + sig := shr(224, mload(0)) + } + } + function try_decode_error_message() -> ret + { + if lt(returndatasize(), 0x44) { leave } + let data := mload(64) + let _1 := not(3) + returndatacopy(data, 4, add(returndatasize(), _1)) + let offset := mload(data) + let _2 := returndatasize() + let _3 := 0xffffffffffffffff + if or(gt(offset, _3), gt(add(offset, 0x24), _2)) { leave } + let msg := add(data, offset) + let length := mload(msg) + if gt(length, _3) { leave } + if gt(add(add(msg, length), 0x20), add(add(data, returndatasize()), _1)) { leave } + finalize_allocation(data, add(add(offset, length), 0x20)) + ret := msg + } + function abi_encode_stringliteral(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 30) + mstore(add(headStart, 64), "e/risk/uniswap-pool-not-inited") + tail := add(headStart, 96) + } + function abi_encode_stringliteral_92b3(pos) -> end + { + mstore(pos, "e/risk/uniswap/") + end := add(pos, 15) + } + 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 abi_encode_string_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_string(headStart, value0) -> tail + { + mstore(headStart, 32) + let length := mload(value0) + mstore(add(headStart, 32), length) + copy_memory_to_memory(add(value0, 32), add(headStart, 64), length) + tail := add(add(headStart, and(add(length, 31), not(31))), 64) + } + function extract_returndata() -> data + { + switch returndatasize() + case 0 { data := 96 } + default { + let _1 := returndatasize() + if gt(_1, 0xffffffffffffffff) { panic_error_0x41() } + let memPtr := mload(64) + finalize_allocation(memPtr, add(and(add(_1, 31), not(31)), 0x20)) + mstore(memPtr, _1) + data := memPtr + returndatacopy(add(memPtr, 0x20), 0, returndatasize()) + } + } + function read_from_storage_split_offset_uint32(slot) -> value + { + value := and(shr(168, sload(slot)), 0xffffffff) + } + /// @ast-id 10602 + function fun_getNewMarketParameters(var_underlying) -> var_p_mpos + { + var_p_mpos := allocate_and_zero_memory_struct_struct_NewMarketParameters() + let _1 := 64 + let _2 := add(var_p_mpos, _1) + let _3 := 32 + write_to_memory_bool(add(mload(_2), _3)) + let _4 := 0 + mstore(add(mload(_2), _1), _4) + write_to_memory_uint32_12567(add(mload(_2), 96)) + write_to_memory_uint24_12568(add(mload(_2), 128)) + let _5 := loadimmutable("10268") + let _6 := sub(shl(160, 1), 1) + switch eq(and(var_underlying, _6), and(_5, _6)) + case 0 { + switch iszero(iszero(and(read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(var_underlying)), _6))) + case 0 { + let var_pool := _4 + let var_fee := _4 + let expr_10439_mpos := allocate_memory() + write_to_memory_uint24_12571(expr_10439_mpos) + write_to_memory_uint24_12572(add(expr_10439_mpos, _3)) + write_to_memory_uint24_12573(add(expr_10439_mpos, _1)) + write_to_memory_uint24_12574(add(expr_10439_mpos, 96)) + let var_bestLiquidity := _4 + let var_i := _4 + let _7 := and(loadimmutable("10270"), _6) + for { } + 1 + { + var_i := increment_uint256(var_i) + } + { + let _8 := 4 + if iszero(lt(var_i, _8)) { break } + let _9 := read_from_memoryt_uint24(memory_array_index_access_uint24(expr_10439_mpos, var_i)) + let _10 := mload(_1) + mstore(_10, shl(225, 0x0b4c7741)) + let _11 := staticcall(gas(), _7, _10, sub(abi_encode_address_address_uint24(add(_10, _8), var_underlying, _5, _9), _10), _10, _3) + if iszero(_11) { revert_forward() } + let expr := _4 + if _11 + { + finalize_allocation(_10, returndatasize()) + expr := abi_decode_address_fromMemory(_10, add(_10, returndatasize())) + } + let _12 := and(expr, _6) + if iszero(_12) { continue } + let _13 := mload(_1) + mstore(_13, shl(225, 0x0d343281)) + let _14 := staticcall(gas(), _12, _13, _8, _13, _3) + if iszero(_14) { revert_forward() } + let expr_1 := _4 + if _14 + { + finalize_allocation(_13, returndatasize()) + expr_1 := abi_decode_uint128_fromMemory(_13, add(_13, returndatasize())) + } + let expr_2 := iszero(and(var_pool, _6)) + if iszero(expr_2) + { + let _15 := 0xffffffffffffffffffffffffffffffff + expr_2 := gt(and(expr_1, _15), and(var_bestLiquidity, _15)) + } + if expr_2 + { + var_pool := expr + var_fee := read_from_memoryt_uint24(memory_array_index_access_uint24(expr_10439_mpos, var_i)) + var_bestLiquidity := expr_1 + } + } + let _16 := and(var_pool, _6) + require_helper_stringliteral_15dc(iszero(iszero(_16))) + require_helper_stringliteral_cad5(eq(cleanup_address(fun_computeUniswapPoolAddress(var_underlying, var_fee)), _16)) + write_to_memory_uint16_12575(var_p_mpos) + write_to_memory_uint32(add(var_p_mpos, _3), and(var_fee, 16777215)) + if iszero(extcodesize(_16)) { revert(_4, _4) } + let _17 := mload(_1) + mstore(_17, shl(224, 0x32148f67)) + let trySuccessCondition := call(gas(), _16, _4, _17, sub(abi_encode_uint16_to_uint16(add(_17, 4)), _17), _17, _4) + if trySuccessCondition + { + finalize_allocation(_17, returndatasize()) + abi_decode(_17, add(_17, returndatasize())) + } + switch iszero(trySuccessCondition) + case 0 { } + default { + let _18 := 1 + if eq(147028384, return_data_selector()) + { + let _19 := try_decode_error_message() + if _19 + { + _18 := _4 + if eq(keccak256(add(_19, _3), mload(_19)), 0xe01ebc6b01bbf458b3d355b6e649efe64599751670c5d19175619893ecf97529) + { + let _20 := mload(_1) + mstore(_20, shl(229, 4594637)) + revert(_20, sub(abi_encode_stringliteral(add(_20, 4)), _20)) + } + let expr_10582_mpos := mload(_1) + let _21 := sub(abi_encode_string_memory_ptr(_19, abi_encode_stringliteral_92b3(add(expr_10582_mpos, _3))), expr_10582_mpos) + mstore(expr_10582_mpos, add(_21, not(31))) + finalize_allocation(expr_10582_mpos, _21) + let _22 := mload(_1) + mstore(_22, shl(229, 4594637)) + revert(_22, sub(abi_encode_string(add(_22, 4), expr_10582_mpos), _22)) + } + } + if _18 + { + fun_revertBytes(extract_returndata()) + } + } + } + default { + write_to_memory_uint16_12577(var_p_mpos) + mstore(add(var_p_mpos, _3), _4) + write_to_memory_uint32(add(mload(_2), _1), read_from_storage_split_offset_uint32(mapping_index_access_mapping_address_address_of_address_12580(read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(var_underlying))))) + } + } + default { + write_to_memory_uint16_12581(var_p_mpos) + mstore(add(var_p_mpos, _3), _4) + } + } + /// @ast-id 164 + function fun_revertBytes(var_errMsg_mpos) + { + let expr := mload(var_errMsg_mpos) + if iszero(iszero(expr)) + { + revert(add(32, var_errMsg_mpos), expr) + } + let _1 := mload(64) + mstore(_1, shl(229, 4594637)) + mstore(add(_1, 4), 32) + mstore(add(_1, 36), 13) + mstore(add(_1, 68), "e/empty-error") + revert(_1, 100) + } + /// @ast-id 10658 + function fun_computeUniswapPoolAddress(var_underlying, var_fee) -> var + { + let var_tokenA := var_underlying + let var_tokenB := loadimmutable("10268") + let var_tokenB_1 := var_tokenB + let _1 := sub(shl(160, 1), 1) + if gt(and(var_underlying, _1), and(var_tokenB, _1)) + { + var_tokenB := var_underlying + var_tokenA := var_tokenB_1 + } + let expr_10648_mpos := mload(64) + let _2 := add(expr_10648_mpos, 0x20) + let _3 := sub(abi_encode_address_address_uint24(_2, var_tokenA, var_tokenB, var_fee), expr_10648_mpos) + mstore(expr_10648_mpos, add(_3, not(31))) + finalize_allocation(expr_10648_mpos, _3) + let expr := keccak256(_2, mload(expr_10648_mpos)) + let expr_10651_mpos := mload(64) + let _4 := add(expr_10651_mpos, 0x20) + mstore(_4, shl(248, 255)) + mstore(add(expr_10651_mpos, 33), and(shl(96, loadimmutable("10270")), not(0xffffffffffffffffffffffff))) + mstore(add(expr_10651_mpos, 53), expr) + mstore(add(expr_10651_mpos, 85), loadimmutable("10272")) + mstore(expr_10651_mpos, 85) + finalize_allocation_22851(expr_10651_mpos) + var := cleanup_address(cleanup_address(keccak256(_4, mload(expr_10651_mpos)))) + } + /// @ast-id 147 + function modifier_FREEMEM(var_assetCache_mpos, var_config_mpos) -> _1, _2 + { + let _3 := 0x40 + let var_origFreeMemPtr := mload(_3) + let var_twap := 0 + let var_twapPeriod := var_twap + var_twap := var_twap + var_twapPeriod := 0 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(var_assetCache_mpos, var_config_mpos) + let _4 := 0xffff + let _5 := and(expr_component_1, _4) + switch eq(_5, 0x01) + case 0 { + switch eq(_5, 0x02) + case 0 { + let _6 := mload(_3) + mstore(_6, shl(229, 4594637)) + revert(_6, sub(abi_encode_stringliteral_ee51(add(_6, 4)), _6)) + } + default { + let _7 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _7)) + let var_ago := and(expr_component_3, _7) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), var_twapPeriod) + let expr_mpos_1 := mload(_3) + let _8 := add(expr_mpos_1, 0x20) + let _9 := shl(224, 0x883bdbfd) + mstore(_8, _9) + let _10 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _11 := not(31) + mstore(expr_mpos_1, add(_10, _11)) + finalize_allocation(expr_mpos_1, _10) + let expr_component_4 := staticcall(gas(), expr, _8, mload(expr_mpos_1), var_twapPeriod, var_twapPeriod) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, 0x20), mload(var_data_mpos)) + let expr_mpos_2 := mload(_3) + let _12 := add(expr_mpos_2, 0x20) + mstore(_12, shl(229, 4594637)) + let _13 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_13, _11)) + finalize_allocation(expr_mpos_2, _13) + if iszero(eq(expr_1, keccak256(_12, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _14 := and(expr, sub(shl(160, 1), 1)) + let _15 := mload(_3) + mstore(_15, shl(224, 0x3850c7bd)) + let _16 := staticcall(gas(), _14, _15, 4, _15, 224) + if iszero(_16) { revert_forward() } + let expr_component_5 := var_twapPeriod + let expr_component_6 := var_twapPeriod + let expr_component_7 := var_twapPeriod + if _16 + { + finalize_allocation(_15, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_15, add(_15, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _17 := mload(_3) + let _18 := shl(224, 0x252c09d7) + mstore(_17, _18) + let _19 := staticcall(gas(), _14, _17, sub(abi_encode_uint16(add(_17, 4), expr_2), _17), _17, 128) + if iszero(_19) { revert_forward() } + let expr_component_15 := var_twapPeriod + let expr_component_16 := var_twapPeriod + if _19 + { + finalize_allocation(_17, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_17, add(_17, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _20 := mload(_3) + mstore(_20, _18) + let _21 := staticcall(gas(), _14, _20, sub(abi_encode_rational_by(add(_20, 4)), _20), _20, 128) + if iszero(_21) { revert_forward() } + let expr_component_21 := var_twapPeriod + if _21 + { + finalize_allocation(_20, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _22 := and(expr_component_6, _4) + let expr_3 := eq(_22, and(expr_component_7, _4)) + if expr_3 { expr_3 := lt(_22, _4) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_14)) + { + revert(var_twapPeriod, var_twapPeriod) + } + let _23 := mload(_3) + mstore(_23, shl(224, 0x32148f67)) + let _24 := call(gas(), _14, var_twapPeriod, _23, sub(abi_encode_uint16(add(_23, 4), expr_4), _23), _23, var_twapPeriod) + if iszero(_24) { revert_forward() } + if _24 + { + finalize_allocation(_23, returndatasize()) + abi_decode(_23, add(_23, returndatasize())) + } + } + let _25 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _25)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _25)) + let expr_mpos_3 := mload(_3) + let _26 := add(expr_mpos_3, 0x20) + mstore(_26, _9) + let _27 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_27, _11)) + finalize_allocation(expr_mpos_3, _27) + let expr_component_26 := staticcall(gas(), expr, _26, mload(expr_mpos_3), var_twapPeriod, var_twapPeriod) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, 0x20), add(add(var_data_mpos, mload(var_data_mpos)), 0x20)) + let _28 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_28, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(var_assetCache_mpos, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod := var_ago + var_twap := var + } + } + default { + var_twap := 0x0de0b6b3a7640000 + var_twapPeriod := and(expr_component_3, 0xffffff) + } + _1 := var_twap + _2 := var_twapPeriod + mstore(_3, var_origFreeMemPtr) + } + /// @ast-id 147 + function modifier_FREEMEM_12660(var_assetCache_mpos, var_config_mpos) -> _1, _2 + { + let _3 := 0x40 + let var_origFreeMemPtr := mload(_3) + let var_twap := 0x00 + let var_twapPeriod := var_twap + var_twap := var_twap + var_twapPeriod := 0x00 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(var_assetCache_mpos, var_config_mpos) + let _4 := 0xffff + let _5 := and(expr_component_1, _4) + switch eq(_5, 0x01) + case 0 { + switch eq(_5, 0x02) + case 0 { + let _6 := mload(_3) + mstore(_6, shl(229, 4594637)) + revert(_6, sub(abi_encode_stringliteral_ee51(add(_6, 4)), _6)) + } + default { + let _7 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _7)) + let var_ago := and(expr_component_3, _7) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), var_twapPeriod) + let expr_mpos_1 := mload(_3) + let _8 := add(expr_mpos_1, 0x20) + let _9 := shl(224, 0x883bdbfd) + mstore(_8, _9) + let _10 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _11 := not(31) + mstore(expr_mpos_1, add(_10, _11)) + finalize_allocation(expr_mpos_1, _10) + let expr_component_4 := staticcall(gas(), expr, _8, mload(expr_mpos_1), var_twapPeriod, var_twapPeriod) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, 0x20), mload(var_data_mpos)) + let expr_mpos_2 := mload(_3) + let _12 := add(expr_mpos_2, 0x20) + mstore(_12, shl(229, 4594637)) + let _13 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_13, _11)) + finalize_allocation(expr_mpos_2, _13) + if iszero(eq(expr_1, keccak256(_12, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _14 := and(expr, sub(shl(160, 1), 1)) + let _15 := mload(_3) + mstore(_15, shl(224, 0x3850c7bd)) + let _16 := staticcall(gas(), _14, _15, 4, _15, 224) + if iszero(_16) { revert_forward() } + let expr_component_5 := var_twapPeriod + let expr_component_6 := var_twapPeriod + let expr_component_7 := var_twapPeriod + if _16 + { + finalize_allocation(_15, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_15, add(_15, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _17 := mload(_3) + let _18 := shl(224, 0x252c09d7) + mstore(_17, _18) + let _19 := staticcall(gas(), _14, _17, sub(abi_encode_uint16(add(_17, 4), expr_2), _17), _17, 128) + if iszero(_19) { revert_forward() } + let expr_component_15 := var_twapPeriod + let expr_component_16 := var_twapPeriod + if _19 + { + finalize_allocation(_17, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_17, add(_17, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _20 := mload(_3) + mstore(_20, _18) + let _21 := staticcall(gas(), _14, _20, sub(abi_encode_rational_by(add(_20, 4)), _20), _20, 128) + if iszero(_21) { revert_forward() } + let expr_component_21 := var_twapPeriod + if _21 + { + finalize_allocation(_20, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _22 := and(expr_component_6, _4) + let expr_3 := eq(_22, and(expr_component_7, _4)) + if expr_3 { expr_3 := lt(_22, _4) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_14)) + { + revert(var_twapPeriod, var_twapPeriod) + } + let _23 := mload(_3) + mstore(_23, shl(224, 0x32148f67)) + let _24 := call(gas(), _14, var_twapPeriod, _23, sub(abi_encode_uint16(add(_23, 4), expr_4), _23), _23, var_twapPeriod) + if iszero(_24) { revert_forward() } + if _24 + { + finalize_allocation(_23, returndatasize()) + abi_decode(_23, add(_23, returndatasize())) + } + } + let _25 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _25)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _25)) + let expr_mpos_3 := mload(_3) + let _26 := add(expr_mpos_3, 0x20) + mstore(_26, _9) + let _27 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_27, _11)) + finalize_allocation(expr_mpos_3, _27) + let expr_component_26 := staticcall(gas(), expr, _26, mload(expr_mpos_3), var_twapPeriod, var_twapPeriod) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, 0x20), add(add(var_data_mpos, mload(var_data_mpos)), 0x20)) + let _28 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_28, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(var_assetCache_mpos, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod := var_ago + var_twap := var + } + } + default { + var_twap := 0x0de0b6b3a7640000 + var_twapPeriod := and(expr_component_3, 0xffffff) + } + _1 := var_twap + _2 := var_twapPeriod + mstore(_3, var_origFreeMemPtr) + } + function abi_encode_stringliteral_ee51(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 22) + mstore(add(headStart, 64), "e/unknown-pricing-type") + tail := add(headStart, 96) + } + function array_allocation_size_array_uint32_dyn(length) -> size + { + if gt(length, 0xffffffffffffffff) { panic_error_0x41() } + size := add(shl(5, length), 0x20) + } + function allocate_and_zero_memory_array_array_uint32_dyn() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_22852(memPtr_1) + mstore(memPtr_1, 0x02) + memPtr := memPtr_1 + calldatacopy(add(memPtr_1, 0x20), calldatasize(), 64) + } + function memory_array_index_access_uint32_dyn_12584(baseRef) -> addr + { + if iszero(mload(baseRef)) { panic_error_0x32() } + addr := add(baseRef, 32) + } + function memory_array_index_access_uint32_dyn_12585(baseRef) -> addr + { + if iszero(lt(0x01, mload(baseRef))) { panic_error_0x32() } + addr := add(baseRef, 64) + } + function memory_array_index_access_uint32_dyn(baseRef, index) -> addr + { + if iszero(lt(index, mload(baseRef))) { panic_error_0x32() } + addr := add(add(baseRef, shl(5, index)), 32) + } + function abi_encode_array_uint32_dyn(headStart, value0) -> tail + { + let _1 := 32 + let tail_1 := add(headStart, _1) + mstore(headStart, _1) + let pos := tail_1 + let length := mload(value0) + mstore(tail_1, length) + pos := add(headStart, 64) + let srcPtr := add(value0, _1) + let i := 0 + for { } lt(i, length) { i := add(i, 1) } + { + mstore(pos, and(mload(srcPtr), 0xffffffff)) + pos := add(pos, _1) + srcPtr := add(srcPtr, _1) + } + tail := pos + } + function abi_encode_stringliteral_d30c(headStart) -> tail + { + mstore(headStart, 32) + mstore(add(headStart, 32), 3) + mstore(add(headStart, 64), "OLD") + tail := add(headStart, 96) + } + function abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6 + { + if slt(sub(dataEnd, headStart), 224) { revert(0, 0) } + let value := mload(headStart) + validator_revert_address(value) + value0 := value + let value_1 := mload(add(headStart, 32)) + if iszero(eq(value_1, signextend(2, value_1))) { revert(0, 0) } + value1 := value_1 + let value_2 := mload(add(headStart, 64)) + validator_revert_uint16(value_2) + value2 := value_2 + let value_3 := mload(add(headStart, 96)) + validator_revert_uint16(value_3) + value3 := value_3 + let value_4 := mload(add(headStart, 128)) + validator_revert_uint16(value_4) + value4 := value_4 + let value_5 := mload(add(headStart, 160)) + validator_revert_uint8(value_5) + value5 := value_5 + let value_6 := mload(add(headStart, 192)) + validator_revert_bool(value_6) + value6 := value_6 + } + function checked_add_uint16(x) -> sum + { + let x_1 := and(x, 0xffff) + if gt(x_1, 65534) { panic_error_0x11() } + sum := add(x_1, 1) + } + function panic_error_0x12() + { + mstore(0, shl(224, 0x4e487b71)) + mstore(4, 0x12) + revert(0, 0x24) + } + function mod_uint16(x, y) -> r + { + let _1 := 0xffff + let y_1 := and(y, _1) + if iszero(y_1) { panic_error_0x12() } + r := mod(and(x, _1), y_1) + } + function abi_decode_int56_fromMemory(offset) -> value + { + value := mload(offset) + if iszero(eq(value, signextend(6, value))) { revert(0, 0) } + } + function abi_decode_uint32t_int56t_uint160t_bool_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3 + { + if slt(sub(dataEnd, headStart), 128) { revert(0, 0) } + let value := mload(headStart) + validator_revert_uint32(value) + value0 := value + value1 := abi_decode_int56_fromMemory(add(headStart, 32)) + let value_1 := mload(add(headStart, 64)) + validator_revert_address(value_1) + value2 := value_1 + let value_2 := mload(add(headStart, 96)) + validator_revert_bool(value_2) + value3 := value_2 + } + function abi_encode_rational_by(headStart) -> tail + { + tail := add(headStart, 32) + mstore(headStart, 0) + } + function checked_sub_uint256(x, y) -> diff + { + if lt(x, y) { panic_error_0x11() } + diff := sub(x, y) + } + function abi_decode_array_int56_dyn_fromMemory(headStart, dataEnd) -> value0 + { + let _1 := 32 + if slt(sub(dataEnd, headStart), _1) { revert(0, 0) } + let offset := mload(headStart) + if gt(offset, 0xffffffffffffffff) { revert(0, 0) } + let _2 := add(headStart, offset) + if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) } + let _3 := mload(_2) + let _4 := array_allocation_size_array_uint32_dyn(_3) + let memPtr := mload(64) + finalize_allocation(memPtr, _4) + let dst := memPtr + mstore(memPtr, _3) + dst := add(memPtr, _1) + let srcEnd := add(add(_2, shl(5, _3)), _1) + if gt(srcEnd, dataEnd) { revert(0, 0) } + let src := add(_2, _1) + for { } lt(src, srcEnd) { src := add(src, _1) } + { + mstore(dst, abi_decode_int56_fromMemory(src)) + dst := add(dst, _1) + } + value0 := memPtr + } + function read_from_memoryt_int56(ptr) -> returnValue + { + returnValue := signextend(6, mload(ptr)) + } + function checked_sub_int56(x, y) -> diff + { + let x_1 := signextend(6, x) + let y_1 := signextend(6, y) + let _1 := slt(y_1, 0) + if and(iszero(_1), slt(x_1, add(not(0x7fffffffffffff), y_1))) { panic_error_0x11() } + if and(_1, sgt(x_1, add(0x7fffffffffffff, y_1))) { panic_error_0x11() } + diff := sub(x_1, y_1) + } + function checked_div_int56(x, y) -> r + { + let x_1 := signextend(6, x) + let y_1 := signextend(6, y) + if iszero(y_1) { panic_error_0x12() } + if and(eq(x_1, not(0x7fffffffffffff)), eq(y_1, not(0))) { panic_error_0x11() } + r := sdiv(x_1, y_1) + } + function convert_int56_to_int24(value) -> converted + { + converted := signextend(2, value) + } + function read_from_memoryt_address(ptr) -> returnValue + { + returnValue := and(mload(ptr), sub(shl(160, 1), 1)) + } + function checked_mul_uint256_12666(x) -> product + { + let _1 := 0xee6b2800 + if and(iszero(iszero(x)), gt(_1, div(not(0), x))) { panic_error_0x11() } + product := mul(x, _1) + } + function checked_mul_uint256(x, y) -> product + { + if and(iszero(iszero(x)), gt(y, div(not(0), x))) { panic_error_0x11() } + product := mul(x, y) + } + function checked_div_uint256_12624(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(shl(192, 1), y) + } + function checked_div_uint256_12625(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(0xc097ce7bc90715b34b9f1000000000, y) + } + function checked_div_uint256_12645(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(0xffffffffffffffffffffffffffff, y) + } + function checked_div_uint256_12649(x) -> r + { + r := div(x, 0x033b2e3c9fd0803ce8000000) + } + function checked_div_uint256_12661(x) -> r + { + r := div(x, 0x0de0b6b3a7640000) + } + function checked_div_uint256_12662(x) -> r + { r := div(x, 0xee6b2800) } + function checked_div_uint256_12692(y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(not(0), y) + } + function checked_div_uint256_22855(x) -> r + { + r := div(x, 0x3782dace9d900000) + } + function checked_div_uint256(x, y) -> r + { + if iszero(y) { panic_error_0x12() } + r := div(x, y) + } + /// @ast-id 10755 + function fun_decodeSqrtPriceX96(var_assetCache_10661_mpos, var_sqrtPriceX96) -> var_price + { + let _1 := sub(shl(160, 1), 1) + let _2 := and(mload(var_assetCache_10661_mpos), _1) + switch lt(_2, and(loadimmutable("10268"), _1)) + case 0 { + let _3 := mload(add(var_assetCache_10661_mpos, 416)) + if and(1, gt(_3, 0x12725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f21)) { panic_error_0x11() } + var_price := fun_mulDiv(var_sqrtPriceX96, var_sqrtPriceX96, checked_div_uint256_12624(mul(0x0de0b6b3a7640000, _3))) + if iszero(var_price) + { + var_price := 0xc097ce7bc90715b34b9f1000000000 + leave + } + var_price := checked_div_uint256_12625(var_price) + } + default { + let expr := fun_mulDiv_22854(var_sqrtPriceX96, var_sqrtPriceX96) + var_price := checked_div_uint256(expr, mload(add(var_assetCache_10661_mpos, 416))) + } + let _4 := 0xc097ce7bc90715b34b9f1000000000 + switch gt(var_price, _4) + case 0 { + if iszero(var_price) { var_price := 1 } + } + default { var_price := _4 } + } + function require_helper_stringliteral_e566(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 25) + mstore(add(memPtr, 68), "e/nested-price-forwarding") + revert(memPtr, 100) + } + } + /// @ast-id 11067 + function fun_resolvePricingConfig(var_assetCache_10981_mpos, var_config_10984_mpos) -> var_underlying, var_pricingType, var_pricingParameters, var_twapWindow + { + let _1 := 0xffff + let cleaned := and(mload(add(var_assetCache_10981_mpos, 320)), _1) + switch eq(cleaned, 0x03) + case 0 { + var_underlying := and(mload(var_assetCache_10981_mpos), sub(shl(160, 1), 1)) + var_pricingType := cleaned + var_pricingParameters := and(mload(add(var_assetCache_10981_mpos, 352)), 0xffffffff) + var_twapWindow := and(mload(add(var_config_10984_mpos, 128)), 0xffffff) + } + default { + var_underlying := read_from_storage_split_offset_address(mapping_index_access_mapping_address_address_of_address_12569(cleanup_address(mload(var_assetCache_10981_mpos)))) + let expr_11011_mpos := fun_resolveAssetConfig(var_underlying) + var_twapWindow := cleanup_uint24(mload(add(expr_11011_mpos, 128))) + let _2 := sload(mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(expr_11011_mpos)))) + var_pricingType := and(shr(208, _2), _1) + var_pricingParameters := shr(224, _2) + require_helper_stringliteral_e566(iszero(eq(var_pricingType, 0x03))) + } + } + function write_to_memory_address(memPtr, value) + { + mstore(memPtr, and(value, sub(shl(160, 1), 1))) + } + 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), 22) + mstore(add(memPtr, 68), "e/market-not-activated") + revert(memPtr, 100) + } + } + /// @ast-id 878 + function fun_resolveAssetConfig(var_underlying) -> var_825_mpos + { + pop(allocate_and_zero_memory_struct_struct_AssetConfig()) + let _1 := sub(shl(160, 1), 1) + mstore(0, and(var_underlying, _1)) + mstore(0x20, 0x08) + let _2 := keccak256(0, 0x40) + let memPtr := mload(0x40) + finalize_allocation_12563(memPtr) + let _3 := sload(_2) + let _4 := and(_3, _1) + mstore(memPtr, _4) + mstore(add(memPtr, 0x20), iszero(iszero(and(shr(160, _3), 0xff)))) + let _5 := 0xffffffff + mstore(add(memPtr, 0x40), and(shr(168, _3), _5)) + let _6 := add(memPtr, 96) + mstore(_6, and(shr(200, _3), _5)) + let _7 := add(memPtr, 128) + mstore(_7, shr(232, _3)) + require_helper_stringliteral(iszero(iszero(_4))) + if eq(and(cleanup_uint32(mload(_6)), _5), _5) + { + write_to_memory_uint32_12631(_6) + } + let _8 := 0xffffff + if eq(and(cleanup_uint24(mload(_7)), _8), _8) { write_to_memory_uint24(_7) } + var_825_mpos := memPtr + } + /// @ast-id 11182 + function fun_getPrice(var_underlying) -> var_twap, var_twapPeriod + { + let expr_11154_mpos := fun_resolveAssetConfig(var_underlying) + let _1 := sub(shl(160, 1), 1) + let _2 := and(mload(expr_11154_mpos), _1) + let _3 := 0 + mstore(_3, _2) + let _4 := 0x20 + mstore(_4, 0x09) + let _5 := 0x40 + let _6 := fun_loadAssetCache(var_underlying, keccak256(_3, _5)) + let var_origFreeMemPtr := mload(_5) + let var_twap_1 := _3 + let var_twapPeriod_1 := _3 + var_twap_1 := _3 + var_twapPeriod_1 := _3 + let expr_component, expr_component_1, expr_component_2, expr_component_3 := fun_resolvePricingConfig(_6, expr_11154_mpos) + let _7 := 0xffff + let _8 := and(expr_component_1, _7) + switch eq(_8, 1) + case 0 { + switch eq(_8, 0x02) + case 0 { + let _9 := mload(_5) + mstore(_9, shl(229, 4594637)) + revert(_9, sub(abi_encode_stringliteral_ee51(add(_9, 4)), _9)) + } + default { + let _10 := 0xffffff + let expr := fun_computeUniswapPoolAddress(expr_component, and(expr_component_2, _10)) + let var_ago := and(expr_component_3, _10) + let expr_mpos := allocate_and_zero_memory_array_array_uint32_dyn() + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), var_ago) + mstore(memory_array_index_access_uint32_dyn_12585(expr_mpos), _3) + let expr_mpos_1 := mload(_5) + let _11 := add(expr_mpos_1, _4) + let _12 := shl(224, 0x883bdbfd) + mstore(_11, _12) + let _13 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_1, 36), expr_mpos), expr_mpos_1) + let _14 := not(31) + mstore(expr_mpos_1, add(_13, _14)) + finalize_allocation(expr_mpos_1, _13) + let expr_component_4 := staticcall(gas(), expr, _11, mload(expr_mpos_1), _3, _3) + let var_data_mpos := extract_returndata() + if iszero(expr_component_4) + { + let expr_1 := keccak256(add(var_data_mpos, _4), mload(var_data_mpos)) + let expr_mpos_2 := mload(_5) + let _15 := add(expr_mpos_2, _4) + mstore(_15, shl(229, 4594637)) + let _16 := sub(abi_encode_stringliteral_d30c(add(expr_mpos_2, 36)), expr_mpos_2) + mstore(expr_mpos_2, add(_16, _14)) + finalize_allocation(expr_mpos_2, _16) + if iszero(eq(expr_1, keccak256(_15, mload(expr_mpos_2)))) + { + fun_revertBytes(var_data_mpos) + } + let _17 := and(expr, _1) + let _18 := mload(_5) + mstore(_18, shl(224, 0x3850c7bd)) + let _19 := staticcall(gas(), _17, _18, 4, _18, 224) + if iszero(_19) { revert_forward() } + let expr_component_5 := _3 + let expr_component_6 := _3 + let expr_component_7 := _3 + if _19 + { + finalize_allocation(_18, returndatasize()) + let expr_component_8, expr_component_9, expr_component_10, expr_component_11, expr_component_12, expr_component_13, expr_component_14 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_18, add(_18, returndatasize())) + expr_component_5 := expr_component_10 + expr_component_6 := expr_component_11 + expr_component_7 := expr_component_12 + } + let expr_2 := mod_uint16(checked_add_uint16(expr_component_5), expr_component_6) + let _20 := mload(_5) + let _21 := shl(224, 0x252c09d7) + mstore(_20, _21) + let _22 := staticcall(gas(), _17, _20, sub(abi_encode_uint16(add(_20, 4), expr_2), _20), _20, 128) + if iszero(_22) { revert_forward() } + let expr_component_15 := _3 + let expr_component_16 := _3 + if _22 + { + finalize_allocation(_20, returndatasize()) + let expr_component_17, expr_component_18, expr_component_19, expr_component_20 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_20, add(_20, returndatasize())) + expr_component_15 := expr_component_17 + expr_component_16 := expr_component_20 + } + let var_oldestAvailableAge := expr_component_15 + if iszero(expr_component_16) + { + let _23 := mload(_5) + mstore(_23, _21) + let _24 := staticcall(gas(), _17, _23, sub(abi_encode_rational_by(add(_23, 4)), _23), _23, 128) + if iszero(_24) { revert_forward() } + let expr_component_21 := _3 + if _24 + { + finalize_allocation(_23, returndatasize()) + let expr_component_22, expr_component_23, expr_component_24, expr_component_25 := abi_decode_uint32t_int56t_uint160t_bool_fromMemory(_23, add(_23, returndatasize())) + expr_component_21 := expr_component_22 + } + var_oldestAvailableAge := expr_component_21 + } + let _25 := and(expr_component_6, _7) + let expr_3 := eq(_25, and(expr_component_7, _7)) + if expr_3 { expr_3 := lt(_25, _7) } + if expr_3 + { + let expr_4 := checked_add_uint16(expr_component_6) + if iszero(extcodesize(_17)) { revert(_3, _3) } + let _26 := mload(_5) + mstore(_26, shl(224, 0x32148f67)) + let _27 := call(gas(), _17, _3, _26, sub(abi_encode_uint16(add(_26, 4), expr_4), _26), _26, _3) + if iszero(_27) { revert_forward() } + if _27 + { + finalize_allocation(_26, returndatasize()) + abi_decode(_26, add(_26, returndatasize())) + } + } + let _28 := 0xffffffff + var_ago := checked_sub_uint256(timestamp(), and(var_oldestAvailableAge, _28)) + write_to_memory_uint32(memory_array_index_access_uint32_dyn_12584(expr_mpos), and(var_ago, _28)) + let expr_mpos_3 := mload(_5) + let _29 := add(expr_mpos_3, _4) + mstore(_29, _12) + let _30 := sub(abi_encode_array_uint32_dyn(add(expr_mpos_3, 36), expr_mpos), expr_mpos_3) + mstore(expr_mpos_3, add(_30, _14)) + finalize_allocation(expr_mpos_3, _30) + let expr_component_26 := staticcall(gas(), expr, _29, mload(expr_mpos_3), _3, _3) + var_data_mpos := extract_returndata() + if iszero(expr_component_26) + { + fun_revertBytes(var_data_mpos) + } + } + let expr_mpos_4 := abi_decode_array_int56_dyn_fromMemory(add(var_data_mpos, _4), add(add(var_data_mpos, mload(var_data_mpos)), _4)) + let _31 := read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12585(expr_mpos_4)) + let expr_5 := checked_sub_int56(_31, read_from_memoryt_int56(memory_array_index_access_uint32_dyn_12584(expr_mpos_4))) + let var := fun_decodeSqrtPriceX96(_6, cleanup_address(fun_getSqrtRatioAtTick(convert_int56_to_int24(checked_div_int56(expr_5, signextend(6, var_ago)))))) + var_twapPeriod_1 := var_ago + var_twap_1 := var + } + } + default { + var_twap_1 := 0x0de0b6b3a7640000 + var_twapPeriod_1 := and(expr_component_3, 0xffffff) + } + mstore(_5, var_origFreeMemPtr) + var_twapPeriod := var_twapPeriod_1 + var_twap := var_twap_1 + } + function allocate_and_zero_memory_struct_struct_AssetCache() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 480) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + let _1 := 0 + mstore(memPtr_1, _1) + mstore(add(memPtr_1, 32), _1) + mstore(add(memPtr_1, 64), _1) + mstore(add(memPtr_1, 96), _1) + mstore(add(memPtr_1, 128), _1) + mstore(add(memPtr_1, 160), _1) + mstore(add(memPtr_1, 192), _1) + mstore(add(memPtr_1, 224), _1) + mstore(add(memPtr_1, 256), _1) + mstore(add(memPtr_1, 288), _1) + mstore(add(memPtr_1, 320), _1) + mstore(add(memPtr_1, 352), _1) + mstore(add(memPtr_1, 384), _1) + mstore(add(memPtr_1, 416), _1) + mstore(add(memPtr_1, 448), _1) + } + function update_storage_value_offsett_uint96_to_uint96(slot, value) + { + let _1 := sload(slot) + sstore(slot, or(and(_1, sub(shl(160, 1), 1)), and(shl(160, value), shl(160, 0xffffffffffffffffffffffff)))) + } + function update_storage_value_offsett_uint112_to_uint112(slot, value) + { + sstore(slot, or(and(sload(slot), not(0xffffffffffffffffffffffffffff)), and(value, 0xffffffffffffffffffffffffffff))) + } + function update_storage_value_offsett_uint144_to_uint144(slot, value) + { + let _1 := sload(slot) + sstore(slot, or(and(_1, 0xffffffffffffffffffffffffffff), and(shl(112, value), not(0xffffffffffffffffffffffffffff)))) + } + /// @ast-id 1304 + function fun_loadAssetCache(var_underlying, var_assetStorage_1248_slot) -> var_assetCache_1252_mpos + { + var_assetCache_1252_mpos := allocate_and_zero_memory_struct_struct_AssetCache() + if fun_initAssetCache(var_underlying, var_assetStorage_1248_slot, var_assetCache_1252_mpos) + { + sstore(var_assetStorage_1248_slot, or(and(sload(var_assetStorage_1248_slot), not(0xffffffffff)), and(mload(add(var_assetCache_1252_mpos, 160)), 0xffffffffff))) + let cleaned := and(mload(var_assetCache_1252_mpos), sub(shl(160, 1), 1)) + let _1 := add(var_assetStorage_1248_slot, 1) + sstore(_1, or(and(sload(_1), shl(160, 0xffffffffffffffffffffffff)), cleaned)) + update_storage_value_offsett_uint96_to_uint96(_1, cleanup_uint96(mload(add(var_assetCache_1252_mpos, 96)))) + let _2 := cleanup_uint112(mload(add(var_assetCache_1252_mpos, 32))) + let _3 := add(var_assetStorage_1248_slot, 3) + update_storage_value_offsett_uint112_to_uint112(_3, _2) + update_storage_value_offsett_uint144_to_uint144(_3, cleanup_uint144(mload(add(var_assetCache_1252_mpos, 64)))) + sstore(add(var_assetStorage_1248_slot, 4), mload(add(var_assetCache_1252_mpos, 128))) + } + } + function write_to_memory_uint40(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffff)) + } + function write_to_memory_uint8(memPtr, value) + { + mstore(memPtr, and(value, 0xff)) + } + function write_to_memory_int96(memPtr, value) + { + mstore(memPtr, signextend(11, value)) + } + function extract_from_storage_value_offsett_uint96(slot_value) -> value + { value := shr(160, slot_value) } + function write_to_memory_uint96(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffff)) + } + function read_from_storage_split_offset_uint112(slot) -> value + { + value := and(sload(slot), 0xffffffffffffffffffffffffffff) + } + function write_to_memory_uint112(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffffffff)) + } + function read_from_storage_split_offset_uint144(slot) -> value + { + value := shr(112, sload(slot)) + } + function write_to_memory_uint144(memPtr, value) + { + mstore(memPtr, and(value, 0xffffffffffffffffffffffffffffffffffff)) + } + function checked_add_int256(x) -> sum + { + let _1 := slt(x, 0) + let _2 := 0x033b2e3c9fd0803ce8000000 + if and(iszero(_1), sgt(_2, sub(sub(shl(255, 1), 1), x))) { panic_error_0x11() } + if and(_1, slt(_2, sub(shl(255, 1), x))) { panic_error_0x11() } + sum := add(x, _2) + } + function checked_add_uint256(x, y) -> sum + { + if gt(x, not(y)) { panic_error_0x11() } + sum := add(x, y) + } + /// @ast-id 1243 + function fun_initAssetCache(var_underlying, var_assetStorage_slot, var_assetCache_917_mpos) -> var_dirty + { + var_dirty := 0x00 + write_to_memory_address(var_assetCache_917_mpos, var_underlying) + let _1 := sload(var_assetStorage_slot) + let _2 := add(var_assetCache_917_mpos, 160) + let _3 := 0xffffffffff + write_to_memory_uint40(_2, and(_1, _3)) + let _4 := and(shr(40, _1), 0xff) + write_to_memory_uint8(add(var_assetCache_917_mpos, 192), _4) + let _5 := 0xffffffff + write_to_memory_uint32(add(var_assetCache_917_mpos, 224), and(shr(48, _1), _5)) + let _6 := add(var_assetCache_917_mpos, 256) + write_to_memory_int96(_6, signextend(11, shr(80, _1))) + let _7 := add(var_assetCache_917_mpos, 288) + write_to_memory_uint32(_7, and(shr(176, _1), _5)) + write_to_memory_uint16(add(var_assetCache_917_mpos, 320), and(shr(208, _1), 0xffff)) + write_to_memory_uint32(add(var_assetCache_917_mpos, 352), shr(224, _1)) + let _8 := extract_from_storage_value_offsett_uint96(sload(add(var_assetStorage_slot, 1))) + let _9 := add(var_assetCache_917_mpos, 96) + write_to_memory_uint96(_9, _8) + let _10 := sload(add(var_assetStorage_slot, 3)) + let _11 := add(var_assetCache_917_mpos, 32) + let _12 := 0xffffffffffffffffffffffffffff + write_to_memory_uint112(_11, and(_10, _12)) + let _13 := add(var_assetCache_917_mpos, 64) + write_to_memory_uint144(_13, shr(112, _10)) + let _14 := sload(add(var_assetStorage_slot, 4)) + let _15 := add(var_assetCache_917_mpos, 128) + mstore(_15, _14) + let expr := exp(0x0a, and(sub(0x12, _4), 0xff)) + let _16 := add(var_assetCache_917_mpos, 416) + mstore(_16, expr) + let expr_1 := checked_div_uint256_12645(expr) + let _17 := add(var_assetCache_917_mpos, 448) + mstore(_17, expr_1) + let expr_2 := modifier_FREEMEM_12646(var_assetCache_917_mpos, address()) + switch iszero(gt(expr_2, mload(_17))) + case 0 { + mstore(add(var_assetCache_917_mpos, 384), 0x00) + } + default { + mstore(add(var_assetCache_917_mpos, 384), mul(expr_2, mload(_16))) + } + let _18 := cleanup_uint40(cleanup_uint40(mload(_2))) + if iszero(eq(timestamp(), _18)) + { + var_dirty := 1 + let expr_3 := fun_rpow(checked_add_int256(cleanup_int96(cleanup_int96(mload(_6)))), checked_sub_uint256(timestamp(), _18)) + let expr_4 := checked_div_uint256_12649(checked_mul_uint256(expr_3, mload(_15))) + let expr_5 := checked_mul_uint256(cleanup_uint144(cleanup_uint144(mload(_13))), expr_4) + let expr_6 := checked_div_uint256(expr_5, mload(_15)) + let var_newReserveBalance := cleanup_uint96(cleanup_uint96(mload(_9))) + let var_newTotalBalances := cleanup_uint112(cleanup_uint112(mload(_11))) + let expr_7 := checked_sub_uint256(expr_6, cleanup_uint144(cleanup_uint144(mload(_13)))) + let _19 := cleanup_uint32(mload(_7)) + let expr_8 := 0x00 + switch eq(and(_19, _5), _5) + case 0 { expr_8 := _19 } + default { expr_8 := 0x36d61600 } + let expr_9 := checked_div_uint256_22855(checked_mul_uint256(expr_7, and(expr_8, _5))) + if iszero(iszero(expr_9)) + { + let _20 := mload(add(var_assetCache_917_mpos, 384)) + let expr_10 := checked_add_uint256(_20, div(expr_6, 0x3b9aca00)) + let expr_11 := checked_mul_uint256(expr_10, var_newTotalBalances) + var_newTotalBalances := checked_div_uint256(expr_11, checked_sub_uint256(expr_10, expr_9)) + var_newReserveBalance := checked_add_uint256(var_newReserveBalance, checked_sub_uint256(var_newTotalBalances, cleanup_uint112(cleanup_uint112(mload(_11))))) + } + let expr_12 := iszero(gt(var_newTotalBalances, _12)) + if expr_12 + { + expr_12 := iszero(gt(expr_6, 0xffffffffffffffffffffffffffffffffffff)) + } + if expr_12 + { + write_to_memory_uint144(_13, fun_encodeDebtAmount(expr_6)) + mstore(_15, expr_4) + write_to_memory_uint40(_2, and(timestamp(), _3)) + if iszero(eq(var_newTotalBalances, cleanup_uint112(cleanup_uint112(mload(_11))))) + { + write_to_memory_uint96(_9, fun_encodeSmallAmount(var_newReserveBalance)) + write_to_memory_uint112(_11, fun_encodeAmount(var_newTotalBalances)) + } + } + } + } + /// @ast-id 1369 + function fun_encodeAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 28) + mstore(add(memPtr, 68), "e/amount-too-large-to-encode") + revert(memPtr, 100) + } + var := and(var_amount, _1) + } + /// @ast-id 1389 + function fun_encodeSmallAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 34) + mstore(add(memPtr, 68), "e/small-amount-too-large-to-enco") + mstore(add(memPtr, 100), "de") + revert(memPtr, 132) + } + var := and(var_amount, _1) + } + /// @ast-id 1409 + function fun_encodeDebtAmount(var_amount) -> var + { + let _1 := 0xffffffffffffffffffffffffffffffffffff + if gt(var_amount, _1) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 33) + mstore(add(memPtr, 68), "e/debt-amount-too-large-to-encod") + mstore(add(memPtr, 100), "e") + revert(memPtr, 132) + } + var := and(var_amount, _1) + } + /// @ast-id 147 + function modifier_FREEMEM_12646(var_assetCache_mpos, var_account) -> _1 + { + let var_origFreeMemPtr := mload(0x40) + _1 := fun_callBalanceOf_inner(var_assetCache_mpos, var_account) + mstore(0x40, var_origFreeMemPtr) + } + function fun_callBalanceOf_inner(var_assetCache_mpos, var_account) -> var + { + let _1 := sub(shl(160, 1), 1) + let cleaned := and(mload(var_assetCache_mpos), _1) + let expr_1542_mpos := mload(64) + let _2 := add(expr_1542_mpos, 0x20) + mstore(_2, shl(224, 0x70a08231)) + mstore(add(expr_1542_mpos, 36), and(var_account, _1)) + mstore(expr_1542_mpos, 36) + finalize_allocation_22852(expr_1542_mpos) + let expr_1543_component := staticcall(0x4e20, cleaned, _2, mload(expr_1542_mpos), 0, 0) + let expr_component_mpos := extract_returndata() + let expr := iszero(expr_1543_component) + if iszero(expr) + { + expr := lt(mload(expr_component_mpos), 0x20) + } + if expr + { + var := 0 + leave + } + if slt(sub(add(expr_component_mpos, mload(expr_component_mpos)), expr_component_mpos), 0x20) { revert(0, 0) } + var := mload(add(expr_component_mpos, 0x20)) + } + /// @ast-id 11294 + function fun_getPriceFull(var_underlying) -> var_twap, var_twapPeriod, var_currPrice + { + var_currPrice := 0 + let expr_11199_mpos := fun_resolveAssetConfig(var_underlying) + let _1 := mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(expr_11199_mpos))) + let expr_11215_mpos := fun_loadAssetCache(var_underlying, _1) + let var_twap_1, var_twapPeriod_1 := modifier_FREEMEM(expr_11215_mpos, expr_11199_mpos) + var_twapPeriod := var_twapPeriod_1 + var_twap := var_twap_1 + let expr_11235_component, expr_component, expr_component_1, expr_component_2 := fun_resolvePricingConfig(expr_11215_mpos, expr_11199_mpos) + let _2 := and(expr_component, 0xffff) + switch eq(_2, 0x01) + case 0 { + let expr := eq(_2, 0x02) + if iszero(expr) { expr := eq(_2, 0x03) } + switch expr + case 0 { + let _3 := mload(64) + mstore(_3, shl(229, 4594637)) + revert(_3, sub(abi_encode_stringliteral_ee51(add(_3, 4)), _3)) + } + default { + let expr_11258_mpos := fun_loadAssetCache(expr_11235_component, _1) + let expr_address := cleanup_address(cleanup_address(fun_computeUniswapPoolAddress(expr_11235_component, and(expr_component_1, 0xffffff)))) + let _4 := mload(64) + mstore(_4, shl(224, 0x3850c7bd)) + let _5 := staticcall(gas(), expr_address, _4, 4, _4, 224) + if iszero(_5) { revert_forward() } + let expr_component_3 := 0 + if _5 + { + finalize_allocation(_4, returndatasize()) + let expr_component_4, expr_component_5, expr_component_6, expr_component_7, expr_component_8, expr_component_9, expr_component_10 := abi_decode_uint160t_int24t_uint16t_uint16t_uint16t_uint8t_bool_fromMemory(_4, add(_4, returndatasize())) + expr_component_3 := expr_component_4 + } + var_currPrice := fun_decodeSqrtPriceX96(expr_11258_mpos, and(expr_component_3, sub(shl(160, 1), 1))) + } + } + default { + var_currPrice := 0x0de0b6b3a7640000 + } + } + function allocate_and_zero_memory_struct_struct_LiquidityStatus() -> memPtr + { + let memPtr_1 := mload(64) + let newFreePtr := add(memPtr_1, 128) + if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr_1)) { panic_error_0x41() } + mstore(64, newFreePtr) + memPtr := memPtr_1 + mstore(memPtr_1, 0) + mstore(add(memPtr_1, 32), 0) + mstore(add(memPtr_1, 64), 0) + mstore(add(memPtr_1, 96), 0) + } + /// @ast-id 11550 + function fun_computeLiquidity(var_account) -> var__mpos + { + pop(allocate_and_zero_memory_struct_struct_LiquidityStatus()) + var__mpos := fun_computeLiquidityRaw(var_account, fun_getEnteredMarketsArray(var_account)) + } + function allocate_and_zero_memory_array_array_address_dyn() -> memPtr + { + let memPtr_1 := mload(64) + finalize_allocation_12670(memPtr_1) + mstore(memPtr_1, 0x01) + memPtr := memPtr_1 + calldatacopy(add(memPtr_1, 0x20), calldatasize(), 0x20) + } + function storage_array_index_access_address_ptr(array, index) -> slot, offset + { + if iszero(lt(index, 0x0100000000)) { panic_error_0x32() } + slot := add(array, index) + offset := 0 + } + function extract_from_storage_value_dynamict_address(slot_value, offset) -> value + { + value := and(shr(shl(3, offset), slot_value), sub(shl(160, 1), 1)) + } + /// @ast-id 510 + function fun_getEnteredMarketsArray(var_account) -> var_438_mpos + { + let _1 := sub(shl(160, 1), 1) + mstore(0, and(var_account, _1)) + mstore(0x20, 0x06) + let value := and(shr(48, sload(keccak256(0, 0x40))), 0xffffffff) + let value_1 := and(shr(80, sload(keccak256(0, 0x40))), _1) + let _2 := array_allocation_size_array_uint32_dyn(value) + let memPtr := mload(0x40) + finalize_allocation(memPtr, _2) + mstore(memPtr, value) + calldatacopy(add(memPtr, 0x20), calldatasize(), add(array_allocation_size_array_uint32_dyn(value), not(31))) + if iszero(value) + { + var_438_mpos := memPtr + leave + } + let _3 := mapping_index_access_mapping_address_address_of_address_12656(var_account) + write_to_memory_address(memory_array_index_access_uint32_dyn_12584(memPtr), value_1) + let var_i := 1 + for { } + lt(var_i, value) + { + var_i := increment_uint256(var_i) + } + { + let _4, _5 := storage_array_index_access_address_ptr(_3, var_i) + write_to_memory_address(memory_array_index_access_uint32_dyn(memPtr, var_i), extract_from_storage_value_dynamict_address(sload(_4), _5)) + } + var_438_mpos := memPtr + } + /// @ast-id 11533 + function fun_computeLiquidityRaw(var_account, var_underlyings_mpos) -> var_status_mpos + { + var_status_mpos := allocate_and_zero_memory_struct_struct_LiquidityStatus() + mstore(var_status_mpos, 0x00) + let _1 := add(var_status_mpos, 32) + mstore(_1, 0x00) + let _2 := add(var_status_mpos, 64) + mstore(_2, 0x00) + let _3 := add(var_status_mpos, 96) + mstore(_3, 0x00) + pop(allocate_and_zero_memory_struct_struct_AssetConfig()) + let zero_struct_AssetCache_mpos := allocate_and_zero_memory_struct_struct_AssetCache() + let var_i := 0x00 + for { } + 1 + { + var_i := increment_uint256(var_i) + } + { + if iszero(lt(var_i, mload(var_underlyings_mpos))) { break } + let _4 := read_from_memoryt_address(memory_array_index_access_uint32_dyn(var_underlyings_mpos, var_i)) + let var_price := 0x00 + let var_assetCacheAndPriceInited := 0x00 + var_price := 0x00 + let var_config_mpos := fun_resolveAssetConfig(_4) + let _5 := mapping_index_access_mapping_address_address_of_address_12628(cleanup_address(mload(var_config_mpos))) + let var_balance := cleanup_uint112(read_from_storage_split_offset_uint112(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))) + let var_owed := cleanup_uint144(read_from_storage_split_offset_uint144(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))) + let expr := iszero(iszero(var_balance)) + if expr + { + expr := iszero(iszero(and(cleanup_uint32(mload(add(var_config_mpos, 64))), 0xffffffff))) + } + if expr + { + pop(fun_initAssetCache(_4, _5, zero_struct_AssetCache_mpos)) + let var_twap, var_twapPeriod := modifier_FREEMEM_12660(zero_struct_AssetCache_mpos, var_config_mpos) + var_price := var_twap + var_assetCacheAndPriceInited := 0x01 + let expr_1 := checked_div_uint256_12661(checked_mul_uint256(div(checked_mul_uint256(var_balance, fun_computeExchangeRate(zero_struct_AssetCache_mpos)), 0x0de0b6b3a7640000), var_twap)) + mstore(var_status_mpos, checked_add_uint256(mload(var_status_mpos), checked_div_uint256_12662(checked_mul_uint256(expr_1, cleanup_uint32(cleanup_uint32(mload(add(var_config_mpos, 64)))))))) + } + if iszero(iszero(var_owed)) + { + if iszero(var_assetCacheAndPriceInited) + { + pop(fun_initAssetCache(_4, _5, zero_struct_AssetCache_mpos)) + let var_twap_1, var_twapPeriod_1 := modifier_FREEMEM_12660(zero_struct_AssetCache_mpos, var_config_mpos) + var_price := var_twap_1 + } + mstore(_2, increment_uint256(mload(_2))) + if cleanup_bool(mload(add(var_config_mpos, 32))) { write_to_memory_bool(_3) } + let expr_2 := checked_div_uint256_12661(checked_mul_uint256(div(fun_roundUpOwed(zero_struct_AssetCache_mpos, fun_getCurrentOwedExact(_5, zero_struct_AssetCache_mpos, var_account, shr(112, sload(mapping_index_access_mapping_address_address_of_address(add(_5, 5), var_account))))), 0x3b9aca00), var_price)) + let _6 := add(var_config_mpos, 96) + let expr_3 := iszero(iszero(and(cleanup_uint32(mload(_6)), 0xffffffff))) + let expr_4 := 0x00 + switch expr_3 + case 0 { + expr_4 := 0xffffffffffffffffffffffffffffffffffff + } + default { + let expr_5 := checked_mul_uint256_12666(expr_2) + expr_4 := checked_div_uint256(expr_5, cleanup_uint32(cleanup_uint32(mload(_6)))) + } + mstore(_1, checked_add_uint256(mload(_1), expr_4)) + } + } + } + /// @ast-id 1440 + function fun_computeExchangeRate(var_assetCache_1412_mpos) -> var + { + let _1 := add(var_assetCache_1412_mpos, 32) + let _2 := 0xffffffffffffffffffffffffffff + if iszero(and(mload(_1), _2)) + { + var := 0x0de0b6b3a7640000 + leave + } + let _3 := mload(add(var_assetCache_1412_mpos, 384)) + let expr := checked_add_uint256(_3, div(and(mload(add(var_assetCache_1412_mpos, 64)), 0xffffffffffffffffffffffffffffffffffff), 0x3b9aca00)) + let _4 := 0x0de0b6b3a7640000 + if and(iszero(iszero(expr)), gt(_4, div(not(0), expr))) { panic_error_0x11() } + let cleaned := and(mload(_1), _2) + if iszero(cleaned) { panic_error_0x12() } + var := div(mul(expr, _4), cleaned) + } + /// @ast-id 2027 + function fun_getCurrentOwedExact(var_assetStorage_1997_slot, var_assetCache_mpos, var_account, var_owed) -> var + { + if iszero(var_owed) + { + var := 0x00 + leave + } + let expr := checked_mul_uint256(var_owed, mload(add(var_assetCache_mpos, 128))) + let _1 := sload(add(mapping_index_access_mapping_address_address_of_address(add(var_assetStorage_1997_slot, 5), var_account), 1)) + if iszero(_1) { panic_error_0x12() } + var := div(expr, _1) + } + /// @ast-id 2063 + function fun_roundUpOwed(var_assetCache_2030_mpos, var_owed) -> var_ + { + if iszero(var_owed) + { + var_ := 0x00 + leave + } + let _1 := mload(add(var_assetCache_2030_mpos, 416)) + let _2 := 0x3b9aca00 + let product := mul(_2, _1) + if iszero(product) { panic_error_0x12() } + var_ := mul(mul(div(add(add(var_owed, product), not(0)), product), _1), _2) + } + /// @ast-id 11632 + function fun_computeAssetLiquidities(var_account) -> var_mpos + { + let expr_11567_mpos := fun_getEnteredMarketsArray(var_account) + let _1 := mload(expr_11567_mpos) + let _2 := array_allocation_size_array_uint32_dyn(_1) + let _3 := 64 + let memPtr := mload(_3) + finalize_allocation(memPtr, _2) + mstore(memPtr, _1) + let _4 := add(array_allocation_size_array_uint32_dyn(_1), not(31)) + let i := 0 + let i_1 := i + for { } lt(i_1, _4) { i_1 := add(i_1, 32) } + { + let memPtr_1 := mload(_3) + finalize_allocation_12670(memPtr_1) + mstore(memPtr_1, i) + let _5 := allocate_and_zero_memory_struct_struct_LiquidityStatus() + let _6 := 32 + mstore(add(memPtr_1, _6), _5) + mstore(add(add(memPtr, i_1), _6), memPtr_1) + } + let expr_mpos := allocate_and_zero_memory_array_array_address_dyn() + let var_i := i + for { } + 0x01 + { + var_i := increment_uint256(var_i) + } + { + if iszero(lt(var_i, mload(expr_11567_mpos))) { break } + let _7 := read_from_memoryt_address(memory_array_index_access_uint32_dyn(expr_11567_mpos, var_i)) + write_to_memory_address(memory_array_index_access_uint32_dyn_12584(expr_mpos), _7) + write_to_memory_address(mload(memory_array_index_access_uint32_dyn(memPtr, var_i)), _7) + mstore(add(mload(memory_array_index_access_uint32_dyn(memPtr, var_i)), 32), fun_computeLiquidityRaw(var_account, expr_mpos)) + } + var_mpos := memPtr + } + /// @ast-id 11667 + function fun_requireLiquidity(var_account) + { + pop(allocate_and_zero_memory_struct_struct_LiquidityStatus()) + let var_mpos := fun_computeLiquidityRaw(var_account, fun_getEnteredMarketsArray(var_account)) + let expr := iszero(mload(add(var_mpos, 96))) + if iszero(expr) + { + expr := eq(mload(add(var_mpos, 64)), 0x01) + } + if iszero(expr) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 28) + mstore(add(memPtr, 68), "e/borrow-isolation-violation") + revert(memPtr, 100) + } + let _1 := mload(var_mpos) + if lt(_1, mload(add(var_mpos, 32))) + { + let memPtr_1 := mload(64) + mstore(memPtr_1, shl(229, 4594637)) + mstore(add(memPtr_1, 4), 32) + mstore(add(memPtr_1, 36), 22) + mstore(add(memPtr_1, 68), "e/collateral-violation") + revert(memPtr_1, 100) + } + } + function require_helper(condition) + { + if iszero(condition) { revert(0, 0) } + } + /// @ast-id 13238 + function fun_mulDiv_22854(var_a, var_b) -> var_result + { + let usr$mm := mulmod(var_a, var_b, not(0)) + let var_prod0 := mul(var_a, var_b) + let _1 := lt(usr$mm, var_prod0) + let _2 := sub(usr$mm, var_prod0) + let var_prod1 := sub(_2, _1) + if eq(_2, _1) + { + var_result := div(var_prod0, 0x12725dd1d243aba0e75fe645cc4873f9e6) + leave + } + let _3 := 0x12725dd1d243aba0e75fe645cc4873f9e6 + if iszero(gt(_3, var_prod1)) { revert(0, 0) } + let var_remainder := mulmod(var_a, var_b, _3) + var_result := mul(or(shr(0x01, sub(var_prod0, var_remainder)), shl(255, sub(var_prod1, gt(var_remainder, var_prod0)))), 0x80bf433070d530fec992d281993084ea0851f19952bccb6b6d6a90f542af7c3b) + } + /// @ast-id 13238 + function fun_mulDiv(var_a, var_b, var_denominator) -> var_result + { + let usr$mm := mulmod(var_a, var_b, not(0)) + let var_prod0 := mul(var_a, var_b) + let _1 := lt(usr$mm, var_prod0) + let _2 := sub(usr$mm, var_prod0) + let var_prod1 := sub(_2, _1) + if eq(_2, _1) + { + require_helper(iszero(iszero(var_denominator))) + var_result := div(var_prod0, var_denominator) + leave + } + require_helper(gt(var_denominator, var_prod1)) + let var_remainder := mulmod(var_a, var_b, var_denominator) + let expr := and(var_denominator, add(not(var_denominator), 0x01)) + let var_denominator_1 := div(var_denominator, expr) + let _3 := 0x02 + let expr_1 := xor(mul(0x03, var_denominator_1), _3) + let expr_2 := mul(expr_1, sub(_3, mul(var_denominator_1, expr_1))) + let expr_3 := mul(expr_2, sub(_3, mul(var_denominator_1, expr_2))) + let expr_4 := mul(expr_3, sub(_3, mul(var_denominator_1, expr_3))) + let expr_5 := mul(expr_4, sub(_3, mul(var_denominator_1, expr_4))) + let expr_6 := mul(expr_5, sub(_3, mul(var_denominator_1, expr_5))) + var_result := mul(or(div(sub(var_prod0, var_remainder), expr), mul(sub(var_prod1, gt(var_remainder, var_prod0)), add(div(sub(0, expr), expr), 0x01))), mul(expr_6, sub(_3, mul(var_denominator_1, expr_6)))) + } + /// @ast-id 13412 + function fun_rpow(var_x, var_n) -> var_z + { + switch var_x + case 0 { + switch var_n + case 0 { + var_z := 0x033b2e3c9fd0803ce8000000 + } + default { var_z := 0 } + } + default { + let _1 := 1 + switch and(var_n, _1) + case 0 { + var_z := 0x033b2e3c9fd0803ce8000000 + } + default { var_z := var_x } + var_n := shr(_1, var_n) + for { } var_n { var_n := shr(_1, var_n) } + { + let usr$xx := mul(var_x, var_x) + if iszero(eq(div(usr$xx, var_x), var_x)) + { + let _2 := 0 + revert(_2, _2) + } + let _3 := 0x019d971e4fe8401e74000000 + let usr$xxRound := add(usr$xx, _3) + if lt(usr$xxRound, usr$xx) + { + let _4 := 0 + revert(_4, _4) + } + let _5 := 0x033b2e3c9fd0803ce8000000 + var_x := div(usr$xxRound, _5) + if and(var_n, _1) + { + let usr$zx := mul(var_z, var_x) + if and(iszero(iszero(var_x)), iszero(eq(div(usr$zx, var_x), var_z))) + { + let _6 := 0 + revert(_6, _6) + } + let usr$zxRound := add(usr$zx, _3) + if lt(usr$zxRound, usr$zx) + { + let _7 := 0 + revert(_7, _7) + } + var_z := div(usr$zxRound, _5) + } + } + } + } + function require_helper_stringliteral_846b(condition) + { + if iszero(condition) + { + let memPtr := mload(64) + mstore(memPtr, shl(229, 4594637)) + mstore(add(memPtr, 4), 32) + mstore(add(memPtr, 36), 1) + mstore(add(memPtr, 68), "T") + revert(memPtr, 100) + } + } + /// @ast-id 13812 + function fun_getSqrtRatioAtTick(var_tick) -> var_sqrtPriceX96 + { + let _1 := signextend(2, var_tick) + let expr := 0x00 + switch slt(_1, expr) + case 0 { expr := _1 } + default { expr := sub(0x00, _1) } + require_helper_stringliteral_846b(iszero(gt(expr, 887272))) + let expr_1 := 0x00 + switch iszero(iszero(and(expr, 0x01))) + case 0 { expr_1 := shl(128, 1) } + default { + expr_1 := 0xfffcb933bd6fad37aa2d162d1a594001 + } + let var_ratio := and(expr_1, 0xffffffffffffffffffffffffffffffffff) + if iszero(iszero(and(expr, 2))) + { + var_ratio := shr(128, mul(var_ratio, 0xfff97272373d413259a46990580e213a)) + } + if iszero(iszero(and(expr, 0x04))) + { + var_ratio := shr(128, mul(var_ratio, 0xfff2e50f5f656932ef12357cf3c7fdcc)) + } + if iszero(iszero(and(expr, 0x08))) + { + var_ratio := shr(128, mul(var_ratio, 0xffe5caca7e10e4e61c3624eaa0941cd0)) + } + if iszero(iszero(and(expr, 0x10))) + { + var_ratio := shr(128, mul(var_ratio, 0xffcb9843d60f6159c9db58835c926644)) + } + if iszero(iszero(and(expr, 0x20))) + { + var_ratio := shr(128, mul(var_ratio, 0xff973b41fa98c081472e6896dfb254c0)) + } + if iszero(iszero(and(expr, 0x40))) + { + var_ratio := shr(128, mul(var_ratio, 0xff2ea16466c96a3843ec78b326b52861)) + } + let _2 := 0x80 + if iszero(iszero(and(expr, _2))) + { + var_ratio := shr(_2, mul(var_ratio, 0xfe5dee046a99a2a811c461f1969c3053)) + } + if iszero(iszero(and(expr, 0x0100))) + { + var_ratio := shr(_2, mul(var_ratio, 0xfcbe86c7900a88aedcffc83b479aa3a4)) + } + if iszero(iszero(and(expr, 0x0200))) + { + var_ratio := shr(_2, mul(var_ratio, 0xf987a7253ac413176f2b074cf7815e54)) + } + if iszero(iszero(and(expr, 0x0400))) + { + var_ratio := shr(_2, mul(var_ratio, 0xf3392b0822b70005940c7a398e4b70f3)) + } + if iszero(iszero(and(expr, 0x0800))) + { + var_ratio := shr(_2, mul(var_ratio, 0xe7159475a2c29b7443b29c7fa6e889d9)) + } + if iszero(iszero(and(expr, 0x1000))) + { + var_ratio := shr(_2, mul(var_ratio, 0xd097f3bdfd2022b8845ad8f792aa5825)) + } + if iszero(iszero(and(expr, 0x2000))) + { + var_ratio := shr(_2, mul(var_ratio, 0xa9f746462d870fdf8a65dc1f90e061e5)) + } + if iszero(iszero(and(expr, 0x4000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x70d869a156d2a1b890bb3df62baf32f7)) + } + if iszero(iszero(and(expr, 0x8000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x31be135f97d08fd981231505542fcfa6)) + } + if iszero(iszero(and(expr, 0x010000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x09aa508b5b7a84e1c677de54f3e99bc9)) + } + if iszero(iszero(and(expr, 0x020000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x5d6af8dedb81196699c329225ee604)) + } + if iszero(iszero(and(expr, 0x040000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x2216e584f5fa1ea926041bedfe98)) + } + if iszero(iszero(and(expr, 0x080000))) + { + var_ratio := shr(_2, mul(var_ratio, 0x048a170391f7dc42444e8fa2)) + } + if sgt(_1, 0x00) + { + var_ratio := checked_div_uint256_12692(var_ratio) + } + let expr_2 := 0x00 + switch iszero(and(var_ratio, 0xffffffff)) + case 0 { expr_2 := 0x01 } + default { expr_2 := 0x00 } + var_sqrtPriceX96 := and(add(shr(0x20, var_ratio), and(expr_2, 0xff)), sub(shl(160, 1), 1)) + } +} +// ----