From 9bd73c2eb8cac39262b7b5437f787dd6eeaebbfe Mon Sep 17 00:00:00 2001 From: jeyldii <45122314+jeyldii@users.noreply.github.com> Date: Tue, 5 Sep 2023 18:48:09 +0400 Subject: [PATCH] Fix out of gas in traderjoe21 helper --- contracts/TraderJoeHelper_v2_1.sol | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/contracts/TraderJoeHelper_v2_1.sol b/contracts/TraderJoeHelper_v2_1.sol index c9f46f9..e868656 100644 --- a/contracts/TraderJoeHelper_v2_1.sol +++ b/contracts/TraderJoeHelper_v2_1.sol @@ -8,8 +8,6 @@ import "./interfaces/ILBPair.sol"; /// @dev Helper contract for interacting with TraderJoe pair contracts. // solhint-disable-next-line contract-name-camelcase contract TraderJoeHelper_v2_1 { - - /// @dev Represents data about a bin in a Trader Joe pair. struct BinData { uint256 id; uint256 reserveX; @@ -24,34 +22,44 @@ contract TraderJoeHelper_v2_1 { * @return data An array of BinData structs containing data about each bin. * @return i The bin id where data collection stopped. It is reset to 0 if end of bins was reached before collecting size bins. */ - function getBins(ILBPair pair, uint24 offset, uint24 size) - external - view - returns (BinData[] memory data, uint24 i) - { + function getBins( + ILBPair pair, + uint24 offset, + uint24 size + ) external view returns (BinData[] memory data, uint24 i) { uint256 counter = 0; data = new BinData[](size); uint24 lastBin = pair.getNextNonEmptyBin(true, type(uint24).max); + uint24 prevId = lastBin; for ( i = offset; i < lastBin && counter < size; i = pair.getNextNonEmptyBin(false, i) ) { + if (prevId == i) { + break; + } (uint256 x, uint256 y) = pair.getBin(i); if (x > 0 || y > 0) { (data[counter].reserveX, data[counter].reserveY) = (x, y); data[counter].id = i; - unchecked{ ++counter; } + unchecked { + ++counter; + } } + prevId = i; } if (i == lastBin && counter < size) { (data[counter].reserveX, data[counter].reserveY) = pair.getBin(i); data[counter].id = i; - unchecked{ ++counter; } + unchecked { + ++counter; + } i = 0; } // cut array size down - assembly ("memory-safe") { // solhint-disable-line no-inline-assembly + assembly ("memory-safe") { + // solhint-disable-line no-inline-assembly mstore(data, counter) } }