uniswap-smart-path


Nameuniswap-smart-path JSON
Version 0.2.0 PyPI version JSON
download
home_page
SummaryFind the path from v2 and v3 pools to swap with the best price, including gas fees
upload_time2023-11-10 13:58:23
maintainer
docs_urlNone
author
requires_python>=3.8
licenseMIT License
keywords blockchain ethereum uniswap universal router swap path route pools
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Uniswap Smart Path

#### Project Information
[![Continous Integration](https://github.com/Elnaril/uniswap-smart-path/actions/workflows/ci.yml/badge.svg)](https://github.com/Elnaril/uniswap-smart-path/actions/workflows/ci.yml)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/uniswap-smart-path)](https://pypi.org/project/uniswap-smart-path/)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/Elnaril/uniswap-smart-path)](https://github.com/Elnaril/uniswap-smart-path/releases)
[![PyPi Repository](https://img.shields.io/badge/repository-pipy.org-blue)](https://pypi.org/project/uniswap-smart-path/)
[![License](https://img.shields.io/github/license/Elnaril/uniswap-smart-path)](https://github.com/Elnaril/uniswap-smart-path/blob/master/LICENSE)

#### Code Quality
[![Test Coverage](https://img.shields.io/badge/dynamic/json?color=blueviolet&label=coverage&query=%24.totals.percent_covered_display&suffix=%25&url=https%3A%2F%2Fraw.githubusercontent.com%2FElnaril%2Funiswap-smart-path%2Fmaster%2Fcoverage.json)](https://github.com/Elnaril/uniswap-smart-path/blob/master/coverage.json)
[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)
[![Type Checker: mypy](https://img.shields.io/badge/%20type%20checker-mypy-%231674b1?style=flat&labelColor=ef8336)](https://mypy-lang.org/)
[![Linter: flake8](https://img.shields.io/badge/%20linter-flake8-%231674b1?style=flat&labelColor=ef8336)](https://flake8.pycqa.org/en/latest/)


## 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](https://github.com/Elnaril/uniswap-universal-router-decoder),
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](https://python.readthedocs.io/en/latest/library/venv.html), here is a [tutorial](https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/).

The library can be pip installed from [pypi.org](https://pypi.org/project/uniswap-smart-path/) as usual:

```bash
# 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.

```python
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:
```python
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.

```python
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.

```python
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()`

```python
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](https://github.com/Elnaril/uniswap-universal-router-decoder) to encode a transaction.

#### Single path
```python
(
    {
        '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.
```python
(
    {
        '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
    }
)
```

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "uniswap-smart-path",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "blockchain,ethereum,uniswap,universal router,swap,path,route,pools",
    "author": "",
    "author_email": "Elnaril <elnaril_dev@caramail.com>",
    "download_url": "https://files.pythonhosted.org/packages/59/96/c562fad27924a5a34f831ede590881f27369e445192cab4de07ff3df6f62/uniswap-smart-path-0.2.0.tar.gz",
    "platform": null,
    "description": "# Uniswap Smart Path\n\n#### Project Information\n[![Continous Integration](https://github.com/Elnaril/uniswap-smart-path/actions/workflows/ci.yml/badge.svg)](https://github.com/Elnaril/uniswap-smart-path/actions/workflows/ci.yml)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/uniswap-smart-path)](https://pypi.org/project/uniswap-smart-path/)\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/Elnaril/uniswap-smart-path)](https://github.com/Elnaril/uniswap-smart-path/releases)\n[![PyPi Repository](https://img.shields.io/badge/repository-pipy.org-blue)](https://pypi.org/project/uniswap-smart-path/)\n[![License](https://img.shields.io/github/license/Elnaril/uniswap-smart-path)](https://github.com/Elnaril/uniswap-smart-path/blob/master/LICENSE)\n\n#### Code Quality\n[![Test Coverage](https://img.shields.io/badge/dynamic/json?color=blueviolet&label=coverage&query=%24.totals.percent_covered_display&suffix=%25&url=https%3A%2F%2Fraw.githubusercontent.com%2FElnaril%2Funiswap-smart-path%2Fmaster%2Fcoverage.json)](https://github.com/Elnaril/uniswap-smart-path/blob/master/coverage.json)\n[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)\n[![Type Checker: mypy](https://img.shields.io/badge/%20type%20checker-mypy-%231674b1?style=flat&labelColor=ef8336)](https://mypy-lang.org/)\n[![Linter: flake8](https://img.shields.io/badge/%20linter-flake8-%231674b1?style=flat&labelColor=ef8336)](https://flake8.pycqa.org/en/latest/)\n\n\n## Overview \n\nWith several V2 and V3 pools, and 2 or 3 tokens per path, there may be quite a few routes to perform a swap.\nAnd if you add the gas fees into the equation, it is not straightforward to be sure to get the best deal. \n\nThe object of this library is to find the path(s), from v2 and v3 pools, to swap with the best price,\nincluding gas fees, and to return it/them in order to be used directly with the [UR codec](https://github.com/Elnaril/uniswap-universal-router-decoder),\nalong with a percentage to know how to divide the amount between them.\n\n\u26a0 This project is a work in progress. Not all features have been implemented yet.\nFor instance the gas fees is not evaluated in the current version.\n\n\u26a0 This tool does not replace your own due diligence to find the best price/path to swap any token.\n\n---\n\n## Installation\nA good practice is to use [Python virtual environments](https://python.readthedocs.io/en/latest/library/venv.html), here is a [tutorial](https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/).\n\nThe library can be pip installed from [pypi.org](https://pypi.org/project/uniswap-smart-path/) as usual:\n\n```bash\n# update pip to latest version if needed\npip install -U pip\n\n# install the decoder from pypi.org\npip install uniswap-smart-path\n```\n\n---\n\n## Usage\n\nThe library exposes a class, `SmartPath` with a public method `get_swap_in_path()` that can be used to find the best path/price.\nFor performance's sake, it is asynchronous. Currently, it supports only the Ethereum blockchain.\n\n```python\nfrom uniswap_smart_path import SmartPath\n\nsmart_path = await SmartPath.create(async_w3)  # where async_w3 is your AsyncWeb3 instance\npath = await smart_path.get_swap_in_path(amount_in_wei, token0_address, token1_address)\n\n```\n\nYou can also create the `SmartPath` instance from a rpc endpoint:\n```python\nfrom uniswap_smart_path import SmartPath\n\nsmart_path = await SmartPath.create(rpc_endpoint=rpc_endpoint)\n\n```\n\n### V2 or V3 pools only\nThe 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.\nCurrently, it supports only the Ethereum blockchain.\n\n```python\nfrom uniswap_smart_path import SmartPath\n\nsmart_path = await SmartPath.create_v2_only(rpc_endpoint=rpc_endpoint)  # could also use an AsyncWeb3 instance i/o rpc\n\n```\n\nSame thing if you wish to look into V3 pools only, just use `SmartPath.create_v3_only()`\nCurrently, it supports only the Ethereum blockchain.\n\n```python\nfrom uniswap_smart_path import SmartPath\n\nsmart_path = await SmartPath.create_v3_only(rpc_endpoint=rpc_endpoint)  # could also use an AsyncWeb3 instance i/o rpc\n\n```\n\n### Custom pools and blockchains\nA custom SmartPath can be created with the factory method `SmartPath.create_custom()`\n\n```python\nfrom uniswap_smart_path import SmartPath\n\npivot_tokens = (wbnb_address, usdt_address, usdc_address, dai_address)  # BSC addresses\nv3_pool_fees = (100, 500, 2500, 10000)  # Pancakeswap v3 fees\n\nsmart_path = await SmartPath.create_custom(\n        w3,  # BSC AsyncWeb3 instance\n        pivot_tokens=pivot_tokens,\n        v3_pool_fees=v3_pool_fees,\n        v2_router=pancakeswapv2_address,\n        v2_factory=pancakeswapv2_factory,\n        v3_quoter=pancakeswapv3_quoter_address,\n        v3_factory=pancakeswapv3_factory,\n    )\n```\n\n## Result\nExamples of output paths that you can use with the [UR codec](https://github.com/Elnaril/uniswap-universal-router-decoder) to encode a transaction.\n\n#### Single path\n```python\n(\n    {\n        'path': ('0xD533a949740bb3306d119CC777fa900bA034cd52', 3000, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 3000, '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2'),\n        'function': 'V3_SWAP_EXACT_IN',\n        'weight': 100,\n        'estimate': 128331138758276360764\n    },\n)\n```\n\n#### Multi path\nHere, 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.\n```python\n(\n    {\n        'path': ('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n        'function': 'V2_SWAP_EXACT_IN',\n        'weight': 10,\n        'estimate': 32858922292711987411\n     },\n    {\n        'path': ('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', 3000, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n        'function': 'V3_SWAP_EXACT_IN',\n        'weight': 90,\n        'estimate': 295000857928717844546\n    }\n)\n```\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Find the path from v2 and v3 pools to swap with the best price, including gas fees",
    "version": "0.2.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/Elnaril/uniswap-smart-path/issues",
        "Buy Me A Coffee": "https://www.buymeacoffee.com/elnaril",
        "Fiverr": "https://www.fiverr.com/freelancers/elnaril",
        "Homepage": "https://github.com/Elnaril/uniswap-smart-path"
    },
    "split_keywords": [
        "blockchain",
        "ethereum",
        "uniswap",
        "universal router",
        "swap",
        "path",
        "route",
        "pools"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0c1c4d6293b0a6c29be4d91063b7c1ffc417f08dc7eb1f2037c2da7c5542fea8",
                "md5": "72a41e4530f9f1f42071abc2388ede96",
                "sha256": "e5241c1fd0b80a43841a39c9d3a7cd9a4d1b5dcfb7259368427edcef1f774a29"
            },
            "downloads": -1,
            "filename": "uniswap_smart_path-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "72a41e4530f9f1f42071abc2388ede96",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 12062,
            "upload_time": "2023-11-10T13:58:21",
            "upload_time_iso_8601": "2023-11-10T13:58:21.795831Z",
            "url": "https://files.pythonhosted.org/packages/0c/1c/4d6293b0a6c29be4d91063b7c1ffc417f08dc7eb1f2037c2da7c5542fea8/uniswap_smart_path-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5996c562fad27924a5a34f831ede590881f27369e445192cab4de07ff3df6f62",
                "md5": "6eec07cc5681ee23191271f7a251f3e8",
                "sha256": "5a38e4972d49381064096bb3b66efeb0f551c3b410bc57b1e100e1cec6e794cf"
            },
            "downloads": -1,
            "filename": "uniswap-smart-path-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6eec07cc5681ee23191271f7a251f3e8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 15557,
            "upload_time": "2023-11-10T13:58:23",
            "upload_time_iso_8601": "2023-11-10T13:58:23.422379Z",
            "url": "https://files.pythonhosted.org/packages/59/96/c562fad27924a5a34f831ede590881f27369e445192cab4de07ff3df6f62/uniswap-smart-path-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-10 13:58:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Elnaril",
    "github_project": "uniswap-smart-path",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "uniswap-smart-path"
}
        
Elapsed time: 0.13668s