Compiling the contract returns this error.

     TypeError: Function cannot be declared as view because this expression (potentially) modifies the state.
           --> contracts/certification/token/CleanEnergyCertificateToken.sol:104:9:
            |
        104 |         contractAddress.call(abi.encodeWithSignature("getTokenProperties(uint256 tokenId)", tokenID));
            |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The issue is that obvious: `getTokenProperties()` function's structure is unknown to the compiler in this case, because I am using **call**. So it doesn't know that `getTokenProperties()` is a view function that doesn't modify storage. 

Here is `getTokenProperties()` code for reference:

    function getTokenProperties(uint256 tokenId) public view returns (CleanEnergyCertificateTokenProperties memory)  {
        require(
            tokenId >= 0 && tokenIdToProperties[tokenId].timestamp > 0,
            "Token and it's properties for with respective tokenId must exist!"
        );
        return tokenIdToProperties[tokenId];
    }


Therefor the only solution here seems to be to leave out the "view" modifier.

Question: Will `getTokenProperties()` spend gas if it has the functionality of a real "view" function, but it isn't declared as such.