// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; 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(); // solhint-disable-next-line avoid-low-level-calls (bool success,) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1)); require(success, "ReentrancyMock: failed call"); } } function countAndCall(ReentrancyAttack attacker) public nonReentrant { _count(); bytes4 func = bytes4(keccak256("callback()")); attacker.callSender(func); } function _count() private { counter += 1; } }