如何通过Python3计算Uniswap 3.0 Pool(旧版称Pair)地址
Uniswap V3 Pool 地址Python3实现方案
Uniswap V3的Pool对应旧版本的Pair概念,相比V2的地址计算逻辑新增了费率参数,需基于CREATE2规则完成计算。
前置依赖
需先安装web3.py库:pip install web3
核心实现代码
from web3 import Web3 # 以太坊主网默认配置,其他EVM链请自行替换对应工厂地址和初始化代码哈希 UNISWAP_V3_FACTORY = "0x1F98431c8aD98523631AE4a59f267346ea31F984" UNISWAP_V3_INIT_CODE_HASH = "0xe34f199b19b2b4f47f68442619d55552c7598d3e2910e84bb72ea0e0f6d00f8b" def compute_pool_address( token_a: str, token_b: str, fee: int, factory_address: str = UNISWAP_V3_FACTORY, init_code_hash: str = UNISWAP_V3_INIT_CODE_HASH ) -> str: # 转换为checksum地址避免大小写校验错误 token_a = Web3.to_checksum_address(token_a) token_b = Web3.to_checksum_address(token_b) # 自动排序代币地址,确定token0和token1 token0, token1 = sorted([token_a, token_b], key=lambda x: Web3.to_bytes(hexstr=x)) # 计算CREATE2所需salt值 salt = Web3.solidity_keccak( ["address", "address", "uint24"], [token0, token1, fee] ) # 按照CREATE2规则计算Pool地址 pool_address_raw = Web3.keccak( b"\xff" + Web3.to_bytes(hexstr=factory_address) + salt + Web3.to_bytes(hexstr=init_code_hash) )[-20:] # 转换为标准checksum地址返回 return Web3.to_checksum_address(pool_address_raw)
使用示例
# 示例:计算以太坊主网USDC-WETH 0.05%费率的Pool地址 usdc_address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" weth_address = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" fee_rate = 500 # 费率单位为百万分之一,500对应0.05% target_pool_address = compute_pool_address(usdc_address, weth_address, fee_rate) print(target_pool_address) # 输出结果:0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640,可直接与链上公开数据校验
注意事项
- 费率参数的单位为百万分之一,常见合法值为100(对应0.01%)、500(对应0.05%)、3000(对应0.3%)、10000(对应1%),不要直接传入小数
- 如果需要计算其他EVM链上的Uniswap V3 Pool地址,只需替换代码中默认的工厂地址和初始化代码哈希为对应链的官方值即可
- 函数内部会自动对两个代币地址做排序,调用时无需提前调整代币顺序
内容的提问来源于stack exchange,提问作者freeearth
相关产品推荐
相关产品推荐

