# OpenZeppelin v5.1での変更点まとめ

> これらのイベントは、contracts/interfaces/ ディレクトリの下にある IERC1967 インターフェースから利用可能。

- URL: https://cardene.dev/articles/3fcd22f83b8a3e
- 公開日: 2024-10-06
- 更新日: 2024-10-06
- トピック: Blockchain
- タグ: ブロックチェーン, solidity, ethereum, smartcontract

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください！

https://twitter.com/cardene777

https://chaldene.net/

https://qiita.com/cardene

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/EIP-2a03fa3ea33d43baa9ed82288f98d4a9

今回はOpenZeppelinのバージョン5.1での変更点をまとめていきます。

以下のGithubの更新ログをもとにまとめていきます。

https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.1.0-rc.0

# ERC1967Utils

:::message
`Upgraded`、`AdminChanged`、`BeaconUpgraded`イベントの重複宣言を削除。
:::

これらのイベントは、`contracts/interfaces/` ディレクトリの下にある IERC1967 インターフェースから利用可能。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC1967.sol

最小pragmaバージョンが`0.8.21`になりました。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b591baef460523e5ca1c53712c464bcc1a1c467/contracts/proxy/ERC1967/ERC1967Utils.sol#L4

# ガバナンスモジュールの変更

:::message
`Governor`と`GovernorCountingSimple`コントラクトで、`_countVotes` 関数が `uint256` を返すように変更されて総投票数を返すように変更。
:::

これにより、部分的な投票や分数投票をサポートします。
既存のユーザーは、`_countVotes` 関数に `return` 文を追加することでコンパイルエラーを解決できます。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b591baef460523e5ca1c53712c464bcc1a1c467/contracts/governance/Governor.sol

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b591baef460523e5ca1c53712c464bcc1a1c467/contracts/governance/extensions/GovernorCountingSimple.sol

# カスタムエラーの変更

:::message
カスタムエラーの識別子が変更されました。
:::

- `Address.FailedInnerCall` → `Errors.FailedCall`
- `Address.AddressInsufficientBalance` → `Errors.InsufficientBalance`
- `Clones.Create2InsufficientBalance` → `Errors.InsufficientBalance`
- `Clones.ERC1167FailedCreateClone` → `Errors.FailedDeployment`
- `Clones.Create2FailedDeployment` → `Errors.FailedDeployment`

`SafeERC20`は以下のように変更されています。
- トークンのアドレスにコードがない場合は、`Address.AddressEmptyCode` → `SafeERC20FailedOperation`
- 返されたデータが `bool` としてデコードできない場合、汎用 `Error(string)` → `SafeERC20FailedOperation`
- コントラクト呼び出しが失敗した場合、汎用 `SafeERC20FailedOperation`に`revert`メッセージを追加。

# カテゴリごとの変更点

## General

:::message
`AccessManager`、`VestingWallet`、`TimelockController`、`ERC2771Forwarder`にアップグレード対応用の初期関数の追加
:::

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5008

## Access

:::message
特定のロールを持つアドレス一覧の取得とより厳密なアクセス制御が可能に。
:::

### `AccessControlEnumerable`
`getRoleMembers` 関数が追加され、特定のロールを持つすべてのアカウントを取得できるように変更。

```solidity
function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) {
    return _roleMembers[role].values();
}
```

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4546

### `AccessManager`
`onlyAuthorized` modifierが追加され、より厳密なアクセス制御を可能に。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5014

## Finance

### VestingWalletCliff

権利確定ウォレットに「`cliff`」を追加できる拡張機能が導入。
これにより、権利確定期間が設定され、その期間を超えるまでウォレットのトークンがロックされます。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4870

## Governance

### `GovernorCountingFractional`
新たにガバナンス投票モジュールが追加され、投票権を「**賛成**」「**反対**」「**棄権**」に分けて投票できるように変更。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5045

### Votes
`_moveDelegateVotes` 関数の可視性が private` から `internal` に変更され、継承先からもアクセスできるように変更。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5007

## Proxy

### Clones
`clone` と `cloneDeterministic` のバージョンが追加され、コントラクト作成時に値を送信することをサポート。
これにより、クローン作成時にトランザクションでのETH送信が可能になります。

### TransparentUpgradeableProxy
`_proxyAdmin()` 関数が `internal` から `view` に変更。

### ProxyAdmin
`UPGRADE_INTERFACE_VERSION`のドキュメント修正。

## Tokens

### ERC1363
トークン支払い標準の実装が追加され、トークンの`transfer`や`approve`後にコントラクトコードを実行できるように変更され、より高度なトークン操作が可能に。

### ERC20TemporaryApproval
一時的な`approve`を実装する **ERC20** 拡張機能の追加。
**ERC7674**に基づいており、トークンの一時的な承認機能を提供。
https://ethereum-magicians.org/t/erc-7674-temporary-approval-extension-for-erc-20/19521

### SafeERC20
受け取りアドレスがEOAかコントラクトによって処理を変更する「**relaxrd**」関数が追加。`ERC1363` 機能と互換性もあるようです。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4631

### ERC721Utils・ERC1155Utils
`IERC721Receiver` と `IERC1155Receiver` 実装コントラクトに対する受け入れチェックを行うための再利用可能なライブラリが追加。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4845

### ERC1363Utils
`ERC1363` トークンのサポートを行う、`ERC721Utils` と `ERC1155Utils` に類似したヘルパー関数の追加。

## Utils

### Arrays
`address[]`、`bytes32[]`、`uint256[]` のソート関数が追加され、配列操作の利便性が向上。

### Arrays
`lowerBound`、`upperBound` 関数とメモリバージョンが追加され、ソートされた配列内での検索が高速化されて重複にも対応。
`findUpperBound`は非推奨となり、`lowerBound` の使用が推奨。

### Base64
URLエンコード用の `encodeURL` 関数が追加。

### Comparator
ヒープ構造のカスタム動作を実装するために役立つ比較関数のライブラリが追加。

### Create2
コントラクト作成時に`revert`した場合、その戻り値データをバブルアップ（再利用）するように変更。

### Create2, Clones
`computeAddress` と `cloneDeterministic` の出力がアドレスタイプとしてクリーンな値（20バイトのみ使用）を生成するようにマスクが追加。

### Errors
一般的なカスタムエラーを集めた新しいライブラリが追加。

### Hashes
よく使用されるハッシュ関数を含むライブラリが追加。

### Packing
`bytesXX` 値のパッキング、抽出、置換を行う新しいユーティリティの追加。

### Panic
パニックコードで`revert`するライブラリの追加。

### ReentrancyGuardTransient
トランジェントストレージ（新しい一時的ストレージ）を使用する変数の追加。

https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4988

### Strings
アドレスをチェックサム付き文字列に変換するユーティリティ関数の追加。

### SlotDerivation
ストレージスロットを導出するライブラリの追加。

### StorageSlot
型付きスロット表現を使用してトランジェントストレージ空間を操作する関数の追加。

## Cryptography

### SignatureChecker
`isValidSignatureNow` のリファクタリングにより、署名者のアドレスにコードがデプロイされている場合は ECDSA 署名の検証をスキップするように変更。
これにより、効率が向上。

### MerkleProof
カスタムハッシュ関数をサポートするために `verify`、`processProof`、`multiProofVerify` のバリエーションが追加。

### P256
P256（secp256r1）の署名の検証と公開鍵の復元を行うライブラリの追加。
### RSA
RFC 8017 の署名検証操作に従った署名を検証するライブラリの追加。

https://datatracker.ietf.org/doc/html/rfc8017

## Math
### Math
`invMod` 関数が追加され、Z/nZ の範囲内での数値のモジュラ逆数を取得できるように変更。

### Math
`modExp` 関数が追加され、**EIP198** プリコンパイルを活用できるように変更。
`uint256` および `bytes memory` バージョンが含まれます。

### Math
カスタムエラーがネイティブのパニックコードに置き換え。

- パニックコード

```solidity
library Panic {
    /// @dev generic / unspecified error
    uint256 internal constant GENERIC = 0x00;
    /// @dev used by the assert() builtin
    uint256 internal constant ASSERT = 0x01;
    /// @dev arithmetic underflow or overflow
    uint256 internal constant UNDER_OVERFLOW = 0x11;
    /// @dev division or modulo by zero
    uint256 internal constant DIVISION_BY_ZERO = 0x12;
    /// @dev enum conversion error
    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
    /// @dev invalid encoding in storage
    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
    /// @dev empty array pop
    uint256 internal constant EMPTY_ARRAY_POP = 0x31;
    /// @dev array out of bounds access
    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
    /// @dev resource error (too large allocation or too large array)
    uint256 internal constant RESOURCE_ERROR = 0x41;
    /// @dev calling invalid internal function
    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
}
```

### Math, SignedMath
`cond ? a : b` を定数ガスコストで計算する分岐なしの三項関数の追加。

### SafeCast
`bool` を `uint256` として扱うための `toUint(bool)` 関数の追加。

## Structures
### CircularBuffer
最後に追加された N 個の値を保存するデータ構造の追加。
これにより、履歴管理が容易になります。

### DoubleEndedQueue
カスタムエラーがネイティブのパニックコードに置き換え。

### EnumerableMap
`UintToBytes32Map`、`AddressToAddressMap`、`AddressToBytes32Map`、`Bytes32ToAddressMap` などの新しいmapping配列の追加。

### Heap
ヒープベースの優先度キューを実装するデータ構造の追加。

### MerkleTree
マークルツリーに要素を挿入し、ルートハッシュを更新できるデータ構造の追加。

# より詳しく

それぞれについてより詳しく確認したい場合は以下から確認してください。

https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.1.0-rc.0

# 最後に

今回はOpenZeppelinのバージョン5.1の変更点をまとめました。

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください！

https://twitter.com/cardene777

https://chaldene.net/

https://qiita.com/cardene

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/EIP-2a03fa3ea33d43baa9ed82288f98d4a9
