Приветствую! Наверное много из вас видел или же получал NFT которые не чего не стоят. Их как правило рассылают пачками по 10к на разные кошельки в любых сетях. Ether, Bsc, Matic, Tron. Batch NFT рассылка - это технология массового распространения NFT среди множества адресов в одной транзакции, как показано в представленном смарт-контракте. Для чего это нужно? Эффективность: Рассылка сотен NFT за одну транзакцию экономит время и газовые fees Аирдропы: Распределение NFT-наград среди участников сообщества Маркетинг: Массовые раздачи промо-NFT Токенизация: Быстрое создание коллекций для множества пользователей Пример функция смарт контракта Solidity. Отправка на n кол-во адресов сети. function batchMint(address[] memory recipients) public onlyOwner { require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); // ... } Code function batchMint(address[] memory recipients) public onlyOwner { require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); // ... } Пример рабочего смарт контракта. contract BatchNFT is ERC721, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string public baseTokenURI; uint256 public constant MAX_BATCH_SIZE = 100; event BatchMinted(address[] recipients, uint256 startTokenId, uint256 endTokenId); event BatchTransferred(address[] recipients, uint256[] tokenIds); constructor( string memory name, string memory symbol, string memory _baseTokenURI ) ERC721(name, symbol) Ownable(msg.sender) { baseTokenURI = _baseTokenURI; } function _baseURI() internal view override returns (string memory) { return baseTokenURI; } function safeMint(address to) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function batchMint(address[] memory recipients) public onlyOwner { require(recipients.length > 0, "No recipients provided"); require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); uint256 startTokenId = _tokenIdCounter.current(); for (uint256 i = 0; i < recipients.length; i++) { require(recipients[i] != address(0), "Invalid recipient address"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(recipients[i], tokenId); } emit BatchMinted(recipients, startTokenId, _tokenIdCounter.current() - 1); } function batchTransfer( address[] memory recipients, uint256[] memory tokenIds ) public { require(recipients.length == tokenIds.length, "Length mismatch"); require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); for (uint256 i = 0; i < recipients.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Not token owner"); require(recipients[i] != address(0), "Invalid recipient address"); safeTransferFrom(msg.sender, recipients[i], tokenIds[i]); } emit BatchTransferred(recipients, tokenIds); } function setBaseURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } } Code contract BatchNFT is ERC721, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string public baseTokenURI; uint256 public constant MAX_BATCH_SIZE = 100; event BatchMinted(address[] recipients, uint256 startTokenId, uint256 endTokenId); event BatchTransferred(address[] recipients, uint256[] tokenIds); constructor( string memory name, string memory symbol, string memory _baseTokenURI ) ERC721(name, symbol) Ownable(msg.sender) { baseTokenURI = _baseTokenURI; } function _baseURI() internal view override returns (string memory) { return baseTokenURI; } function safeMint(address to) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function batchMint(address[] memory recipients) public onlyOwner { require(recipients.length > 0, "No recipients provided"); require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); uint256 startTokenId = _tokenIdCounter.current(); for (uint256 i = 0; i < recipients.length; i++) { require(recipients[i] != address(0), "Invalid recipient address"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(recipients[i], tokenId); } emit BatchMinted(recipients, startTokenId, _tokenIdCounter.current() - 1); } function batchTransfer( address[] memory recipients, uint256[] memory tokenIds ) public { require(recipients.length == tokenIds.length, "Length mismatch"); require(recipients.length <= MAX_BATCH_SIZE, "Batch too large"); for (uint256 i = 0; i < recipients.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Not token owner"); require(recipients[i] != address(0), "Invalid recipient address"); safeTransferFrom(msg.sender, recipients[i], tokenIds[i]); } emit BatchTransferred(recipients, tokenIds); } function setBaseURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } } Рассылку использую как правило для рассылки блек проектов с целью опустошить ваши коши. Я же хочу показать как это работает под капотом. Удачи)