繁体   English   中英

通过python3计算uniswap 3.0 pool(pair)地址

[英]Compute uniswap 3.0 pool (pair) address via python3

我遇到了一个问题,如何根据12计算新的 uniswap 的版本 3 池(它称为对的早期版本)地址

在新的 uniswap v3.0 中,还有一个用于计算池地址的附加参数——以百分比表示的费用金额,其定义类似于sdk中的 uint24 类型。 从第一次解决计算池地址问题的sdk`s computePoolAddress中,有一个让我感到困惑的部分来源

[defaultAbiCoder.encode(['address', 'address', 'uint24'], [token0.address, token1.address, fee])

不知何故,我决定使用encodePacked (即来自encode_abi_packed的 python3 的 encode_abi_packed)function 来计算它。但它产生了错误的结果。 深入了解 uniswap v3.0 periphery pool conract - 3澄清了我的错误。 结果在 3.0 版中使用encode (即来自encode_abi的 python3 的 encode_abi)function。 这里有更多解释

因此,将它们耦合在一起。

主要function借助python3计算池地址。

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

def compute_pairs_address_with_target_v3(factory = '0x1F98431c8aD98523631AE4a59f267346ea31F984', token_0 = None, token_1 = None, fee = 3000):
    POOL_INIT_CODE_HASH = '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54'
    token_0 = Web3.toChecksumAddress(token_0)
    token_1 = Web3.toChecksumAddress(token_1)
    abiEncoded_1 = encode_abi(['address', 'address', 'uint24'], (token_0, token_1, fee )) if int(token_0,16)<int(token_1,16) else encode_abi(['address', 'address', 'uint24'], (token_1, token_0, fee ))
    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(), POOL_INIT_CODE_HASH])[12:]
    return(resPair.hex())

测试它,基于45

factoryAddress = '0x1111111111111111111111111111111111111111'
token0 = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
token1 = '0x6B175474E89094C44Da98b954EedeAC495271d0F'
fee = 500 #https://docs.uniswap.org/sdk/reference/enums/FeeAmount#low
targetPoolAddress = '0x90B1b09A9715CaDbFD9331b3A7652B24BfBEfD32'
assert(targetPoolAddress.lower() == compute_pairs_address_with_target_v3(factory = factoryAddress, token_0 = token0, token_1 = token1, fee = fee).lower())

token0 = '0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0'
token1 = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
factoryAddress = '0x1F98431c8aD98523631AE4a59f267346ea31F984'
fee = 3000 #https://docs.uniswap.org/sdk/reference/enums/FeeAmount#medium
targetPoolAddress = '0x290a6a7460b308ee3f19023d2d00de604bcf5b42' #WETH /MATIC 0.3 % fee
assert(targetPoolAddress.lower() == compute_pairs_address_with_target_v3(factory = factoryAddress, token_0 = token0, token_1 = token1, fee = fee).lower())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM