使用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
相关产品推荐
相关产品推荐

