vault: check Lock invariant before writing

This commit is contained in:
Mark Spanbroek 2025-01-28 15:00:20 +01:00
parent 220b648758
commit f0da7cd918

View File

@ -149,10 +149,12 @@ abstract contract VaultBase {
Timestamp expiry, Timestamp expiry,
Timestamp maximum Timestamp maximum
) internal { ) internal {
require(expiry <= maximum, ExpiryPastMaximum()); Lock memory lock = _locks[controller][context];
Lock memory existing = _locks[controller][context]; require(lock.maximum == Timestamp.wrap(0), AlreadyLocked());
require(existing.maximum == Timestamp.wrap(0), AlreadyLocked()); lock.expiry = expiry;
_locks[controller][context] = Lock({expiry: expiry, maximum: maximum}); lock.maximum = maximum;
_checkLockInvariant(lock);
_locks[controller][context] = lock;
} }
function _extendLock( function _extendLock(
@ -163,8 +165,9 @@ abstract contract VaultBase {
Lock memory lock = _locks[controller][context]; Lock memory lock = _locks[controller][context];
require(lock.isLocked(), LockRequired()); require(lock.isLocked(), LockRequired());
require(lock.expiry <= expiry, InvalidExpiry()); require(lock.expiry <= expiry, InvalidExpiry());
require(expiry <= lock.maximum, ExpiryPastMaximum()); lock.expiry = expiry;
_locks[controller][context].expiry = expiry; _checkLockInvariant(lock);
_locks[controller][context] = lock;
} }
function _flow( function _flow(
@ -198,6 +201,10 @@ abstract contract VaultBase {
_flows[controller][context][to] = receiverFlow; _flows[controller][context][to] = receiverFlow;
} }
function _checkLockInvariant(Lock memory lock) private pure {
require(lock.expiry <= lock.maximum, ExpiryPastMaximum());
}
function _checkFlowInvariant( function _checkFlowInvariant(
Balance memory balance, Balance memory balance,
Lock memory lock, Lock memory lock,