diff --git a/pages/lp.mdx b/pages/lp.mdx index b902e96..b3b7c06 100644 --- a/pages/lp.mdx +++ b/pages/lp.mdx @@ -98,7 +98,7 @@ This design opens interesting possibilities not possible on a conventional DEX: - **Block-scoped JIT liquidity**: a position can be opened and closed in the same transaction. As the opening is processed in a batch in the first phase of the DEX `EndBlock` handler and the closure is processed in a batch following all trade executions, this allows a liquidity provider to quote a price and be guaranteed that it will only be valid for a single block's batch executions. -- **Replicating Market Makers**: the payoff function of any CFMM can be approximated via constant-sum AMMs, allowing market makers to replicate whatever trading function they want. This functionality is implemented in `pcli` for approximating the payoff of an `xy=k` (UniV2) curve. +- **Replicating Market Makers**: the payoff function of any CFMM can be approximated via constant-sum AMMs, allowing market makers to replicate whatever trading function they want. This functionality is implemented in `pcli` for two strategies: a linear spread across a range, and an approximation of the payoff of an `xy=k` (UniV2) curve. [poa]: https://buf.build/penumbra-zone/penumbra/docs/main:penumbra.core.component.dex.v1#penumbra.core.component.dex.v1.PositionOpen [pca]: https://buf.build/penumbra-zone/penumbra/docs/main:penumbra.core.component.dex.v1#penumbra.core.component.dex.v1.PositionClose @@ -139,23 +139,79 @@ pcli tx lp close-all pcli tx lp withdraw-all ``` -### Payoff replication with `pcli` +### Range liquidity with `pcli` - -Payoff replication is experimental. Payoff computations could be incorrect. Use at your own risk! - +As of `v0.80.1`, `pcli` can compute a set of positions that spread liquidity +across a price range. To do this, use +``` +pcli tx lp replicate linear --help +``` +This strategy takes a number of parameters (see `--help` for details), most importantly: + +- the trading pair +- the lower bound of the price range +- the upper bound of the price range +- the fee tier for the positions -`pcli` also has support for synthetically replicating the payoffs of other CFMMs. Currently, only `xy=k` (UniV2) liquidity is supported: +For example, the following invocation will create 5 positions spread across the range `1.8` to `2.2` USDC per UM: ``` -pcli tx lp replicate xyk penumbra:gn 100penumbra +$ pcli tx lp replicate linear upenumbra:transfer/channel-2/uusdc 100000000transfer/channel-2/uusdc --lower-price 1.8 --upper-price 2.2 --fee-bps 100 --num-positions 5 +################################################################################# +########################### LIQUIDITY SUMMARY ################################### +################################################################################# + +You want to provide liquidity on the pair upenumbra:transfer/channel-2/uusdc +You will need: + -> 50252144upenumbra + -> 0transfer/channel-2/uusdc +You will create the following positions: + ID State Fee Sell Price Reserves + plpid1klkeg9ve0mu5hu4v5afrg8qaneh3tmhzjww9c4yd7203v89qv90q0ruva3 opened 100bps 1.800001transfer/channel-2/usdc 11.111111penumbra + plpid1d5dmxgtaf34k3846kw858wqzyamg40ks20tprzxe0sgdyqcqdfzqj580m7 opened 100bps 1.900001transfer/channel-2/usdc 10.526315penumbra + plpid1vynfad7qzccl0p3zlqjttfv9smpdlxw86w0c7hxq2fcll9qqlpdqaqhjwv opened 100bps 2transfer/channel-2/usdc 10penumbra + plpid1kn5y806w98n0gnr28vq79r0fx7nd0dlclzzsktrla47efhxy87usuzxnae opened 100bps 2.100001transfer/channel-2/usdc 9.523809penumbra + plpid1c95eyegaeganw25c79q0etrryneg0ppgy5c9jxv5vh0e0p4yxeqs9a4dtr opened 100bps 2.200001transfer/channel-2/usdc 9.090909penumbra +Do you want to open those liquidity positions on-chain? [y/n] ``` -This command will create a sequence of liquidity positions which, in combination, synthetically replicate the portfolio value function of an `xy=k` AMM: + +The portfolio value function of this strategy (not accounting for fees) can be visualized as follows: - + -See the [Replicating Market Makers](https://arxiv.org/abs/2103.14769) paper for -details. +The x-axis shows the price of `UM` in terms of `USDC`, and the y-axis shows the +value of the position in the presence of traders (i.e., assuming the portfolio +always holds the less valuable asset, as a trader will trade away the more +valuable asset). The lower part of the chart shows the value of each individual +liquidity position. When the market price is less than the position's price, the +position holds UM, so the position's value increases with the price of UM up to +its sell price, at which point the position's value is constant. The upper part +of the chart shows the combined PVF of the portfolio of positions (in blue), as +well as the PVF of a UniV3 position in the same range for reference. Notice that +even with only 5 positions, the portfolio value fairly closely approximates the +UniV3 curve. + +This can be understood as a special case of some of the contents of the +[Replicating Market Makers](https://arxiv.org/abs/2103.14769) paper. + + +`pcli` currently has limited support for external asset metadata, **including denom exponents**. Double-check proposed positions to be sure they're not mispriced by a factor of 1,000,000. + + + +`pcli` can load an external registry of asset metadata, placed in `$PCLI_HOME/registry.json`. The Prax wallet registry can be downloaded via +``` +wget -O PATH/TO/PCLI_HOME/registry.json https://raw.githubusercontent.com/prax-wallet/registry/main/registry/chains/penumbra-1.json +``` + + + +Even using an external registry, `pcli` cannot use it to parse command-line arguments, due to limitations that will be removed in a future release. + +Thus it is necessary to specify `upenumbra:transfer/channel-2/uusdc` (the base denom for both assets, so that the specified prices are 1.8 `upenumbra` per `uusdc`, not 1.8 `penumbra` per `uusdc`, a _very_ different price) and `100000000transfer/channel-2/uusdc`. + +This limitation will be removed in a future release. + ### Programmatic access with `pclientd` diff --git a/public/images/pvf-linear.png b/public/images/pvf-linear.png new file mode 100644 index 0000000..e1f780a Binary files /dev/null and b/public/images/pvf-linear.png differ