AMMDeposit

[ソース]

(AMM amendment が必要です。)

自動マーケットメーカー(AMM)インスタンスに資金を預け、AMMの流動性プロバイダートークン( LPトークン )を受け取ります。AMMのプールにある資産の一方または両方を預けることができます。

トランザクションが成功すると、LPトークンを保持するためにAMMアカウント(リミット0)にトラストラインが作成されます。

AMMDeposit JSONの例

{
    "Account" : "rJVUeRqDFNs2xqA7ncVE6ZoAhPUoaJJSQm",
    "Amount" : {
        "currency" : "TST",
        "issuer" : "rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd",
        "value" : "2.5"
    },
    "Amount2" : "30000000",
    "Asset" : {
        "currency" : "TST",
        "issuer" : "rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd"
    },
    "Asset2" : {
        "currency" : "XRP"
    },
    "Fee" : "10",
    "Flags" : 1048576,
    "Sequence" : 7,
    "TransactionType" : "AMMDeposit"
}

AMMDeposit フィールド

共通フィールドに加えて、AMMDepositトランザクションは以下のフィールドを使用します。

フィールド JSONの型 内部の型 必須? 説明
Asset オブジェクト STIssue はい AMMのプールにある資産の一つを定義します。JSONでは、currencyissuerフィールドを持つオブジェクトになります(XRPの場合はissuerを省略します)。
Asset2 オブジェクト STIssue はい AMMのプールにあるもう一つの資産を定義します。JSONでは、currencyissuerフィールドを持つオブジェクトになります(XRPの場合はissuerを省略します)。
Amount 通貨額 Amount いいえ AMMに預ける1つの資産の量を指定します。存在する場合、これはAMMのプールにある資産の一つ(トークンまたはXRP)と一致する必要があります。
Amount2 通貨額 Amount いいえ AMMに追加する別の資産の量を指定します。存在する場合、これはAMMのプール内の他の資産と一致する必要があり、Amountと同じ資産にすることはできません。
EPrice 通貨額 Amount いいえ 受け取った各LPトークンに支払う、預け入れ資産の最大有効価格です。
LPTokenOut 通貨額 Amount いいえ AMMのLPトークンの購入数量。

AMMDepositモード

このトランザクションには5つのモードがあり、どのフラグを指定するかで定義されます。それぞれのモードは、特定のフィールドの組み合わせを必要とし、次の2つのカテゴリに分類されます。

  • ダブルアセット入金: AMMのプールにある両方(2つ)の資産を、既存の資産の残高に比例して預けます。この預け入れでは手数料は徴収されません。
  • シングルアセット入金: AMMの2つの資産のうち1つだけを預けます。AMMは、この預け入れによってプール内の資産残高がどれだけ変化したかによって、対価として支払われるLPトークンから差し引く手数料を設定します。

以下の項目の組み合わせは、ダブルアセット入金について示しています。

フラグ名 フラグ値 指定フィールド 意味
tfLPToken 0x00010000 LPTokenOutのみ 指定された量のLPトークンを受け取るようにこのAMMの2つの資産を預けます。預ける金額は、AMMの保有する2つの資産の割合と等しくなります。
tfTwoAsset 0x00100000 AmountAmount2 このAMMの両資産を指定した金額まで預けます。実際に預ける金額は、AMMがすでに保有している資産と同じ割合を維持する必要があるため、どちらか一方の預け入れ金額が指定金額より少なくてもかまいません。得られるLPトークンの金額は、預けた金額の合計から算出されます。
tfTwoAssetIfEmpty 0x00800000 AmountAmount2 プールが空のAMMに、このAMMの資産を指定した金額預け入れます。得られるLPトークンの量は、預け入れた合計額から算出されます。

以下の項目の組み合わせは、シングルアセット入金について示しています。

フラグ名 フラグ値 指定フィールド 意味
tfSingleAsset 0x00080000 Amountのみ 指定の資産を指定の量だけ預け、その結果得られたプールのシェアに応じた量のLPトークンを受け取ります。(手数料を差し引いた金額)
tfOneAssetLPToken 0x00200000 AmountLPTokenOut 1つの資産を指定された上限額まで預け、対価として指定金額分のLPトークンを受け取ります。(手数料を差し引いた金額)
tfLimitLPToken 0x00400000 AmountEPrice 1つの資産を指定された金額まで預けますが、LPトークン1つにつき指定された有効価格(手数料差引後)を超えて預けることはありません。

これ以外のフィールドとフラグの組み合わせは無効です。

シングルアセット入金の手数料

シングルアセット入金の手数料は、AMMを使って預け入れ金額の一部を他の資産と交換し、結果的にダブルアセット入金を行った場合と同じになるように計算されます。AMMの取引手数料は、一部の資産の交換に必要な金額には適用されますが、残りの預け入れ金額には適用されません。 例えば、AMMの資産プールがUSDとEURで完全に均等に分割されている場合、100USDを預けようとすると、受け取るLPトークンの量は、50EUR+50USDを預けた場合よりもわずかに少なくなります。

ダブルアセット入金の場合、LPトークンを受け取る数は、以下の計算式で算出できます。

1 +B - (F × (1 - W) × B)P][)(W- 1L = T ×
  • L: 受け取るLPトークンの量
  • T: 預け入れ前のLPトークンの残高合計
  • B: 預け入れ資産の額
  • F: 取引手数料
  • W: プール内の預金資産の重みです。これはすべてのAMMプールで0.5と定義されています(50/50の分割を意味します)ので、Wによる累乗は平方根を取ることと同一です。
  • P: 預け入れ前のプール内の預金資産の合計額

空のAMMの場合の特殊なケース

場合によっては、プール内に資産がない状態で AMM が存在することがあります。このような状態の AMM には通常の入金を行うことができません。なぜなら資産間の比率が未定義 (0/0) だからです。その代わりに、フラグ tfTwoAssetIfEmpty と両方の資産の正確な金額を指定した“空AMM”への特殊な入金を行うことができます。これはAMMを作成するAMMCreateトランザクションが行うのと同じように、資産間の比率を直接設定します。ダブルアセット入金と同様に、これは手数料を徴収されません。

AMMが空の場合のみ、「空のAMM」への特別な入金を行うことができます。

AMMDepositのフラグ

AMMDepositトランザクションは、以下のようなFlagsフィールドの値をサポートしています。

フラグ名 16進数値 10進数値 説明
tfLPToken 0x00010000 65536 ダブルアセット入金を行い、指定された額のLPトークンを受け取ります。
tfSingleAsset 0x00080000 524288 預け入れる資産を指定して、シングルアセット入金を行います。
tfTwoAsset 0x00100000 1048576 両資産を指定金額で預けるダブルアセット入金を行います。
tfOneAssetLPToken 0x00200000 2097152 シングルアセット入金を行い、指定された額のLPトークンを受け取ります。
tfLimitLPToken 0x00400000 4194304 有効価格を指定して、シングルアセット入金を行います。
tfTwoAssetIfEmpty 0x00800000 8388608 空のプールを持つAMMに特別なダブルアセット入金を行います。

これらのフラグのうちの1つのみと、任意のグローバルフラグを指定する必要があります。

エラーケース

すべてのトランザクションで発生する可能性のあるエラーに加えて、AMMDepositトランザクションでは、次のトランザクション結果コードが発生する可能性があります。

エラーコード 説明
tecAMM_EMPTY 現在、AMM は資産を保有していないため、通常の入金はできません。代わりに、空のAMMの場合の特殊な入金を行う必要があります。
tecAMM_NOT_EMPTY The transaction specified tfTwoAssetIfEmpty, but the AMM was not empty.
tecAMM_FAILED 預け入れの条件が成立しませんでした。例えば、EPriceフィールドに指定された実効価格が低すぎる場合など。
tecFROZEN
tecINSUF_RESERVE_LINE このトランザクションの送信者は、この処理による準備金要件の増加の対象であり、LPトークンを保持するための新しいトラストラインが必要で、そのための追加の所有者準備金分のXRPを保有していないためと思われます。
tecUNFUNDED_AMM 送信者の残高が、指定された預け入れを行うのに十分な量ではありません。
temBAD_AMOUNT トランザクションで指定された金額が無効です。例えば、金額がマイナスなど。
temBAD_FEE トランザクションで指定された手数料の値が無効です。例えば、取引手数料が許容範囲外など。
temMALFORMED トランザクションで無効なフィールドの組み合わせが指定されました。詳細は、AMMDepositモードを参照してください。
terNO_ACCOUNT リクエストで参照されたいずれかのアカウントが存在しません。
terNO_AMM このトランザクションの資産ペアの自動マーケットメーカーインスタンスが存在しません。