当试图验证从@uniswap/v3- peripheral导入的合约时,出现编译器错误



我试图在Kovan测试网上的我自己的智能合约中使用Uniswap执行从DAI到WETH的简单交换。不幸的是,即使手动设置了gas限制,我的交易也一直在恢复。

我还发现我无法通过etherscan-API或手动验证Kovan上的合约。相反,对于我导入的每个库,我都得到这个错误:

Source "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol" not found: File import callback not supported

因此,我感觉在编译过程中出现了问题,我没有任何进一步的想法来解决我的问题。

以下是我到目前为止尝试的一些信息,以及如何复制:Brownie版本1.16.4,在Windows 10和Ubuntu 21.04上测试

我试过:

  • 使用Brownie包管理器导入库
  • 使用npm导入库并使用相对路径
  • 在brownie-config.yaml
  • 中所有不同的编译器重新映射
  • 手动添加所有依赖文件到项目文件夹

这是一个链接到我的代码重现我的错误:https://github.com/MjCage/swap-demo

那就好,如果有人可以帮助。

不太可能在编译过程中出现问题。如果你的合约可以编译,但它所做的与源代码不匹配,那么你在编译器中发现了一个非常严重的代码错误,你应该报告它,以便它可以快速修复。从经验中我认为更有可能的是你有一个错误在你的合同。

至于验证过程中的错误-问题是要正确编译多文件项目,您必须提供所有源文件并将它们放在正确的目录中。这也适用于库代码,所以如果你的合同导入了ISwapRouter.sol,你也需要提交该文件以及它依次导入的所有文件。

下一个障碍是,据我所知,Etherscan的多文件验证选项只允许您从单个目录提交文件,因此它只获得它们的名称,而不是整个路径(不确定通过API是否不同)。您需要Etherscan将文件视为@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol,但它只看到ISwapRouter.sol,编译器不会将它们视为相同的(毕竟两者都可以存在)。

正确的解决方案是使用标准JSON验证选项——这样你提交整个JSON输入你的框架通过编译器和包括在项目的所有文件(包括库)和相关的编译器选项。问题是布朗尼不会直接给你这个输入。您可能能够从它存储在磁盘上的JSON中重新创建它(标准JSON输入格式在编译器输入和输出JSON描述中有文档),但这有点手动工作。不幸的是,Brownie没有提供任何在命令行上请求它的方法。我所知道的获得它的唯一其他方法是使用Brownie的API并调用compiler.generate_input_json()

由于这是一个只有一个合约的简单项目,并且没有深度依赖,因此您可能更容易遵循@Jacopo Mosconi的回答并只是"平坦化"。该合同通过直接粘贴到主合同中的源来替换所有的导入。您也可以尝试将文件复制到您的项目目录并更改导入,以便它只包含文件名,而不包含任何路径组件-这可能通过多文件验证。扁平化是Brownie和许多其他框架目前做验证的最终方式,Etherscan的检查足够宽松,允许以这种方式修改源代码——它只检查字节码,所以即使你完全改变了导入结构、名称、注释甚至任何被优化器删除的代码,你仍然可以进行验证。

编译器找不到ISwapRouter.sol

可以添加ISwapRouter的代码。直接在你的交换上。并从代码中删除该行,这是代码https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol

最新更新