@@ -18,7 +18,7 @@ import "./interfaces/INttManagerEvents.sol";
18
18
import "./interfaces/INTTToken.sol " ;
19
19
import "./interfaces/ITransceiver.sol " ;
20
20
import "./TransceiverRegistry.sol " ;
21
- import "./NttTrimmer .sol " ;
21
+ import "./libraries/TrimmedAmount .sol " ;
22
22
import "./libraries/PausableOwnable.sol " ;
23
23
import "./libraries/Implementation.sol " ;
24
24
@@ -27,13 +27,14 @@ contract NttManager is
27
27
INttManagerEvents ,
28
28
TransceiverRegistry ,
29
29
RateLimiter ,
30
- NttTrimmer ,
31
30
ReentrancyGuardUpgradeable ,
32
31
PausableOwnable ,
33
32
Implementation
34
33
{
35
34
using BytesParsing for bytes ;
36
35
using SafeERC20 for IERC20 ;
36
+ using TrimmedAmountLib for uint256 ;
37
+ using TrimmedAmountLib for TrimmedAmount;
37
38
38
39
error RefundFailed (uint256 refundAmount );
39
40
error CannotRenounceNttManagerOwnership (address owner );
@@ -179,7 +180,7 @@ contract NttManager is
179
180
Mode _mode ,
180
181
uint16 _chainId ,
181
182
uint64 _rateLimitDuration
182
- ) RateLimiter (_rateLimitDuration) NttTrimmer (_token) {
183
+ ) RateLimiter (_rateLimitDuration) {
183
184
token = _token;
184
185
mode = _mode;
185
186
chainId = _chainId;
@@ -309,11 +310,11 @@ contract NttManager is
309
310
}
310
311
311
312
function setOutboundLimit (uint256 limit ) external onlyOwner {
312
- _setOutboundLimit (_nttTrimmer ( limit));
313
+ _setOutboundLimit (limit. trim ( tokenDecimals () ));
313
314
}
314
315
315
316
function setInboundLimit (uint256 limit , uint16 chainId_ ) external onlyOwner {
316
- _setInboundLimit (_nttTrimmer ( limit), chainId_);
317
+ _setInboundLimit (limit. trim ( tokenDecimals () ), chainId_);
317
318
}
318
319
319
320
function completeOutboundQueuedTransfer (uint64 messageSequence )
@@ -363,9 +364,9 @@ contract NttManager is
363
364
function trimTransferAmount (uint256 amount ) internal view returns (TrimmedAmount memory ) {
364
365
TrimmedAmount memory trimmedAmount;
365
366
{
366
- trimmedAmount = _nttTrimmer ( amount);
367
+ trimmedAmount = amount. trim ( tokenDecimals () );
367
368
// don't deposit dust that can not be bridged due to the decimal shift
368
- uint256 newAmount = _nttUntrim ( trimmedAmount);
369
+ uint256 newAmount = trimmedAmount. untrim ( tokenDecimals () );
369
370
if (amount != newAmount) {
370
371
revert TransferAmountHasDust (amount, amount - newAmount);
371
372
}
@@ -557,7 +558,11 @@ contract NttManager is
557
558
recipientChain, priceQuotes, instructions, enabledTransceivers, encodedNttManagerPayload
558
559
);
559
560
560
- emit TransferSent (recipient, _nttUntrim (amount), msg .value , recipientChain, seq);
561
+ // push it on the stack again to avoid a stack too deep error
562
+ TrimmedAmount memory amt = amount;
563
+ uint16 destinationChain = recipientChain;
564
+
565
+ emit TransferSent (recipient, amt.untrim (tokenDecimals ()), msg .value , destinationChain, seq);
561
566
562
567
// return the sequence number
563
568
return sequence;
@@ -616,8 +621,8 @@ contract NttManager is
616
621
if (nativeTokenTransfer.toChain != chainId) {
617
622
revert InvalidTargetChain (nativeTokenTransfer.toChain, chainId);
618
623
}
619
-
620
- TrimmedAmount memory nativeTransferAmount = _nttFixDecimals ( nativeTokenTransfer.amount);
624
+ TrimmedAmount memory nativeTransferAmount =
625
+ nativeTokenTransfer.amount. untrim ( tokenDecimals ()). trim ( tokenDecimals () );
621
626
622
627
address transferRecipient = fromWormholeFormat (nativeTokenTransfer.to);
623
628
@@ -668,7 +673,7 @@ contract NttManager is
668
673
) internal {
669
674
// calculate proper amount of tokens to unlock/mint to recipient
670
675
// untrim the amount
671
- uint256 untrimmedAmount = _nttUntrim ( amount);
676
+ uint256 untrimmedAmount = amount. untrim ( tokenDecimals () );
672
677
673
678
emit TransferRedeemed (digest);
674
679
@@ -765,7 +770,8 @@ contract NttManager is
765
770
}
766
771
767
772
function tokenDecimals () public view override (INttManager, RateLimiter) returns (uint8 ) {
768
- return tokenDecimals_;
773
+ (, bytes memory queriedDecimals ) = token.staticcall (abi.encodeWithSignature ("decimals() " ));
774
+ return abi.decode (queriedDecimals, (uint8 ));
769
775
}
770
776
771
777
/// ============== INVARIANTS =============================================
0 commit comments