123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- pragma solidity ^0.4.24;
- import "../utils/ReentrancyGuard.sol";
- import "./ReentrancyAttack.sol";
- contract ReentrancyMock is ReentrancyGuard {
- uint256 public counter;
- constructor() public {
- counter = 0;
- }
- function callback() external nonReentrant {
- count();
- }
- function countLocalRecursive(uint256 _n) public nonReentrant {
- if (_n > 0) {
- count();
- countLocalRecursive(_n - 1);
- }
- }
- function countThisRecursive(uint256 _n) public nonReentrant {
- if (_n > 0) {
- count();
- // solium-disable-next-line security/no-low-level-calls
- bool result = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", _n - 1));
- require(result == true);
- }
- }
- function countAndCall(ReentrancyAttack _attacker) public nonReentrant {
- count();
- bytes4 func = bytes4(keccak256("callback()"));
- _attacker.callSender(func);
- }
- function count() private {
- counter += 1;
- }
- }
|