/**
* Source Code first verified at https://etherscan.io on Sunday, April 28, 2019
(UTC) */
pragma solidity ^0.5.7;
// Batch transfer Ether and Voken
//
// More info:
// https://vision.network
// https://voken.io
//
// Contact us:
// [email protected]
// [email protected]
/**
* @title SafeMath for uint256
* @dev Unsigned math operations with safety checks that revert on error.
*/
library SafeMath256 {
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
}
/**
* @title Ownable
*/
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract
* to the sender account.
*/
constructor () internal {
_owner = msg.sender;
}
/**
* @return The address of the owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == _owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0));
address __previousOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(__previousOwner, newOwner);
}
/**
* @dev Rescue compatible ERC20 Token
*
* @param tokenAddr ERC20 The address of the ERC20 token contract
* @param receiver The address of the receiver
* @param amount uint256
*/
function rescueTokens(address tokenAddr, address receiver, uint256 amount) external onlyOwner {
IERC20 __token = IERC20(tokenAddr);
require(receiver != address(0));
uint256 __balance = __token.balanceOf(address(this));
require(__balance >= amount);
assert(__token.transfer(receiver, amount));
}
}
/**
* @title ERC20 interface
* @dev see https://eips.ethereum.org/EIPS/eip-20
*/
interface IERC20{
function balanceOf(address owner) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
}
/**
* @title Batch Transfer Ether And Voken
*/
contract BatchTransferEtherAndVoken is Ownable{
using SafeMath256 for uint256;
IERC20 VOKEN = IERC20(0x759a8f76a36B89c70df23f057f23E3359aac74D6);
/**
* @dev Batch transfer both.
*/
function transfer(address payable[] memory accounts, uint256 etherValue, uint256 vokenValue) public payable {
uint256 __etherBalance = address(this).balance;
uint256 __vokenAllowance = VOKEN.allowance(msg.sender, address(this));
require(__etherBalance >= etherValue.mul(accounts.length));
require(__vokenAllowance >= vokenValue.mul(accounts.length));
for (uint256 i = 0; i < accounts.length; i++) {
accounts[i].transfer(etherValue);
assert(VOKEN.transferFrom(msg.sender, accounts[i], vokenValue));
}
}
/**
* @dev Batch transfer Ether.
*/
function batchTtransferEther(address payable[] memory accounts, uint256 etherValue) public payable {
uint256 __etherBalance = address(this).balance;
require(__etherBalance >= etherValue.mul(accounts.length));
for (uint256 i = 0; i < accounts.length; i++) {
accounts[i].transfer(etherValue);
}
}
/**
* @dev Batch transfer Voken.
*/
function batchTransferVoken(address payable[] memory accounts, uint256 vokenValue) public payable {
uint256 __vokenAllowance = VOKEN.allowance(msg.sender, address(this));
require(__vokenAllowance >= vokenValue.mul(accounts.length));
for (uint256 i = 0; i < accounts.length; i++) {
assert(VOKEN.transferFrom(msg.sender, accounts[i], vokenValue));
}
}
}