首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Uniswap通用路由器-解码执行函数参数

Uniswap通用路由器-解码执行函数参数
EN

Ethereum用户
提问于 2023-02-07 16:22:43
回答 1查看 1K关注 0票数 2

我使用了这个线程(在ethers.js中解码Uniswap通用路由器事务)中描述的方法,并在这个链接中解码了事务的大部分数据:https://arbiscan.io/tx/0xfd288567b1a9c827a260b28ff0b6b183d256c60881f75c7d86d50a501593c6fd

代码语言:javascript
运行
复制
Data: 0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000063e1579200000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000b2c73eba00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82af49447d8a07e3bd95bd0d56f35241523fbab1002710602eb0d99a5e3e76d1510372c4d2020e12eaea8a000000000000000000000000000000000000000000

ExecuteWithCommandsAndInputs(ExecuteWithCommandsAndInputsCall { commands: Bytes(0x0b00), inputs: [Bytes(0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc10000), Bytes(0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000b2c73eba00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82af49447d8a07e3bd95bd0d56f35241523fbab1002710602eb0d99a5e3e76d1510372c4d2020e12eaea8a000000000000000000000000000000000000000000)], deadline: 1675712402 })

解码后的数据如下:

  • 0x0b00 = execute函数的第一个参数(命令字节)
  • 0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc10000 (二千万0000000000000) =执行函数的第二个参数的第一个输入。这与"WRAP_ETH“所需的数据匹配。
  • 0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000b2c73eba00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82af49447d8a07e3bd95bd0d56f35241523fbab1002710602eb0d99a5e3e76d1510372c4d2020e12eaea8a000000000000000000000000000000000000000000 =这部分让我头疼。基于Uniswap通用路由器技术参考(https://docs.uniswap.org/contracts/universal-router/technical-reference),应该有5个输入(地址、uint256、uint256、字节、bool)。但是,我将数据分割成64个字符,总共有8行。这是否意味着有8个输入,而不是5个?
EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-02-08 11:45:25

正确的是,V3_SWAP_EXACT_IN本身接受5个参数。

但是第四个参数( path )是一个字节数组,它们还包括费用和一些偏移,以正确构建路径。您可以在他们的V3Path.sol智能合同和V3SwapRouter.sol中查看更多内容。

从您所包含的代码片段判断,您成功地用ethers接口解码了通用函数。我建议您对V3函数也这样做,如下所示:

代码语言:javascript
运行
复制
const abiCoder = new AbiCoder();
decoded = abiCoder.decode(["address", "uint256", "uint256", "bytes", "bool"], inputForFunction);

使用它,您可以为V3_SWAP_EXACT_IN函数的每个输入获取相应的参数。基本上,您创建一个迷你界面,只需您需要解码功能。只要你知道输入,它就会给出正确的结果。

运行代码段应该会产生如下结果:

代码语言:javascript
运行
复制
[
  '0x0000000000000000000000000000000000000001',
  BigNumber { _hex: '0x06ccf946da6cf708', _isBigNumber: true },
  BigNumber { _hex: '0x04c72ae4b04a0a42db7f', _isBigNumber: true },
  '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271000c83aecc790e8a4453e5dd3b0b4b3680501a7a7',
  false
]

现在这里实际上有5个输入(接收者、输入、minOut、路径、fromowner)

下一个挑战是解码路径本身,因为路径仍然是不正确的格式。如果您签出了V3Path.sol,您可以看到不同的地址偏移量,在从路径中提取地址时,您必须考虑到这些费用。

我在我的应用程序中使用了以下函数:

代码语言:javascript
运行
复制
function extractPathFromV3(fullPath, reverse = false) {
    const fullPathWithoutHexSymbol = fullPath.substring(2);
    let path = [];
    let currentAddress = "";
    for (let i = 0; i < fullPathWithoutHexSymbol.length; i++) {
        currentAddress += fullPathWithoutHexSymbol[i];
        if (currentAddress.length === 40) {
            path.push('0x' + currentAddress);
            i = i + 6;
            currentAddress = "";
        }
    }
    if (reverse) {
        return path.reverse();
    }
    return path;
}

它从路径中获取每个地址,不包括费用(跳过6个字节),并且可以反转路径,因为在默认情况下,V3_SWAP_EXACT_OUT路径是反向的,所以这也是必要的。

如果您对单模通用解码器感兴趣,可以在这里查看我的完整实现。

希望它能澄清一点。

票数 5
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/144478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档