// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "IERC721.sol"; import "ERC721Holder.sol"; contract NFTBulkSender is ERC721Holder { event BulkTransferCompleted(address indexed sender, address indexed receiver, uint256 totalTransferred); function bulkSend( address[] memory contractAddresses, uint256[] memory tokenIds, address receiver ) external { require(contractAddresses.length == tokenIds.length, "Input arrays must have the same length"); require(receiver != address(0), "Invalid receiver address"); uint256 totalTransferred = 0; for (uint256 i = 0; i < contractAddresses.length; i++) { IERC721 nftContract = IERC721(contractAddresses[i]); uint256 tokenId = tokenIds[i]; require(nftContract.ownerOf(tokenId) == msg.sender, "Sender must own the NFT"); nftContract.safeTransferFrom(msg.sender, receiver, tokenId); totalTransferred++; } emit BulkTransferCompleted(msg.sender, receiver, totalTransferred); } }