【问题标题】:Compute uniswap 3.0 pool (pair) address via python3通过 python3 计算 uniswap 3.0 池(对)地址
【发布时间】:2021-10-06 21:22:30
【问题描述】:

我对如何计算有点困惑 新的 uniswap 版本 3 池(早期版本称为 pair) 地址基于12

【问题讨论】:

    标签: python-3.x ethereum solidity


    【解决方案1】:

    在新的 uniswap v3.0 中还有一个额外的参数 用于计算池地址 - 费用百分比,定义如sdk 使用 uint24 类型。 来自sdk`s computePoolAddress第一时间入驻 由于计算池地址问题有一个让我感到困惑的部分来源

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

    为什么我决定使用encodePacked(即encode_abi_packed for python3 from eth_abi.packed)函数来计算它。但它产生了错误的结果。 深入了解 uniswap v3.0 外围池合同 - 3 已澄清 我的错。结果在 3.0 版中使用了 encode(即 encode_abi 用于来自 eth_abi 的 python3)函数。多一点解释here

    所以,把所有的东西结合在一起。

    借助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())
    

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2021-09-30
      • 2021-09-26
      • 2022-11-18
      • 2021-05-21
      • 2015-08-19
      • 1970-01-01
      • 2012-03-16
      • 2011-06-28
      相关资源
      最近更新 更多