🧐

XRP LedgerのSingle Asset Vault機能

2024/12/06に公開

はじめに

この記事はXLS-65: Single Asset Vaultを紹介するものです。

原文

Single Asset Vault (単一資産の金庫)

概要

Single Asset Vaultは、1人または複数の拠出者からの資産を集約し、その資産を他のオンチェーンプロトコルで利用できるようにするための、オンチェーンの新しい基礎要素です。Single Asset Vaultは、多目的トークン(MPToken)を使用して、Vaultの所有権シェアを表現します。Vaultは、レンディング市場、アグリゲーター、利息付きトークン、資産管理など、さまざまな用途に利用できます。Single Asset Vaultは、流動性提供機能を特定のプロトコルロジックから分離します。

1. はじめに

1.1 機能概要

Single Asset Vault は、1人または複数の拠出者からの資産を集約し、シェアを通じて所有権を表現するオンチェーンのオブジェクトです。レンディングプロトコルなどの他のプロトコルは、利回りを生み出すかどうかに関わらず、このVaultを介してこれらの資産にアクセスすることができます。現在、他のプロトコルは、Vaultを作成したアカウントによって作成されなければなりません。しかし、将来的には変更される可能性があります。

この仕様は、利用可能な資産、シェア、総価値、その他の関連情報などの主要な詳細を含む新しいVaultレジャーエントリを導入します。

この仕様は、以下のトランザクションを含みます。

Vault管理:

  • VaultCreate: 新しいVaultオブジェクトを作成します。
  • VaultSet: 既存のVaultオブジェクトを更新します。
  • VaultDelete: 既存のVaultオブジェクトを削除します。

Asset Management:

  • VaultDeposit: 指定された数量の資産をVaultに預け入れ、シェアを受け取ります。
  • VaultWithdraw: Vaultにシェアを返し、指定された数量の資産を引き出します。

さらに、発行者はClawback操作を実行できます。

  • VaultClawback: Clawbackドキュメントに従って、IOUまたはMPTの発行者がVaultから資金を引き上げることを可能にします。

1.1.1 Vaultの所有者と管理

Vaultは、Vault Ownerと呼ばれるアカウントによって所有および管理されます。このアカウントは、Vaultオブジェクトの作成、更新、および削除を担当します。

1.1.2 アクセス制限

Single Asset Vaultは、公開または非公開のいずれかです。任意の拠出者は、十分なシェアを所有している場合、公開Vaultから流動性を預け入れ、引き出すことができます。対照的に、非公開シェアへのアクセスは、Permissioned Domainsによって制御されます。これらは、オンチェーンのCredentialsを使用してVaultへのアクセスを管理します。必要な資格情報を持つ拠出者のみが、非公開Vaultに資産を預け入れることができます。Vault Ownerが拠出者の資金をロックするのを防ぐため、任意のシェアホルダーは資金を引き出すことができます。

1.1.3 利回りを生み出すシェア

シェアは、Vaultの資産の所有権を表します。オンチェーンのシェアは、多目的トークン(MPToken)で表されます。Vaultを作成する際、Vault Ownerはシェアを送信(移転)不可能に設定できます。送信不可能なシェアは、他のアカウントに送信することはできません--それらはVaultを通じて引き換えることのみができます。Vaultが非公開の場合、シェアは他のDeFiプロトコルで転送され、使用されることができますが、受け取りアカウントがシェアを保持することを許可されている限り。Vaultのシェアは、Vaultに接続されたプロトコルによって、ホルダーが初期に預け入れた流動性よりも多く(または少なく)引き出すことができるかどうかによって、利回りを生み出す可能性があります。

1.2 用語

  • Vault: 流動性を集約し、この流動性を1つまたは複数のアクセス者に提供するためのレジャーエントリ。
  • Asset: Vaultの通貨。XRP、代替可能トークン(IOU)、または多目的トークン(MPToken)のいずれかです。
  • Share: シェアは、Vaultの資産の拠出者の取り分を表します。シェアは、Vaultの Pseudo Account(Pseudo Account) によって作成されたMPTokenです。
  • Protocol Instance: 集約された流動性へのアクセスを必要とする別のXRP Ledgerプロトコル。

1.3 人物

  • Vault Owner: Vaultの作成と削除を担当するアカウント。
  • Depositor: Vaultに資産を預け入れ、引き出すエンティティ。

1.4 Vaultへの接続

Vaultに接続するプロトコルは、その債務を追跡する必要があります。さらに、資金が削除されたり、追加されたりしたときのVaultの状態の更新は、プロトコルのトランザクションで処理する必要があります。例については、レンディングプロトコル仕様をご覧ください。

2. レジャーエントリ

2.1 Vaultレジャーエントリ

Vaultレジャーエントリは、トークン化されたVaultの状態を記述します。

2.1.1 オブジェクト識別子

Vaultオブジェクトのキーは、次の値を順番に連結した結果です。

  • Vaultスペースキー 0x0056 (大文字のV)
  • トランザクションを送信したアカウントのAccountID、つまりVaultOwner
  • トランザクションのSequence番号。トランザクションがチケットを使用した場合は、TicketSequenceの値を使用します。

2.1.2 フィールド

Vaultには以下のフィールドがあります。

フィールド名 変更可能? 必須? JSONタイプ 内部タイプ デフォルト値 説明
LedgerIndex N/A string UINT16 N/A レジャーオブジェクト識別子。
Flags Yes string UINT32 0 レジャーオブジェクトのフラグ。
PreviousTxnID N/A string HASH256 N/A このオブジェクトを最後に変更したトランザクションIDを識別します。
PreviousTxnLgrSeq N/A number UINT32 N/A このオブジェクトを最後に変更したレジャーのシーケンス。
Sequence N/A number UINT32 N/A Vaultを作成したトランザクションのシーケンス番号。
OwnerNode N/A number UINT64 N/A このアイテムが所有者のディレクトリで参照されているページを識別します。
Owner No string AccountID N/A Vault Ownerのアカウントアドレス。
Account N/A string ACCOUNTID N/A Vaultの Pseudo Account のアドレス。
Data Yes string BLOB None Vaultに関する任意のメタデータ。256バイトに制限されています。
Asset No string or object ISSUE N/A Vaultの資産。VaultはXRPIOUMPTをサポートします。
AssetsTotal N/A number NUMBER 0 Vaultの総価値。
AssetsAvailable N/A number NUMBER 0 Vaultに利用可能な資産の量。
LossUnrealized N/A number NUMBER 0 Vaultの未実現の潜在的損失額。
AssetsMaximum Yes number NUMBER 0 Vaultが保持できる資産の最大量。ゼロ値0は上限がないことを示します。
Share N/A object MPT 0 シェアを表すMPTokenIssuanceオブジェクトの識別子。
WithdrawalPolicy No string UINT8 N/A Vaultが使用する引き出し戦略。
PermissionedDomainID No string HASH256 None Vaultのパーミッションドメインの識別子。この値はVaultが公開の場合は無視されます。
2.1.2.1 フラグ

Vaultオブジェクトは以下のフラグをサポートします。

フラグ名 フラグ値 変更可能? 説明
lsfVaultPrivate 0x0001 No Vaultが非公開の場合に設定されます。

2.1.3 Pseudo AccountのVault

AccountRootエントリは、Vaultに預け入れられたXRP、IOU、またはMPTを保持します。また、Vaultのシェアの発行者として機能します。Pseudo Account は、XLS-64d仕様に従います。Vaultオブジェクトを作成するときにAccountRootオブジェクトが作成されます。

2.1.4 所有権

Vaultオブジェクトは、VaultSetトランザクションを送信したアカウントが所有する所有者ディレクトリに格納され、VaultのシェアからVaultオブジェクトの検索を容易にするために、Pseudo Account の所有者ディレクトリにおいても追跡されます。

2.1.5 所有者準備金

Vaultオブジェクトは、作成された各オブジェクトに対して1つの準備金を必要とします。

  • Vaultオブジェクト自身。
  • Vaultのシェアに関連するMPTokenIssuance

2.1.6 Vaultのシェア

シェアは、拠出者が所有するVaultの資産の持分を表します。Vault Ownerは、シェアの通貨コードと、トークンがVaultの作成時に移転可能かどうかを設定します。これらの2つの値は変更できません。シェアは多目的トークン(MPToken)で表されます。MPTはVaultの Pseudo Account によって発行されます。

2.1.6.1 MPTokenIssuance

MPTokenIssuanceオブジェクトは、レジャー上のシェアを表します。Vaultオブジェクトと一緒に作成および削除されます。

2.1.6.1.1 MPTokenIssuance Values

以下の表には、「フィールド」、「説明」、「値」の見出しがあります。

フィールド 説明
Issuer Vaultの Pseudo Account のアカウントID。 Pseudo Account ID
MaximumAmount 発行できる数に制限はありません。 0xFFFFFFFFFFFFFFFF
TransferFee シェアを移転するために支払われる手数料。 0
MPTokenMetadata シェアMPTに関する任意のメタデータ、16進数形式。 -

フラグ

以下のフラグは、シェアが移転可能かどうかと、Vaultが公開か非公開かに基づいて設定されます。

条件 移転可能 移転不可能
公開Vault lsfMPTCanEscrow
lsfMPTCanTrade
lsfMPTCanTransfer
フラグなし
非公開Vault lsfMPTCanEscrow
lsfMPTCanTrade
lsfMPTCanTransfer
lsfMPTRequireAuth
lsfMPTRequireAuth
2.1.6.2 MPToken

MPTokenオブジェクトは、拠出者が保持するシェアの量を表します。拠出者が流動性をVaultに預け入れると作成され、拠出者がシェアを引き出す(または移転する)と削除されます。

2.1.6.2.1 MPTokenの値

MPTokenの値は、仕様に従って設定されます。

条件 移転可能 移転不可能
公開Vault フラグなし lsfMPTAuthorized
非公開Vault lsfMPTAuthorized lsfMPTAuthorized

2.1.7 交換アルゴリズム

交換アルゴリズムとは、資産をシェアに交換し、シェアを資産に交換するために使用されるアルゴリズムです。このアルゴリズムは、流動性を預け入れるか引き出すときに実行されます。Vaultは、以下に詳述するデフォルトの交換アルゴリズムを使用します。

2.1.7.1 未実現損失

知識のある預金者は、損失の発生を事前に知り、シェアを早期に換金することが考えられます。その結果、残りの拠出者が損失の全額を負担することになります。このような行為を抑制するために、私たちは「含み損」という概念を導入し、これをVaultオブジェクトのLossUnrealizedフィールドで捕捉します。「含み損」は、Vaultが被る可能性のある潜在的な損失を捕捉し、それによってVaultの価値を一時的に減少させます。Vaultに接続されたプロトコルのみが、LossUnrealizedフィールドを増減することができます。

「含み損」は一時的にVaultの価値を減少させます。悪意のある拠出者は、価格が上昇する前に価格を下げて資産を預け入れ、それを引き出すことでこれを利用する可能性があります。

総額100万ドルのVaultと総額100万ドルのシェアを保有しているVaultを考えてみましょう。Vaultの「含み損」は90万ドルとします。新しい取引レートは以下の通りです。

exchangeRate = \frac{AssetsTotal - LossUnrealized}{SharesTotal}
exchangeRate = \frac{1,000,000 - 900,000}{1,000,000} = 0.1

「含み損」が解消された後、新しい実効取引レートは以下の通りとなります。

exchangeRate = \frac{AssetsTotal}{SharesTotal}
exchangeRate = \frac{1,000,000}{1,000,000} = 1.0

拠出者は、取引レート0.1で10万ドルの資産を預け入れ、100万のシェアを受け取ることができます。「含み損」が解消されれば、そのシェアは100万ドルの価値を持つことになります。

この問題に対処するため、Vaultは2つの異なる取引レートモデルを使用する必要があります。1つは資産を預け入れる場合、もう1つは資産を引き出す場合です。

2.1.7.2 取引レートアルゴリズム

変数

以下の変数はVaultの残高を定義します。

  • \Gamma_{share} - 発行されたシェアの総数。

  • \Gamma_{asset} - Vaultの総資産、将来の収益を含む。

  • \Delta_{asset} - 入金、出金、または償還後の資産の総額の変化。

  • \Delta_{share} - 入金、出金、または償還後のシェアの総額の変化。

  • \iota - Vaultの未実現損失。

2.1.7.2.1 入金

預金者が受け取るシェアの数(\Delta_{share})は以下の通りです。

\Delta_{share} = \Delta_{asset} \times \frac{\Gamma_{share}}{\Gamma_{asset} + 0^{\Gamma_{asset}}}

預金後のVaultの更新された値は以下の通りです。

  • \Gamma_{asset} = \Gamma_{asset} + \Delta_{asset} Vaultの資産の新しい残高。
  • \Gamma_{share} = \Gamma_{share} + \Delta_{share} Vaultのシェアの新しい残高。
2.1.7.2.2 償還

償還後の資産の数(\Delta_{asset})は以下の通りです。

\Delta_{asset} = \Delta_{share} \times \frac{\Gamma_{asset} - \iota}{\Gamma_{share} + 0^{\Gamma_{share}}}

償還後のVaultの更新された値は以下の通りです。

  • \Gamma_{asset} = \Gamma_{asset} - \Delta_{asset} Vaultの資産の新しい残高。
  • \Gamma_{share} = \Gamma_{share} - \Delta_{share} Vaultのシェアの新しい残高。
2.1.7.2.3 出金

\Delta_{asset}を出金するためにバーンするシェアの数は次のように計算します。

\Delta_{share} = \Delta_{asset} \times \frac{\Gamma_{share}}{\Gamma_{asset} - \iota + 0^{\Gamma_{asset}}}

以下の式は、引き出しが成功した後の更新されたVaultの数を示します。

  • \Gamma_{asset} = \Gamma_{asset} - \Delta_{asset} Vaultの資産の新しい残高。
  • \Gamma_{share} = \Gamma_{share} - \Delta_{share} Vaultのシェアの新しい残高。
2.1.7.3 引き出しポリシー

引き出しポリシーは、Vaultから流動性を引き出すときに使用されるロジックを制御します。各戦略には独自の実装がありますが、実装後に複数のVaultで使用できます。したがって、異なるVaultには異なる引き出しポリシーがあります。本仕様では以下のポリシーを導入します。

2.1.7.3.1 first-come-first-serve (先着順)

先着順(First Come, First Serve)戦略では、すべてのリクエストを平等に扱い、十分なシェアがあれば、拠出者は資産を任意の金額で引き出すことができます。

2.1.8 凍結された資産

Vaultの資産の発行者は、IOUに対するグローバル凍結またはMPTのロックを通じて凍結を実施することができます。Vaultの資産が凍結されると、資産はIssuerのアカウントに指定されたDestinationアカウントにのみ引き出すことができます。同様に、凍結された資産はVaultに預け入れることができません。さらに、Vaultの資産が凍結されると、対応するシェアは移転できません。

3. トランザクション

本提案で導入されたすべてのトランザクションは、すべてのトランザクションで共有される共通トランザクションフィールドを組み込みます。標準フィールドは、この提案がそのようなフィールドの新しい可能性の値を導入するため、必要な場合にのみ文書化されます。

3.1 VaultCreate, VaultSet, VaultDeleteトランザクション

Vaultオブジェクトは、VaultCreate, VaultSet, VaultDeleteトランザクションで管理されます。

3.1.1 VaultCreateトランザクション

VaultCreateトランザクションは、新しいVaultオブジェクトを作成します。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string Uint16 58 トランザクションタイプ。
Flags string Uint32 0 Vaultのフラグを指定。
Data string Blob Vaultの任意のメタデータ。最大256バイト。
Asset string or object Issue N/A Vaultの資産(XRP、IOU、またはMPT)。
AssetsMaximum number Uint64 0 Vaultで保持できる資産の最大量。
MPTokenMetadata string Blob シェアのMPTに関する任意のメタデータ。最大1024バイト。
WithdrawalPolicy string UINT8 strFirstComeFirstServe Vaultで使用される引き出し戦略。
PermissionedDomainID string Hash256 Vaultオブジェクトに関連付けられたPermissionedDomainオブジェクトのID。
3.1.1.1 フラグ
フラグ名 フラグ値 説明
tfVaultPrivate 0x0001 Vaultが非公開であることを示します。Vaultの作成時にのみ設定できます。
tfVaultShareNonTransferable 0x0002 シェアが送信不可であることを示します。Vaultの作成時にのみ設定できます。
3.1.1.2 引き出し戦略

引き出し戦略は、Vaultでサポートされる引き出し戦略を示します。以下の値がサポートされています。

戦略名 説明
strFirstComeFirstServe 0x0001 リクエストは先着順で処理されます。
3.1.1.3 トランザクション料金

トランザクションは、Pseudo AccountAccountRootオブジェクトを作成します。したがって、トランザクションは所有者準備金1つ分をバーンする必要があります。

3.1.1.4 失敗条件
  • AssetMPT:

    • MPTokenIssuanceオブジェクトにlsfMPTCanTransferが設定されていない。(資産が送信不可である)
    • MPTokenIssuanceオブジェクトにlsfMPTLockedが設定されている。(資産がグローバルロックされている)
  • AssetIOU:

    • 発行者アカウントにlsfGlobalFreezeフラグが設定されている。(資産が凍結されている)
  • Dataフィールドが256バイトを超えている。

  • トランザクションを送信するアカウントの所有者準備金が不足している。

3.1.1.5 状態変更
  • 新しいVaultオブジェクトを作成します。

  • シェアのMPTokenIssuanceオブジェクトを作成します。

  • 新しいAccountRootPseudo Accountオブジェクトを作成し、PseudoOwnerVaultIDに設定します。

  • Vault.AssetIOU:

    • Pseudo AccountのAccountRootと発行者のAccountRootの間にRippleStateオブジェクトを作成します。
  • Vault.AssetMPT:

    • Pseudo AccountのMPTokenオブジェクトを作成します。
3.1.1.6 不変条件

未定

3.1.2 VaultSetトランザクション

VaultSetトランザクションは、既存のVaultオブジェクトを更新します。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string Uint16 59 トランザクションタイプ。
VaultID string Hash256 N/A 変更するVaultのID。Vaultを更新する際には、必ず含める必要があります。
Data string Blob 任意のVaultメタデータ。最大256バイト。
AssetsMaximum number Uint64 0 Vaultで保有できる資産の最大額。この値は、0でない限り、Vaultの現在のAssetsTotalよりも低くすることはできません。
3.1.2.1 失敗条件
  • 指定されたVaultIDVaultオブジェクトが存在しない。
  • 送信アカウントがVaultのOwnerではない。
  • Dataフィールドが256バイトを超えている。
  • Vault.AssetsMaximum > 0 かつ AssetsMaximum > 0 かつ:
    • AssetsMaximum < Vault.AssetsTotal (新しいAssetsMaximumは、現在のAssetsTotalよりも低くすることはできません。)
  • 不変フィールドを変更しようとしている。
3.1.2.2 状態変更
  • Vaultオブジェクトの可変フィールドを更新します。
3.1.2.3 不変条件

未定

3.1.3 VaultDeleteトランザクション

VaultDeleteトランザクションは、既存のVaultオブジェクトを削除します。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string Uint16 60 トランザクションタイプ。
VaultID string Hash256 N/A 削除するVaultのID。
3.1.3.1 失敗条件
  • 指定されたVaultIDVaultオブジェクトが存在しない。
  • 送信アカウントがVaultのOwnerではない。
  • AssetsTotal, AssetsAvailableまたはMPTokenIssuance(Vault.Share).OutstandingAmountが0より大きい。
  • Vaultの Pseudo AccountOwnerDirectoryに、Vault、シェアのMPTokenIssuance、または資産のMPTokenまたはトラストラインへのポインタ以外のオブジェクトが含まれている。
3.1.3.2 状態変更
  • シェアのMPTokenIssuanceオブジェクトを削除します。
  • 保有資産に対応するMPTokenまたはRippleStateオブジェクトを削除します。
  • Pseudo AccountAccountRootオブジェクトとそのDirectoryNodeオブジェクトを削除します。
  • Vault.Ownerアカウントに所有者準備金を解放します。
  • Vaultオブジェクトを削除します。
3.1.3.3 不変条件

未定

3.2 VaultDepositVaultWithdrawトランザクション

拠出者は、トークン化されたVaultに資産を入金または出金するためにVaultDepositおよびVaultWithdrawトランザクションを呼び出します。

3.2.1 VaultDepositトランザクション

VaultDepositトランザクションは、Vaultのシェアを交換して流動性を追加します。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string UINT16 61 トランザクションタイプ。
VaultID string HASH256 N/A Vaultに資産を入金するVaultのID。
Amount string or object AMOUNT N/A 入金する資産の量。
3.2.1.1 失敗条件
  • VaultIDVaultオブジェクトが存在しない。

  • Vaultの資産タイプが、拠出者が入金しようとしている資産タイプと一致しない。

  • 拠出者が入金するための資金が不足している。

  • AmountをVaultのAssetsTotalに加算した結果、AssetsMaximumを超える。

  • VaultlsfPrivateフラグが設定されているが、資産を入金するアカウントがPermissioned Domainに資格がない。

  • Vaultの資産タイプがMPT:

    • MPTokenIssuance.lsfMPTCanTransferが設定されていない。(資産が送信不可である)
    • MPTokenIssuance.lsfMPTLockedが設定されている。(資産がグローバルロックされている)
    • MPToken(MPTokenIssuanceID, AccountID).lsfMPTLockedが設定されている。(資産が拠出者によるロックされている)
    • MPToken(MPTokenIssuanceID, AccountID).MPTAmount < Amount (資産が不足している)
  • 資産タイプがIOU:

    • 発行者アカウントにlsfGlobalFreezeフラグが設定されている。(資産が凍結されている)
    • RippleStateオブジェクト間のlsfHighFreezeまたはlsfLowFreezeフラグが設定されている。(資産が拠出者によるロックされている)
    • RippleStateオブジェクトのBalance < Amount (資産が不足している)
3.2.1.2 状態変更

MPTokenオブジェクトが存在しない場合は、作成します。詳細については、3.4.2 MPTokenをご覧ください。

  • シェアのMPTokenオブジェクトのMPTAmountフィールドを\Delta_{share}増加します。

  • シェアのMPTokenIssuanceオブジェクトのOutstandingAmountフィールドを\Delta_{share}増加します。

  • VaultAssetsTotalおよびAssetsAvailableAmount増加します。

  • 資産タイプがXRP:

    • Pseudo Account AccountRootBalanceフィールドをAmount増加します。
    • 拠出者のAccountRootBalanceフィールドをAmount減少します。
  • 資産タイプがIOU:

    • Pseudo Account AccountRootと発行者のAccountRootの間のRippleStateBalanceフィールドをAmount増加します。
    • 拠出者のAccountRootと発行者のAccountRootの間のRippleStateBalanceフィールドをAmount減少します。
  • 資産タイプがMPT:

    • Pseudo Account MPTokenオブジェクトのMPToken.MPTAmountフィールドをAmount増加します。
    • 拠出者のMPTokenオブジェクトのMPToken.MPTAmountフィールドをAmount減少します。
3.2.1.3 不変条件

未定

3.2.2 VaultWithdrawトランザクション

VaultWithdrawトランザクションは、Vaultのシェアを交換して資産を引き出します。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string UINT16 62 トランザクションタイプ。
VaultID string HASH256 N/A Vaultから資産を引き出すVaultのID。
Amount number STAmount 0 引き出すVaultの資産の正確な量。
Destination string AccountID Empty 資産を受け取るアカウント。資産を受け取ることができる必要があります。

AmountがVaultの資産の場合は、Withdraw式を使用してシェアのコストを計算します。
AmountがVaultのシェアの場合は、Redeem式を使用して資産の量を計算します。

以下のセクションでは、以下の変数を使用します。

  • \Gamma_{share} - Vaultが発行したシェアの総数。

  • \Gamma_{asset} - Vault内の資産の総数、将来の収益を含む。

  • \Delta_{asset} - 入金、出金、または償還後の資産の総額の変化。

  • \Delta_{share} - 入金、出金、または償還後のシェアの総額の変化。

3.2.2.1 失敗条件
  • VaultIDを持つVaultオブジェクトが存在しない。

  • 資産タイプがMPT:

    • MPTokenIssuance.lsfMPTCanTransferが設定されていない。(資産が送信不可である)
    • MPTokenIssuance.lsfMPTLockedフラグが設定されている。(資産がグローバルロックされている)
    • MPToken(MPTokenIssuanceID, AccountID).lsfMPTLockedフラグが設定されている。(資産が拠出者によるロックされている)
  • 資産タイプがIOU:

    • 発行者アカウントにlsfGlobalFreezeフラグが設定されている。(資産が凍結されている)
    • RippleStateオブジェクト間のlsfHighFreezeまたはlsfLowFreezeフラグが設定されている。(資産が拠出者によるロックされている)
  • Amountの単位がVaultのシェアではない。

  • Amountの単位がVaultの資産ではない。

  • Vault内の流動性が不足している。

    • AmountがVaultのシェア:

      • MPTokenIssuance(Vault.Share).OutstandingAmount < Amount (引き出そうとするシェアがVault内に存在しない)
      • 拠出者のAccountshares MPToken.MPTAmount < Amount (引き出そうとするシェアを拠出者が所有していない)
      • Vault.AssetsAvailable < \Delta_{asset} (Vault内の資産が不足している)
    • AmountがVaultの資産:

      • 拠出者のAccountshares MPToken.MPTAmount < \Delta_{share} (引き出そうとするシェアを拠出者が所有していない)
      • Vault.AssetsAvailable < Amount (Vault内の資産が不足している)
  • 資産を受け取るアカウントが指定されているが、資産を受け取ることができない。

3.2.2.2 State Changes
  • 資産タイプがXRP:

    • Pseudo Account AccountRootBalanceフィールドを\Delta_{asset}減少します。
    • 拠出者のAccountRootBalanceフィールドを\Delta_{asset}増加します。
  • 資産タイプがIOU:

    • Pseudo Account AccountRootと発行者のAccountRootの間のRippleStateBalanceフィールドを\Delta_{asset}減少します。
    • 拠出者のAccountRootと発行者のAccountRootの間のRippleStateBalanceフィールドを\Delta_{asset}増加します。
  • 資産タイプがMPT:

    • Pseudo Account MPTokenオブジェクトのMPToken.MPTAmountフィールドを\Delta_{asset}減少します。
    • 拠出者のMPTokenオブジェクトのMPToken.MPTAmountフィールドを\Delta_{asset}増加します。
  • 拠出者のAccountRootVault.ShareMPTokenオブジェクトを更新します:

    • MPToken.MPTAmount\Delta_{share}減少します。
    • MPToken.MPTAmount == 0の場合は、オブジェクトを削除します。
  • Vault.ShareMPTokenIssuanceオブジェクトを更新します:

    • MPTokenIssuance.OutstandingAmountフィールドを\Delta_{share}減少します。
  • VaultAssetsTotalおよびAssetsAvailable\Delta_{asset}減少します。

3.2.2.3 不変条件

未定

3.3 VaultClawbackトランザクション

3.3.1 VaultClawbackトランザクション

VaultClawbackトランザクションは、Vaultから資産を引き出し、アカウントのシェアを償還します。概念的には、トランザクションはHolderの代わりにVaultWithdrawを実行し、資産のIssuerアカウントに資金を送信します。Amount全体に対して償還が行われない場合は、トランザクションは部分的な償還を行います。VaultClawbackトランザクションは、将来の手数料や罰金を尊重しなければなりません。

フィールド名 必須? JSONの型 内部の型 デフォルト値 説明
TransactionType string UINT16 63 トランザクションタイプ。
VaultID string HASH256 N/A VaultのID。Vaultから資産を引き出します。
Holder string AccountID N/A 資産を償還するアカウントのID。
Amount number NUMBER 0 償還する資産の量。Amount0の場合は、Holderが所有するシェアの総数まで償還します。
3.3.1.1 失敗条件
  • VaultIDに紐づくVaultオブジェクトが存在しません。

  • Vault.AssetXRPの場合。

  • Vault.AssetIOUの場合:

    • トランザクションの送信者が発行者アカウントではありません。
  • Vault.AssetMPTの場合:

    • トランザクションの送信者がMPTokenIssuance.Issuerではありません。
    • HolderVault.ShareMPTokenオブジェクトが存在しないか、MPToken.MPTAmount == 0です。
3.3.1.2 状態変更
  • Vault.AssetIOUの場合:

    • Pseudo Account AccountRootと発行者のAccountRootの間のRippleStateBalanceフィールドを\Delta_{asset}減少します。
  • Vault.AssetMPTの場合:

    • Pseudo Account MPTokenオブジェクトのMPToken.MPTAmountフィールドを\Delta_{asset}減少します。
  • HolderAccountRootVault.ShareMPTokenオブジェクトを更新します:

    • MPToken.MPTAmount\Delta_{share}減少します。
    • MPToken.MPTAmount == 0の場合は、オブジェクトを削除します。
  • Vault.ShareMPTokenIssuanceオブジェクトを更新します:

    • MPTokenIssuance.OutstandingAmountフィールドを\Delta_{share}減少します。
  • Vault.AssetsTotalおよびAssetsAvailable\Delta_{asset}減少します。

3.3.1.3 不変条件

未定

4. API

4.1 RPC ledger_entry

このメソッドは、特定のIDのVaultオブジェクトを取得します。仕様的には、一般的なフィールドを省略しています。こちらから見つけることができます。

4.1.1 リクエストフィールド

ledger_entryメソッドに以下のフィールドを追加します:

フィールド名 必須? JSONの型 説明
vault_id string 取得するVaultのオブジェクトID。

4.1.2 レスポンス

フィールド名 必須? JSONの型 説明
LedgerEntryType string レジャーオブジェクトのタイプ。
LedgerIndex string レジャーオブジェクトの識別子。
Flags string レジャーオブジェクトのフラグ。
PreviousTxnID string 最後にこのオブジェクトを変更したトランザクションのID。
PreviousTxnLgrSeq number 最後にこのオブジェクトを変更したトランザクションを含むレジャーのシーケンス。
Sequence number Vaultを作成したトランザクションのシーケンス番号。
OwnerNode number このアイテムが所有者のディレクトリで参照されているページを識別します。
Owner string Vaultの所有者のアカウントアドレス。
Account string Vaultの Pseudo Account のアドレス。
Data string Vaultに関する任意のメタデータ。最大256バイト。
Asset string or object Vaultの資産。VaultはXRP, IOUおよびMPTをサポートします。
AssetsTotal number Vaultの総資産額。
AssetsAvailable number Vault内で利用可能な資産額。
LossUnrealized number 未実現の損失額。Vaultの資産として表現されます。
AssetsMaximum number Vaultが保持できる資産の最大額。ゼロ値0は上限がないことを示します。
Share object 共有MPTokenIssuanceオブジェクトの識別子。
SharesTotal number Vaultが発行したシェアの総数。
WithdrawalPolicy string Vaultが使用する引き出し戦略。
PermissionedDomainID string Vaultの許可されたドメインの識別子。公開Vaultの場合は無視されます。

4.1.2.1 例

{
  "LedgerEntryType": "Vault",
  "LedgerIndex": "E123F4567890ABCDE123F4567890ABCDEF1234567890ABCDEF1234567890ABCD",
  "Flags": "0",
  "PreviousTxnID": "9A8765B4321CDE987654321CDE987654321CDE987654321CDE987654321CDE98",
  "PreviousTxnLgrSeq": 12345678,
  "Sequence": 1,
  "OwnerNode": 2,
  "Owner": "rEXAMPLE9AbCdEfGhIjKlMnOpQrStUvWxYz",
  "Account": "rPseudoAcc1234567890abcdef1234567890abcdef",
  "Data": "This is arbitrary metadata about the vault.",
  "Asset": {
    "currency": "USD",
    "issuer": "rIssuer1234567890abcdef1234567890abcdef",
    "value": "1000"
  },
  "AssetsTotal": 1000000,
  "AssetsAvailable": 800000,
  "LossUnrealized": 200000,
  "AssetsMaximum": 0,
  "Share": {
    "TokenID": "ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890",
    "Issuer": "rShareIssuer1234567890abcdef1234567890abcdef"
  },
  "SharesTotal": 5000,
  "WithdrawalPolicy": "FIFO",
  "PermissionedDomainID": "example-domain-id"
}

付録

A-1 F.A.Q.

A-1.1 なぜWithdrawRedeemの両方を許可しているのですか?

この設計は、XRPLユーザーと開発者が実装する必要があるオフチェーンの計算量を減らすために選択されました。

A-1.2 なぜVaultのシェアを所有するアカウントがVaultWithdrawトランザクションを送信できるのですか?

VaultWithdrawトランザクションは、許可されたドメインのルールを尊重しません。言い換えれば、Vaultのシェアを所有するアカウントはそれらを引き出すことができます。

この決定は、拠出者がプライベートVaultに資産を預け入れ、その資格を無効化することによってアクセスを取り消され、資金へのアクセスを失うという状況を避けるためになされました。

Discussion