# [ERC5604] NFTにリース権を付与する仕組みを理解しよう！

> ERC5604は「NFTリース権（NFT Lien）」という新しい概念を提案しています。NFTリース権とは、特定の資産に対して設定される**担保権（security interest）**の一種です。

- URL: https://cardene.dev/articles/cf459c271022a0d91ebe
- 公開日: 2025-11-13
- 更新日: 2025-11-13
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

今回は、NFTに担保権（リース権）を設定できるようにし、NFTを使った融資や契約を安全に行うための仕組みを提案している**ERC5604**についてまとめていきます！

:::message
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-5604

他にも様々なEIP・BIP・SLIP・CAIP・ENSIP・RFC・ACPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

## 概要

**ERC5604**は「**NFTリース権（NFT Lien）**」という新しい概念を提案しています。
NFTリース権とは、特定の資産に対して設定される**担保権（security interest）**の一種です。
これは、債務の返済や特定の義務の履行を確保するために設定されます。
つまり、NFT（非代替性トークン）を所有している人が、そのNFTを担保として提供し、もし債務を履行できなかった場合には、そのNFTに対して権利を持つ者が優先的に回収を行えるようにする仕組みです。

**ERC5604**では、NFTに対してリース権（lien）を**設定するためのインターフェース**と**削除するためのインターフェース**、さらに**リース権の操作を通知するイベント**を定義しています。
これにより、異なるNFTコントラクト間でも共通の方法でリース権を扱うことが可能になります。

技術的には、スマートコントラクト上でNFTのステートに「**リース（担保）**」を設定できるようにし、ブロックチェーン上で透明かつ安全にその関係を管理できるようにすることが目的です。

NFTリース権を設定することで、単なるデジタル資産としてのNFTが、金融や契約上の担保としても活用できるようになります。

## 動機

リース権（Lien）は、現実世界の金融や契約の中で非常に一般的に使われている仕組みです。
例えば、自動車ローンを組んだときに車に設定される**車両担保権**や、住宅ローンで家に設定される**不動産担保権**が代表的です。
これらは「**債務を履行できなかった場合に、債権者が優先的に資産を差し押さえられる**」というルールを明確にするものです。

NFTの世界でも、同じようなニーズが生まれています。
例えば、NFTが「**権利証書（deed）**」のような役割を持つ場合、そのNFTに対してリース権を設定できる仕組みが求められます。
これにより、NFTを担保にした融資、NFTを使ったリース契約、または権利移転に関する安全な金融取引が可能になります。

**ERC5604**では、NFTリース権を扱うための**標準インターフェース**を定義することを目的としています。
これにより、NFTを発行するコントラクトや、それを利用する金融アプリケーション間で統一的な方法でリース関係（lien holding relationship）を実装・運用できるようになります。

## 仕様

#### コントラクトの基本要件

* すべての準拠コントラクトは**ERC721**および**ERC165**を実装する必要があります。
* 以下で定義される `IERC_LIEN` インターフェースを必ず実装する必要があります。

:::message
**ERC165**については以下の記事を参考にしてください。
:::

[\[ERC165\] コントラクトが特定のインターフェースをサポートしているか確認する仕組みを理解しよう！](/articles/541184977a5cba51b759)

```javascript
interface IERC_LIEN is ERC721, ERC165 {
    /// === Events ===

    event OnLienPlaced(uint256 tokenId, address holder, bytes calldata extraParams);
    event OnLienRemoved(uint256 tokenId, address holder, bytes calldata extraParams);

    /// === CRUD ===

    function addLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;
    function removeLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;
    function hasLien(uint256 tokenId, address holder, bytes calldata extraParams) public view returns (bool);
}
```

#### イベント

##### `OnLienPlaced`

```javascript
event OnLienPlaced(uint256 tokenId, address holder, bytes calldata extraParams);
```

新しいリース権がNFTに設定された時に発行されるイベント。
`OnLienPlaced` イベントは、NFTに対して新しいリース権（担保権）が追加されたことを示します。
このイベントは必ず発行されます。
スマートコントラクトの外部から、どのNFTに誰のリース権が設定されたかを追跡するために使われます。

**パラメータ**

* `tokenId`
  * リース権が設定されたNFTの識別子。
* `holder`
  * リース権を持つアドレス。
* `extraParams`
  * 拡張用の追加データ。
  * 将来の拡張機能のために利用されます。

##### `OnLienRemoved`

```javascript
event OnLienRemoved(uint256 tokenId, address holder, bytes calldata extraParams);
```

既存のリース権がNFTから削除された時に発行されるイベント。
`OnLienRemoved` イベントは、NFTに設定されていたリース権が正しく削除されたことを示します。
このイベントも必ず発行され、リース状態の変更を追跡するために使われます。

**パラメータ**

* `tokenId`
  * リース権が削除されたNFTの識別子。
* `holder`
  * 削除されたリース権を持っていたアドレス。
* `extraParams`
  * 拡張用の追加データ。
  * 将来的な拡張やメタデータ伝達に利用されます。

#### 関数

##### `addLienHolder`

```javascript
function addLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;
```

NFTに新しいリース権を設定する関数。
指定したNFT（`tokenId`）に対して、指定したアドレス（`holder`）がリース権を持つように設定します。
すでに同じホルダーが同じNFTにリース権を持っている場合、この関数はエラーを返します。
リース設定が成功した場合、`OnLienPlaced` イベントが発行されます。

**引数**

* `tokenId`
  * リース権を設定するNFTの識別子。
* `holder`
  * リース権を保持するアドレス。
* `extraParams`
  * 拡張用の追加データ。たとえば期限や契約条件を含むことができます。

##### `removeLienHolder`

```javascript
function removeLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;
```

NFTに設定されたリース権を削除する関数。
指定されたNFTから、指定されたホルダーのリース権を削除します。
もし指定されたホルダーがそのNFTにリース権を持っていない場合、エラーを返します。
削除が成功した場合、`OnLienRemoved` イベントが発行されます。

**引数**

* `tokenId`
  * リース権を削除するNFTの識別子。
* `holder`
  * 削除対象となるリース権のホルダー。
* `extraParams`
  * 拡張用の追加データ。契約解除理由などの情報を含むことが可能です。

##### `hasLien`

```javascript
function hasLien(uint256 tokenId, address holder, bytes calldata extraParams) public view returns (bool);
```

NFTにリース権が設定されているかどうかを確認する関数。
指定されたNFTとホルダーの組み合わせについて、現在有効なリース権が存在するかを確認します。
もし`tokenId`が存在しない、または所有者がいない場合、この関数はエラーを返します。

**引数**

* `tokenId`
  * リース権の状態を確認するNFTの識別子。
* `holder`
  * 確認対象となるホルダーのアドレス。
* `extraParams`
  * 拡張用の追加データ。
  * 将来的な利用のために予約されています。

**戻り値**

* `bool`
  * リース権が存在する場合は `true`、存在しない場合は `false`。

## 補足

#### ERC-721のみをサポートする理由

**ERC5604**では、対象となるトークン規格を**ERC721**のみに限定しています。
その理由は、実装をできるだけシンプルにし、ガスコスト（ブロックチェーン上での実行コスト）を抑えるためです。

NFTの担保権管理において、**ERC721**は1つのトークン＝1つの固有資産という性質を持っており、リース権の管理や追跡が明確になります。
一方で、**ERC20**（同質トークン）や **ERC1155**（複数トークン型NFT）は、複数の資産が混在する構造のため、リース権の適用範囲や数量を管理するロジックが複雑になります。

そのため、まずはシンプルで理解しやすい**ERC721**限定の仕様とし、今後の拡張で他の規格（**ERC20**・**ERC1155**など）に対応させる余地を残しています。

#### `addLienHolder` と `removeLienHolder` を分けた理由

**ERC5604**では、「**リース権の追加**」と「**リース権の削除**」を別々の関数として定義しています。
それぞれを統合して「**変更**」機能としてまとめる方法も考えられますが、意図的に分離しています。

理由は、リース権の追加と削除は性質の異なる操作であり、異なるアクセス制御（Access Control）が必要になることが多いためです。

たとえば以下のような状況を考えます。

| 操作  | 主な実行者  | 意味    |
| ------ | --------------------- | ------------------ |
| リース権を追加する（`addLienHolder`） | NFTの所有者 | 他者をリース権者として設定する行為。 |
| リース権を削除する（`removeLienHolder`） | リース権を持つ者自身、または契約上の管理者 | リース権関係を終了させる行為。    |

このように、リース権の追加と削除では実行主体が異なるため、アクセス権限の制御も別に考える必要があります。
したがって、**ERC5604**では2つの関数を明確に分けています。

#### 「債務額（amount of debt）」を含めなかった理由

このインターフェースでは、「**どのくらいの金額（債務額）を担保しているか**」という情報を扱っていません。
これは、リース権（lien）そのものの定義とは別の問題であり、金融的な契約ロジックを内包すると仕様が複雑になりすぎるためです。

債務額を扱う仕組みは、それ自体で1つの新しい標準（ERC）として定義する価値があると考えられています。
つまり、**ERC5604**ではリース権の存在関係の管理にのみ焦点を当て、実際の債務条件や金額などの詳細は別の仕様で扱う想定になっています。

#### 承認（endorsement）機能を含めなかった理由

**ERC5604**では、リース権を持つ者がNFTの移転や交換に同意する「**承認（endorsement）**」の仕組みを含めていません。
この承認は、NFTが担保として扱われる際に、リース権者の同意が必要になるケースを想定しています。

ただし、承認の仕組みは契約内容や利用シナリオによって大きく異なり、共通のルールを定めることが難しいため、現段階では仕様から除外されています。
これについても、将来的に独立したERCとして定義することが検討されています。

## 互換性

この提案は、**ERC721**を拡張する形で設計されています。
そのため、この仕様に準拠するコントラクトは、必ず**ERC721**の要件をすべて満たす必要があります。

## 引用

Zainan Victor Zhou (@xinbenlv), Allen Zhou <allen@ubiloan.io>, Alex Qin <alex@ubiloan.io>, "ERC-5604: NFT Lien [DRAFT]," Ethereum Improvement Proposals, no. 5604, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5604.

## 最後に

今回は「NFTに担保権（リース権）を設定できるようにし、NFTを使った融資や契約を安全に行うための仕組みを提案している**ERC5604**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
