-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathSendToMany.sol
More file actions
75 lines (67 loc) · 2.79 KB
/
SendToMany.sol
File metadata and controls
75 lines (67 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
pragma solidity ^0.4.23;
import "./IERC20.sol";
contract SendToMany {
address owner;
mapping(address => uint) private tokenSums;
constructor() public {
owner = msg.sender;
}
modifier isOwner() {
require(msg.sender == owner, "must be the owner address");
_;
}
function sendMany(address[] memory addresses, uint[] memory amounts, address tokenContract) public payable isOwner {
require(addresses.length == amounts.length);
uint sum = 0;
for(uint i = 0; i < amounts.length; i++) {
sum += amounts[i];
}
if(tokenContract != 0x0) {
IERC20 token = IERC20(tokenContract);
require(token.allowance(msg.sender, address(this)) >= sum, "This contract is not allowed enough funds for this batch");
for(i = 0; i < addresses.length; i++) {
require(token.transferFrom(msg.sender, addresses[i], amounts[i]), "token transfer failed");
}
} else {
require((msg.value) >= sum, "must send enough ETH");
for(i = 0; i < addresses.length; i++) {
addresses[i].transfer(amounts[i]);
}
}
}
function validateBatch(address[] memory addresses, uint[] memory amounts, address[] memory tokenContracts, uint sentValue, address sender) public view returns(bool) {
require(addresses.length == amounts.length, "must provide same length addresses and amounts");
require(addresses.length == tokenContracts.length, "must provide same length addresses and tokenContracts");
for(uint i = 0; i < addresses.length; i++) {
address tokenContract = tokenContracts[i];
uint amount = amounts[i];
tokenSums[tokenContract] += amount;
uint sum = tokenSums[tokenContract];
if(tokenContract != 0x0) {
IERC20 token = IERC20(tokenContract);
require(token.allowance(sender, address(this)) >= sum, "This contract is not allowed enough funds for this batch");
} else {
require(sentValue >= sum, "must send enough ETH");
}
}
return true;
}
function batchSend(address[] memory addresses, uint[] memory amounts, address[] memory tokenContracts) public payable {
require(addresses.length == amounts.length, "must provide same length addresses and amounts");
require(addresses.length == tokenContracts.length, "must provide same length addresses and tokenContracts");
uint ethSum = 0;
for(uint i = 0; i < addresses.length; i++) {
address tokenContract = tokenContracts[i];
address recipient = addresses[i];
uint amount = amounts[i];
if(tokenContract != 0x0) {
IERC20 token = IERC20(tokenContract);
require(token.transferFrom(msg.sender, recipient, amount), "token transfer failed");
} else {
ethSum += amount;
require(msg.value >= ethSum, "must send enough ETH");
recipient.transfer(amount);
}
}
}
}