function stake(address _userUportAddress, uint _expiryDate, bytes _signature) public payable whenNotPaused {
        bytes32 hashMessage = keccak256(abi.encodePacked(_userUportAddress, msg.value, _expiryDate));
        address signer = hashMessage.toEthSignedMessageHash().recover(_signature);

        require(signer == grantSigner, "Signature is not valid");
        require(block.timestamp < _expiryDate, "Grant is expired");
        require(userStakedAddress[_userUportAddress] == 0, "User has already staked!");

        userStakedAddress[_userUportAddress] = msg.sender;
        stakedAmount[_userUportAddress] = msg.value;

        emit UserStake(_userUportAddress, msg.sender, msg.value);
    }