Skip to main content

Decode & Encode transaction data sent to Uniswap universal router

Project description

Uniswap Universal Router Decoder & Encoder

⚠ This branch (v0.5.*) is kept for compatibility with web3 v5.31.*.

⚠ The latest version is on the master branch and uses web3 > v6.0.0

The rationale is:

  • web3 v5 uses eth-account < v0.6.0
  • a bug impacting EIP712 signatures for structured data with arrays has been fixed in eth-account v0.7.0 (see #175)
  • web3 v6 uses eth-account > v0.8.0
  • web3 v6 introduces breaking changes compared to v5

Project Information

Tests & Lint PyPI - Python Version GitHub release (latest by date) PyPi Repository GitHub

Code Quality

CodeQL Test Coverage Imports: isort Type Checker: mypy Linter: flake8

Overview and Points of Attention

The object of this library is to decode & encode the transaction input sent to the Uniswap universal router (UR) (address 0xEf1c6E67703c7BD7107eed8303Fbe6EC2554BF6B on Ethereum Mainnet).

⚠ This library has not been audited, so use at your own risk !

⚠ There is no guarantee of compatibility between 2 versions: consider forcing the version in your dependency requirements.

⚠ This project is a work in progress so not all commands are decoded yet. Below the list of the already implemented ones. Also, only one command can be encoded in a single transaction input data at the moment.

Command Id Function Name Decode Encode
0x00 V3_SWAP_EXACT_IN
0x01 V3_SWAP_EXACT_OUT
0x02 - 0x06
0x07 placeholder N/A N/A
0x08 V2_SWAP_EXACT_IN
0x09 V2_SWAP_EXACT_OUT
0x0a PERMIT2_PERMIT
0x0b WRAP_ETH
0x0c UNWRAP_WETH
0x0d PERMIT2_TRANSFER_FROM_BATCH
0x0e - 0x0f placeholders N/A N/A
0x10 - 0x1d
0x1e - 0x3f placeholders N/A N/A

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-universal-router-decoder

Usage

The library exposes a class, RouterDecoder with several public methods that can be used to decode or encode UR data.

How to decode a transaction input

To decode a transaction input, use the decode_function_input method as follow:

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

trx_input = "0x3593564c000000000000000000 ... 90095b5c4e9f5845bba"  # the trx input to decode
decoder = RouterDecoder()
decoded_trx_input = decoder.decode_function_input(trx_input)

How to decode a transaction

It's also possible to decode the whole transaction, given its hash and providing the decoder has been built with either a valid Web3 instance or the link to a rpc endpoint:

# Using a web3 instance
from web3 import Web3
from uniswap_universal_router_decoder.router_decoder import RouterDecoder
w3 = Web3(...)  # your web3 instance
decoder = RouterDecoder(w3=w3)
# Using a rpc endpoint
from web3 import Web3
from uniswap_universal_router_decoder.router_decoder import RouterDecoder
rpc_link = "https://..."  # your rpc endpoint
decoder = RouterDecoder(rpc_endpoint=rpc_link)

And then the decoder will get the transaction from the blockchain and decode it, along with its input data:

trx_hash = "0x52e63b7 ... 11b979dd9"
decoded_transaction = decoder.decode_transaction(trx_hash)

How to decode an Uniswap V3 swap path

The RouterDecoder class exposes also the static method decode_v3_path which can be used to decode a given Uniswap V3 path.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

uniswap_v3_path = b"\xc0*\xaa9\xb2#\xfe\x8d\n\x0e ... \xd7\x89"  # bytes or str hex
fn_name = "V3_SWAP_EXACT_IN"  # Or V3_SWAP_EXACT_OUT
decoded_path = RouterDecoder.decode_v3_path(fn_name, uniswap_v3_path)

The result is a tuple, starting with the "in-token" and ending with the "out-token", with the pool fees between each pair.

How to encode a call to the function WRAP_ETH

This function can be used to convert eth to weth using the UR.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

decoder = RouterDecoder()
encoded_data = decoder.encode_data_for_wrap_eth(amount_in_wei)  # to convert amount_in_wei eth to weth

# then in your transaction dict:
transaction["data"] = encoded_data

# you can now sign and send the transaction to the UR

How to encode a call to the function V2_SWAP_EXACT_IN

This function can be used to swap tokens on a V2 pool. Correct allowances must have been set before using sending such transaction.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

decoder = RouterDecoder()
encoded_data = decoder.encode_data_for_v2_swap_exact_in(
        amount_in,  # in Wei
        min_amount_out,  # in Wei
        [
            in_token_address,
            out_token_address,
        ],
        timestamp,  # unix timestamp after which the trx will not be valid any more
    )

# then in your transaction dict:
transaction["data"] = encoded_data

# you can now sign and send the transaction to the UR

How to encode a call to the function V2_SWAP_EXACT_OUT

This function can be used to swap tokens on a V2 pool. Correct allowances must have been set before using sending such transaction.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

decoder = RouterDecoder()
encoded_data = decoder.encode_data_for_v2_swap_exact_out(
        amount_out,  # in Wei
        max_amount_in,  # in Wei
        [
            in_token_address,
            out_token_address,
        ],
        timestamp,  # unix timestamp after which the trx will not be valid any more
    )

# then in your transaction dict:
transaction["data"] = encoded_data

# you can now sign and send the transaction to the UR

How to encode a call to the function V3_SWAP_EXACT_IN

This function can be used to swap tokens on a V3 pool. Correct allowances must have been set before using sending such transaction.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

decoder = RouterDecoder()
encoded_data = decoder.encode_data_for_v3_swap_exact_in(
        amount_in,  # in Wei
        min_amount_out,  # in Wei
        [
            in_token_address,
            pool_fee,
            out_token_address,
        ],
        timestamp,  # unix timestamp after which the trx will not be valid any more
    )

# then in your transaction dict:
transaction["data"] = encoded_data

# you can now sign and send the transaction to the UR

How to encode a call to the function V3_SWAP_EXACT_OUT

This function can be used to swap tokens on a V3 pool. Correct allowances must have been set before using sending such transaction.

from uniswap_universal_router_decoder.router_decoder import RouterDecoder

decoder = RouterDecoder()
encoded_data = decoder.encode_data_for_v3_swap_exact_out(
        amount_out,  # in Wei
        max_amount_in,  # in Wei
        [
            in_token_address,
            pool_fee,
            out_token_address,
        ],
        timestamp,  # unix timestamp after which the trx will not be valid any more
    )

# then in your transaction dict:
transaction["data"] = encoded_data

# you can now sign and send the transaction to the UR

Project details


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-universal-router-decoder-0.5.5.tar.gz.

File metadata

File hashes

Hashes for uniswap-universal-router-decoder-0.5.5.tar.gz
Algorithm Hash digest
SHA256 acf47c15728f7d3767af80aa22f9a433497e62061ffa13943d81da7d9e2a75b3
MD5 5b4c94ab85b108de60a06da25f284347
BLAKE2b-256 93648b5da383adc285a4aa11e12f2721595d0bfc78511feca5b24aca20568375

See more details on using hashes here.

Provenance

File details

Details for the file uniswap_universal_router_decoder-0.5.5-py3-none-any.whl.

File metadata

File hashes

Hashes for uniswap_universal_router_decoder-0.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 c91b342b8b603aa45929c7b1b8db2a424aebd0ef479ea72ec66628a87d2315d7
MD5 e4c9279488dfea3e33000f347c8aeb10
BLAKE2b-256 a48af7dd03728d1baff40d1ee866ab81fa82235d362a46e0b781aa9c10ca8d9c

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page