From f738daff96a0fb5e19f9d807b0158e64904041ca Mon Sep 17 00:00:00 2001 From: JulesCrown Date: Tue, 17 Sep 2024 16:16:41 +0200 Subject: [PATCH] improve tax rate handling --- onchain/src/Stake.sol | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/onchain/src/Stake.sol b/onchain/src/Stake.sol index e6fe232..aa707a9 100644 --- a/onchain/src/Stake.sol +++ b/onchain/src/Stake.sol @@ -89,8 +89,7 @@ contract Stake { /// @dev Internal function to calculate and pay taxes for a position, adjusting shares and handling position liquidation if necessary. function _payTax(uint256 positionId, StakingPosition storage pos, uint256 taxFloorDuration) private { - // TODO: check if position exits - require(pos.share > 0, "position not found"); + // existance of position should be checked before // ihet = Implied Holding Expiry Timestamp uint256 ihet = (block.timestamp - pos.creationTime < taxFloorDuration) ? pos.creationTime + taxFloorDuration @@ -103,7 +102,6 @@ contract Stake { taxAmountDue = assetsBefore; } if (assetsBefore - taxAmountDue > 0) { - require(taxAmountDue > 10**18, "taxAmountDue not worth it"); // if something left over, update storage uint256 shareAfterTax = assetsToShares(assetsBefore - taxAmountDue); outstandingStake -= pos.share - shareAfterTax; @@ -220,7 +218,7 @@ contract Stake { smallestPositionShare = lastPos.share; } // dissolve position - _payTax(positionsToSnatch[index], lastPos, 0); + _payTax(positionsToSnatch[index], lastPos, TAX_FLOOR_DURATION); if (availableStake > sharesWanted) { revert TooMuchSnatch(receiver, sharesWanted, availableStake, smallestPositionShare); } @@ -300,7 +298,7 @@ contract Stake { } // to prevent snatch-and-change grieving attack, pay TAX_FLOOR_DURATION require(taxRate > pos.taxRate, "tax too low to snatch"); - _payTax(positionId, pos, TAX_FLOOR_DURATION); + _payTax(positionId, pos, 0); pos.taxRate = taxRate; emit PositionRateHiked(positionId, pos.owner, taxRate); } @@ -310,12 +308,12 @@ contract Stake { /// @dev Pays the due taxes based on the TAX_FLOOR_DURATION and returns the remaining assets to the position owner. function exitPosition(uint256 positionId) external { StakingPosition storage pos = positions[positionId]; - if (pos.creationTime == 0) { - revert PositionNotFound(positionId, msg.sender); - } if (pos.owner != msg.sender) { revert NoPermission(msg.sender, pos.owner); } + if (pos.creationTime == 0) { + revert PositionNotFound(positionId, msg.sender); + } // to prevent snatch-and-exit grieving attack, pay TAX_FLOOR_DURATION _payTax(positionId, pos, TAX_FLOOR_DURATION); _exitPosition(positionId, pos); @@ -326,6 +324,9 @@ contract Stake { /// @dev Calculates and pays the tax due, possibly adjusting the position's share count. function payTax(uint256 positionId) external { StakingPosition storage pos = positions[positionId]; + if (pos.creationTime == 0) { + revert PositionNotFound(positionId, msg.sender); + } _payTax(positionId, pos, 0); }