🧐

XRP LedgerのAMM Clawback機能

2024/11/22に公開

はじめに

この記事は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トランザクションを使用する必要があります。

この変更により、クローバックが可能な発行体による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アカウントからクローバックされるトークンの量を指定します。AmountAssetフィールドと一致する必要があります。

  • 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
}
  • この例では、tfClawTwoAssetsFlagsに設定されているため、1000FOOと2000BARの両方が発行者に返却されます。(FlagstfClawTwoAssetsが設定されていない場合、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