-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathairdrop.sol
146 lines (113 loc) · 3.99 KB
/
airdrop.sol
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/**
*Submitted for verification at BscScan.com on 2023-05-17
*/
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8;
pragma experimental ABIEncoderV2;
interface IERC20 {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}
contract Context {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
function _msgSender() internal view returns (address) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/* --------- Access Control --------- */
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract Claimable is Ownable {
function claimToken(
address tokenAddress,
uint256 amount
) external onlyOwner {
IERC20(tokenAddress).transfer(owner(), amount);
}
function claimETH(uint256 amount) external onlyOwner {
(bool sent, ) = owner().call{value: amount}("");
require(sent, "Failed to send Ether");
}
}
contract Airdrop is Claimable {
event Claim(address to, uint256 amount);
IERC20 public token;
uint256 airDropAmount = 1 * 10**18;
uint256 feeAmount = 1 * 10**15;
constructor(address _tokenAddress) {
token = IERC20(_tokenAddress);
}
function deposit(uint256 _amount) public {
require(
token.transferFrom(msg.sender, address(this), _amount),
"deposit failed"
);
}
function withdraw(uint256 _amount) public onlyOwner {
require(token.transfer(msg.sender, _amount), "withdraw failed");
}
function airdrop() public payable{
require(msg.value >= feeAmount, "Fee is very small.");
require(token.transfer(msg.sender, airDropAmount), "airdrop failed");
(bool sent, ) = owner().call{value: msg.value}("");
}
receive() external payable {}
fallback() external payable {}
}