@@ -61,10 +61,11 @@ contract TestNonFungibleNttManager is Test {
61
61
address nft ,
62
62
IManagerBase.Mode _mode ,
63
63
uint16 _chainId ,
64
- bool shouldInitialize
64
+ bool shouldInitialize ,
65
+ uint8 _tokenIdWidth
65
66
) internal returns (INonFungibleNttManager) {
66
67
NonFungibleNttManager implementation =
67
- new NonFungibleNttManager (address (nft), tokenIdWidth , _mode, _chainId);
68
+ new NonFungibleNttManager (address (nft), _tokenIdWidth , _mode, _chainId);
68
69
69
70
NonFungibleNttManager proxy =
70
71
NonFungibleNttManager (address (new ERC1967Proxy (address (implementation), "" )));
@@ -112,12 +113,15 @@ contract TestNonFungibleNttManager is Test {
112
113
nftTwo = new DummyNftMintAndBurn (bytes ("https://metadata.dn420.com/y/ " ));
113
114
114
115
// Managers.
115
- managerOne =
116
- deployNonFungibleManager (address (nftOne), IManagerBase.Mode.LOCKING, chainIdOne, true );
117
- managerTwo =
118
- deployNonFungibleManager (address (nftTwo), IManagerBase.Mode.BURNING, chainIdTwo, true );
119
- managerThree =
120
- deployNonFungibleManager (address (nftOne), IManagerBase.Mode.BURNING, chainIdThree, true );
116
+ managerOne = deployNonFungibleManager (
117
+ address (nftOne), IManagerBase.Mode.LOCKING, chainIdOne, true , tokenIdWidth
118
+ );
119
+ managerTwo = deployNonFungibleManager (
120
+ address (nftTwo), IManagerBase.Mode.BURNING, chainIdTwo, true , tokenIdWidth
121
+ );
122
+ managerThree = deployNonFungibleManager (
123
+ address (nftOne), IManagerBase.Mode.BURNING, chainIdThree, true , tokenIdWidth
124
+ );
121
125
122
126
// Wormhole Transceivers.
123
127
transceiverOne = deployWormholeTranceiver (address (managerOne));
@@ -214,8 +218,9 @@ contract TestNonFungibleNttManager is Test {
214
218
function test_cannotInitalizeNotDeployer () public {
215
219
// Don't initialize.
216
220
vm.prank (owner);
217
- INonFungibleNttManager dummyManager =
218
- deployNonFungibleManager (address (nftOne), IManagerBase.Mode.LOCKING, chainIdOne, false );
221
+ INonFungibleNttManager dummyManager = deployNonFungibleManager (
222
+ address (nftOne), IManagerBase.Mode.LOCKING, chainIdOne, false , tokenIdWidth
223
+ );
219
224
220
225
vm.prank (makeAddr ("notOwner " ));
221
226
vm.expectRevert (
@@ -630,6 +635,38 @@ contract TestNonFungibleNttManager is Test {
630
635
);
631
636
}
632
637
638
+ function test_cannotTransferPayloadSizeExceeded () public {
639
+ // Deploy manager with 32 byte tokenIdWidth.
640
+ INonFungibleNttManager manager = deployNonFungibleManager (
641
+ address (nftOne), IManagerBase.Mode.BURNING, chainIdThree, true , 32
642
+ );
643
+ WormholeTransceiver transceiver = deployWormholeTranceiver (address (manager));
644
+ transceiver.setWormholePeer (chainIdTwo, toWormholeFormat (makeAddr ("random " )));
645
+ manager.setTransceiver (address (transceiver));
646
+ manager.setPeer (chainIdTwo, toWormholeFormat (makeAddr ("random " )));
647
+
648
+ // Since the NonFungibleNtt payload is currently 180 bytes (without the tokenIds),
649
+ // we should be able to cause the error by transferring with 21 tokenIds.
650
+ // floor((850 - 180) / 33) + 1 (32 bytes per tokenId, 1 byte for length).
651
+ uint256 nftCount = 21 ;
652
+ uint256 startId = 0 ;
653
+
654
+ address recipient = makeAddr ("recipient " );
655
+ uint256 [] memory tokenIds = _mintNftBatch (nftOne, recipient, nftCount, startId);
656
+
657
+ vm.startPrank (recipient);
658
+ nftOne.setApprovalForAll (address (managerOne), true );
659
+
660
+ vm.expectRevert (
661
+ abi.encodeWithSelector (
662
+ IWormholeTransceiver.ExceedsMaxPayloadSize.selector ,
663
+ 873 ,
664
+ transceiver.MAX_PAYLOAD_SIZE ()
665
+ )
666
+ );
667
+ manager.transfer (tokenIds, chainIdTwo, toWormholeFormat (recipient), new bytes (1 ));
668
+ }
669
+
633
670
function test_cannotTransferDuplicateNfts () public {
634
671
uint256 nftCount = 2 ;
635
672
uint256 startId = 0 ;
@@ -1067,4 +1104,3 @@ contract TestNonFungibleNttManager is Test {
1067
1104
1068
1105
// TODO:
1069
1106
// 1) Relayer test
1070
- // 2) Add max payload size and associated tests
0 commit comments