1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // SPDX-License-Identifier: MIT
- pragma solidity ^0.8.0;
- import "../security/ReentrancyGuardUpgradeable.sol";
- import "./ReentrancyAttackUpgradeable.sol";
- import "../proxy/utils/Initializable.sol";
- contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable {
- uint256 public counter;
- function __ReentrancyMock_init() internal onlyInitializing {
- __ReentrancyGuard_init_unchained();
- __ReentrancyMock_init_unchained();
- }
- function __ReentrancyMock_init_unchained() internal onlyInitializing {
- 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();
- (bool success, ) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1));
- require(success, "ReentrancyMock: failed call");
- }
- }
- function countAndCall(ReentrancyAttackUpgradeable attacker) public nonReentrant {
- _count();
- bytes4 func = bytes4(keccak256("callback()"));
- attacker.callSender(func);
- }
- function _count() private {
- counter += 1;
- }
- /**
- * This empty reserved space is put in place to allow future versions to add new
- * variables without shifting down storage in the inheritance chain.
- * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
- */
- uint256[49] private __gap;
- }
|