XRP LedgerのAMM Clawback機能
はじめに
この記事はXLS-74: AMM Clawbackを紹介するものです。
AMM Clawback
概要
AMMClawback amendmentにより、トークン発行者はAMMプールに入金したウォレットからトークンをクローバックできるようになり、規制遵守が保証されます。AMMClawbackトランザクションは、発行者によってlsfAllowTrustLineClawback
が有効になっている場合にのみ許可されます。lsfAllowTrustLineClawback
は、アカウントが所有者ディレクトリを持っていない場合にのみAccountSetを通して設定できます。
1. 概要
この提案では、AMMを通じたトークンの凍結とクローバックについての新しい機能を導入します。
1.1. AMMとトークンの凍結
現在、AMMプール内のアセットが凍結(グローバルまたは個別)されても、ペアトークンをAMMプールに預けることができます(ペアとなるアセットが凍結されていない場合)。この提案の導入により、
- ウォレットが所有するトークンの少なくとも1つがトークン発行者によって凍結(個別またはグローバル)されている場合、ウォレットが新しいトークンをAMMプールに預ける(片面および両面)ことを禁止します。
1.2. AMMと非認可のトークン
現在、あるアカウントがAMMプール内のトークンを保有する権限がない場合でも、そのペアのトークンについて権限があれば、他のペアトークンを片側入金することができます。本提案では以下を導入します。
- ウォレットがAMMプール内のトークンの一方または両方を保有する権限を持たない場合、AMMプールに新しいトークン(片面または両面)を入金できないようにします。
1.3. AMMとクローバック
現在、クローバックを有効にしているアカウントが発行するトークンを含むトークンペアでAMMプールを作成できません。この提案では以下を導入します:
- トークンの1つが
lsfAllowTrustLineClawback
を有効にしていても、アカウントがAMMプールを作成できるようにします。ただし、トークン発行者はClawback
トランザクションを使用してAMMアカウントからクローバックを行うことはできません。 - 新しい
AMMClawback
トランザクションを導入して、トークン発行者が自分のトークンを持つAMMプールから、プール内の現在の割合に従って専用のクローバックを行えるようにします。
2. 仕様
2.1. 新しいトークンの入金禁止
この提案では、トークンがトラストラインと自動マーケットメーカー(AMM)プールとの間で相互作用する場合のAMMDeposit
トランザクションの動作を変更します。
2.1.1. 凍結資産のAMMDeposit
2つのトークンAとBを持つ自動マーケットメーカー(AMM)プールを作成する場合を考えます。現在、トークンAは凍結されています(個別またはグローバル)。以下の表は、特定のシナリオが現在の動作と提案された動作の両方で許可または禁止されているかどうかを示しています。
シナリオ | 現在の挙動 | 提案された挙動 |
---|---|---|
両面入金 | 禁止 | 禁止 |
Aの片面入金(凍結) | 禁止 | 禁止 |
Aの片面入金 | 許可 | 禁止 |
上の表に示されているように、主な変更点は、AMMプールの一方の資産が凍結された場合、もう一方の資産への預け入れができなくなったことです。つまり、ペアとなるトークンが凍結された場合、凍結されていないトークンの預金も禁止されます。
2.1.1. 非認可のトークンのAMMDeposit
2つのトークンで自動マーケットメーカー(AMM)プールを作成する場合を考えます。Aの発行者はlsfRequireAuth
を設定しており、保有者はAを保有する権限がありません。
以下の表は、現在の動作と提案されている動作で許可されるシナリオと禁止されるシナリオを示しています。
シナリオ | 現在の挙動 | 提案された挙動 |
---|---|---|
両面入金 | 禁止 | 禁止 |
Aの片面入金(非認可) | 禁止 | 禁止 |
Bの片面入金 | 許可 | 禁止 |
主な変更点は、保有者がAMMプール内のトークンの1つを保有できない場合、もう1つの資産を預けることができなくなったことです。
2.2. Clawback可能なトークンでのAMMプールの作成を許可
現在、lsfAllowTrustLineClawback
フラグを設定して発行者アカウントのクローバックを有効にしている場合、このアカウントが発行したトークンを含むペアのAMMCreate
は禁止されています。AMMClawback amendmentにより、クローバックを有効にした発行者アカウントが発行したトークンを含むペアのAMMCreate
が許可されます。発行者はClawback
トランザクションを使用してAMMアカウントからクローバックを行うことはできません。発行者がAMMアカウントからクローバックを行うには、AMMClawback
トランザクションが必要です。
例 AMMClawback Amendmentの説明
発行者がAccountSet
トランザクションでlsfAllowTrustLineClawback
フラグを設定してクローバックを有効にしたとします。さらに、通貨Aと通貨Bについて、保有者と発行者の間で2つのトラストラインが確立されているとします。
-変更前の動作:
- ホルダーが発行者に関連付けられたトラストライン資産AとBのペアを使用してAMMプール(AMMCreate
)を作成しようとすると、トランザクションはtecNO_PERMISSION
エラーで失敗します。
-
変更後の動作:
- AMMClawback amendmentの有効化後、保有者が資産AとBでAMMプールを作成するために
AMMCreate
トランザクションを送信すると、トランザクションは成功します。 - ただし、発行者がAMMアカウントから資産をクローバックしたい場合は、通常の
Clawback
トランザクションではなく、AMMClawback
トランザクションを使用する必要があります。
- AMMClawback amendmentの有効化後、保有者が資産AとBでAMMプールを作成するために
この変更により、クローバックが可能な発行体によるAMMプールの作成が可能になると同時に、発行体がAMMアカウントから資産をクローバックするための新しいトランザクションタイプ(AMMClawback
)が導入されました。
2.3. AMMプールからのクローバックのための新しいトランザクションの導入
この提案では、トークンの発行者がAMMプールから資産をクローバックできるように、新しいトランザクションタイプAMMClawback
を導入します。
発行者はlsfAllowTrustLineClawback
フラグが有効な場合にのみAMMプールで発行されたトークンをクローバックできます。このフラグがセットされていない状態でこれを実行しようとすると、エラーコードtecNO_PERMISSION
が返されます。
保有者アカウント、資産、資産2、金額を指定することで、このトランザクションは以下のことを行います。
- 指定された保有者アカウントが保有する資産のうち、指定されたAMMアカウントにある指定された金額をクローバックします。
- このトランザクションは、AMMプールから現在の割合で指定された量のトークンの2つのアセットの引き出しを開始します。
- ただし、
Asset
の発行者がAccount
と一致する必要があります。そうでない場合はtemMALFORMED
が返されます。 - 発行者がAMMプール内で1つのトークンしか発行していない場合
- 発行者の
asset
は発行者のアカウントに戻ります。 - 発行者が発行していないペアの
asset2
は保有者のアカウントに戻されます。
- 発行者の
- AMMプール内の2つのトークンの両方が発行者によって発行された場合、このトランザクションは次のようになります。
- 発行者の
asset
は発行者のアカウントに戻ります。 - もし
tfClawTwoAssets
フラグがセットされていれば、ペアになったasset2
も発行者によって発行され、同様に発行者のアカウントに戻ります。 - もし
tfClawTwoAssets
フラグがセットされていなければ、ペアになったasset2
は保有者に戻ります。
- 発行者の
-
tfClawTwoAssets
フラグを設定できるのは、発行者がAMMプールで両方のトークンを発行している場合のみです。そうでない場合はtecNO_PERMISSION
が返されます。 - 要求されたトークンの量がAMMプール内の保有者の利用可能な残高を超えた場合、指定された保有者が所有するすべてのトークンがクローバックされます。
- リクエストに金額が指定されていない場合、指定された保有者が所有するすべてのトークンがプールからクローバックされます。
2.3.1. AMMClawbackトランザクションのフィールド
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
TransactionType |
:heavy_check_mark: | string |
UINT16 |
TransactionType
は新しいトランザクションタイプAMMClawback
を指定します。整数値は31です。推奨される名前はttAMM_CLAWBACK
です。
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
Account |
:heavy_check_mark: | string |
ACCOUNT ID |
Account
はクローバックするトークンの発行者を指定し、トランザクションを提出するアカウントと一致する必要があります。
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
Holder |
:heavy_check_mark: | string |
ACCOUNT ID |
Holder
は、クローバックされる資産の保有者アカウントを指定します。
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
Asset |
:heavy_check_mark: | object |
ISSUE |
Asset
は発行者がAMMプールから取り戻したいトークンを指定します。Asset
の発行者はAccount
と一致しなければなりません。一致しない場合、システムはtemMALFORMED
というエラーを返します。クローバックするトークンは常にAsset2
ではなくAsset
に入れてください。
このフィールドは次のサブフィールドを持ちます。
フィールド名 | 必須? | 説明 |
---|---|---|
issuer |
:heavy_check_mark: | クローバックされるトークンの発行者を指定します。これはAccount フィールドと同じでなければなりません。 |
currency |
:heavy_check_mark: | クローバックされるトークンの通貨を指定します。 |
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
Asset2 |
:heavy_check_mark: | object |
ISSUE |
Asset2
ではAMMプール内のもう一方の資産を指定します。
このフィールドは次のサブフィールドを持ちます。
フィールド名 | 必須? | 説明 |
---|---|---|
issuer |
ペアになったトークンの発行者を指定します。XRPの場合は省略します。 | |
currency |
:heavy_check_mark: | ペアになったトークンの通貨を指定します。 |
フィールド名 | 必須? | JSONの型 | 内部の型 |
---|---|---|---|
Amount |
object |
AMOUNT |
Amount
ではAMMアカウントからクローバックされるトークンの量を指定します。Amount
はAsset
フィールドと一致する必要があります。
-
Amount
が指定されていない場合、指定された資産がすべてクローバックされます。 -
Amount
が保有者のAMMプール内の現在の残高を超える場合、指定されたトークンがすべてクローバックされます。
このフィールドは次のサブフィールドを持ちます。
フィールド名 | 必須? | 説明 |
---|---|---|
issuer |
:heavy_check_mark: | クローバックされるトークンの発行者を指定します。これはAccount フィールドと同じでなければなりません。 |
currency |
:heavy_check_mark: | クローバックされるトークンの通貨を指定します。 |
value |
:heavy_check_mark: | クローバックされるトークンの最大量を指定します。 |
2.3.2. Flags
フラグ名 | 16進数の値 | 説明 |
---|---|---|
tfClawTwoAssets |
0x00000001 | 発行者がプール内の両方のトークンをクローバックしたいかどうかを示します。2つの資産は両方とも発行者によって発行されている必要があります。 |
- このフラグは発行者がプール内の両方のトークンを発行している場合にのみ設定できます。
- 設定されている場合、
Asset
トークンとペアのトークンAsset2
の両方がクローバックされます。 - 設定されていない場合、
Asset
トークンのみがクローバックされ、ペアのトークンAsset2
は保有者に戻ります。
2.3.3. AMMClawbackトランザクションの例
2.3.3.1 発行者が1つのトークンしか発行していない場合
発行者がFOOとBARの2つのトークンを含むAMMプールが存在しているとします。FOOとBARの比率は1:2です。発行者rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL
はFOOのみを発行し、BARは他のアカウントによって発行されています。
{
"TransactionType": "AMMClawback",
"Account": "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"Holder": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"Asset": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Asset2" : {
"currency" : "BAR",
"issuer" : "rHtptZx1yHf6Yv43s1RWffM3XnEYv3XhRg"
},
"Amount": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"value" : "1000"
}
}
- このトランザクションが実行されると、発行者
rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL
は、保有者rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B
が所有するFOOを最大1000までAMMプールFOO/BARから取り戻すことができます。 - このトランザクションにより、AMMアカウントから2つの対応する資産が現在の割合で引き出されます。
-
Account
によって発行された資産は、発行者のアカウントに戻されます。したがって、1000FOOは発行者rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL
に戻されます。 - もう一方の資産は保有者のウォレットに戻されます。FOOとBARの割合は1:2であるため、2000のBARが保有者のウォレットに戻されます。
-
Amount
が指定されていない場合、またはそのサブフィールドであるvalue
が保有者の利用可能残高を超える場合、保有者のFOOはすべてAMMプールから回収されます。
-
- BARは発行者によって発行されていないため、
tfClawTwoAssets
は設定できません。
2.3.3.2 両方のトークンが同一アカウントによって発行されている場合
FOOとBARの比率が1:2であるAMMプールが存在しているとします。発行者rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL
はFOOとBARの両方を発行しています。
{
"TransactionType": "AMMClawback",
"Account": "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"Holder": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"Asset": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Asset2": {
"currency" : "BAR",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Amount": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"value" : "1000"
},
"Flags": 1
}
- この例では、
tfClawTwoAssets
がFlags
に設定されているため、1000FOOと2000BARの両方が発行者に返却されます。(Flags
にtfClawTwoAssets
が設定されていない場合、1000FOOが発行者に返却され、2000BARが保有者に返却されます。) -
Amount
が指定されていない場合、またはそのサブフィールドvalue
が保有者の利用可能残高を超える場合、AMMプール内の保有者の既存のFOO残高を回収します。BARが回収されるか保有者に返却されるかは、フラグtfClawTwoAssets
によって決定されます。
2.3.3.3 すべてのトークンをクローバックする
{
"TransactionType": "AMMClawback",
"Account": "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"Holder": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"Asset": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Asset2" : {
"currency" : "BAR",
"issuer" : "rHtptZx1yHf6Yv43s1RWffM3XnEYv3XhRg"
}
}
- 発行者は
Amount
フィールドを省略することで、保有者のFOOトークン残高をAMMプールから回収します。 - この例では、BARは異なる発行者によって発行されているため、
tfClawTwoAssets
は設定できません。AMMプール内のすべての保有者のFOOが回収され、対応するBARは保有者に戻ります。
2.3.3.4 同一発行者によって発行されたすべてのトークンをクローバックする
{
"TransactionType": "AMMClawback",
"Account": "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"Holder": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"Asset": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Asset2" : {
"currency" : "BAR",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Flags": 1
}
- この例では、FOOとBARは同じ発行者によって発行されています。そのため、
tfClawTwoAssets
を設定することが許可されます。 -
Amount
が指定されておらず、tfClawTwoAssets
が設定されているため、発行者はAMMプールから保有者のFOOと対応するBARをすべて回収します。(回収されたFOOとBARは、AMMプール内の保有者のLPトークンすべてを償還した際の2つの資産の引き出し額を反映しています。) -
tfClawTwoAssets
は、BARが回収されるか保有者に返却されるかを決定するために使用されます。
2.3.3.5 XRPを含むプールからトークンをクローバックする
{
"TransactionType": "AMMClawback",
"Account": "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"Holder": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"Asset": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL"
},
"Asset2" : {
"currency" : "XRP",
},
"Amount": {
"currency" : "FOO",
"issuer" : "rPdYxU9dNkbzC5Y2h4jLbVJ3rMRrk7WVRL",
"value" : "1000"
}
}
- この例では、発行者はAMMプールFOO/XRPから1000FOOを回収します。対応するXRPの割合は保有者に戻ります。
- XRPは回収できません。
Discussion