文件 1 的 1:MultiSender.sol
pragma solidity ^0.8.7;
interface IERC20 {
function balanceOf(address address_) external view returns (uint256);
function transferFrom(address from_, address to_, uint256 amount_) external
returns (bool);
}
interface IERC721 {
function ownerOf(uint256 tokenId_) external view returns (address);
function transferFrom(address from_, address to_, uint256 tokenId_) external;
}
interface IERC1155 {
function balanceOf(address address_, uint256 tokenId_) external view
returns (uint256);
function safeTransferFrom(address from_, address to_, uint256 tokenId_,
uint256 amount_, bytes calldata data_) external;
}
contract MultiSender {
function _sendETH(address payable address_, uint256 amount_) internal {
(bool success, ) = payable(address_).call{value: amount_}("");
require(success, "Transfer failed");
}
function _calculateTotalAmounts(uint256[] memory amounts_) internal pure
returns (uint256 _totalAmount) {
for (uint256 i = 0; i < amounts_.length; i++) {
_totalAmount += amounts_[i];
}
}
function multiSendETH(address payable[] calldata addresses_,
uint256[] calldata amounts_, bool useChecks_) external payable {
require(addresses_.length == amounts_.length,
"Array lengths mismatch!");
if (useChecks_) {
uint256 _totalAmount = _calculateTotalAmounts(amounts_);
require(msg.value == _totalAmount,
"Invalid amount of ETH sent!");
}
for (uint256 i = 0; i < addresses_.length; i++) {
_sendETH(addresses_[i], amounts_[i]);
}
}
function multiSendERC20(address erc20_, address[] calldata addresses_,
uint256[] calldata amounts_, bool useChecks_) external {
require(addresses_.length == amounts_.length,
"Array lengths mismatch!");
if (useChecks_) {
uint256 _totalAmount = _calculateTotalAmounts(amounts_);
require(IERC20(erc20_).balanceOf(msg.sender) >= _totalAmount,
"msg.sender does not have enough balance!");
}
for (uint256 i = 0; i < addresses_.length; i++) {
IERC20(erc20_).transferFrom(msg.sender, addresses_[i], amounts_[i]);
}
}
function multiSendERC721(address erc721_, address[] calldata addresses_,
uint256[] calldata tokenIds_, bool useChecks_) external {
require(addresses_.length == tokenIds_.length,
"Array lengths mismatch!");
if (useChecks_) {
for (uint256 i = 0; i < tokenIds_.length; i++) {
require(msg.sender == IERC721(erc721_).ownerOf(tokenIds_[i]),
"You are not the owner of this token!");
}
}
for (uint256 i = 0; i < addresses_.length; i++) {
IERC721(erc721_).transferFrom(msg.sender, addresses_[i], tokenIds_[i]);
}
}
function multiSendERC1155(address erc1155_, address[] calldata addresses_,
uint256[] calldata tokenIds_, uint256[] calldata amounts_,
bytes calldata data_) external {
require(addresses_.length == tokenIds_.length
&& addresses_.length == amounts_.length,
"Array lengths mismatch!");
for (uint256 i = 0; i < addresses_.length; i++) {
IERC1155(erc1155_).safeTransferFrom(msg.sender, addresses_[i], tokenIds_[i],
amounts_[i], data_);
}
}
}
{
"compilationTarget": {
"MultiSender.sol": "MultiSender"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}