-
Notifications
You must be signed in to change notification settings - Fork 526
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Alex.Karys <alex.karys@CORN-Alex-632.local> Co-authored-by: dannydaniil <danny.daniil@uniswap.org>
- Loading branch information
1 parent
6729414
commit 5d927ed
Showing
7 changed files
with
154 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
--- | ||
id: overview | ||
title: Overview | ||
sidebar_position: 1 | ||
--- | ||
|
||
# UniswapX | ||
|
||
UniswapX is a new permissionless, open source (GPL), auction-based routing protocol for trading across AMMs and other liquidity sources. | ||
|
||
UniswapX improves swapping in several ways: | ||
|
||
- Better prices by aggregating liquidity sources | ||
- Gas-free swapping | ||
- Protection against MEV (Maximal Extractable Value) | ||
- No cost for failed transactions | ||
- And in the coming months, UniswapX will expand to gas-free cross-chain swaps. | ||
|
||
Swappers generate signed orders which specify the intents of their swap, and fillers compete using arbitrary filling strategies to satisfy these orders. | ||
|
||
# Trading on UniswapX | ||
To trade using UniswapX, swappers create a new type of order called an Exclusive Dutch Order which specifies the maximum and minimum outputs they are willing to receive in a trade over a certain time period. | ||
|
||
<!-- <img src={require('./images/UniswapX_graph.png').default} alt="UniswapX" width="100%%" /> --> | ||
|
||
They then sign a message that uses Permit2 to allow the transfer of tokens to complete the trade as long as the the number of tokens sent and received matched what is specified in the decay curve. These Signed Order messages are broadcast publicly and available to be executed by anyone who wants to be a “filler”. | ||
|
||
## Fillers on UniswapX | ||
UniswapX introduces a new participant in the Uniswap ecosystem, the _Filler_. These agents pickup signed orders from swappers and compete to execute them using any source of liquidity they have access to. | ||
|
||
Anyone can fill orders on UniswapX, get started by reading our [Filler Integration Guide](/uniswapx/guides/createfiller). | ||
|
||
## Parametizing UniswapX Orders | ||
The UniswapX protocol does not explicitly parameterize the pricing of orders like the Exclusive Dutch Order, rather order parameterization is left to be configured by the order constructor. | ||
|
||
In the current Uniswap Labs interface implementation of UniswapX, some fillers may choose to help parameterize orders by participating as quoters. These fillers can *only* win a quote if they guarantee improved swapper execution over Uniswap v3 or v2 liquidity pools. Fillers who win a quote will receive execution priority for a limited period of time to fill orders they submitted wining quotes for. | ||
|
||
To ensure a smooth swapping experience for traders during the beta period, the set of Quoters will be vetted by Uniswap Labs following UniswapX’s launch, with plans to make the quoting system fully permissionless in the near future. | ||
|
||
If you are interested in participating as a Quoter during the beta period, please reach out [here](mailto:quoters@uniswap.org). | ||
|
||
# UniswapX Protocol Architecture | ||
|
||
<!-- ![Architecture](./assets/uniswapx-architecture.png) --> | ||
<img src={require('./images/UniswapX.png').default} alt="UniswapX" width="100%%" /> | ||
|
||
### Reactors | ||
|
||
Order Reactors _settle_ UniswapX orders. They are responsible for validating orders of a specific type, resolving them into inputs and outputs, and executing them against the filler's strategy, and verifying that the order was successfully fulfilled. | ||
|
||
Reactors process orders using the following steps: | ||
- Validate the order | ||
- Resolve the order into inputs and outputs | ||
- Pull input tokens from the swapper to the fillContract using permit2 `permitWitnessTransferFrom` with the order as witness | ||
- Call `reactorCallback` on the fillContract | ||
- Verify that the output tokens were received by the output recipients | ||
|
||
Reactors implement the [IReactor](./src/interfaces/IReactor.sol) interface which abstracts the specifics of the order specification. This allows for different reactor implementations with different order formats to be used with the same interface, allowing for shared infrastructure and easy extension by fillers. | ||
|
||
Current reactor implementations: | ||
- [LimitOrderReactor](./src/reactors/LimitOrderReactor.sol): A reactor that settles simple static limit orders | ||
- [DutchOrderReactor](./src/reactors/DutchOrderReactor.sol): A reactor that settles linear-decay dutch orders | ||
- [ExclusiveDutchOrderReactor](./src/reactors/ExclusiveDutchOrderReactor.sol): A reactor that settles linear-decay dutch orders with a period of exclusivity before decay begins | ||
|
||
### Fill Contracts | ||
|
||
Order fillContracts _fill_ UniswapX orders. They specify the filler's strategy for fulfilling orders and are called by the reactor with `reactorCallback`. | ||
|
||
Some sample fillContract implementations are provided in this repository: | ||
- [SwapRouter02Executor](./src/sample-executors/SwapRouter02Executor.sol): A fillContract that uses UniswapV2 and UniswapV3 via the SwapRouter02 router | ||
|
||
### Direct Fill | ||
|
||
If a filler wants to fill orders using funds on-hand rather than a fillContract, they can do so gas efficiently using the `directFill` macro by specifying `address(1)` as the fillContract. This will pull tokens from the filler using `msg.sender` to satisfy the order outputs. | ||
|
||
# Whitepaper | ||
More details on the UniswapX protocol are available in the [UniswapX Whitepaper](https://uniswap.org/whitepaper-uniswapx.pdf). | ||
|
||
# Deployment Addresses | ||
|
||
| Contract | Address | Source | | ||
| --- | --- | --- | | ||
| Exclusive Dutch Order Reactor | [0xe80bF394d190851E215D5F67B67f8F5A52783F1E](https://etherscan.io/address/0xe80bF394d190851E215D5F67B67f8F5A52783F1E) | [ExclusiveDutchOrderReactor](https://github.com/Uniswap/UniswapX/blob/v1.0.0/src/reactors/ExclusiveDutchOrderReactor.sol) | | ||
| OrderQuoter | [0x7714520f383C998e8822E8743FD6f90A2979689b](https://etherscan.io/address/0x7714520f383C998e8822E8743FD6f90A2979689b) | [OrderQuoter](https://github.com/Uniswap/UniswapX/blob/v1.0.0/src/OrderQuoter.sol) | | ||
| Permit2 | [0x000000000022D473030F116dDEE9F6B43aC78BA3](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | [Permit2](https://github.com/Uniswap/permit2) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"label": "UniswapX", | ||
"position": 2, | ||
"collapsed": true | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"label": "Guides", | ||
"position": 3, | ||
"collapsed": false | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
--- | ||
id: becomequoter | ||
title: Become a Quoter | ||
sidebar_position: 2 | ||
--- | ||
# Quoting During UniswapX Beta | ||
To ensure a smooth swapping experience for traders during the beta period, the set of Quoters will be vetted by Uniswap Labs following UniswapX’s launch, with plans to make the quoting system fully permissionless in the near future. | ||
|
||
If you are interested in participating as a Quoter during the beta period, please reach out [here](mailto:quoters@uniswap.org). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
--- | ||
id: createfiller | ||
title: Creating A Filler | ||
sidebar_position: 1 | ||
--- | ||
|
||
# Integrating as a Filler | ||
|
||
There are two components to integrating as a filler: defining a filler execution strategy and retrieving & executing discovered orders. | ||
|
||
## 1. Defining a Filler Execution Strategy | ||
|
||
To execute a discovered order, a filler needs to call one of the `execute` methods ([source](https://github.com/Uniswap/UniswapX/blob/de36900fa074784bda215b902d4854bdffab09ba/src/reactors/BaseReactor.sol#L31)) of the Dutch Order Reactor, providing it with the orders to execute along with the address of the executor contract that defines their fill strategy. | ||
|
||
The simplest fill strategy is called `Direct Filler`, where the trade is executed directly against tokens held in the fillers address. To use this strategy, we’ve provided a short cut so fillers do not need to deploy an executor contract. They can simply call `execute` with filler address `address(1)` to fill against themselves (see [source](https://github.com/Uniswap/UniswapX/blob/de36900fa074784bda215b902d4854bdffab09ba/src/reactors/BaseReactor.sol#L73)): | ||
|
||
```solidity | ||
// Execute direct filler order | ||
DutchOrderReactor.execute(order, address(1)); | ||
``` | ||
|
||
More sophisticated fillers can implement arbitrarily complex strategies by deploying their own Executor contracts. This contract should implement the [IReactorCallback](https://github.com/Uniswap/UniswapX/blob/main/src/interfaces/IReactorCallback.sol) interface, which takes in an order with input tokens and returns the allotted number of output tokens to the caller. To use an executor contract, fillers simply specify it’s address when calling `execute`: | ||
|
||
```solidity | ||
// Execute custom fill strategy | ||
address executor = /* Address of deployed executor contract */ ; | ||
bytes fillData = /* Call data to be sent to your executor contract */; | ||
DutchOrderReactor.execute(order, executor, fillData); | ||
``` | ||
|
||
For convenience, we’ve provided an [example Executor Contract](https://github.com/Uniswap/UniswapX/tree/main/src/sample-executors) which demonstrates how a filler could implement a strategy that executes a UniswapX order against a Uniswap V3 pool. | ||
|
||
## 2. Retrieve & Execute Signed Orders | ||
|
||
All signed orders created through the Uniswap UI will be available via the UniswapX Orders Endpoint: | ||
|
||
``` | ||
GET https://api.uniswap.org/v2/orders?orderStatus=open&chainId=1&limit=1 | ||
``` | ||
|
||
It’s up to the individual filler to architect their own systems for finding and executing profitable orders, but the basic flow is as follows: | ||
|
||
1. Call `GET` on the `/orders` of the UniswapX Orders Endpoint as written above, to retrieve open signed orders | ||
2. Decode returned orders using the [UniswapX SDK](https://github.com/Uniswap/UniswapX-sdk/#parsing-orders) | ||
3. Determine which orders you would like to execute | ||
4. Send a new transaction to the [execute](https://github.com/Uniswap/UniswapX/blob/a2025e3306312fc284a29daebdcabb88b50037c2/src/reactors/BaseReactor.sol#L29) or [executeBatch](https://github.com/Uniswap/UniswapX/blob/a2025e3306312fc284a29daebdcabb88b50037c2/src/reactors/BaseReactor.sol#L37) methods of the [Dutch Order Reactor](https://github.com/Uniswap/UniswapX/blob/main/src/reactors/DutchOrderReactor.sol) specifying the signed orders you’d like to fill and the address of your executor contract | ||
|
||
If the order is valid, it will be competing against other fillers attempts to execute it in a gas auction. For this reason, we recommend submitting these transactions through a service like [Flashbots Protect](https://docs.flashbots.net/flashbots-protect/overview). |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5d927ed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Successfully deployed to the following URLs:
docs – ./
docs-git-main-uniswap.vercel.app
docs-uniswap.vercel.app
docs.uniswap.org