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 a202180
Showing 1 changed file with 56 additions and 18 deletions.
74 changes: 56 additions & 18 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,13 +106,37 @@ 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);
}
_;
}

modifier onlyMultiplierUpdater() {
require(
_msgSender() == multiplierUpdater,
"BackedToken: Only multiplier updater"
);
_;
}

modifier onlyUpdatedMultiplier(uint256 oldMultiplier) {
require(
multiplier == oldMultiplier,
"BackedToken: Multiplier changed in the meantime"
);
_;
}

modifier onlyNewerMultiplierNonce(uint256 newMultiplierNonce) {
require(
multiplierNonce < newMultiplierNonce,
"BackedToken: Multiplier nonce is outdated."
);
_;
}

// constructor, set lastTimeFeeApplied to lock the implementation instance.
constructor () {
Expand Down Expand Up @@ -155,6 +181,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 +191,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 +201,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 +213,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 +239,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 +249,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 @@ -328,16 +357,24 @@ contract BackedAutoFeeTokenImplementation is BackedTokenImplementation {
function updateMultiplierValue(
uint256 newMultiplier,
uint256 oldMultiplier
) external updateMultiplier {
require(
_msgSender() == multiplierUpdater,
"BackedToken: Only multiplier updater"
);
require(
multiplier == oldMultiplier,
"BackedToken: Multiplier changed in the meantime"
);
_updateMultiplier(newMultiplier);
) public onlyMultiplierUpdater onlyUpdatedMultiplier(oldMultiplier) updateMultiplier {
_updateMultiplier(newMultiplier, multiplierNonce + 1);
}

/**
* @dev Function to change the contract multiplier with nonce, only if oldMultiplier did not change in the meantime. Allowed only for owner
*
* Emits a { MultiplierChanged } event
*
* @param newMultiplier New multiplier value
* @param newMultiplierNonce New multplier nonce
*/
function updateMultiplierWithNonce(
uint256 newMultiplier,
uint256 oldMultiplier,
uint256 newMultiplierNonce
) external onlyMultiplierUpdater onlyUpdatedMultiplier(oldMultiplier) onlyNewerMultiplierNonce(newMultiplierNonce) updateMultiplier {
_updateMultiplier(newMultiplier, newMultiplierNonce);
}

/**
Expand Down Expand Up @@ -469,8 +506,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

0 comments on commit a202180

Please sign in to comment.