我使用了这个线程(在ethers.js中解码Uniswap通用路由器事务)中描述的方法,并在这个链接中解码了事务的大部分数据:https://arbiscan.io/tx/0xfd288567b1a9c827a260b28ff0b6b183d256c60881f75c7d86d50a501593c6fd。
Data: 0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000063e1579200000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000b2c73eba00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82af49447d8a07e3bd95bd0d56f35241523fbab1002710602eb0d99a5e3e76d1510372c4d2020e12eaea8a000000000000000000000000000000000000000000
ExecuteWithCommandsAndInputs(ExecuteWithCommandsAndInputsCall { commands: Bytes(0x0b00), inputs: [Bytes(0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc10000), Bytes(0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000b2c73eba00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82af49447d8a07e3bd95bd0d56f35241523fbab1002710602eb0d99a5e3e76d1510372c4d2020e12eaea8a000000000000000000000000000000000000000000)], deadline: 1675712402 })
解码后的数据如下:
发布于 2023-02-08 11:45:25
正确的是,V3_SWAP_EXACT_IN本身接受5个参数。
但是第四个参数( path )是一个字节数组,它们还包括费用和一些偏移,以正确构建路径。您可以在他们的V3Path.sol智能合同和V3SwapRouter.sol中查看更多内容。
从您所包含的代码片段判断,您成功地用ethers接口解码了通用函数。我建议您对V3函数也这样做,如下所示:
const abiCoder = new AbiCoder();
decoded = abiCoder.decode(["address", "uint256", "uint256", "bytes", "bool"], inputForFunction);
使用它,您可以为V3_SWAP_EXACT_IN函数的每个输入获取相应的参数。基本上,您创建一个迷你界面,只需您需要解码功能。只要你知道输入,它就会给出正确的结果。
运行代码段应该会产生如下结果:
[
'0x0000000000000000000000000000000000000001',
BigNumber { _hex: '0x06ccf946da6cf708', _isBigNumber: true },
BigNumber { _hex: '0x04c72ae4b04a0a42db7f', _isBigNumber: true },
'0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271000c83aecc790e8a4453e5dd3b0b4b3680501a7a7',
false
]
现在这里实际上有5个输入(接收者、输入、minOut、路径、fromowner)
下一个挑战是解码路径本身,因为路径仍然是不正确的格式。如果您签出了V3Path.sol,您可以看到不同的地址偏移量,在从路径中提取地址时,您必须考虑到这些费用。
我在我的应用程序中使用了以下函数:
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路径是反向的,所以这也是必要的。
如果您对单模通用解码器感兴趣,可以在这里查看我的完整实现。
希望它能澄清一点。
https://ethereum.stackexchange.com/questions/144478
复制相似问题