@@ -24,11 +24,14 @@ import "./libraries/NttManagerHelpers.sol";
24
24
import {Utils} from "./libraries/Utils.sol " ;
25
25
import "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol " ;
26
26
import "../src/libraries/external/OwnableUpgradeable.sol " ;
27
+ import "wormhole-solidity-sdk/libraries/BytesParsing.sol " ;
27
28
28
29
import "./mocks/MockTransceivers.sol " ;
29
30
import "../src/mocks/DummyNft.sol " ;
30
31
31
32
contract TestNonFungibleNttManager is Test {
33
+ using BytesParsing for bytes ;
34
+
32
35
uint16 constant chainIdOne = 2 ;
33
36
uint16 constant chainIdTwo = 6 ;
34
37
uint16 constant chainIdThree = 10 ;
@@ -40,6 +43,7 @@ contract TestNonFungibleNttManager is Test {
40
43
address relayer = 0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470 ;
41
44
uint8 consistencyLevel = 1 ;
42
45
uint256 baseGasLimit = 500000 ;
46
+ uint8 tokenIdWidth = 2 ;
43
47
44
48
address owner = makeAddr ("owner " );
45
49
@@ -60,7 +64,7 @@ contract TestNonFungibleNttManager is Test {
60
64
bool shouldInitialize
61
65
) internal returns (INonFungibleNttManager) {
62
66
NonFungibleNttManager implementation =
63
- new NonFungibleNttManager (address (nft), _mode, _chainId);
67
+ new NonFungibleNttManager (address (nft), tokenIdWidth, _mode, _chainId);
64
68
65
69
NonFungibleNttManager proxy =
66
70
NonFungibleNttManager (address (new ERC1967Proxy (address (implementation), "" )));
@@ -227,12 +231,60 @@ contract TestNonFungibleNttManager is Test {
227
231
managerOne.setPeer (chainId, newPeer);
228
232
}
229
233
230
- // ============================ Transfer Tests ======================================
231
-
232
- function test_lockAndMint (uint256 nftCount , uint256 startId ) public {
234
+ // ============================ Serde Tests ======================================
235
+
236
+ function test_serde (
237
+ uint8 tokenIdWidth ,
238
+ bytes32 to ,
239
+ uint16 toChain ,
240
+ bytes memory payload ,
241
+ uint256 nftCount ,
242
+ uint256 startId
243
+ ) public {
244
+ // Narrow the search.
245
+ tokenIdWidth = uint8 (bound (tokenIdWidth, 1 , 32 ));
246
+ // Ugly, but necessary.
247
+ vm.assume (
248
+ tokenIdWidth == 1 || tokenIdWidth == 2 || tokenIdWidth == 4 || tokenIdWidth == 8
249
+ || tokenIdWidth == 16 || tokenIdWidth == 32
250
+ );
251
+ vm.assume (to != bytes32 (0 ));
252
+ vm.assume (toChain != 0 );
233
253
nftCount = bound (nftCount, 1 , managerOne.getMaxBatchSize ());
234
254
startId = bound (startId, 0 , type (uint256 ).max - nftCount);
235
255
256
+ TransceiverStructs.NonFungibleNativeTokenTransfer memory nftTransfer = TransceiverStructs
257
+ .NonFungibleNativeTokenTransfer ({
258
+ to: to,
259
+ toChain: toChain,
260
+ payload: payload,
261
+ tokenIds: _createBatchTokenIds (nftCount, startId)
262
+ });
263
+
264
+ bytes memory encoded =
265
+ TransceiverStructs.encodeNonFungibleNativeTokenTransfer (nftTransfer, 32 );
266
+
267
+ TransceiverStructs.NonFungibleNativeTokenTransfer memory out =
268
+ TransceiverStructs.parseNonFungibleNativeTokenTransfer (encoded);
269
+
270
+ assertEq (out.to, to, "To address should be the same " );
271
+ assertEq (out.toChain, toChain, "To chain should be the same " );
272
+ assertEq (out.payload, payload, "Payload should be the same " );
273
+ assertEq (
274
+ out.tokenIds.length , nftTransfer.tokenIds.length , "TokenIds length should be the same "
275
+ );
276
+
277
+ for (uint256 i = 0 ; i < nftCount; i++ ) {
278
+ assertEq (out.tokenIds[i], nftTransfer.tokenIds[i], "TokenId should be the same " );
279
+ }
280
+ }
281
+
282
+ // ============================ Transfer Tests ======================================
283
+
284
+ function test_lockAndMint (uint16 nftCount , uint16 startId ) public {
285
+ nftCount = uint16 (bound (nftCount, 1 , managerOne.getMaxBatchSize ()));
286
+ startId = uint16 (bound (startId, 0 , type (uint16 ).max - nftCount));
287
+
236
288
address recipient = makeAddr ("recipient " );
237
289
uint256 [] memory tokenIds = _mintNftBatch (nftOne, recipient, nftCount, startId);
238
290
@@ -253,9 +305,9 @@ contract TestNonFungibleNttManager is Test {
253
305
assertTrue (_isBatchOwner (nftOne, tokenIds, address (managerOne)), "Manager should own NFTs " );
254
306
}
255
307
256
- function test_burnAndUnlock (uint256 nftCount , uint256 startId ) public {
257
- nftCount = bound (nftCount, 1 , managerTwo .getMaxBatchSize ());
258
- startId = bound (startId, 0 , type (uint256 ).max - nftCount);
308
+ function test_burnAndUnlock (uint16 nftCount , uint16 startId ) public {
309
+ nftCount = uint16 ( bound (nftCount, 1 , managerOne .getMaxBatchSize () ));
310
+ startId = uint16 ( bound (startId, 0 , type (uint16 ).max - nftCount) );
259
311
260
312
// Mint nftOne to managerOne to "lock" them.
261
313
{
@@ -287,9 +339,9 @@ contract TestNonFungibleNttManager is Test {
287
339
assertTrue (_isBatchOwner (nftOne, tokenIds, recipient), "Recipient should own NFTs " );
288
340
}
289
341
290
- function test_burnAndMint (uint256 nftCount , uint256 startId ) public {
291
- nftCount = bound (nftCount, 1 , managerOne.getMaxBatchSize ());
292
- startId = bound (startId, 0 , type (uint256 ).max - nftCount);
342
+ function test_burnAndMint (uint16 nftCount , uint16 startId ) public {
343
+ nftCount = uint16 ( bound (nftCount, 1 , managerOne.getMaxBatchSize () ));
344
+ startId = uint16 ( bound (startId, 0 , type (uint16 ).max - nftCount) );
293
345
294
346
address recipient = makeAddr ("recipient " );
295
347
uint256 [] memory tokenIds = _mintNftBatch (nftOne, recipient, nftCount, startId);
@@ -483,9 +535,7 @@ contract TestNonFungibleNttManager is Test {
483
535
484
536
vm.expectRevert (
485
537
abi.encodeWithSelector (
486
- INonFungibleNttManager.InvalidTargetChain.selector ,
487
- chainIdThree,
488
- chainIdTwo
538
+ INonFungibleNttManager.InvalidTargetChain.selector , chainIdThree, chainIdTwo
489
539
)
490
540
);
491
541
transceiverTwo.receiveMessage (encodedVm);
@@ -605,6 +655,17 @@ contract TestNonFungibleNttManager is Test {
605
655
return arr;
606
656
}
607
657
658
+ function _createBatchTokenIds (
659
+ uint256 len ,
660
+ uint256 start
661
+ ) internal pure returns (uint256 [] memory ) {
662
+ uint256 [] memory arr = new uint256 [](len);
663
+ for (uint256 i = 0 ; i < len; i++ ) {
664
+ arr[i] = start + i;
665
+ }
666
+ return arr;
667
+ }
668
+
608
669
function _getWormholeMessage (
609
670
Vm.Log[] memory logs ,
610
671
uint16 emitterChain
0 commit comments