diff --git a/evm/src/NttManager/NttManagerState.sol b/evm/src/NttManager/NttManagerState.sol index 66b998ce3..366cfedff 100644 --- a/evm/src/NttManager/NttManagerState.sol +++ b/evm/src/NttManager/NttManagerState.sol @@ -70,6 +70,7 @@ abstract contract NttManagerState is } __PausedOwnable_init(msg.sender, msg.sender); __ReentrancyGuard_init(); + _setOutboundLimit(TrimmedAmountLib.max(tokenDecimals_)); } function _initialize() internal virtual override { @@ -272,6 +273,8 @@ abstract contract NttManagerState is _getPeersStorage()[peerChainId].peerAddress = peerContract; _getPeersStorage()[peerChainId].tokenDecimals = decimals; + _setInboundLimit(TrimmedAmountLib.max(tokenDecimals_), peerChainId); + emit PeerUpdated( peerChainId, oldPeer.peerAddress, oldPeer.tokenDecimals, peerContract, decimals ); diff --git a/evm/src/libraries/RateLimiter.sol b/evm/src/libraries/RateLimiter.sol index 704ac5e0a..ca80aa825 100644 --- a/evm/src/libraries/RateLimiter.sol +++ b/evm/src/libraries/RateLimiter.sol @@ -85,12 +85,15 @@ abstract contract RateLimiter is IRateLimiter, IRateLimiterEvents { RateLimitParams storage rateLimitParams ) internal { TrimmedAmount memory oldLimit = rateLimitParams.limit; - TrimmedAmount memory currentCapacity = _getCurrentCapacity(rateLimitParams); + if (oldLimit.isNull()) { + rateLimitParams.currentCapacity = limit; + } else { + TrimmedAmount memory currentCapacity = _getCurrentCapacity(rateLimitParams); + rateLimitParams.currentCapacity = + _calculateNewCurrentCapacity(limit, oldLimit, currentCapacity); + } rateLimitParams.limit = limit; - rateLimitParams.currentCapacity = - _calculateNewCurrentCapacity(limit, oldLimit, currentCapacity); - rateLimitParams.lastTxTimestamp = uint64(block.timestamp); } diff --git a/evm/src/libraries/TrimmedAmount.sol b/evm/src/libraries/TrimmedAmount.sol index b8e7d8fdc..8df4b2aaf 100644 --- a/evm/src/libraries/TrimmedAmount.sol +++ b/evm/src/libraries/TrimmedAmount.sol @@ -34,14 +34,6 @@ library TrimmedAmountLib { } function gt(TrimmedAmount memory a, TrimmedAmount memory b) internal pure returns (bool) { - // on initialization - if (isZero(b) && !isZero(a)) { - return true; - } - if (isZero(a) && !isZero(b)) { - return false; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -50,14 +42,6 @@ library TrimmedAmountLib { } function lt(TrimmedAmount memory a, TrimmedAmount memory b) internal pure returns (bool) { - // on initialization - if (isZero(b) && !isZero(a)) { - return false; - } - if (isZero(a) && !isZero(b)) { - return true; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -65,8 +49,7 @@ library TrimmedAmountLib { return a.amount < b.amount; } - // TODO: is this needed? let's remove it - function isZero(TrimmedAmount memory a) internal pure returns (bool) { + function isNull(TrimmedAmount memory a) internal pure returns (bool) { return (a.amount == 0 && a.decimals == 0); } @@ -74,11 +57,6 @@ library TrimmedAmountLib { TrimmedAmount memory a, TrimmedAmount memory b ) internal pure returns (TrimmedAmount memory) { - // on initialization - if (isZero(b)) { - return a; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -90,15 +68,6 @@ library TrimmedAmountLib { TrimmedAmount memory a, TrimmedAmount memory b ) internal pure returns (TrimmedAmount memory) { - // on initialization - if (isZero(a)) { - return b; - } - - if (isZero(b)) { - return a; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -109,15 +78,6 @@ library TrimmedAmountLib { TrimmedAmount memory a, TrimmedAmount memory b ) internal pure returns (TrimmedAmount memory) { - // on initialization - if (isZero(a)) { - return b; - } - - if (isZero(b)) { - return a; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -134,14 +94,6 @@ library TrimmedAmountLib { TrimmedAmount memory a, TrimmedAmount memory b ) public pure returns (TrimmedAmount memory) { - // on initialization - if (isZero(a) && !isZero(b)) { - return a; - } - if (isZero(b) && !isZero(a)) { - return b; - } - if (a.decimals != b.decimals) { revert NumberOfDecimalsNotEqual(a.decimals, b.decimals); } @@ -176,6 +128,11 @@ library TrimmedAmountLib { ); } + function max(uint8 decimals) internal pure returns (TrimmedAmount memory) { + uint8 actualDecimals = minUint8(TRIMMED_DECIMALS, decimals); + return TrimmedAmount(type(uint64).max, actualDecimals); + } + /// @dev trim the amount to target decimals. /// The actual resulting decimals is the minimum of TRIMMED_DECIMALS, /// fromDecimals, and toDecimals. This ensures that no dust is