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. レジャーエントリ
Vault
レジャーエントリ
2.1 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が非公開の場合に設定されます。 |
Pseudo Account
のVault
2.1.3 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万ドルとします。新しい取引レートは以下の通りです。
「含み損」が解消された後、新しい実効取引レートは以下の通りとなります。
拠出者は、取引レート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. トランザクション
本提案で導入されたすべてのトランザクションは、すべてのトランザクションで共有される共通トランザクションフィールドを組み込みます。標準フィールドは、この提案がそのようなフィールドの新しい可能性の値を導入するため、必要な場合にのみ文書化されます。
VaultCreate
, VaultSet
, VaultDelete
トランザクション
3.1 Vault
オブジェクトは、VaultCreate
, VaultSet
, VaultDelete
トランザクションで管理されます。
VaultCreate
トランザクション
3.1.1 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
オブジェクトを作成します。 -
新しい
AccountRoot
Pseudo 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 不変条件
未定
VaultSet
トランザクション
3.1.2 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 不変条件
未定
VaultDelete
トランザクション
3.1.3 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 不変条件
未定
VaultDeposit
とVaultWithdraw
トランザクション
3.2 拠出者は、トークン化されたVaultに資産を入金または出金するためにVaultDeposit
およびVaultWithdraw
トランザクションを呼び出します。
VaultDeposit
トランザクション
3.2.1 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 不変条件
未定
VaultWithdraw
トランザクション
3.2.2 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 不変条件
未定
VaultClawback
トランザクション
3.3
VaultClawback
トランザクション
3.3.1 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
ledger_entry
4.1 RPC このメソッドは、特定の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.
Withdraw
とRedeem
の両方を許可しているのですか?
A-1.1 なぜこの設計は、XRPLユーザーと開発者が実装する必要があるオフチェーンの計算量を減らすために選択されました。
VaultWithdraw
トランザクションを送信できるのですか?
A-1.2 なぜVaultのシェアを所有するアカウントがVaultWithdraw
トランザクションは、許可されたドメインのルールを尊重しません。言い換えれば、Vaultのシェアを所有するアカウントはそれらを引き出すことができます。
この決定は、拠出者がプライベートVaultに資産を預け入れ、その資格を無効化することによってアクセスを取り消され、資金へのアクセスを失うという状況を避けるためになされました。
Discussion