Skip to content

Commit

Permalink
feat: multiplier nonce.
Browse files Browse the repository at this point in the history
  • Loading branch information
jdrskr committed Oct 1, 2024
1 parent f538c9a commit 023e8d1
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 10 deletions.
24 changes: 15 additions & 9 deletions contracts/BackedAutoFeeTokenImplementation.sol
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {

uint256 internal _totalShares;

uint256 public multiplierNonce;

// Events:

/**
Expand Down Expand Up @@ -104,10 +106,10 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
// Modifiers:

modifier updateMultiplier() {
(uint256 newMultiplier, uint256 periodsPassed) = getCurrentMultiplier();
(uint256 newMultiplier, uint256 periodsPassed, uint256 newMultiplierNonce) = getCurrentMultiplier();
lastTimeFeeApplied = lastTimeFeeApplied + periodLength * periodsPassed;
if (multiplier != newMultiplier) {
_updateMultiplier(newMultiplier);
_updateMultiplier(newMultiplier, newMultiplierNonce);
}
_;
}
Expand Down Expand Up @@ -155,6 +157,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
require(_lastTimeFeeApplied != 0, "Invalid last time fee applied");

multiplier = 1e18;
multiplierNonce = 0;
periodLength = _periodLength;
lastTimeFeeApplied = _lastTimeFeeApplied;
feePerPeriod = _feePerPeriod;
Expand All @@ -164,7 +167,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
(uint256 newMultiplier, ) = getCurrentMultiplier();
(uint256 newMultiplier, ,) = getCurrentMultiplier();
return _getUnderlyingAmountByShares(_totalShares, newMultiplier);
}

Expand All @@ -174,7 +177,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
function balanceOf(
address account
) public view virtual override returns (uint256) {
(uint256 newMultiplier, ) = getCurrentMultiplier();
(uint256 newMultiplier, ,) = getCurrentMultiplier();
return _getUnderlyingAmountByShares(sharesOf(account), newMultiplier);
}

Expand All @@ -186,13 +189,15 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
public
view
virtual
returns (uint256 newMultiplier, uint256 periodsPassed)
returns (uint256 newMultiplier, uint256 periodsPassed, uint256 newMultiplierNonce)
{
periodsPassed = (block.timestamp - lastTimeFeeApplied) / periodLength;
newMultiplier = multiplier;
newMultiplierNonce = multiplierNonce;
if (feePerPeriod > 0) {
for (uint256 index = 0; index < periodsPassed; index++) {
newMultiplier = (newMultiplier * (1e18 - feePerPeriod)) / 1e18;
newMultiplierNonce += 1;
}
}
}
Expand All @@ -210,7 +215,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
function getSharesByUnderlyingAmount(
uint256 _underlyingAmount
) external view returns (uint256) {
(uint256 newMultiplier, ) = getCurrentMultiplier();
(uint256 newMultiplier, ,) = getCurrentMultiplier();
return _getSharesByUnderlyingAmount(_underlyingAmount, newMultiplier);
}

Expand All @@ -220,7 +225,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
function getUnderlyingAmountByShares(
uint256 _sharesAmount
) external view returns (uint256) {
(uint256 newMultiplier, ) = getCurrentMultiplier();
(uint256 newMultiplier, ,) = getCurrentMultiplier();
return _getUnderlyingAmountByShares(_sharesAmount, newMultiplier);
}

Expand Down Expand Up @@ -337,7 +342,7 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
multiplier == oldMultiplier,
"BackedToken: Multiplier changed in the meantime"
);
_updateMultiplier(newMultiplier);
_updateMultiplier(newMultiplier, multiplierNonce + 1);
}

/**
Expand Down Expand Up @@ -469,8 +474,9 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
*
* Emit an {MultiplierUpdated} event.
*/
function _updateMultiplier(uint256 newMultiplier) internal virtual {
function _updateMultiplier(uint256 newMultiplier, uint256 newMultiplierNonce) internal virtual {
multiplier = newMultiplier;
multiplierNonce = newMultiplierNonce;
emit MultiplierUpdated(newMultiplier);
}

Expand Down
2 changes: 1 addition & 1 deletion contracts/BackedTokenImplementation.sol
Original file line number Diff line number Diff line change
Expand Up @@ -323,5 +323,5 @@ contract BackedTokenImplementation is OwnableUpgradeable, ERC20PermitDelegateTra
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
uint256[48] private __gap;
}

0 comments on commit 023e8d1

Please sign in to comment.