The Reentrancy attack is one of the most destructive attacks in the Solidity smart contract. A reentrancy attack occurs when a function makes an external call to another untrusted contract. Then the untrusted contract makes a recursive call back to the original function in an attempt to drain funds.
pragma solidity ^0.5.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/SafeERC20.sol";
contract BatchSendERC20 {
using SafeMath for uint256;
using SafeERC20 for IERC20;
address public owner;
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
constructor() public{
owner = msg.sender;
}
//getowner
function getOwner() public view returns (address) {
return owner;
}
//get token balance
function getTokenBalance(IERC20 token) public view returns (uint256) {
return token.balanceOf(address(this));
}
//withdraw whole erc20 token balance
function withdraw(IERC20 token) public onlyOwner{
token.safeTransfer(msg.sender, token.balanceOf(address(this)));
}
//batch send fixed token amount from sender, require approval of contract as spender
function multiSendFixedToken(IERC20 token, address[] memory recipients, uint256 amount) public {
address from = msg.sender;
require(recipients.length > 0);
require(amount > 0);
require(recipients.length * amount <= token.allowance(from, address(this)));
for (uint256 i = 0; i < recipients.length; i++) {
token.safeTransferFrom(from, recipients[i], amount);
}
}
//batch send different token amount from sender, require approval of contract as spender
function multiSendDiffToken(IERC20 token, address[] memory recipients, uint256[] memory amounts) public {
require(recipients.length > 0);
require(recipients.length == amounts.length);
address from = msg.sender;
uint256 allowance = token.allowance(from, address(this));
uint256 currentSum = 0;
for (uint256 i = 0; i < recipients.length; i++) {
uint256 amount = amounts[i];
require(amount > 0);
currentSum = currentSum.add(amount);
require(currentSum <= allowance);
token.safeTransferFrom(from, recipients[i], amount);
}
}
//batch send fixed token amount from contract
function multiSendFixedTokenFromContract(IERC20 token, address[] memory recipients, uint256 amount) public onlyOwner {
require(recipients.length > 0);
require(amount > 0);
require(recipients.length * amount <= token.balanceOf(address(this)));
for (uint256 i = 0; i < recipients.length; i++) {
token.safeTransfer(recipients[i], amount);
}
}
//batch send different token amount from contract
function multiSendDiffTokenFromContract(IERC20 token, address[] memory recipients, uint256[] memory amounts) public onlyOwner {
require(recipients.length > 0);
require(recipients.length == amounts.length);
uint256 length = recipients.length;
uint256 currentSum = 0;
uint256 currentTokenBalance = token.balanceOf(address(this));
for (uint256 i = 0; i < length; i++) {
uint256 amount = amounts[i];
require(amount > 0);
currentSum = currentSum.add(amount);
require(currentSum <= currentTokenBalance);
token.safeTransfer(recipients[i], amount);
}
}
}
pragma solidity ^0.5.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/SafeERC20.sol";
contract BatchSendERC20 {
using SafeMath for uint256;
using SafeERC20 for IERC20;
address public owner;
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
constructor() public{
owner = msg.sender;
}
//getowner
function getOwner() public view returns (address) {
return owner;
}
//get token balance
function getTokenBalance(IERC20 token) public view returns (uint256) {
return token.balanceOf(address(this));
}
//withdraw whole erc20 token balance
function withdraw(IERC20 token) public onlyOwner{
token.safeTransfer(msg.sender, token.balanceOf(address(this)));
}
//batch send fixed token amount from sender, require approval of contract as spender
function multiSendFixedToken(IERC20 token, address[] memory recipients, uint256 amount) public {
address from = msg.sender;
require(recipients.length > 0);
require(amount > 0);
require(recipients.length * amount <= token.allowance(from, address(this)));
for (uint256 i = 0; i < recipients.length; i++) {
token.safeTransferFrom(from, recipients[i], amount);
}
}
//batch send different token amount from sender, require approval of contract as spender
function multiSendDiffToken(IERC20 token, address[] memory recipients, uint256[] memory amounts) public {
require(recipients.length > 0);
require(recipients.length == amounts.length);
address from = msg.sender;
uint256 allowance = token.allowance(from, address(this));
uint256 currentSum = 0;
for (uint256 i = 0; i < recipients.length; i++) {
uint256 amount = amounts[i];
require(amount > 0);
currentSum = currentSum.add(amount);
require(currentSum <= allowance);
token.safeTransferFrom(from, recipients[i], amount);
}
}
//batch send fixed token amount from contract
function multiSendFixedTokenFromContract(IERC20 token, address[] memory recipients, uint256 amount) public onlyOwner {
require(recipients.length > 0);
require(amount > 0);
require(recipients.length * amount <= token.balanceOf(address(this)));
for (uint256 i = 0; i < recipients.length; i++) {
token.safeTransfer(recipients[i], amount);
}
}
//batch send different token amount from contract
function multiSendDiffTokenFromContract(IERC20 token, address[] memory recipients, uint256[] memory amounts) public onlyOwner {
require(recipients.length > 0);
require(recipients.length == amounts.length);
uint256 length = recipients.length;
uint256 currentSum = 0;
uint256 currentTokenBalance = token.balanceOf(address(this));
for (uint256 i = 0; i < length; i++) {
uint256 amount = amounts[i];
require(amount > 0);
currentSum = currentSum.add(amount);
require(currentSum <= currentTokenBalance);
token.safeTransfer(recipients[i], amount);
}
}
}