// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract DelegatecallStorage {
    uint public counter;

    function getCounter() public view returns (uint){
      return counter;
    }
    function setVars(address _contract, uint _counter) public payable returns (uint){
      (bool success, ) = _contract.delegatecall(
          abi.encodeWithSignature("setVars(uint256)", _counter)
      );
      require(success, 'Error message: Delegatecall failed');
      return counter;
    }
    function setVarsSelf(address _contract, uint _counter) public payable returns (uint){
      (bool success, ) = _contract.delegatecall(
        abi.encodeWithSignature("setVarsSelf(address,uint256)", _contract, _counter)
      );
      require(success, 'Error message: Delegatecall failed');
      return counter;
    }
    function setVarsRevert(address _contract, uint _counter) public payable returns (uint){
         (bool success, ) = _contract.delegatecall(
            abi.encodeWithSignature("setVars(uint256)", _counter)
        );
        require(false,"intentionally throwing error");
    }
    function revert() public{
        require(false,"intentionally throwing error");
    }
}