尝试验证从@uniswap/v3periphery导入的协定时出现编译器错误

2024-10-05 13:16:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在Kovan Testnet上的我自己的SmartContract中使用Uniswap执行从DAI到WETH的简单交换。不幸的是,即使在手动设置气体限值后,我的事务仍会被还原

我还发现,我无法通过etherscan API或手动验证Kovan上的合同。相反,我每次导入库时都会出现以下错误:

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

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

以下是我到目前为止尝试的内容以及如何复制的一些信息: 布朗尼版本1.16.4,在Windows10和Ubuntu21.04上测试

我试过:

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

这里有一个链接,指向复制错误的代码: https://github.com/MjCage/swap-demo

如果有人能帮忙那就太好了


Tags: 错误not手动事务testnetetherscan气体入库
2条回答

编译器找不到ISwapRouter.sol

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

“编译时出错”的可能性很小。如果您的契约进行了编译,但是它与源代码不匹配,那么您在编译器中发现了一个非常严重的codegen错误,您应该report it,以便能够快速修复它。根据我的经验,你的合同很可能有漏洞

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

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

正确的解决方案是使用标准的JSON验证选项——通过这种方式,您可以提交框架传递给编译器的整个JSON输入,其中包括项目中的所有文件(包括库)和相关的编译器选项。问题是布朗尼没有直接给你这个输入。您可能可以从存储在磁盘上的JSON(标准JSON输入格式在Compiler Input and Output JSON Description中有文档记录)重新创建它,但这需要一些手工工作。不幸的是,Brownie没有提供任何方法在命令行上请求此操作。据我所知,获得它的唯一其他方法是使用Brownie的API并调用^{}

由于这是一个只有一个合同的简单项目,并且没有很深的依赖关系,因此您可能更容易遵循@Jacopo Mosconi的答案,通过将所有导入内容替换为直接粘贴到主合同中的源来“展平”合同。您还可以尝试将文件复制到项目目录并更改导入,使其仅包含文件名,而不包含任何路径组件-这可能会通过多文件验证。扁平化最终是布朗尼和许多其他框架目前进行验证的方式,Etherscan的检查非常宽松,允许以这种方式修改源代码-它只检查字节码,因此即使完全更改导入结构、名称、注释,甚至优化器删除的任何代码,您仍然可以进行验证

相关问题 更多 >

    热门问题