From e347f132a7d643ae8c0dcea1d6bae2001377cff6 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 4 Jul 2025 19:19:38 +0100 Subject: [PATCH 1/2] Use actual transferred amount for balance update --- contracts/accounting/FarmAccounting.sol | 9 +++++---- test/FarmingPool.js | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/contracts/accounting/FarmAccounting.sol b/contracts/accounting/FarmAccounting.sol index 78e2a6e..f05b0fe 100644 --- a/contracts/accounting/FarmAccounting.sol +++ b/contracts/accounting/FarmAccounting.sol @@ -31,22 +31,23 @@ library FarmAccounting { } } - function startFarming(Info storage info, uint256 amount, uint256 period) internal returns(uint256) { + function startFarming(Info storage info, uint256 amount, uint256 period) internal returns(uint256 newAmount) { if (period == 0) revert ZeroDuration(); if (period > type(uint32).max) revert DurationTooLarge(); + newAmount = amount; // If something left from prev farming add it to the new farming (uint40 finished, uint32 duration, uint184 reward, uint256 balance) = (info.finished, info.duration, info.reward, info.balance); if (block.timestamp < finished) { - amount += reward - farmedSinceCheckpointScaled(info, finished - duration) / _SCALE; + newAmount += reward - farmedSinceCheckpointScaled(info, finished - duration) / _SCALE; } - if (amount > _MAX_REWARD_AMOUNT) revert AmountTooLarge(); + if (newAmount > _MAX_REWARD_AMOUNT) revert AmountTooLarge(); (info.finished, info.duration, info.reward, info.balance) = ( uint40(block.timestamp + period), uint32(period), - uint184(amount), + uint184(newAmount), balance + amount ); return amount; diff --git a/test/FarmingPool.js b/test/FarmingPool.js index 9ff6262..4092c4c 100644 --- a/test/FarmingPool.js +++ b/test/FarmingPool.js @@ -51,6 +51,23 @@ describe('FarmingPool', function () { farm.connect(wallet2).startFarming(1000, 60 * 60 * 24), ).to.be.revertedWithCustomError(farm, 'NotDistributor'); }); + + it('should rescue extra gift tokens from farm in the case of overlapping farming', async function () { + const { gift, farm } = await loadFixture(initContracts); + const duration = BigInt(60 * 60 * 24); + const amount = 100n; + await gift.mint(farm, amount); + await farm.startFarming(1000, duration); + await time.increaseTo((await farm.farmInfo()).finished - duration / 2n); + await farm.startFarming(1000, duration); + await farm.stopFarming(); + const farmInfoBefore = await farm.farmInfo(); + console.log(`farmBalance = ${await gift.balanceOf(farm)}, farmInfo.reward = ${farmInfoBefore.reward}, farmInfo.balance = ${farmInfoBefore.balance}`); + // Shouldn't revert with InsufficientFunds + await farm.rescueFunds(gift, amount); + const farmInfoAfter = await farm.farmInfo(); + console.log(`farmBalance = ${await gift.balanceOf(farm)}, farmInfo.reward = ${farmInfoAfter.reward}, farmInfo.balance = ${farmInfoAfter.balance}`); + }); }); describe('name', function () { From 84b17841ce66ce038f453634d14f79f9898a273f Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 11 Sep 2025 17:36:57 +0100 Subject: [PATCH 2/2] Fix return value in method --- contracts/accounting/FarmAccounting.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/accounting/FarmAccounting.sol b/contracts/accounting/FarmAccounting.sol index f05b0fe..60597f0 100644 --- a/contracts/accounting/FarmAccounting.sol +++ b/contracts/accounting/FarmAccounting.sol @@ -50,7 +50,6 @@ library FarmAccounting { uint184(newAmount), balance + amount ); - return amount; } function stopFarming(Info storage info) internal returns(uint256 leftover) {