-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFaucet.sol
More file actions
127 lines (96 loc) · 2.09 KB
/
Copy pathFaucet.sol
File metadata and controls
127 lines (96 loc) · 2.09 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
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
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC20 {
function transfer(
address to,
uint256 amount
) external returns(bool);
}
interface IERC721 {
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
}
contract AdvancedFaucet {
address public owner;
IERC20 public token;
IERC721 public nft;
uint256 public dripAmount =
100 * 10**18;
uint256 public ethAmount =
0.0001 ether;
uint256 public xpReward = 10;
mapping(address => uint256)
public lastClaim;
mapping(address => uint256)
public xp;
mapping(address => uint256)
public totalClaims;
event Claimed(
address indexed user,
uint256 amount,
uint256 xpReward
);
constructor(
address _token,
address _nft
) {
owner = msg.sender;
token = IERC20(_token);
nft = IERC721(_nft);
}
modifier onlyOwner(){
require(
msg.sender == owner,
"Not owner"
);
_;
}
function claim() external {
require(
block.timestamp >
lastClaim[msg.sender] + 1 days,
"Wait 24 hours"
);
lastClaim[msg.sender] =
block.timestamp;
totalClaims[msg.sender]++;
xp[msg.sender] += xpReward;
token.transfer(
msg.sender,
dripAmount
);
payable(msg.sender)
.transfer(ethAmount);
emit Claimed(
msg.sender,
dripAmount,
xpReward
);
}
function sendNFT(
address user,
uint256 tokenId
) external onlyOwner {
nft.safeTransferFrom(
address(this),
user,
tokenId
);
}
function depositETH()
external
payable
{}
function withdrawETH()
external
onlyOwner
{
payable(owner)
.transfer(
address(this).balance
);
}
}