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.
EDIT: I just figured out I can use staticcall
instead of call
and that solves the issue.
But My question still remains. What if I forget to declare function and view ? Will it spend gas? I guess not, but I am not sure.