0

我正在尝试在 Kovan 测试网上我自己的 SmartContract 中使用 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

如果有人可以提供帮助,那就太好了。

4

2 回答 2

0

编译器找不到 ISwapRouter.sol

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

于 2021-10-10T17:38:26.487 回答
0

“编译期间出现问题”的可能性很小。如果你的合约可以编译,但它与源代码不匹配,那么你在编译器中发现了一个非常严重的代码生成错误,你应该报告它以便快速修复它。根据经验,我会说您的合同中更有可能存在错误。

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

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

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

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

于 2021-10-10T20:18:45.237 回答