ReentrancyTransientMock.sol 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.24;
  3. import {ReentrancyGuardTransient} from "../utils/ReentrancyGuardTransient.sol";
  4. import {ReentrancyAttack} from "./ReentrancyAttack.sol";
  5. contract ReentrancyTransientMock is ReentrancyGuardTransient {
  6. uint256 public counter;
  7. constructor() {
  8. counter = 0;
  9. }
  10. function callback() external nonReentrant {
  11. _count();
  12. }
  13. function viewCallback() external view nonReentrantView returns (uint256) {
  14. return counter;
  15. }
  16. function countLocalRecursive(uint256 n) public nonReentrant {
  17. if (n > 0) {
  18. _count();
  19. countLocalRecursive(n - 1);
  20. }
  21. }
  22. function countThisRecursive(uint256 n) public nonReentrant {
  23. if (n > 0) {
  24. _count();
  25. (bool success, ) = address(this).call(abi.encodeCall(this.countThisRecursive, (n - 1)));
  26. require(success, "ReentrancyTransientMock: failed call");
  27. }
  28. }
  29. function countAndCall(ReentrancyAttack attacker) public nonReentrant {
  30. _count();
  31. attacker.callSender(abi.encodeCall(this.callback, ()));
  32. }
  33. function countAndCallView(ReentrancyAttack attacker) public nonReentrant {
  34. _count();
  35. attacker.staticcallSender(abi.encodeCall(this.viewCallback, ()));
  36. }
  37. function _count() private {
  38. counter += 1;
  39. }
  40. function guardedCheckEntered() public nonReentrant {
  41. require(_reentrancyGuardEntered());
  42. }
  43. function unguardedCheckNotEntered() public view {
  44. require(!_reentrancyGuardEntered());
  45. }
  46. }