I know we should avoid initial values in field declarations with ZeppelinOS, but what about for constants?
(A) Should we change them to non-constants even though they will in effect be used as constant to avoid the Uninitialized constant variable
lint warning?
OR
(B) Is it okay for a constant still to be defined in the contract with ZeppelinOS?
Thanks!
1 Like
Hi @pcowgill welcome to the forum. It would be great if you could share with the community what you are working on.
I assume that it is ok to define constants in an upgradeable ZeppelinOS contract based on the Solidity documentation for how constants work:
https://solidity.readthedocs.io/en/latest/contracts.html#constant-state-variables
The compiler does not reserve a storage slot for these variables, and every occurrence is replaced by the respective constant expression (which might be computed to a single value by the optimizer).
Not all types for constants are implemented at this time. The only supported types are value types and strings.
I added a constant to the sample contract used in the ZeppelinOS tutorial: https://docs.zeppelinos.org/docs/deploying.html
ZeppelinOS didn't show any warnings or errors and I was able to access the value of the constant from truffle console
as I would expect.
pragma solidity ^0.5.0;
import "zos-lib/contracts/Initializable.sol";
contract MyContract is Initializable {
uint256 public x;
string public s;
uint256 constant public y = 23;
function initialize(uint256 _x, string memory _s) initializer public {
x = _x;
s = _s;
}
}
2 Likes
Thanks for the quick response. Yep, I can confirm that this worked for me as well.
I just made a PR to add this to the docs: https://github.com/zeppelinos/zos/pull/1036
2 Likes
Thanks for making a PR. That is awesome.
1 Like