improve tax rate handling

This commit is contained in:
JulesCrown 2024-09-17 16:16:41 +02:00
parent b4dfb03590
commit f738daff96

View file

@ -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);
}