XRP LedgerのSingle Asset Vault機能
はじめに
この記事は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はXRP、IOU、MPTをサポートします。 |
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 lsfMPTCanTradelsfMPTCanTransfer
|
フラグなし |
| 非公開Vault |
lsfMPTCanEscrowlsfMPTCanTradelsfMPTCanTransferlsfMPTRequireAuth
|
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万ドルとします。新しい取引レートは以下の通りです。
「含み損」が解消された後、新しい実効取引レートは以下の通りとなります。
拠出者は、取引レート0.1で10万ドルの資産を預け入れ、100万のシェアを受け取ることができます。「含み損」が解消されれば、そのシェアは100万ドルの価値を持つことになります。
この問題に対処するため、Vaultは2つの異なる取引レートモデルを使用する必要があります。1つは資産を預け入れる場合、もう1つは資産を引き出す場合です。
2.1.7.2 取引レートアルゴリズム
変数
以下の変数はVaultの残高を定義します。
-
- 発行されたシェアの総数。\Gamma_{share} -
- Vaultの総資産、将来の収益を含む。\Gamma_{asset} -
- 入金、出金、または償還後の資産の総額の変化。\Delta_{asset} -
- 入金、出金、または償還後のシェアの総額の変化。\Delta_{share} -
- Vaultの未実現損失。\iota
2.1.7.2.1 入金
預金者が受け取るシェアの数(
預金後のVaultの更新された値は以下の通りです。
-
Vaultの資産の新しい残高。\Gamma_{asset} = \Gamma_{asset} + \Delta_{asset} -
Vaultのシェアの新しい残高。\Gamma_{share} = \Gamma_{share} + \Delta_{share}
2.1.7.2.2 償還
償還後の資産の数(
償還後のVaultの更新された値は以下の通りです。
-
Vaultの資産の新しい残高。\Gamma_{asset} = \Gamma_{asset} - \Delta_{asset} -
Vaultのシェアの新しい残高。\Gamma_{share} = \Gamma_{share} - \Delta_{share}
2.1.7.2.3 出金
以下の式は、引き出しが成功した後の更新されたVaultの数を示します。
-
Vaultの資産の新しい残高。\Gamma_{asset} = \Gamma_{asset} - \Delta_{asset} -
Vaultのシェアの新しい残高。\Gamma_{share} = \Gamma_{share} - \Delta_{share}
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 AccountのAccountRootオブジェクトを作成します。したがって、トランザクションは所有者準備金1つ分をバーンする必要があります。
3.1.1.4 失敗条件
-
AssetがMPT:-
MPTokenIssuanceオブジェクトにlsfMPTCanTransferが設定されていない。(資産が送信不可である) -
MPTokenIssuanceオブジェクトにlsfMPTLockedが設定されている。(資産がグローバルロックされている)
-
-
AssetがIOU:- 発行者アカウントに
lsfGlobalFreezeフラグが設定されている。(資産が凍結されている)
- 発行者アカウントに
-
Dataフィールドが256バイトを超えている。 -
トランザクションを送信するアカウントの所有者準備金が不足している。
3.1.1.5 状態変更
-
新しい
Vaultオブジェクトを作成します。 -
シェアの
MPTokenIssuanceオブジェクトを作成します。 -
新しい
AccountRootPseudo Accountオブジェクトを作成し、PseudoOwnerをVaultIDに設定します。 -
Vault.AssetがIOU:- Pseudo Accountの
AccountRootと発行者のAccountRootの間にRippleStateオブジェクトを作成します。
- Pseudo Accountの
-
Vault.AssetがMPT:- Pseudo Accountの
MPTokenオブジェクトを作成します。
- Pseudo Accountの
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 失敗条件
- 指定された
VaultIDのVaultオブジェクトが存在しない。 - 送信アカウントが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 失敗条件
- 指定された
VaultIDのVaultオブジェクトが存在しない。 - 送信アカウントがVaultの
Ownerではない。 -
AssetsTotal,AssetsAvailableまたはMPTokenIssuance(Vault.Share).OutstandingAmountが0より大きい。 - Vaultの Pseudo Account の
OwnerDirectoryに、Vault、シェアのMPTokenIssuance、または資産のMPTokenまたはトラストラインへのポインタ以外のオブジェクトが含まれている。
3.1.3.2 状態変更
- シェアの
MPTokenIssuanceオブジェクトを削除します。 - 保有資産に対応する
MPTokenまたはRippleStateオブジェクトを削除します。 -
Pseudo Account の
AccountRootオブジェクトとそのDirectoryNodeオブジェクトを削除します。 -
Vault.Ownerアカウントに所有者準備金を解放します。 -
Vaultオブジェクトを削除します。
3.1.3.3 不変条件
未定
3.2 VaultDepositとVaultWithdrawトランザクション
拠出者は、トークン化された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 失敗条件
-
VaultIDのVaultオブジェクトが存在しない。 -
Vaultの資産タイプが、拠出者が入金しようとしている資産タイプと一致しない。
-
拠出者が入金するための資金が不足している。
-
AmountをVaultのAssetsTotalに加算した結果、AssetsMaximumを超える。 -
VaultのlsfPrivateフラグが設定されているが、資産を入金するアカウントが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} -
VaultのAssetsTotalおよびAssetsAvailableをAmount増加します。 -
資産タイプが
XRP:-
Pseudo Account
AccountRootのBalanceフィールドをAmount増加します。 - 拠出者の
AccountRootのBalanceフィールドをAmount減少します。
-
Pseudo Account
-
資産タイプが
IOU:-
Pseudo Account
AccountRootと発行者のAccountRootの間のRippleStateのBalanceフィールドをAmount増加します。 - 拠出者の
AccountRootと発行者のAccountRootの間のRippleStateのBalanceフィールドをAmount減少します。
-
Pseudo Account
-
資産タイプが
MPT:-
Pseudo Account
MPTokenオブジェクトのMPToken.MPTAmountフィールドをAmount増加します。 - 拠出者の
MPTokenオブジェクトのMPToken.MPTAmountフィールドをAmount減少します。
-
Pseudo Account
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式を使用して資産の量を計算します。
以下のセクションでは、以下の変数を使用します。
-
- Vaultが発行したシェアの総数。\Gamma_{share} -
- Vault内の資産の総数、将来の収益を含む。\Gamma_{asset} -
- 入金、出金、または償還後の資産の総額の変化。\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内に存在しない) - 拠出者の
Accountのshares MPToken.MPTAmount<Amount(引き出そうとするシェアを拠出者が所有していない) -
Vault.AssetsAvailable< (Vault内の資産が不足している)\Delta_{asset}
-
-
AmountがVaultの資産:- 拠出者の
Accountのshares MPToken.MPTAmount< (引き出そうとするシェアを拠出者が所有していない)\Delta_{share} -
Vault.AssetsAvailable<Amount(Vault内の資産が不足している)
- 拠出者の
-
-
資産を受け取るアカウントが指定されているが、資産を受け取ることができない。
3.2.2.2 State Changes
-
資産タイプが
XRP:-
Pseudo Account
AccountRootのBalanceフィールドを 減少します。\Delta_{asset} - 拠出者の
AccountRootのBalanceフィールドを 増加します。\Delta_{asset}
-
Pseudo Account
-
資産タイプが
IOU:-
Pseudo Account
AccountRootと発行者のAccountRootの間のRippleStateのBalanceフィールドを 減少します。\Delta_{asset} - 拠出者の
AccountRootと発行者のAccountRootの間のRippleStateのBalanceフィールドを 増加します。\Delta_{asset}
-
Pseudo Account
-
資産タイプが
MPT:-
Pseudo Account
MPTokenオブジェクトのMPToken.MPTAmountフィールドを 減少します。\Delta_{asset} - 拠出者の
MPTokenオブジェクトのMPToken.MPTAmountフィールドを 増加します。\Delta_{asset}
-
Pseudo Account
-
拠出者の
AccountRootのVault.ShareのMPTokenオブジェクトを更新します:-
MPToken.MPTAmountを 減少します。\Delta_{share} -
MPToken.MPTAmount == 0の場合は、オブジェクトを削除します。
-
-
Vault.ShareのMPTokenIssuanceオブジェクトを更新します:-
MPTokenIssuance.OutstandingAmountフィールドを 減少します。\Delta_{share}
-
-
VaultのAssetsTotalおよび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 | 償還する資産の量。Amountが0の場合は、Holderが所有するシェアの総数まで償還します。 |
3.3.1.1 失敗条件
-
VaultIDに紐づくVaultオブジェクトが存在しません。 -
Vault.AssetがXRPの場合。 -
Vault.AssetがIOUの場合:- トランザクションの送信者が発行者アカウントではありません。
-
Vault.AssetがMPTの場合:- トランザクションの送信者が
MPTokenIssuance.Issuerではありません。 -
HolderのVault.ShareのMPTokenオブジェクトが存在しないか、MPToken.MPTAmount == 0です。
- トランザクションの送信者が
3.3.1.2 状態変更
-
Vault.AssetがIOUの場合:-
Pseudo Account
AccountRootと発行者のAccountRootの間のRippleStateのBalanceフィールドを 減少します。\Delta_{asset}
-
Pseudo Account
-
Vault.AssetがMPTの場合:-
Pseudo Account
MPTokenオブジェクトのMPToken.MPTAmountフィールドを 減少します。\Delta_{asset}
-
Pseudo Account
-
HolderのAccountRootのVault.ShareのMPTokenオブジェクトを更新します:-
MPToken.MPTAmountを 減少します。\Delta_{share} -
MPToken.MPTAmount == 0の場合は、オブジェクトを削除します。
-
-
Vault.ShareのMPTokenIssuanceオブジェクトを更新します:-
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 なぜWithdrawとRedeemの両方を許可しているのですか?
この設計は、XRPLユーザーと開発者が実装する必要があるオフチェーンの計算量を減らすために選択されました。
A-1.2 なぜVaultのシェアを所有するアカウントがVaultWithdrawトランザクションを送信できるのですか?
VaultWithdrawトランザクションは、許可されたドメインのルールを尊重しません。言い換えれば、Vaultのシェアを所有するアカウントはそれらを引き出すことができます。
この決定は、拠出者がプライベートVaultに資産を預け入れ、その資格を無効化することによってアクセスを取り消され、資金へのアクセスを失うという状況を避けるためになされました。
Discussion