2
2
pragma solidity ^ 0.8.13 ;
3
3
4
4
import {Token} from "./Token.sol " ;
5
+ import {ECDSA} from "solady/utils/ECDSA.sol " ;
5
6
6
7
contract WeekPool {
7
8
uint256 private _week;
8
9
uint256 private _totalPoints;
9
10
Token private _token;
11
+ uint256 private _tokens;
10
12
11
13
address private _signer;
12
14
@@ -16,11 +18,12 @@ contract WeekPool {
16
18
bytes32 private constant SOME_TYPE_HASH = keccak256 ("BaselineRequest(uint256 vehicleId,address owner,uint256 week,uint256 points) " );
17
19
18
20
19
- constructor (address token , uint256 week , uint256 totalPoints , address signer ) {
21
+ constructor (address token , uint256 week , uint256 totalPoints , address signer , uint256 tokens ) {
20
22
_token = Token (token);
21
23
_week = week;
22
24
_totalPoints = totalPoints;
23
25
_signer = signer;
26
+ _tokens = tokens;
24
27
}
25
28
26
29
function claim (bytes calldata data ) external {
@@ -34,8 +37,16 @@ contract WeekPool {
34
37
35
38
(uint256 vehicleId , address owner , uint256 week , uint256 points , bytes memory signature ) = abi.decode (data, (uint256 , address , uint256 , uint256 , bytes ));
36
39
40
+ require (! _claimed[vehicleId], "Already claimed " );
41
+ require (_week == week, "Wrong week " );
42
+
37
43
bytes32 structHash = keccak256 (abi.encode (SOME_TYPE_HASH, vehicleId, owner, week, points));
38
44
bytes32 fullHash = keccak256 (abi.encodePacked ("\x19\x01 " , DOMAIN_SEPARATOR, structHash));
39
-
45
+
46
+ require (ECDSA.recover (fullHash, signature) == _signer, "Wrong signer " );
47
+
48
+ _claimed[vehicleId] = true ;
49
+
50
+ require (_token.transfer (owner, (_tokens * points) / _totalPoints), "Transfer failed " );
40
51
}
41
52
}
0 commit comments