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では、currency とissuer フィールドを持つオブジェクトになります(XRPの場合はissuer を省略します)。 |
Asset2 | オブジェクト | STIssue | はい | AMMのプールにあるもう一つの資産を定義します。JSONでは、currency とissuer フィールドを持つオブジェクトになります(XRPの場合はissuer を省略します)。 |
Amount | 通貨額 | Amount | いいえ | AMMに預ける1つの資産の量を指定します。存在する場合、これはAMMのプールにある資産の一つ(トークンまたはXRP)と一致する必要があります。 |
Amount2 | 通貨額 | Amount | いいえ | AMMに追加する別の資産の量を指定します。存在する場合、これはAMMのプール内の他の資産と一致する必要があり、Amount と同じ資産にすることはできません。 |
EPrice | 通貨額 | Amount | いいえ | 受け取った各LPトークンに支払う、預け入れ資産の最大有効価格です。 |
LPTokenOut | 通貨額 | Amount | いいえ | AMMのLPトークンの購入数量。 |
TradingFee | 数値 | UInt16 | いいえ | AMMプールの取引手数料を1/100,000の単位で投票します。1は0.001%に相当します。最大値は1000で、1%の手数料を示します。 |
AMMDepositモード
このトランザクションには5つのモードがあり、どのフラグを指定するかで定義されます。それぞれのモードは、特定のフィールドの組み合わせを必要とし、次の2つのカテゴリに分類されます。
- ダブルアセット入金: AMMのプールにある両方(2つ)の資産を、既存の資産の残高に比例して預けます。この預け入れでは手数料は徴収されません。
- シングルアセット入金: AMMの2つの資産のうち1つだけを預けます。AMMは、この預け入れによってプール内の資産残高がどれだけ変化したかによって、対価として支払われるLPトークンから差し引く手数料を設定します。
以下の項目の組み合わせは、ダブルアセット入金について示しています。
フラグ名 | フラグ値 | 指定フィールド | 意味 |
---|---|---|---|
tfLPToken | 0x00010000 | LPTokenOut のみ | 指定された量のLPトークンを受け取るようにこのAMMの2つの資産を預けます。預ける金額は、AMMの保有する2つの資産の割合と等しくなります。 |
tfTwoAsset | 0x00100000 | Amount とAmount2 | このAMMの両資産を指定した金額まで預けます。実際に預ける金額は、AMMがすでに保有している資産と同じ割合を維持する必要があるため、どちらか一方の預け入れ金額が指定金額より少なくてもかまいません。得られるLPトークンの金額は、預けた金額の合計から算出されます。 |
tfTwoAssetIfEmpty | 0x00800000 | Amount とAmount2 | プールが空のAMMに、このAMMの資産を指定した金額預け入れます。得られるLPトークンの量は、預け入れた合計額から算出されます。 |
以下の項目の組み合わせは、シングルアセット入金について示しています。
フラグ名 | フラグ値 | 指定フィールド | 意味 |
---|---|---|---|
tfSingleAsset | 0x00080000 | Amount のみ | 指定の資産を指定の量だけ預け、その結果得られたプールのシェアに応じた量のLPトークンを受け取ります。(手数料を差し引いた金額) |
tfOneAssetLPToken | 0x00200000 | Amount とLPTokenOut | 1つの資産を指定された上限額まで預け、対価として指定金額分のLPトークンを受け取ります。(手数料を差し引いた金額) |
tfLimitLPToken | 0x00400000 | Amount とEPrice | 1つの資産を指定された金額まで預けますが、LPトークン1つにつき指定された有効価格(手数料差引後)を超えて預けることはありません。 |
これ以外のフィールドとフラグの組み合わせは無効です。
シングルアセット入金の手数料
シングルアセット入金の手数料は、AMMを使って預け入れ金額の一部を他の資産と交換し、結果的にダブルアセット入金を行った場合と同じになるように計算されます。AMMの取引手数料は、一部の資産の交換に必要な金額には適用されますが、残りの預け入れ金額には適用されません。 例えば、AMMの資産プールがUSDとEURで完全に均等に分割されている場合、100USDを預けようとすると、受け取るLPトークンの量は、50EUR+50USDを預けた場合よりもわずかに少なくなります。
ダブルアセット入金の場合、LPトークンを受け取る数は、以下の計算式で算出できます。
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 | トランザクションでtfTwoAssetIfEmpty が指定されましたが、AMMは空ではありませんでした。 |
tecAMM_FAILED | 預け入れの条件が成立しませんでした。例えば、EPrice フィールドに指定された実効価格が低すぎる場合など。 |
tecFROZEN | トランザクションは凍結されているトークンを預けようとしました。 |
tecINSUF_RESERVE_LINE | このトランザクションの送信者は、この処理による準備金要件の増加の対象であり、LPトークンを保持するための新しいトラストラインが必要で、そのための追加の所有者準備金分のXRPを保有していないためと思われます。 |
tecUNFUNDED_AMM | 送信者の残高が、指定された預け入れを行うのに十分な量ではありません。 |
temBAD_AMOUNT | トランザクションで指定された金額が無効です。例えば、金額がマイナスなど。 |
temBAD_FEE | トランザクションで指定された手数料の値が無効です。例えば、取引手数料が許容範囲外など。 |
temMALFORMED | トランザクションで無効なフィールドの組み合わせが指定されました。詳細は、AMMDepositモードをご覧ください。 |
terNO_ACCOUNT | リクエストで参照されたいずれかのアカウントが存在しません。 |
terNO_AMM | このトランザクションの資産ペアの自動マーケットメーカーインスタンスが存在しません。 |