Error while depositing and withdraw erc20 token

I have made a contract which have two function depositToken() and withdrawToken()
the contract goes like this

pragma solidity ^0.7.6;

// SPDX-License-Identifier: Unlicense
import "@opengsn/contracts/src/BaseRelayRecipient.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
interface ERC20 {
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

contract Funding is BaseRelayRecipient , Ownable,ReentrancyGuard{
    string public override versionRecipient = "2.2.0";
    mapping(address => uint256) public ngo;

    struct userData {
        uint256 amount;
        uint256 requestedOn;
    }

    mapping(address => userData) public user;

    address public tokenAddress;

    mapping(address => uint256) public fundedBy;
    uint256 public totalEtherSupply;

    constructor(address forwarder,address _address) {
        trustedForwarder = forwarder;
        tokenAddress = _address;
    }

    //

    event DepositToken(address _depositedBy, uint256 _amount);
    event WithdrawToken(address _withdrawnBy, uint256 _amount);

    

    function depositToken() public {
        userData memory _user;
        _user.requestedOn = block.timestamp;
        _user.amount += 10;
        user[_msgSender()] = _user;
        ERC20(tokenAddress).transferFrom(_msgSender(), address(this), 10);
        emit DepositToken(_msgSender(), 10);
    }

    function withdrawToken() public {
        require(block.timestamp >= user[_msgSender()].requestedOn + 10 minutes);
        user[_msgSender()].amount -= 5;
        ERC20(tokenAddress).transfer(_msgSender(), 5);
        emit WithdrawToken(_msgSender(), 5);
    }


    // if you are using ReentrancyGaurd and Ownable then use this these two function. 
    function _msgSender()
        internal
        view
        virtual
        override(Context,BaseRelayRecipient)
        returns (address payable ret)
    {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            // At this point we know that the sender is a trusted forwarder,
            // so we trust that the last bytes of msg.data are the verified sender address.
            // extract sender address from the end of msg.data
            assembly {
                ret := shr(96, calldataload(sub(calldatasize(), 20)))
            }
        } else {
            return msg.sender;
        }
    }
    function _msgData() internal override(Context,BaseRelayRecipient) virtual view returns (bytes memory ret) {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            return msg.data[0:msg.data.length-20];
        } else {
            return msg.data;
        }
    }
}

previously it was showing error of unpredictable gas limit but now it is showing new error.

bundle.js:35453 Uncaught (in promise) Error: transaction failed (transactionHash="0x2d8064d4ceefca0c1e7a82c9104536dbbd0db7f7e22666caae5f5427e2722fbe", transaction={"hash":"0x2d8064d4ceefca0c1e7a82c9104536dbbd0db7f7e22666caae5f5427e2722fbe","type":0,"accessList":null,"blockHash":null,"blockNumber":null,"transactionIndex":null,"confirmations":0,"from":"0xF3497728b01114DF22a6BD481Ab5E264c3a422F7","gasPrice":{"type":"BigNumber","hex":"0x6cc54588"},"gasLimit":{"type":"BigNumber","hex":"0x0e50aa"},"to":"0x6650d69225CA31049DB7Bd210aE4671c0B1ca132","value":{"type":"BigNumber","hex":"0x00"},"nonce":221,"data":"0x10c454310000000000000000000000000000000000000000000000000000000000045a4400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000e50aa00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000b1551b2b46df680e8e25e97232888a26ecdc01f500000000000000000000000003a28c4d980ea5fd94a20cced6d06876b49facf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000094c4c30000000000000000000000000000000000000000000000000000000000000004c89039c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cc5458800000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3497728b01114df22a6bd481ab5e264c3a422f700000000000000000000000025c4af205d7fd0a7bf160378985b72ca5946806300000000000000000000000083a54884be4657706785d7309cf46b58fe5f6e8a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c389a99cef89fff991ddb6b1e12515ae0358c8d92eb16840f46d4423048174aa68b845aa31d1860696e03ea39cc4bbce42a90e55c49dfc2b666b1476011f43341c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","r":"0x98ba171bc36832a9ee3846a1aa8efe26216b68191c70f16cd3b83c90efa2cac2","s":"0x663b08245ff36ed7e0c79d10a5147a0783efe4f601340d32493cb27fd35ae900","v":44,"creates":null,"chainId":4}, receipt={"to":"0x6650d69225CA31049DB7Bd210aE4671c0B1ca132","from":"0xF3497728b01114DF22a6BD481Ab5E264c3a422F7","contractAddress":null,"transactionIndex":20,"gasUsed":{"type":"BigNumber","hex":"0x0310ef"},"logsBloom":"0x00000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000080000008000000000000800000000000000000004000000000000800000000000000000000000800000000000000000000000000000000000000000000800000008000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000402000000000000000000000000000000000000000000000000000000000100000000000000000000000000","blockHash":"0xec7202dfe32639a060425392a6ef75332d016f2366e057847cd3357c985f15f0","transactionHash":"0x2d8064d4ceefca0c1e7a82c9104536dbbd0db7f7e22666caae5f5427e2722fbe","logs":[{"transactionIndex":20,"blockNumber":9743701,"transactionHash":"0x2d8064d4ceefca0c1e7a82c9104536dbbd0db7f7e22666caae5f5427e2722fbe","address":"0x6650d69225CA31049DB7Bd210aE4671c0B1ca132","topics":["0xc9aa709786a3d5fe2cc947abc1ba8cbb0f6decb57aa74b84eb7f558125fee454","0x00000000000000000000000034a50fa22f68c0f085b8540f119c4576d57eac5f","0x000000000000000000000000f3497728b01114df22a6bd481ab5e264c3a422f7","0x000000000000000000000000b1551b2b46df680e8e25e97232888a26ecdc01f5"],"data":"0x00000000000000000000000003a28c4d980ea5fd94a20cced6d06876b49facf000000000000000000000000025c4af205d7fd0a7bf160378985b72ca59468063c89039c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000026b70f19d4cac","logIndex":27,"blockHash":"0xec7202dfe32639a060425392a6ef75332d016f2366e057847cd3357c985f15f0"}],"blockNumber":9743701,"confirmations":1,"cumulativeGasUsed":{"type":"BigNumber","hex":"0x44e365"},"effectiveGasPrice":{"type":"BigNumber","hex":"0x6cc54588"},"status":0,"type":0,"byzantium":true}, code=CALL_EXCEPTION, version=providers/5.5.0)

I don’t know what caused the error, and I can’t see the context where you called it .
But I see you use an older gsn: the latest (2.2.4) is based on Solidity 0.8, and not 0.7.6

hello thanx for the reply ,
right now I have applied the latest version.
here is the transaction hash
0x8047cf9393947caa0abbcd39098502be8cf9d97ad21ddd0527fcc25b1ce3151c.
if you go to internal traction you will observe that the first error occurs when forwarder interact with this contract.
I have set the trusted forwarder according to rinkeby also

Is This the right way of writing a contract which will just deposit and withdraw a erc20 contract ?
this is my index.js file

const ethers = require('ethers')
const { RelayProvider } = require( '@opengsn/provider')

const paymasterAddress = require( '../build/gsn/Paymaster').address
console.log("paymasterAddress :: ", paymasterAddress);
const contractArtifact = require('../build/contracts/Funding.json')
const contractAbi = contractArtifact.abi
console.log("abi :: ",contractAbi );

let theContract
let provider

async function initContract() {

  if (!window.ethereum) {
    throw new Error('provider not found')
  }
  window.ethereum.on('accountsChanged', () => {
    console.log('acct');
    window.location.reload()
  })
  window.ethereum.on('chainChanged', () => {
    console.log('chainChained');
    window.location.reload()
  })
  const networkId = await window.ethereum.request({method: 'net_version'})
  console.log("networkId :: ", networkId);

  

  const gsnProviderRinkeby = await RelayProvider.newProvider( {
    provider: window.ethereum,
    config: {
           
            paymasterAddress,
        }
  }).init();

  provider = new ethers.providers.Web3Provider(gsnProviderRinkeby)

  const network = await provider.getNetwork()
  const artifactNetwork = contractArtifact.networks[networkId]
  console.log("artifactId :: ", artifactNetwork);
  if (!artifactNetwork)
    throw new Error('Can\'t find deployment on network ' + networkId)
  const contractAddress = artifactNetwork.address
  theContract = new ethers.Contract(
    contractAddress, contractAbi, provider.getSigner());
  
  console.log("the contract :: ", theContract);

  await listenToEvents()
  return {contractAddress, network}
}
// deposit call 
async function depositCall() {
  await window.ethereum.send('eth_requestAccounts');
  console.log("after 1st line ");
  const transaction = await theContract.depositToken({gasLimit: 500000});
  await transaction.wait(1);
  console.log("after transaction :: ", transaction);
  const hash = transaction.hash
  console.log(`Transaction ${hash} sent`)
  const receipt = await provider.waitForTransaction(hash)
  console.log(`Mined in block: ${receipt.blockNumber}`)
}
// withdraw call
async function withdrawCall() {
  await window.ethereum.send('eth_requestAccounts');
  console.log("after 1st line ");
  const transaction = await theContract.withdrawToken({gasLimit: 500000});
  await transaction.wait(1);
  console.log("after transaction :: ", transaction);
  const hash = transaction.hash
  console.log(`Transaction ${hash} sent`)
  const receipt = await provider.waitForTransaction(hash)
  console.log(`Mined in block: ${receipt.blockNumber}`)
}
let logview

function log(message) {
  message = message.replace(/(0x\w\w\w\w)\w*(\w\w\w\w)\b/g, '<b>$1...$2</b>')
  if (!logview) {
    logview = document.getElementById('logview')
  }
  logview.innerHTML = message + "<br>\n" + logview.innerHTML
}

async function listenToEvents() {

  theContract.on('DepositToken', (_depositedBy, _amount, rawEvent) => {
    log(`Deposited by &nbsp;${_depositedBy} amount :: &nbsp;${_amount}`)
    console.log(`Deposited by  ${_depositedBy} by ${_amount}`)
  })

  theContract.on('WithdrawToken', (_withdrawnBy, _amount, rawEvent) => {
    log(`wihtdrawn by &nbsp;${_withdrawnBy} amount :: &nbsp;${_amount}`)
    console.log(`wihtdrawn by  ${_withdrawnBy} by ${_amount}`)
  })
}

window.app = {
  initContract,
  depositCall,
  withdrawCall,
  log
}