// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.18; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "../periphery/libraries/SomaSwapLiquidityMathLibrary.sol"; contract ExampleComputeLiquidityValue { using SafeMath for uint256; address public immutable factory; constructor(address factory_) { factory = factory_; } // see SomaSwapLiquidityMathLibrary#getReservesAfterArbitrage function getReservesAfterArbitrage(address tokenA, address tokenB, uint256 truePriceTokenA, uint256 truePriceTokenB) external view returns (uint256 reserveA, uint256 reserveB) { return SomaSwapLiquidityMathLibrary.getReservesAfterArbitrage( factory, tokenA, tokenB, truePriceTokenA, truePriceTokenB ); } // see SomaSwapLiquidityMathLibrary#getLiquidityValue function getLiquidityValue(address tokenA, address tokenB, uint256 liquidityAmount) external view returns (uint256 tokenAAmount, uint256 tokenBAmount) { return SomaSwapLiquidityMathLibrary.getLiquidityValue(factory, tokenA, tokenB, liquidityAmount); } // see SomaSwapLiquidityMathLibrary#getLiquidityValueAfterArbitrageToPrice function getLiquidityValueAfterArbitrageToPrice( address tokenA, address tokenB, uint256 truePriceTokenA, uint256 truePriceTokenB, uint256 liquidityAmount ) external view returns (uint256 tokenAAmount, uint256 tokenBAmount) { return SomaSwapLiquidityMathLibrary.getLiquidityValueAfterArbitrageToPrice( factory, tokenA, tokenB, truePriceTokenA, truePriceTokenB, liquidityAmount ); } // test function to measure the gas cost of the above function function getGasCostOfGetLiquidityValueAfterArbitrageToPrice( address tokenA, address tokenB, uint256 truePriceTokenA, uint256 truePriceTokenB, uint256 liquidityAmount ) external view returns (uint256) { uint256 gasBefore = gasleft(); SomaSwapLiquidityMathLibrary.getLiquidityValueAfterArbitrageToPrice( factory, tokenA, tokenB, truePriceTokenA, truePriceTokenB, liquidityAmount ); uint256 gasAfter = gasleft(); return gasBefore - gasAfter; } }