1+ # @version 0.2.16
2+
3+ event Claimed:
4+ user: indexed(address)
5+ amount: uint256
6+
7+ claimed: public(HashMap[bytes32, bool])
8+ target_message: public(bytes32)
9+ reward_amount: public(uint256)
10+ CEO: public(address)
11+
12+ @external
13+ def __init__():
14+ # The message players need to sign
15+ self.target_message = keccak256("I, The Compfest CEO, Hereby Declare That I Will Give 20 ETH To this person")
16+ self.reward_amount = 20 * 10**18 # 20 ETH
17+ self.CEO = 0xB1fdC7607932246c3551D4aA17e19c1eA95840F9
18+
19+ @external
20+ @payable
21+ @nonreentrant("claim")
22+ def fund_contract():
23+ pass
24+
25+ @external
26+ @view
27+ def get_message_to_sign() -> bytes32:
28+ return self.target_message
29+
30+
31+ @internal
32+ @pure
33+ def _recover_signer(message_hash: bytes32, v: uint256, r: uint256, s: uint256) -> address:
34+ return ecrecover(message_hash, v, r, s)
35+
36+ @external
37+ @nonreentrant("claim")
38+ def claim_reward(v: uint256, r: uint256, s: uint256):
39+
40+ temp: address = msg.sender
41+ assert temp.codesize <= 43, "Contract can't be too big"
42+
43+ sig_hash: bytes32 = keccak256(concat(convert(v, bytes32), convert(r, bytes32), convert(s, bytes32)))
44+
45+ assert not self.claimed[sig_hash], "You Already Claimed Vrooo...."
46+
47+ signer: address = self._recover_signer(self.target_message, v, r, s)
48+
49+ assert signer == self.CEO, "Invalid signature"
50+
51+ raw_call(msg.sender, b"", value=self.reward_amount)
52+
53+ self.claimed[sig_hash] = True
54+
55+ log Claimed(msg.sender, self.reward_amount)
56+
57+ @external
58+ @nonreentrant("claim")
59+ def gamble_reward(v: uint256, r: uint256, s: uint256):
60+ """Gamble 20 ETH with valid signature"""
61+
62+ temp: address = msg.sender
63+ assert temp.codesize <= 43, "Contract can't be too big"
64+
65+ sig_hash: bytes32 = keccak256(concat(convert(v, bytes32), convert(r, bytes32), convert(s, bytes32)))
66+
67+ assert not self.claimed[sig_hash], "You Already Claimed Vrooo...."
68+
69+ signer: address = self._recover_signer(self.target_message, v, r, s)
70+
71+ assert signer == self.CEO, "Invalid signature"
72+
73+ real_reward: uint256 = self.reward_amount * 2 # Double the reward for gambling
74+
75+ if(convert(blockhash(block.number-1), uint256) % 5 == 0):
76+ raw_call(msg.sender, b"", value=real_reward)
77+ else:
78+ raw_call(msg.sender, b"lmao", value=0)
79+
80+ self.claimed[sig_hash] = True
81+
82+ log Claimed(msg.sender, self.reward_amount)
0 commit comments