Skip to content

Commit

Permalink
fix: cannot resolve retrieval with earlier timstamp
Browse files Browse the repository at this point in the history
  • Loading branch information
deluca-mike committed Apr 10, 2024
1 parent de46008 commit e8e8211
Show file tree
Hide file tree
Showing 4 changed files with 390 additions and 82 deletions.
24 changes: 20 additions & 4 deletions src/MinterGateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ contract MinterGateway is IMinterGateway, ContinuousIndexing, ERC712Extended {
uint40 updateTimestamp;
uint40 penalizedUntilTimestamp;
uint40 frozenUntilTimestamp;
uint40 latestProposedRetrievalTimestamp;
}

/* ============ Variables ============ */
Expand Down Expand Up @@ -228,6 +229,7 @@ contract MinterGateway is IMinterGateway, ContinuousIndexing, ERC712Extended {
revert RetrievalsExceedCollateral(updatedTotalPendingRetrievals_, currentCollateral_);
}

minterState_.latestProposedRetrievalTimestamp = uint40(block.timestamp);
minterState_.totalPendingRetrievals = updatedTotalPendingRetrievals_;
_pendingCollateralRetrievals[msg.sender][retrievalId_] = safeCollateral_;

Expand Down Expand Up @@ -580,6 +582,11 @@ contract MinterGateway is IMinterGateway, ContinuousIndexing, ERC712Extended {
return _minterStates[minter_].penalizedUntilTimestamp;
}

/// @inheritdoc IMinterGateway
function latestProposedRetrievalOf(address minter_) external view returns (uint40) {
return _minterStates[minter_].latestProposedRetrievalTimestamp;
}

/// @inheritdoc IMinterGateway
function getPenaltyForMissedCollateralUpdates(address minter_) external view returns (uint240) {
uint112 penaltyPrincipal_ = _getPenaltyPrincipalForMissedCollateralUpdates(minter_);
Expand Down Expand Up @@ -866,13 +873,22 @@ contract MinterGateway is IMinterGateway, ContinuousIndexing, ERC712Extended {
* @param newTimestamp_ The timestamp of the collateral update.
*/
function _updateCollateral(address minter_, uint240 amount_, uint40 newTimestamp_) internal {
uint40 lastUpdateTimestamp_ = _minterStates[minter_].updateTimestamp;
MinterState storage minterState_ = _minterStates[minter_];

// MinterGateway already has more recent collateral update
uint40 lastUpdateTimestamp_ = minterState_.updateTimestamp;

// Revert if minter's last collateral update is more recent.
if (newTimestamp_ <= lastUpdateTimestamp_) revert StaleCollateralUpdate(newTimestamp_, lastUpdateTimestamp_);

_minterStates[minter_].collateral = amount_;
_minterStates[minter_].updateTimestamp = newTimestamp_;
uint40 latestProposedRetrievalTimestamp_ = minterState_.latestProposedRetrievalTimestamp;

// Revert if minter's last created retrieval proposal is more recent.
if (newTimestamp_ <= latestProposedRetrievalTimestamp_) {
revert ObsoleteCollateralUpdate(newTimestamp_, latestProposedRetrievalTimestamp_);
}

minterState_.collateral = amount_;
minterState_.updateTimestamp = newTimestamp_;
}

/* ============ Internal View/Pure Functions ============ */
Expand Down
12 changes: 9 additions & 3 deletions src/interfaces/IMinterGateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,12 @@ interface IMinterGateway is IContinuousIndexing, IERC712 {
/// If `validators`, `signatures`, `timestamps` lengths do not match.
error SignatureArrayLengthsMismatch();

/// @notice Emitted when calling `updateCollateral` if Minter Gateway has more fresh collateral update.
/// @notice Emitted when updating collateral with a timestamp older than the current last update timestamp.
error StaleCollateralUpdate(uint40 newTimestamp, uint40 lastCollateralUpdate);

/// @notice Emitted when updating collateral with a timestamp older than the latest retrieval proposal date.
error ObsoleteCollateralUpdate(uint40 newTimestamp, uint40 latestProposedRetrievalTimestamp);

/// @notice Emitted when calling `deactivateMinter` with a minter still approved in TTG Registrar.
error StillApprovedMinter();

Expand Down Expand Up @@ -362,6 +365,9 @@ interface IMinterGateway is IContinuousIndexing, IERC712 {
/// @notice The timestamp until which minter is already penalized for missed collateral updates.
function penalizedUntilOf(address minter) external view returns (uint40);

/// @notice The timestamp when `minter` created their latest retrieval proposal.
function latestProposedRetrievalOf(address minter) external view returns (uint40);

/// @notice The penalty for missed collateral updates. Penalized once per missed interval.
function getPenaltyForMissedCollateralUpdates(address minter) external view returns (uint240);

Expand All @@ -386,10 +392,10 @@ interface IMinterGateway is IContinuousIndexing, IERC712 {
address minter
) external view returns (uint48 mintId, uint40 createdAt, address destination, uint240 amount);

/// @notice The minter's proposeRetrieval proposal amount
/// @notice The amount of a pending retrieval request for an active minter.
function pendingCollateralRetrievalOf(address minter, uint256 retrievalId) external view returns (uint240);

/// @notice The total amount of active proposeRetrieval requests per minter
/// @notice The total amount of pending retrieval requests for an active minter.
function totalPendingCollateralRetrievalOf(address minter) external view returns (uint240);

/// @notice The timestamp when minter becomes unfrozen after being frozen by validator.
Expand Down
Loading

0 comments on commit e8e8211

Please sign in to comment.