vault: check Lock invariant before writing

This commit is contained in:
Mark Spanbroek 2025-01-28 15:00:20 +01:00
parent 421a1eb5ba
commit d35cc00841

View File

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