mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-20 19:55:54 +00:00
Merge branch 'amm_concept'
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
DEFAULT_ADDRESS_1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
|
DEFAULT_ADDRESS_1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"
|
||||||
DEFAULT_ADDRESS_2 = "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX"
|
DEFAULT_ADDRESS_2 = "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX"
|
||||||
|
TST_ISSUER = "rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd"
|
||||||
|
|
||||||
Request("Account Methods")
|
Request("Account Methods")
|
||||||
|
|
||||||
@@ -475,6 +476,22 @@ Request('ripple_path_find', {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Request('amm_info', {
|
||||||
|
description: "Looks up info on an Automated Market Maker instance.",
|
||||||
|
link: "amm_info.html",
|
||||||
|
status: "not_enabled",
|
||||||
|
body: {
|
||||||
|
"command": "amm_info",
|
||||||
|
"asset": {
|
||||||
|
"currency": "XRP"
|
||||||
|
},
|
||||||
|
"asset2": {
|
||||||
|
"currency": "TST",
|
||||||
|
"issuer": TST_ISSUER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
Request("Payment Channel Methods")
|
Request("Payment Channel Methods")
|
||||||
|
|
||||||
Request('channel_authorize', {
|
Request('channel_authorize', {
|
||||||
|
|||||||
85
content/_img-sources/amm-concept-deposit.uxf
Normal file
85
content/_img-sources/amm-concept-deposit.uxf
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<diagram program="umlet" version="14.2">
|
||||||
|
<zoom_level>10</zoom_level>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>290</x>
|
||||||
|
<y>70</y>
|
||||||
|
<w>110</w>
|
||||||
|
<h>100</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>AMM</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLUseCase</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>30</x>
|
||||||
|
<y>80</y>
|
||||||
|
<w>120</w>
|
||||||
|
<h>80</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>Liquidity
|
||||||
|
Provider</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>140</x>
|
||||||
|
<y>90</y>
|
||||||
|
<w>190</w>
|
||||||
|
<h>50</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->>>
|
||||||
|
r2=Deposit assets</panel_attributes>
|
||||||
|
<additional_attributes>10.0;30.0;20.0;20.0;170.0;20.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>140</x>
|
||||||
|
<y>110</y>
|
||||||
|
<w>190</w>
|
||||||
|
<h>40</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->>>
|
||||||
|
</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;20.0;20.0;170.0;20.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>80</x>
|
||||||
|
<y>110</y>
|
||||||
|
<w>370</w>
|
||||||
|
<h>120</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=<<.
|
||||||
|
Receive LP Tokens</panel_attributes>
|
||||||
|
<additional_attributes>10.0;50.0;10.0;100.0;350.0;100.0;350.0;10.0;320.0;10.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>310</x>
|
||||||
|
<y>100</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>USD</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>310</x>
|
||||||
|
<y>120</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>ETH</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
</diagram>
|
||||||
74
content/_img-sources/amm-concept-swap.uxf
Normal file
74
content/_img-sources/amm-concept-swap.uxf
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<diagram program="umlet" version="14.2">
|
||||||
|
<zoom_level>10</zoom_level>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>320</x>
|
||||||
|
<y>170</y>
|
||||||
|
<w>110</w>
|
||||||
|
<h>100</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>AMM</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>230</x>
|
||||||
|
<y>100</y>
|
||||||
|
<w>120</w>
|
||||||
|
<h>130</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->>>
|
||||||
|
Sell 1.25 USD
|
||||||
|
|
||||||
|
</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;10.0;110.0;90.0;110.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>340</x>
|
||||||
|
<y>200</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>USD: 6.25</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>340</x>
|
||||||
|
<y>220</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>ETH: 4</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLUseCase</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>180</x>
|
||||||
|
<y>30</y>
|
||||||
|
<w>120</w>
|
||||||
|
<h>80</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>Trader</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>290</x>
|
||||||
|
<y>60</y>
|
||||||
|
<w>280</w>
|
||||||
|
<h>190</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=<<.
|
||||||
|
Receive 1 ETH</panel_attributes>
|
||||||
|
<additional_attributes>10.0;10.0;160.0;10.0;160.0;170.0;120.0;170.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
</diagram>
|
||||||
86
content/_img-sources/amm-concept-withdraw.uxf
Normal file
86
content/_img-sources/amm-concept-withdraw.uxf
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<diagram program="umlet" version="14.2">
|
||||||
|
<zoom_level>10</zoom_level>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>290</x>
|
||||||
|
<y>70</y>
|
||||||
|
<w>110</w>
|
||||||
|
<h>100</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>AMM</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLUseCase</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>30</x>
|
||||||
|
<y>80</y>
|
||||||
|
<w>120</w>
|
||||||
|
<h>80</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>Liquidity
|
||||||
|
Provider</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>370</x>
|
||||||
|
<y>110</y>
|
||||||
|
<w>80</w>
|
||||||
|
<h>40</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=.
|
||||||
|
</panel_attributes>
|
||||||
|
<additional_attributes>10.0;20.0;40.0;20.0;60.0;10.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>80</x>
|
||||||
|
<y>100</y>
|
||||||
|
<w>500</w>
|
||||||
|
<h>130</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=<<.
|
||||||
|
Receive assets</panel_attributes>
|
||||||
|
<additional_attributes>10.0;60.0;10.0;110.0;380.0;110.0;380.0;20.0;350.0;20.0;330.0;10.0;300.0;10.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>310</x>
|
||||||
|
<y>100</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>USD</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>UMLClass</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>310</x>
|
||||||
|
<y>120</y>
|
||||||
|
<w>70</w>
|
||||||
|
<h>20</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>ETH</panel_attributes>
|
||||||
|
<additional_attributes/>
|
||||||
|
</element>
|
||||||
|
<element>
|
||||||
|
<id>Relation</id>
|
||||||
|
<coordinates>
|
||||||
|
<x>140</x>
|
||||||
|
<y>100</y>
|
||||||
|
<w>170</w>
|
||||||
|
<h>50</h>
|
||||||
|
</coordinates>
|
||||||
|
<panel_attributes>lt=->>>
|
||||||
|
Redeem
|
||||||
|
LP Tokens</panel_attributes>
|
||||||
|
<additional_attributes>10.0;20.0;150.0;20.0</additional_attributes>
|
||||||
|
</element>
|
||||||
|
</diagram>
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
html: automated-market-makers.html
|
||||||
|
parent: decentralized-exchange.html
|
||||||
|
blurb: Automated Market Makers (AMMs) provide liquidity between asset pairs, complemeting the order books in the decentralized exchange while providing passive income for their liquidity providers.
|
||||||
|
status: not_enabled
|
||||||
|
labels:
|
||||||
|
- XRP
|
||||||
|
- Decentralized Exchange
|
||||||
|
- AMM
|
||||||
|
---
|
||||||
|
# Automated Market Makers
|
||||||
|
|
||||||
|
Automated Market Makers (AMMs) are smart contracts that provide liquidity in the XRP Ledger's decentralized exchange. Each AMM holds a pool of two assets and enables users to swap between them at an exchange rate set by a formula.
|
||||||
|
|
||||||
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
|
For any given pair of assets, there can be up to one AMM in the ledger. Anyone can create the AMM for an asset pair if it doesn't exist yet, or deposit to an existing AMM. Those who deposit assets into an AMM are called _liquidity providers_ (LPs) and receive "LP Tokens" from the AMM. LP Tokens enable liquidity providers to:
|
||||||
|
|
||||||
|
- Redeem their LP Tokens for a share of the assets in the AMM's pool, including fees collected.
|
||||||
|
- Vote to change the AMM's fee settings. The votes are weighted based on how many LP Tokens the voters hold.
|
||||||
|
- Bid some of their LP Tokens to receive a temporary discount on the AMM's trading fees.
|
||||||
|
|
||||||
|
When the flow of funds between the two assets in a pool is relatively active and balanced, the fees provide a source of passive income for liquidity providers. However, when the relative price between the assets shifts, the liquidity providers can take a loss on the [currency risk](https://www.investopedia.com/terms/c/currencyrisk.asp).
|
||||||
|
|
||||||
|
## How the AMM Works
|
||||||
|
|
||||||
|
An AMM holds two different assets: at most one of these can be XRP, and one or both of them can be [tokens](tokens.html). Tokens with different issuers are considered different assets for this purpose. This means that there can be an AMM for two tokens with the same currency code but different issuers ("FOO issued by WayGate" is different than "FOO issued by StableFoo"), or the same issuer but different currency codes. The order does not matter; the AMM for FOO.WayGate to XRP is the same as for XRP to FOO.WayGate.
|
||||||
|
|
||||||
|
When users want to trade in the decentralized exchange, their [Offers](offers.html) and [Cross-Currency Payments](cross-currency-payments.html) can automatically use AMMs to complete the trade. A single transaction might execute by matching Offers, AMMs, or a mix of both, depending on what's cheaper.
|
||||||
|
|
||||||
|
An AMM sets its exchange rate based on the balance of assets in the pool. When you trade against an AMM, the exchange rate adjusts based on how much your trade shifts the balance of assets the AMM holds. As its supply of one asset goes down, the price of that asset goes up; as its supply of an asset goes up, the price of that asset goes down. An AMM gives generally better exchange rates when it has larger overall amounts in its pool. This is because any given trade causes a smaller shift in the balance of the AMM's assets. The more a trade unbalances the AMM's supply of the two assets, the more extreme the exchange rate becomes.
|
||||||
|
|
||||||
|
The AMM also charges a percentage trading fee on top of the exchange rate.
|
||||||
|
|
||||||
|
The XRP Ledger's implements a _geometric mean_ AMM with a weight parameter of 0.5, so it functions like a _constant product_ market maker. For a detailed explanation of the _constant product_ AMM formula and the economics of AMMs in general, see [Kris Machowski's Introduction to Automated Market Makers](https://www.machow.ski/posts/an_introduction_to_automated_market_makers/).
|
||||||
|
|
||||||
|
|
||||||
|
## LP Tokens
|
||||||
|
<!-- TODO: add diagrams showcasing flow of funds -->
|
||||||
|
Whoever creates the AMM becomes the first liquidity provider, and receives LP Tokens that represent 100% ownership of assets in the AMM's pool. They can redeem some or all of those LP Tokens to withdraw assets from the AMM in proportion to the amounts currently there. (The proportions shift over time as people trade against the AMM.) The AMM does not charge a fee when withdrawing both assets.
|
||||||
|
|
||||||
|
For example, if you created an AMM with 5 ETH and 5 USD, and then someone exchanged 1.26 USD for 1 ETH, the pool now has 4 ETH and 6.26 USD in it. You can spend half your LP Tokens to withdraw 2 ETH and 3.13 USD.
|
||||||
|
|
||||||
|
Anyone can deposit assets to an existing AMM. When they do, they receive new LP Tokens based on how much they deposited. The amount that a liquidity provider can withdraw from an AMM is based on the proportion of the AMM's LP Tokens they hold compared to the total number of LP Tokens outstanding.
|
||||||
|
|
||||||
|
LP Tokens are like other tokens in the XRP Ledger, so you can use them in many [types of payments](payment-types.html), trade them in the decentralized exchange, or even deposit them as assets for new AMMs. (To receive LP Tokens as payment, you must set up a [trust line](trust-lines-and-issuing.html) with a nonzero limit with the AMM Account as the issuer.) However, you can _only_ send LP Tokens directly to the AMM (redeeming them) using the [AMMWithdraw][] transaction type, not through other types of payments. Similarly, you can only send assets to the AMM's pool through the [AMMDeposit][] transaction type.
|
||||||
|
|
||||||
|
The AMM is designed so that an AMM's asset pool is empty if and only if the AMM has no outstanding LP Tokens. This situation can only occur as the result of an [AMMWithdraw][] transaction; when it does, the AMM is automatically deleted.
|
||||||
|
|
||||||
|
### LP Token Currency Codes
|
||||||
|
|
||||||
|
LP Tokens use a special type of currency code in the 160-bit hexadecimal ["non-standard" format](currency-formats.html#nonstandard-currency-codes). These codes have the first 8 bits `0x03`. The remainder of the code is a SHA-512 hash, truncated to the first 152 bits, of the two assets' currency codes and their issuers. (The assets are placed in a "canonical order" with the numerically lower currency+issuer pair first.) As a result, the LP Tokens for a given asset pair's AMM have a predictable, consistent currency code.
|
||||||
|
|
||||||
|
|
||||||
|
## Trading Fees
|
||||||
|
|
||||||
|
Trading fees are a source of passive income for liquidity providers, and they offset the currency risk of letting others trade against the pool's assets. Trading fees are paid to the AMM, not directly to liquidity providers, but liquidity providers benefit because their LP Tokens can be redeemed for a percentage of the AMM's pool.
|
||||||
|
|
||||||
|
Liquidity providers can vote to set the fee from 0% to 1%, in increments of 0.001%. Liquidity providers have an incentive to set trading fees at an appropriate rate: if fees are too high, trades will use order books to get a better rate instead; if fees are too low, liquidity providers don't get any benefit for contributing to the pool. <!-- STYLE_OVERRIDE: will --> Each AMM gives its liquidity providers the power to vote on its fees, in proportion to the amount of LP Tokens those liquidity providers hold.
|
||||||
|
|
||||||
|
To vote, a liquidity provider sends an [AMMVote transaction][]. Whenever anyone places a new vote, the AMM recalculates its fee to be an average of the latest votes weighted by how many LP Tokens those voters hold. Up to 8 liquidity providers' votes can be counted this way; if more liquidity providers try to vote then only the top 8 votes (by most LP Tokens held) are counted. Even though liquidity providers' share of LP Tokens can shift rapidly for many reasons (such as trading those tokens using [Offers](offers.html)), the trading fees are only recalculated whenever someone places a new vote (even if that vote is not one of the top 8).
|
||||||
|
|
||||||
|
### Auction Slot
|
||||||
|
|
||||||
|
Unlike any previous Automated Market Makers, the XRP Ledger's AMM design has an _auction slot_ that a liquidity provider can bid on to get a discount on the trading fee for a 24-hour period. The bid must be paid in LP Tokens, which are returned to the AMM. No more than one account can hold the auction slot at a time, but the bidder can name up to 4 more accounts to also receive the discount. There is no minimum bid, but if the slot is currently occupied then you must outbid the current slot holder to displace them. If someone displaces you, you get part of your bid back depending on how much time remains. As long as you hold an active auction slot, you pay a discounted trading fee of 0% when making trades against that AMM.
|
||||||
|
|
||||||
|
With any AMM, when the price of its assets shifts significantly in external markets, traders can use arbitrage to profit off the AMM, which results in a loss for liquidity providers. The auction mechanism is intended to return more of that value to liquidity providers and more quickly bring the AMM's prices back into balance with external markets.
|
||||||
|
|
||||||
|
|
||||||
|
## Representation in the Ledger
|
||||||
|
|
||||||
|
In the ledger's state data, an AMM consists of multiple [ledger entries](ledger-object-types.html):
|
||||||
|
|
||||||
|
- An [AMM object][] describing the automated market maker itself.
|
||||||
|
|
||||||
|
- A special [AccountRoot object][] that issues the AMM's LP Tokens, and holds the AMM's XRP (if it has any).
|
||||||
|
|
||||||
|
The address of this AccountRoot is chosen somewhat randomly when the AMM is created, and it is different if the AMM is deleted and re-created. This is to prevent people from funding the AMM account with excess XRP in advance.
|
||||||
|
|
||||||
|
- [Trust lines](trust-lines-and-issuing.html) to the special AMM Account for the tokens in the AMM's pool.
|
||||||
|
|
||||||
|
These objects are not owned by any account, so the [reserve requirement](reserves.html) does not apply to them. However, to prevent spam, the transaction to create an AMM has a special [transaction cost](transaction-cost.html) that requires the sender to burn a larger than usual amount of XRP.
|
||||||
|
|
||||||
|
|
||||||
|
<!--{# common link defs #}-->
|
||||||
|
{% include '_snippets/rippled-api-links.md' %}
|
||||||
|
{% include '_snippets/tx-type-links.md' %}
|
||||||
|
{% include '_snippets/rippled_versions.md' %}
|
||||||
@@ -59,6 +59,8 @@ An example of the request format:
|
|||||||
|
|
||||||
<!-- MULTICODE_BLOCK_END -->
|
<!-- MULTICODE_BLOCK_END -->
|
||||||
|
|
||||||
|
[Try it! >](websocket-api-tool.html?server=wss%3A%2F%2Famm.devnet.rippletest.net%3A51233%2F#amm_info)
|
||||||
|
|
||||||
The request includes the following parameters:
|
The request includes the following parameters:
|
||||||
|
|
||||||
| `Field` | Type | Description |
|
| `Field` | Type | Description |
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ labels:
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Automated Market Makers (AMMs) use an AccountRoot object to issue their LP Tokens and hold the assets in the AMM pool, in addition to the [AMM object][] for tracking some of the details of the AMM. The address of an AMM's associated AccountRoot is randomized so that users cannot identify and fund the address in advance of the AMM being created. Unlike normal accounts, AMM AccountRoots are created with the following settings:
|
[Automated Market Makers](automated-market-makers.html) (AMMs) use an AccountRoot object to issue their LP Tokens and hold the assets in the AMM pool, in addition to the [AMM object][] for tracking some of the details of the AMM. The address of an AMM's associated AccountRoot is randomized so that users cannot identify and fund the address in advance of the AMM being created. Unlike normal accounts, AMM AccountRoots are created with the following settings:
|
||||||
|
|
||||||
- `lsfAMM` **enabled**. This indicates that the AccountRoot is part of an AMM and is not a regular account.
|
- `lsfAMM` **enabled**. This indicates that the AccountRoot is part of an AMM and is not a regular account.
|
||||||
- `lsfDisableMaster` **enabled** and no other means of authorizing transactions. This ensures no one can control the account directly, and it cannot send transactions.
|
- `lsfDisableMaster` **enabled** and no other means of authorizing transactions. This ensures no one can control the account directly, and it cannot send transactions.
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ AccountRoot objects can have the following flag values:
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Automated Market Makers (AMMs) use an AccountRoot object to issue their LP Tokens and hold the assets in the AMM pool, and an [AMM object][] for tracking some of the details of the AMM. The address of an AMM's associated AccountRoot is randomized so that users cannot identify and fund the address in advance of the AMM being created. Unlike normal accounts, AMM AccountRoot objects are created with the following settings:
|
[Automated Market Makers](automated-market-makers.html) (AMMs) use an AccountRoot object to issue their LP Tokens and hold the assets in the AMM pool, and an [AMM object][] for tracking some of the details of the AMM. The address of an AMM's AccountRoot is randomized so that users cannot identify and fund the address in advance of the AMM being created. Unlike normal accounts, AMM AccountRoot objects are created with the following settings:
|
||||||
|
|
||||||
- `lsfAMM` **enabled**. This indicates that the AccountRoot is part of an AMM and is not a regular account.
|
- `lsfAMM` **enabled**. This indicates that the AccountRoot is part of an AMM and is not a regular account.
|
||||||
- `lsfDisableMaster` **enabled** and no other means of authorizing transactions. This ensures no one can control the account directly, and it cannot send transactions.
|
- `lsfDisableMaster` **enabled** and no other means of authorizing transactions. This ensures no one can control the account directly, and it cannot send transactions.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
The `AMM` object type describes a single Automated Market Maker (AMM) instance.
|
The `AMM` object type describes a single [Automated Market Maker](automated-market-makers.html) (AMM) instance.
|
||||||
|
|
||||||
|
|
||||||
## Example AMM JSON
|
## Example AMM JSON
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ For the most part, transactions with `tec` codes take no action other than to de
|
|||||||
| Code | Value | Explanation |
|
| Code | Value | Explanation |
|
||||||
|:---------------------------|:------|:----------------------------------------|
|
|:---------------------------|:------|:----------------------------------------|
|
||||||
| `tecAMM_BALANCE` | 163 |
|
| `tecAMM_BALANCE` | 163 |
|
||||||
| `tecAMM_DIRECT_PAYMENT` | 169 | The transaction tried to send money directly to an AccountRoot object that is part of an Automated Market Maker (AMM) :not_enabled:. AMM AccountRoot entries cannot send or receive money directly except through [AMMWithdraw][] and [AMMDeposit][] transactions. |
|
| `tecAMM_DIRECT_PAYMENT` | 169 | The transaction tried to send money directly to an AccountRoot object that is part of an [Automated Market Maker](automated-market-makers.html) (AMM) :not_enabled:. AMM AccountRoot entries cannot send or receive money directly except through [AMMWithdraw][] and [AMMDeposit][] transactions. |
|
||||||
| `tecAMM_EXISTS` | 167 | The [AMMCreate transaction][] :not_enabled: tried to create an Automated Market Maker (AMM) instance that already exists. There can only be at most one AMM per unique currency pair. |
|
| `tecAMM_EXISTS` | 167 | The [AMMCreate transaction][] :not_enabled: tried to create an [Automated Market Maker](automated-market-makers.html) (AMM) instance that already exists. There can only be at most one AMM per unique currency pair. |
|
||||||
| `tecAMM_FAILED_DEPOSIT` | 164 | The [AMMDeposit transaction][] :not_enabled: failed, probably because the sender does not have enough of the specified assets, or because the deposit requested an effective price that isn't possible with the available amounts. |
|
| `tecAMM_FAILED_DEPOSIT` | 164 | The [AMMDeposit transaction][] :not_enabled: failed, probably because the sender does not have enough of the specified assets, or because the deposit requested an effective price that isn't possible with the available amounts. |
|
||||||
| `tecAMM_FAILED_WITHDRAW` | 165 | The [AMMWithdraw transaction][] :not_enabled: failed, probably because the sender does not have enough LP Tokens, or because the withdraw requested an effective price that isn't possible with the available amounts. |
|
| `tecAMM_FAILED_WITHDRAW` | 165 | The [AMMWithdraw transaction][] :not_enabled: failed, probably because the sender does not have enough LP Tokens, or because the withdraw requested an effective price that isn't possible with the available amounts. |
|
||||||
| `tecAMM_FAILED_BID` | 168 | The [AMMBid transaction][] :not_enabled: failed, probably because the price to win the auction was higher than the specified maximum value or the sender's current balance. |
|
| `tecAMM_FAILED_BID` | 168 | The [AMMBid transaction][] :not_enabled: failed, probably because the price to win the auction was higher than the specified maximum value or the sender's current balance. |
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ These codes indicate that the transaction was malformed, and cannot succeed acco
|
|||||||
| `temREDUNDANT` | The transaction would do nothing; for example, it is sending a payment directly to the sending account, or creating an offer to buy and sell the same currency from the same issuer. |
|
| `temREDUNDANT` | The transaction would do nothing; for example, it is sending a payment directly to the sending account, or creating an offer to buy and sell the same currency from the same issuer. |
|
||||||
| `temREDUNDANT_SEND_MAX` | [Removed in: rippled 0.28.0][] |
|
| `temREDUNDANT_SEND_MAX` | [Removed in: rippled 0.28.0][] |
|
||||||
| `temRIPPLE_EMPTY` | The [Payment transaction][] includes an empty `Paths` field, but paths are necessary to complete this payment. |
|
| `temRIPPLE_EMPTY` | The [Payment transaction][] includes an empty `Paths` field, but paths are necessary to complete this payment. |
|
||||||
| `temBAD_AMM_OPTIONS` | The transaction specified an invalid combination of options for an Automated Market Maker (AMM). :not_enabled: |
|
| `temBAD_AMM_OPTIONS` | The transaction specified an invalid combination of options regarding an [Automated Market Maker](automated-market-makers.html) (AMM). :not_enabled: |
|
||||||
| `temBAD_AMM_TOKENS` | The transaction incorrectly specified an Automated Market Maker's LP Tokens. :not_enabled: |
|
| `temBAD_AMM_TOKENS` | The transaction incorrectly specified an [Automated Market Maker](automated-market-makers.html)'s LP Tokens. :not_enabled: |
|
||||||
| `temBAD_WEIGHT` | The [SignerListSet transaction][] includes a `SignerWeight` that is invalid, for example a zero or negative value. |
|
| `temBAD_WEIGHT` | The [SignerListSet transaction][] includes a `SignerWeight` that is invalid, for example a zero or negative value. |
|
||||||
| `temBAD_SIGNER` | The [SignerListSet transaction][] includes a signer who is invalid. For example, there may be duplicate entries, or the owner of the SignerList may also be a member. |
|
| `temBAD_SIGNER` | The [SignerListSet transaction][] includes a signer who is invalid. For example, there may be duplicate entries, or the owner of the SignerList may also be a member. |
|
||||||
| `temBAD_QUORUM` | The [SignerListSet transaction][] has an invalid `SignerQuorum` value. Either the value is not greater than zero, or it is more than the sum of all signers in the list. |
|
| `temBAD_QUORUM` | The [SignerListSet transaction][] has an invalid `SignerQuorum` value. Either the value is not greater than zero, or it is more than the sum of all signers in the list. |
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Bid on an Automated Market Maker's (AMM's) auction slot. If you win, you can trade against the AMM at a discounted fee until you are outbid or 24 hours have passed. If you are outbid before 24 hours have passed, you are refunded part of the cost of your bid based on how much time remains.
|
Bid on an [Automated Market Maker](automated-market-makers.html)'s (AMM's) auction slot. If you win, you can trade against the AMM at a discounted fee until you are outbid or 24 hours have passed. If you are outbid before 24 hours have passed, you are refunded part of the cost of your bid based on how much time remains.
|
||||||
|
|
||||||
You bid using the AMM's LP Tokens; the amount of a winning bid is returned to the AMM, decreasing the outstanding balance of LP Tokens.
|
You bid using the AMM's LP Tokens; the amount of a winning bid is returned to the AMM, decreasing the outstanding balance of LP Tokens.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
html: ammcreate.html
|
html: ammcreate.html
|
||||||
parent: transaction-types.html
|
parent: transaction-types.html
|
||||||
blurb: Create a new AMM instance for trading a given pair of assets.
|
blurb: Create a new Automated Market Maker for trading a given pair of assets.
|
||||||
labels:
|
labels:
|
||||||
- AMM
|
- AMM
|
||||||
status: not_enabled
|
status: not_enabled
|
||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Create a new Automated Market-Maker (AMM) instance for trading a pair of assets ([fungible tokens](tokens.html) or [XRP](xrp.html)).
|
Create a new [Automated Market Maker](automated-market-makers.html) (AMM) instance for trading a pair of assets ([fungible tokens](tokens.html) or [XRP](xrp.html)).
|
||||||
|
|
||||||
Creates both an [AMM object][] and a [special AccountRoot object](accountroot.html#special-amm-accountroot-objects) to represent the AMM. Also transfers ownership of the starting balance of both assets from the sender to the created `AccountRoot` and issues an initial balance of liquidity provider tokens (LP Tokens) from the AMM account to the sender.
|
Creates both an [AMM object][] and a [special AccountRoot object](accountroot.html#special-amm-accountroot-objects) to represent the AMM. Also transfers ownership of the starting balance of both assets from the sender to the created `AccountRoot` and issues an initial balance of liquidity provider tokens (LP Tokens) from the AMM account to the sender.
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Deposit funds into an Automated Market-Maker (AMM) instance and receive the AMM's liquidity provider tokens (_LP Tokens_) in exchange. You can deposit one or both of the assets in the AMM's pool.
|
Deposit funds into an [Automated Market Maker](automated-market-makers.html) (AMM) instance and receive the AMM's liquidity provider tokens (_LP Tokens_) in exchange. You can deposit one or both of the assets in the AMM's pool.
|
||||||
|
|
||||||
If successful, this transaction creates a [trust line](trust-lines-and-issuing.html) to the AMM Account (limit 0) to hold the LP Tokens.
|
If successful, this transaction creates a [trust line](trust-lines-and-issuing.html) to the AMM Account (limit 0) to hold the LP Tokens.
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Vote on the trading fee for an Automated Market Maker instance. Up to 8 accounts can vote in proportion to the amount of the AMM's LP Tokens they hold. Each new vote re-calculates the AMM's trading fee based on a weighted average of the votes.
|
Vote on the trading fee for an [Automated Market Maker](automated-market-makers.html) instance. Up to 8 accounts can vote in proportion to the amount of the AMM's LP Tokens they hold. Each new vote re-calculates the AMM's trading fee based on a weighted average of the votes.
|
||||||
|
|
||||||
## Example {{currentpage.name}} JSON
|
## Example {{currentpage.name}} JSON
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ status: not_enabled
|
|||||||
|
|
||||||
{% include '_snippets/amm-disclaimer.md' %}
|
{% include '_snippets/amm-disclaimer.md' %}
|
||||||
|
|
||||||
Withdraw assets from an Automated Market-Maker (AMM) instance by returning the AMM's liquidity provider tokens (LP Tokens).
|
Withdraw assets from an [Automated Market Maker](automated-market-makers.html) (AMM) instance by returning the AMM's liquidity provider tokens (LP Tokens).
|
||||||
|
|
||||||
## Example {{currentpage.name}} JSON
|
## Example {{currentpage.name}} JSON
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ If you don't [run your own `rippled` server](install-rippled.html), you can use
|
|||||||
| Ripple[¹][] | Testnet | `https://s.altnet.rippletest.net:51234/` | `wss://s.altnet.rippletest.net/` | Testnet public server |
|
| Ripple[¹][] | Testnet | `https://s.altnet.rippletest.net:51234/` | `wss://s.altnet.rippletest.net/` | Testnet public server |
|
||||||
| XRPL Labs | Testnet | `https://testnet.xrpl-labs.com/` | `wss://testnet.xrpl-labs.com/` | Testnet public server with CORS support |
|
| XRPL Labs | Testnet | `https://testnet.xrpl-labs.com/` | `wss://testnet.xrpl-labs.com/` | Testnet public server with CORS support |
|
||||||
| Ripple[¹][] | Devnet | `https://s.devnet.rippletest.net:51234/` | `wss://s.devnet.rippletest.net/` | Devnet public server |
|
| Ripple[¹][] | Devnet | `https://s.devnet.rippletest.net:51234/` | `wss://s.devnet.rippletest.net/` | Devnet public server |
|
||||||
|
| Ripple[¹][] | AMM-Devnet | `https://amm.devnet.rippletest.net:51234/` | `wss://amm.devnet.rippletest.net:51233/` | Special devnet for [XLS-30d Automated Market Maker](https://github.com/XRPLF/XRPL-Standards/discussions/78) development. |
|
||||||
|
|
||||||
[Network]: parallel-networks.html
|
[Network]: parallel-networks.html
|
||||||
[¹]: #footnote-1
|
[¹]: #footnote-1
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ targets:
|
|||||||
"nftokenoffer.html#nftokenoffer-flags": "nftokenoffer.html#nftokenoffer-フラグ"
|
"nftokenoffer.html#nftokenoffer-flags": "nftokenoffer.html#nftokenoffer-フラグ"
|
||||||
# Fix links from untranslated AMM pages:
|
# Fix links from untranslated AMM pages:
|
||||||
"transaction-common-fields.html#global-flags": "transaction-common-fields.html#グローバルフラグ"
|
"transaction-common-fields.html#global-flags": "transaction-common-fields.html#グローバルフラグ"
|
||||||
|
"currency-formats.html#nonstandard-currency-codes": "currency-formats.html#非標準通貨コード"
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
|
|
||||||
@@ -840,6 +841,11 @@ pages:
|
|||||||
targets:
|
targets:
|
||||||
- ja
|
- ja
|
||||||
|
|
||||||
|
- md: concepts/decentralized-exchange/automated-market-makers.md
|
||||||
|
targets:
|
||||||
|
- en
|
||||||
|
- ja
|
||||||
|
|
||||||
- md: concepts/decentralized-exchange/offers.md
|
- md: concepts/decentralized-exchange/offers.md
|
||||||
targets:
|
targets:
|
||||||
- en
|
- en
|
||||||
|
|||||||
@@ -100,49 +100,71 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
|
||||||
|
{% for conn in [
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-s1",
|
||||||
|
"ws_url": "wss://s1.ripple.com/",
|
||||||
|
"jsonrpc_url": "https://s1.ripple.com:51234/",
|
||||||
|
"shortname": "Mainnet s1",
|
||||||
|
"longname": "s1.ripple.com (Mainnet Public Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-xrplcluster",
|
||||||
|
"ws_url": "wss://xrplcluster.com/",
|
||||||
|
"jsonrpc_url": "https://xrplcluster.com/",
|
||||||
|
"shortname": "Mainnet xrplcluster",
|
||||||
|
"longname": "xrplcluster.com (Mainnet Full History Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-s2",
|
||||||
|
"ws_url": "wss://s2.ripple.com/",
|
||||||
|
"jsonrpc_url": "https://s2.ripple.com:51234/",
|
||||||
|
"shortname": "Mainnet s2",
|
||||||
|
"longname": "s2.ripple.com (Mainnet Full History Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-testnet",
|
||||||
|
"ws_url": "wss://s.altnet.rippletest.net:51233/",
|
||||||
|
"jsonrpc_url": "https://s.altnet.rippletest.net:51234/",
|
||||||
|
"shortname": "Testnet",
|
||||||
|
"longname": "s.altnet.rippletest.net (Testnet Public Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-devnet",
|
||||||
|
"ws_url": "wss://s.devnet.rippletest.net:51233/",
|
||||||
|
"jsonrpc_url": "https://s.devnet.rippletest.net:51234/",
|
||||||
|
"shortname": "Devnet",
|
||||||
|
"longname": "s.devnet.rippletest.net (Devnet Public Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-nftdevnet",
|
||||||
|
"ws_url": "wss://xls20-sandbox.rippletest.net:51233/",
|
||||||
|
"jsonrpc_url": "https://xls20-sandbox.rippletest.net:51234/",
|
||||||
|
"shortname": "NFT-Devnet",
|
||||||
|
"longname": "xls20-sandbox.rippletest.net (NFT-Devnet Cluster)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-ammdevnet",
|
||||||
|
"ws_url": "wss://amm.devnet.rippletest.net:51233/",
|
||||||
|
"jsonrpc_url": "https://amm.devnet.rippletest.net:51234/",
|
||||||
|
"shortname": "AMM-Devnet",
|
||||||
|
"longname": "amm.devnet.rippletest.net (XLS-30d AMM Devnet)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wstool-1-connection-localhost",
|
||||||
|
"ws_url": "ws://localhost:6006/",
|
||||||
|
"jsonrpc_url": "http://localhost:5005/",
|
||||||
|
"shortname": "Local server",
|
||||||
|
"longname": "localhost:6006 (Local <code>rippled</code> Server on port 6006) <br/>\n <small>(Requires that you <a href=\"install-rippled.html\">run <code>rippled</code></a> on this machine with default WebSocket settings)</small>"
|
||||||
|
}
|
||||||
|
] %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-s1" value="wss://s1.ripple.com/" data-jsonrpcurl="https://s1.ripple.com:51234/" data-shortname="Mainnet s1" checked>
|
<input class="form-check-input" type="radio" name="wstool-1-connection" id="{{conn.id}}" value="{{conn.ws_url}}" data-jsonrpcurl="{{conn.jsonrpc_url}}" data-shortname="{{conn.shortname}}"{% if loop.index == 1 %} checked{% endif %}>
|
||||||
<label class="form-check-label" for="wstool-1-connection-s1">
|
<label class="form-check-label" for="{{conn.id}}">
|
||||||
s1.ripple.com (Mainnet Public Cluster)
|
{{conn.longname}}
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-xrplcluster" value="wss://xrplcluster.com/" data-jsonrpcurl="https://xrplcluster.com/" data-shortname="Mainnet xrplcluster">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-xrplcluster">
|
|
||||||
xrplcluster.com (Mainnet Full History Cluster)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-s2" value="wss://s2.ripple.com/" data-jsonrpcurl="https://s2.ripple.com:51234/" data-shortname="Mainnet s2">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-s2">
|
|
||||||
s2.ripple.com (Mainnet Full History Cluster)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-testnet" value="wss://s.altnet.rippletest.net:51233/" data-jsonrpcurl="https://s.altnet.rippletest.net:51234/" data-shortname="Testnet">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-testnet">
|
|
||||||
s.altnet.rippletest.net (Testnet Public Cluster)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-devnet" value="wss://s.devnet.rippletest.net:51233/" data-jsonrpcurl="https://s.devnet.rippletest.net:51234/" data-shortname="Devnet">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-devnet">
|
|
||||||
s.devnet.rippletest.net (Devnet Public Cluster)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-nftdevnet" value="wss://xls20-sandbox.rippletest.net:51233/" data-jsonrpcurl="https://xls20-sandbox.rippletest.net:51234/" data-shortname="NFT-Devnet">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-nftdevnet">
|
|
||||||
xls20-sandbox.rippletest.net (NFT-Devnet Cluster)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="radio" name="wstool-1-connection" id="wstool-1-connection-localhost" value="ws://localhost:6006/" data-jsonrpcurl="http://localhost:5005/" data-shortname="Local server">
|
|
||||||
<label class="form-check-label" for="wstool-1-connection-localhost">
|
|
||||||
localhost:6006 (Local <code>rippled</code> Server on port 6006) <br/>
|
|
||||||
<small>(Requires that you <a href="install-rippled.html">run <code>rippled</code></a> on this machine with default WebSocket settings)</small>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|||||||
Reference in New Issue
Block a user