123456789101112131415161718192021222324252627282930313233343536373839 |
- // SPDX-License-Identifier: MIT
- pragma solidity ^0.8.20;
- import {ERC20} from "../../token/ERC20/ERC20.sol";
- import {Address} from "../../utils/Address.sol";
- contract ERC20Reentrant is ERC20("TEST", "TST") {
- enum Type {
- No,
- Before,
- After
- }
- Type private _reenterType;
- address private _reenterTarget;
- bytes private _reenterData;
- function scheduleReenter(Type when, address target, bytes calldata data) external {
- _reenterType = when;
- _reenterTarget = target;
- _reenterData = data;
- }
- function functionCall(address target, bytes memory data) public returns (bytes memory) {
- return Address.functionCall(target, data);
- }
- function _update(address from, address to, uint256 amount) internal override {
- if (_reenterType == Type.Before) {
- _reenterType = Type.No;
- functionCall(_reenterTarget, _reenterData);
- }
- super._update(from, to, amount);
- if (_reenterType == Type.After) {
- _reenterType = Type.No;
- functionCall(_reenterTarget, _reenterData);
- }
- }
- }
|