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

Uniswap V3交易Multicall函数data字段未解码问题求助

问题:UniswapV3 Multicall交易的data字段未解码

我尝试通过以下代码异步读取UniswapV3的待处理交易,使用Router的ABI解码输入,但调用Multicall函数时,data字段的字节数组未被解码,仍显示为原始bytes数据。

address_router = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
with open("abiRouterUniswapV3.json", "r") as myFile:
    data = myFile.read()
abiRouter = json.loads(data)

contractRouter = w3.eth.contract(address=address_router, abi=abiRouter)

block_filter = w3.eth.filter('pending')

def handle_event(event):
    try:
        tx = w3.eth.getTransaction(event)
        tx_to = tx.to
    except Exception:
        pass
    else:
        if tx_to == "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45": #filtering only UniswapV3 
            input_decoded = contractRouter.decode_function_input(tx.input)
            print("hash: ", tx.hash.hex())
            print(input_decoded)

示例输出:

hash: 0x907b4c17bc525786960c4b2373c1b60cafc3f287e95cf5948432e4e71b25dd00
(<Function multicall(uint256,bytes[])>, {'deadline': 1663819751, 'data': [b'G+C\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1ck\xf5&4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x029\xc5\x0f\x85c\xf09@5\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfb\xc9\xc2\xa8\x8d\x98;\xa1\xe3\xe6(\x11Y\xe9\x98\xa4\xc9\x1aC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0*\xaa9\xb2#\xfe\x8d\n\x0e\O'\xea\xd9\x08<ul\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\xee\xc9\x13"\x95\xc1\xfd|\xab\x0b,\xfd\xe6z\x15\xaa\x94W\xd7']})

请问代码存在什么问题或遗漏了什么?


原因与解决方案

核心问题

decode_function_input仅会解码当前函数(此处为multicall)的顶层参数,而multicall的data参数是字节数组,每个元素是另一个合约函数的完整调用数据(包含函数选择器和参数),Web3.py不会自动递归解码这些嵌套的函数调用数据。

解决步骤

  1. 识别当前解码的函数是否为multicall
  2. 遍历data数组中的每个字节片段
  3. 对每个字节片段单独调用decode_function_input解码,因为这些片段是调用UniswapV3 Router其他函数的编码数据,可复用同一个contractRouter实例。

修改后的代码示例

address_router = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
with open("abiRouterUniswapV3.json", "r") as myFile:
    data = myFile.read()
abiRouter = json.loads(data)

contractRouter = w3.eth.contract(address=address_router, abi=abiRouter)

block_filter = w3.eth.filter('pending')

def handle_event(event):
    try:
        tx = w3.eth.getTransaction(event)
        tx_to = tx.to
    except Exception:
        pass
    else:
        if tx_to == "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45":
            input_decoded = contractRouter.decode_function_input(tx.input)
            print("hash: ", tx.hash.hex())
            func, params = input_decoded
            
            # 处理multicall函数的嵌套调用
            if func.name == "multicall":
                print(f"Deadline: {params['deadline']}")
                print("Nested calls:")
                for idx, call_data in enumerate(params['data']):
                    try:
                        nested_func, nested_params = contractRouter.decode_function_input(call_data)
                        print(f"  Call {idx+1}: {nested_func.name}")
                        print(f"    Params: {nested_params}")
                    except Exception as e:
                        print(f"  Call {idx+1}: Failed to decode - {str(e)}")
            else:
                print(func)
                print(params)

注意事项

  • 确保你的ABI文件包含multicall中嵌套调用的所有函数定义,否则解码会失败。
  • 部分data片段可能是调用其他合约的函数,此时需要对应合约的ABI才能解码,建议用try-except捕获解码异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:50:45