You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用web3.py计算PancakeSwap代币对LP地址结果不符问题排查

问题原因

  • PancakeSwap V2属于Uniswap V2类分叉协议,工厂合约在计算交易对salt时,会先对两个传入的代币地址做从小到大排序,再拼接计算哈希。你的代码没有做排序步骤,直接按给定的代币地址+WBNB的顺序拼接,导致salt计算错误,最终生成的LP地址和实际不符。
  • 你的打印语句输出的是整个CONTRACTS字典,不是单独的代币地址,也和预期输出不一致。

修复后代码

from web3 import Web3
from eth_abi.packed import encode_abi_packed
from eth_abi import encode_abi
import eth_abi

"""
Contract: 0xe56842ed550ff2794f010738554db45e60730371
BIN/BNB Address: 0xe432afB7283A08Be24E9038C30CA6336A7cC8218
"""

CONTRACTS = {"CONTRACT": "0xe56842ed550ff2794f010738554db45e60730371",}

PANCAKE_SWAP_FACTORY = "0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73"
PANCAKE_SWAP_ROUTER  = "0x10ED43C718714eb63d5aA57B78B54704E256024E"
WBNB_ADDRESS = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"

hexadem_= '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'
factory = PANCAKE_SWAP_FACTORY

# 新增地址排序步骤:把两个地址转成整数比较,小的在前大的在后
tokenA = CONTRACTS['CONTRACT']
tokenB = WBNB_ADDRESS
if int(tokenA, 16) > int(tokenB, 16):
    tokenA, tokenB = tokenB, tokenA

abiEncoded_1 = encode_abi_packed(['address', 'address'], (tokenA, tokenB))
salt_ = Web3.solidityKeccak(['bytes'], ['0x' +abiEncoded_1.hex()])
abiEncoded_2 = encode_abi_packed([ 'address', 'bytes32'], ( factory, salt_))
resPair = Web3.solidityKeccak(['bytes','bytes'], ['0xff' + abiEncoded_2.hex(), hexadem_])[12:]

# 修改打印逻辑,输出单独的代币地址
print("Token Contract: ", CONTRACTS['CONTRACT'])
print("BNB-LP Address: ", resPair.hex())

运行上述代码即可得到你预期的0xe432afB7283A08Be24E9038C30CA6336A7cC8218 LP地址。

内容的提问来源于stack exchange,提问作者rbutrnz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:06:04