Find the path from v2 and v3 pools to swap with the best price, including gas fees
Project description
Uniswap Smart Path
Project Information
Code Quality
Overview
With several V2 and V3 pools, and 2 or 3 tokens per path, there may be quite a few routes to perform a swap. And if you add the gas fees into the equation, it is not straightforward to be sure to get the best deal.
The object of this library is to find the path(s), from v2 and v3 pools, to swap with the best price, including gas fees, and to return it/them in order to be used directly with the UR codec, along with a percentage to know how to divide the amount between them.
⚠ This project is a work in progress. Not all features have been implemented yet. For instance the gas fees is not evaluated in the current version.
⚠ This tool does not replace your own due diligence to find the best price/path to swap any token.
Installation
A good practice is to use Python virtual environments, here is a tutorial.
The library can be pip installed from pypi.org as usual:
# update pip to latest version if needed
pip install -U pip
# install the decoder from pypi.org
pip install uniswap-smart-path
Usage
The library exposes a class, SmartPath
with a public method get_swap_in_path()
that can be used to find the best path/price.
For performance's sake, it is asynchronous. Currently, it supports only the Ethereum blockchain.
from uniswap_smart_path import SmartPath
smart_path = await SmartPath.create(async_w3) # where async_w3 is your AsyncWeb3 instance
path = await smart_path.get_swap_in_path(amount_in_wei, token0_address, token1_address)
You can also create the SmartPath
instance from a rpc endpoint:
from uniswap_smart_path import SmartPath
smart_path = await SmartPath.create(rpc_endpoint=rpc_endpoint)
V2 or V3 pools only
The factory method SmartPath.create_v2_only()
can be used to create a SmartPath
instance that will look for the best path in V2 pools only.
Currently, it supports only the Ethereum blockchain.
from uniswap_smart_path import SmartPath
smart_path = await SmartPath.create_v2_only(rpc_endpoint=rpc_endpoint) # could also use an AsyncWeb3 instance i/o rpc
Same thing if you wish to look into V3 pools only, just use SmartPath.create_v3_only()
Currently, it supports only the Ethereum blockchain.
from uniswap_smart_path import SmartPath
smart_path = await SmartPath.create_v3_only(rpc_endpoint=rpc_endpoint) # could also use an AsyncWeb3 instance i/o rpc
Custom pools and blockchains
A custom SmartPath can be created with the factory method SmartPath.create_custom()
from uniswap_smart_path import SmartPath
pivot_tokens = (wbnb_address, usdt_address, usdc_address, dai_address) # BSC addresses
v3_pool_fees = (100, 500, 2500, 10000) # Pancakeswap v3 fees
smart_path = await SmartPath.create_custom(
w3, # BSC AsyncWeb3 instance
pivot_tokens=pivot_tokens,
v3_pool_fees=v3_pool_fees,
v2_router=pancakeswapv2_address,
v2_factory=pancakeswapv2_factory,
v3_quoter=pancakeswapv3_quoter_address,
v3_factory=pancakeswapv3_factory,
)
Result
Examples of output paths that you can use with the UR codec to encode a transaction.
Single path
(
{
'path': ('0xD533a949740bb3306d119CC777fa900bA034cd52', 3000, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 3000, '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2'),
'function': 'V3_SWAP_EXACT_IN',
'weight': 100,
'estimate': 128331138758276360764
},
)
Multi path
Here, 90% of the amount should be swapped on a V3 pool and 10% on a V2 pool, all that in a single transaction using the UR codec.
(
{
'path': ('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
'function': 'V2_SWAP_EXACT_IN',
'weight': 10,
'estimate': 32858922292711987411
},
{
'path': ('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', 3000, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
'function': 'V3_SWAP_EXACT_IN',
'weight': 90,
'estimate': 295000857928717844546
}
)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file uniswap-smart-path-0.2.0.tar.gz
.
File metadata
- Download URL: uniswap-smart-path-0.2.0.tar.gz
- Upload date:
- Size: 15.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5a38e4972d49381064096bb3b66efeb0f551c3b410bc57b1e100e1cec6e794cf |
|
MD5 | 6eec07cc5681ee23191271f7a251f3e8 |
|
BLAKE2b-256 | 5996c562fad27924a5a34f831ede590881f27369e445192cab4de07ff3df6f62 |
File details
Details for the file uniswap_smart_path-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: uniswap_smart_path-0.2.0-py3-none-any.whl
- Upload date:
- Size: 12.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e5241c1fd0b80a43841a39c9d3a7cd9a4d1b5dcfb7259368427edcef1f774a29 |
|
MD5 | 72a41e4530f9f1f42071abc2388ede96 |
|
BLAKE2b-256 | 0c1c4d6293b0a6c29be4d91063b7c1ffc417f08dc7eb1f2037c2da7c5542fea8 |