メインコンテンツへスキップ
Change page

ERC-7540 非同期トークン化ヴォールト標準

はじめに

ERC-7540は、非同期の預入れ (deposit) および償還 (redemption) フローのサポートを追加することで、ERC-4626 トークン化ヴォールト標準を拡張します。この標準では、リクエスト後に請求 (claim) するパターンが導入されています。ユーザーはまずリクエストを送信して資産やシェアをロックし、ヴォールトがそれを処理した後に結果を請求します。

これは、ヴォールトが1つのトランザクションで即座にセトルメントできない場合に必要となります。例えば以下の通りです。

  • トークン化された米国債、プライベートクレジット、その他T+1やT+2のセトルメントサイクルを持つ資産などのリアル・ワールド・アセット (RWA) プロトコル
  • 信用評価がオフチェーンで行われる無担保レンディング
  • ブリッジングによって遅延が生じるクロスチェーンのヴォールトストラテジー
  • アンボンディング期間があるリキッド・ステーキング・トークン (LST)

ヴォールトは、預入れのみ、償還のみ、またはその両方で非同期にすることを選択できます。この柔軟性により、ヴォールト開発者は、基盤となるストラテジーが要求する部分にのみ非同期フローを追加し、もう一方を同期的なままに保つことができます。

前提知識

このページをより深く理解するために、まずはトークン標準ERC-20、およびERC-4626について読むことをお勧めします。

ERC-4626とERC-7540の比較

ERC-4626では、預入れはアトミックにセトルメントされます。つまり、投資家は1つのトランザクションで資産を送金し、シェアを受け取ります。

ERC-4626 synchronous deposit flow

ERC-7540はこれを2つのステップに分割します。投資家はまずrequestDeposit()を呼び出して資産をロックし、ヴォールト管理者がリクエストを処理するのを待ちます。処理が完了すると、投資家はdeposit()を呼び出してシェアを請求します。交換レートはリクエスト時ではなく、処理完了時に決定されます。

ERC-7540 asynchronous deposit flow

償還フローも同様に機能します。requestRedeem()でシェアをロックし、処理が完了すると投資家はredeem()を呼び出して資産を請求します。

ERC-7540の関数と機能

ERC-7540はERC-4626のインターフェースを完全に継承していますが、deposit / mint / withdraw / redeemを請求関数として再利用します。新しいrequestDepositおよびrequestRedeem関数は、最初のリクエストステップを処理します。

各リクエストは3つの状態を遷移します。保留中 (pending: 送信済みで処理待ち)、請求可能 (claimable: 処理完了および価格決定済み)、および請求済み (claimed: 投資家がシェアまたは資産を回収済み) です。

Request lifecycle: Pending, Claimable, Claimed

預入れリクエストフロー

requestDeposit

function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId)

ownerからヴォールトへassetsを送金し、預入れリクエストを送信します。controllerアドレスがリクエストの制御権を受け取ります。リクエストバッチを識別するrequestIdを返します。

pendingDepositRequest

function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

指定されたcontrollerおよびrequestIdに対する、保留中 (まだ請求可能ではない) の預入れリクエストにおけるassetsの量を返します。

claimableDepositRequest

function claimableDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

指定されたcontrollerおよびrequestIdに対する、請求可能 (処理完了済みだがまだ請求されていない) な預入れリクエストにおけるassetsの量を返します。

預入れの請求

預入れリクエストが請求可能になると、ユーザーは標準のERC-4626のdepositまたはmint関数を呼び出してシェアを請求します。ERC-7540では、これらの関数はもはや資産を送金しません (それはリクエスト時にすでに完了しています)。受信者に対してシェアをミントするだけです。

償還リクエストフロー

requestRedeem

function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId)

ownerからsharesをロックし、償還リクエストを送信します。controllerアドレスがリクエストの制御権を受け取ります。

pendingRedeemRequest

function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

指定されたcontrollerおよびrequestIdに対する、保留中の償還リクエストにおけるsharesの量を返します。

claimableRedeemRequest

function claimableRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

指定されたcontrollerおよびrequestIdに対する、請求可能な償還リクエストにおけるsharesの量を返します。

償還の請求

償還リクエストが請求可能になると、ユーザーは標準のERC-4626のredeemまたはwithdraw関数を呼び出して資産を請求します。

オペレーター管理

ERC-7540には、サードパーティがユーザーに代わってリクエストを管理できるようにするオペレーターパターン (ERC-6909 (新しいタブで開く)由来) が含まれています。

setOperator

function setOperator(address operator, bool approved) external returns (bool)

預入れ/償還リクエストおよび請求に関して、msg.senderの代理として行動するoperatorを承認または取り消します。

isOperator

function isOperator(address controller, address operator) external view returns (bool)

operatorcontrollerの代理として行動することを承認されているかどうかを返します。

リクエストID

リクエストIDは、異なるリクエストバッチを区別します。同じrequestIdを共有するすべてのリクエストは代替可能 (fungible) であり、一緒に状態を遷移し、同じ交換レートを受け取ります。

ヴォールトがすべてのリクエストに対してrequestId = 0を返す場合、controllerアドレスのみがリクエストの状態を区別します。同じコントローラーからの複数のリクエストは集約されます。

イベント

DepositRequestイベント

預入れリクエストがrequestDeposit経由で送信されたときに発行されなければなりません (MUST)。

event DepositRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 assets
)

RedeemRequestイベント

償還リクエストがrequestRedeem経由で送信されたときに発行されなければなりません (MUST)。

event RedeemRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 shares
)

OperatorSetイベント

オペレーターがsetOperator経由で承認または取り消されたときに発行されなければなりません (MUST)。

event OperatorSet(
    address indexed controller,
    address indexed operator,
    bool approved
)

プレビュー関数

プレビュー関数は、非同期のフローに対してのみリバートしなければなりません。なぜなら、リクエストが処理されるまで交換レートが不明だからです。非同期預入れヴォールトでは、previewDepositおよびpreviewMintはリバートしなければならず (MUST)、一方でpreviewRedeemおよびpreviewWithdrawはERC-4626と同様に機能し続けます (非同期償還ヴォールトの場合はその逆になります)。これはERC-4626との重要な動作上の違いです。

参考文献