Skip to content

Commit 36948a0

Browse files
committed
evm: Fix possible overflow on backfilling
1 parent 06634b9 commit 36948a0

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

evm/src/libraries/RateLimiter.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ abstract contract RateLimiter is IRateLimiter, IRateLimiterEvents {
240240
RateLimitParams storage rateLimitParams
241241
) internal {
242242
rateLimitParams.lastTxTimestamp = uint64(block.timestamp);
243-
rateLimitParams.currentCapacity = capacity.add(amount).min(rateLimitParams.limit);
243+
rateLimitParams.currentCapacity = capacity.saturatingAdd(amount).min(rateLimitParams.limit);
244244
}
245245

246246
function _isOutboundAmountRateLimited(TrimmedAmount memory amount)

evm/src/libraries/TrimmedAmount.sol

+25
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,31 @@ library TrimmedAmountLib {
105105
return TrimmedAmount(a.amount + b.amount, a.decimals);
106106
}
107107

108+
function saturatingAdd(
109+
TrimmedAmount memory a,
110+
TrimmedAmount memory b
111+
) internal pure returns (TrimmedAmount memory) {
112+
// on initialization
113+
if (isZero(a)) {
114+
return b;
115+
}
116+
117+
if (isZero(b)) {
118+
return a;
119+
}
120+
121+
if (a.decimals != b.decimals) {
122+
revert NumberOfDecimalsNotEqual(a.decimals, b.decimals);
123+
}
124+
125+
uint256 saturatedSum;
126+
unchecked {
127+
saturatedSum = uint256(a.amount) + uint256(b.amount);
128+
saturatedSum = saturatedSum > type(uint64).max ? type(uint64).max : saturatedSum;
129+
}
130+
return TrimmedAmount(uint64(saturatedSum), a.decimals);
131+
}
132+
108133
function min(
109134
TrimmedAmount memory a,
110135
TrimmedAmount memory b

0 commit comments

Comments
 (0)