57 lines
2.3 KiB
Solidity
57 lines
2.3 KiB
Solidity
// 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]);
|
|
}
|
|
}
|
|
}
|