先日、Ownableのownerをimmutableで定義するコントラクトを作成した。

ownerアドレスをimmutableで記録させる話(構想)
スマートコントラクトを運用していく上で必要になってくるのが権限の管理。これはイーサリアムの基盤ではなくスマートコントラクト内でロジックを記述して行う。msg.senderがスマートコントラクトに登録されているアドレスと一致しない場合はエラー...
このコントラクトをそのままUpgradeableなコントラクトに使用するとデプロイ時にエラーが発生するため、もう少し調整が必要。※通常のデプロイ方法では問題ない。
エラーの内容はこんな感じ。
Error: Contract `contracts/App.sol:App` is not upgrade safe
contracts/OwnableImmutable.sol:28: Contract `OwnableImmutable` has a constructor
Define an initializer instead
https://zpl.in/upgrades/error-001
contracts/OwnableImmutable.sol:24: Variable `_OWNER` is immutable and will be initialized on the implementation
If by design, annotate with '@custom:oz-upgrades-unsafe-allow state-variable-immutable'
Otherwise, consider a constant variable or use a mutable variable instead
ということで出力内容のとおりアノテーションを記述してやればよい。
abstract contract OwnableImmutable is ContextUpgradeable {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
address private immutable _OWNER;
error OwnableUnauthorizedAccount(address account);
/// @custom:oz-upgrades-unsafe-allow constructor
constructor(address initialOwner) {
_OWNER = initialOwner;
}
function _owner() internal view virtual returns (address) {
return _OWNER;
}
function _checkOwner() internal view virtual {
if (_OWNER != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
modifier onlyOwner() {
_checkOwner();
_;
}
}
「///」で開始しているコメントがそれ。不具合を誘発する実装なので警告されているが、今回はそれを承知で実装しているため問題ない。
コメント