ownerアドレスをimmutableで記録させる話(構想)【続き】

先日、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();
        _;
    }
}

「///」で開始しているコメントがそれ。不具合を誘発する実装なので警告されているが、今回はそれを承知で実装しているため問題ない。

コメント