// SPDX-License-Identifier: MIT
pragma solidity >=0.8.17;

contract RecursiveDelegatecall {
    event RecursiveCallEvent(uint256 count, address self);
    uint256 public totalCalls;

    function recursiveCall(uint256 count) public returns (uint256) {
        emit RecursiveCallEvent(count, address(this));
        totalCalls += 1;
        if (count > 1) {
            count -= 1;
            (bool success, bytes memory returnedData) = address(this)
                .delegatecall(
                    abi.encodeWithSignature("recursiveCall(uint256)", count)
                );
            return count;
        }
        return count;
    }
}