interface IGelatoProviderModule {

    /// @notice Check if provider agrees to pay for inputted task receipt
    /// @dev Enables arbitrary checks by provider
    /// @param _userProxy The smart contract account of the user who submitted the Task.
    /// @param _provider The account of the Provider who uses the ProviderModule.
    /// @param _task Gelato Task to be executed.
    /// @return "OK" if provider agrees
    function isProvided(address _userProxy, address _provider, Task calldata _task)
        external
        view
        returns(string memory);

    /// @notice Convert action specific payload into proxy specific payload
    /// @dev Encoded multiple actions into a multisend
    /// @param _taskReceiptId Unique ID of Gelato Task to be executed.
    /// @param _userProxy The smart contract account of the user who submitted the Task.
    /// @param _provider The account of the Provider who uses the ProviderModule.
    /// @param _task Gelato Task to be executed.
    /// @param _cycleId For Tasks that form part of a cycle/chain.
    /// @return Encoded payload that will be used for low-level .call on user proxy
    /// @return checkReturndata if true, fwd returndata from userProxy.call to ProviderModule
    function execPayload(
        uint256 _taskReceiptId,
        address _userProxy,
        address _provider,
        Task calldata _task,
        uint256 _cycleId
    )
        external
        view
        returns(bytes memory, bool checkReturndata);

    /// @notice Called by GelatoCore.exec to verifiy that no revert happend on userProxy
    /// @dev If a caught revert is detected, this fn should revert with the detected error
    /// @param _proxyReturndata Data from GelatoCore._exec.userProxy.call(execPayload)
    function execRevertCheck(bytes calldata _proxyReturndata) external pure;
}
function execPayload(
    uint256 _taskReceiptId,
    address _userProxy,
    address _provider,
    Task calldata _task,
    uint256 _cycleId
)
    external
    view
    returns(bytes memory, bool checkReturndata);

/// @notice Convert action specific payload into proxy specific payload
/// @dev Encoded multiple actions into a multisend
/// @param _taskReceiptId Unique ID of Gelato Task to be executed.
/// @param _userProxy The smart contract account of the user who submitted the Task.
/// @param _provider The account of the Provider who uses the ProviderModule.
/// @param _task Gelato Task to be executed.
/// @param _cycleId For Tasks that form part of a cycle/chain.
/// @return Encoded payload that will be used for low-level .call on user proxy
/// @return checkReturndata if true, fwd returndata from userProxy.call to ProviderModule