Source code for eth_defi.uniswap_v3.pool
"""Uniswap v3 pool data."""
from dataclasses import dataclass
from typing import Union
from eth_typing import HexAddress
from eth_defi.abi import get_deployed_contract
from eth_defi.token import TokenDetails, fetch_erc20_details
[docs]@dataclass
class PoolDetails:
"""Uniswap v3 trading pool info."""
#: Pool address
address: HexAddress
#: One pair of tokens
token0: TokenDetails
#: One pair of tokens
token1: TokenDetails
#: Pool fee as expressed in smart contracts (100*bps)
#: e.g. 0.3% = 30bps so raw_fee = 3000
raw_fee: int
#: Pool fee as % multiplier, 1 = 100%
fee: float
def __repr__(self):
return f"Pool {self.address} is {self.token0.symbol}-{self.token1.symbol}, with the fee {self.fee * 100:.04f}%"
[docs] def convert_price_to_human(self, tick: int, reverse_token_order=False):
"""Convert the price obtained through
:param tick:
Logarithmic tick from the Uniswap pool
:param reverse_token_order:
For natural base - quote token order. If set,
assume quote token is token0.
"""
raw_price = 1.0001**tick
if reverse_token_order:
return (1 / raw_price) / 10 ** (self.token0.decimals - self.token1.decimals)
else:
return raw_price / 10 ** (self.token1.decimals - self.token0.decimals)
[docs]def fetch_pool_details(web3, pool_contact_address: Union[str, HexAddress]) -> PoolDetails:
pool = get_deployed_contract(web3, "uniswap_v3/UniswapV3Pool.json", pool_contact_address)
token0_address = pool.functions.token0().call()
token1_address = pool.functions.token1().call()
token0 = fetch_erc20_details(web3, token0_address)
token1 = fetch_erc20_details(web3, token1_address)
raw_fee = pool.functions.fee().call()
return PoolDetails(
pool.address,
token0,
token1,
raw_fee,
raw_fee / 1_000_000,
)
[docs]def get_raw_fee_from_pool_address(web3, pool_contract_address: HexAddress):
"""Get the swap fee for a pool, given the pool contract address
:param web3:
Web3 instance
:param pool_contract_address:
Address of pool contract
:return:
Swap fee expressed as uint24"""
pool = get_deployed_contract(web3, "uniswap_v3/UniswapV3Pool.json", pool_contract_address)
return pool.functions.fee().call()