contracts-imtbl/contracts/tools/AirdropToken.sol
2024-06-27 20:18:08 +08:00

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]);
}
}
}