// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; interface IERC721 { function mint(address to, uint256 tokenID) external; function transferFrom(address from, address to, uint256 tokenId) external; } contract AirdropToken is Ownable{ using SafeERC20 for IERC20; mapping(address user => uint256 amount) public failTransferList; function getSum(uint256[] calldata _arr) public pure returns (uint256 sum) { for (uint256 i = 0; i < _arr.length; i++) sum = sum + _arr[i]; } function multiTransferETH(address payable[] calldata _addresses, uint256[] calldata _amounts) public payable { require(_addresses.length == _amounts.length, "Lengths of Addresses and Amounts NOT EQUAL"); uint256 _amountSum = getSum(_amounts); require(msg.value == _amountSum, "Transfer amount error"); for (uint256 i = 0; i < _addresses.length; i++) { (bool success, ) = _addresses[i].call{value: _amounts[i]}(""); if (!success) { failTransferList[_addresses[i]] = _amounts[i]; } } } function multiTransferERC20(address _token, address[] calldata _addresses, uint256[] calldata _amounts) external { require(_addresses.length == _amounts.length, "Lengths of Addresses and Amounts NOT EQUAL"); IERC20 token = IERC20(_token); for (uint256 i; i < _addresses.length; i++) { token.safeTransferFrom(msg.sender, _addresses[i], _amounts[i]); } } function multiTransferERC721(address _token, address[] calldata _addresses, uint256[] calldata _tokenIds) external { require(_addresses.length == _tokenIds.length, "Lengths of Addresses and TokenIds NOT EQUAL"); IERC721 token = IERC721(_token); for (uint256 i; i < _addresses.length; i++) { token.transferFrom(msg.sender, _addresses[i], _tokenIds[i]); } } function multiMintERC721(address _token, address[] calldata _addresses, uint256[] calldata _tokenIds) external onlyOwner(){ require(_addresses.length == _tokenIds.length, "Lengths of Addresses and TokenIds NOT EQUAL"); IERC721 token = IERC721(_token); for (uint256 i; i < _addresses.length; i++) { token.mint(_addresses[i], _tokenIds[i]); } } }