// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.19; import "forge-std/Test.sol"; import {BaseLineLP} from "../../src/BaseLineLP.sol"; import "@uniswap-v3-core/interfaces/IUniswapV3Pool.sol"; contract PoolSerializer is Test { string csv; // Helper function to convert uint to string function uintToStr(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } // Helper function to convert int to string function intToStr(int256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } bool negative = _i < 0; uint256 j = uint256(negative ? -_i : _i); uint256 len; while (j != 0) { len++; j /= 10; } if (negative) { len++; } bytes memory bstr = new bytes(len); uint256 k = len; uint256 l = uint256(negative ? -_i : _i); while (l != 0) { k = k-1; uint8 temp = (48 + uint8(l - l / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; l /= 10; } if (negative) { bstr[0] = '-'; } return string(bstr); } function createCSVHeader() public { csv = "FLOOR liquidity, FLOOR tickLower, FLOOR tickUpper, FLOOR ETH, FLOOR HARB, ANCHOR liquidity, ANCHOR tickLower, ANCHOR tickUpper, ANCHOR ETH, ANCHOR HARB, DISCOVERY liquidity, DISCOVERY tickLower, DISCOVERY tickUpper, DISCOVERY ETH, DISCOVERY HARB, CURRENT TICK"; } function appendPossitions(BaseLineLP lm, IUniswapV3Pool pool, bool token0isWeth) public { (, int24 tickLower, int24 tickUpper) = lm.positions(BaseLineLP.Stage.FLOOR); (uint128 liquidity,,, uint128 tokensOwed0, uint128 tokensOwed1 ) = pool.positions(keccak256(abi.encodePacked(address(lm), tickLower, tickUpper))); string memory floorData = string(abi.encodePacked( uintToStr(liquidity), ",", intToStr(tickLower), ",", intToStr(tickUpper), ",", uintToStr(token0isWeth ? tokensOwed0 : tokensOwed1), ",", uintToStr(token0isWeth ? tokensOwed1 : tokensOwed0), "," )); (liquidity, tickLower, tickUpper) = lm.positions(BaseLineLP.Stage.ANCHOR); (uint256 ethAmount, uint256 harbAmount) = lm.tokensIn(BaseLineLP.Stage.ANCHOR); string memory anchorData = string(abi.encodePacked( uintToStr(liquidity), ",", intToStr(tickLower), ",", intToStr(tickUpper), ",", uintToStr(ethAmount), ",", uintToStr(harbAmount), "," )); (liquidity, tickLower, tickUpper) = lm.positions(BaseLineLP.Stage.DISCOVERY); (ethAmount, harbAmount) = lm.tokensIn(BaseLineLP.Stage.DISCOVERY); (, int24 currentTick, , , , , ) = pool.slot0(); string memory discoveryData = string(abi.encodePacked( uintToStr(liquidity), ",", intToStr(tickLower), ",", intToStr(tickUpper), ",", uintToStr(ethAmount), ",", uintToStr(harbAmount), ",", intToStr(currentTick) )); csv = string(abi.encodePacked(csv, "\n", floorData, anchorData, discoveryData)); } function writeCsv() public { string memory path = "./out/positions.csv"; vm.writeFile(path, csv); } }