尝试验证从 @uniswap/v3-periphery 导入的合同时出现编译器错误
Getting compiler error when trying to verify a contract importing from @uniswap/v3-periphery
我正在尝试使用 Uniswap 在我自己的 Kovan 测试网上的 SmartContract 中执行从 DAI 到 WETH 的简单交换。不幸的是,即使在手动设置气体限制后,我的交易仍然被还原。
我还发现我无法通过 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 导入库并使用相对路径
- 布朗尼中各种不同的编译器重映射-config.yaml
- 手动添加所有依赖文件到项目文件夹
这里是 link 我的代码,用于重现我的错误:
https://github.com/MjCage/swap-demo
如果有人能提供帮助就太好了。
编译器找不到ISwapRouter.sol
您可以直接在 swap.sol 上添加 ISwapRouter.sol 的代码,并从您的代码中删除该行,这是代码 https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol
不太可能出现“编译过程中出错”的情况。如果你的合约编译但它所做的与源不匹配,你在编译器中发现了一个非常严重的代码生成错误,你应该 report it 以便它可以快速修复。根据经验,我会说你的合同中更有可能存在错误。
至于验证过程中的错误 - 问题是要正确编译多文件项目,您必须提供所有源文件并将它们放在正确的目录中。这也适用于库代码,因此如果您的合同导入 ISwapRouter.sol
,您还需要提交该文件以及它依次导入的所有文件。
下一个障碍是,据我所知,Etherscan 的多文件验证选项只允许您从单个目录提交文件,因此它只获取文件名,而不是整个路径(不确定是否通过 API 是不同的)。您需要 Etherscan 将文件视为 @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol
,但它只会看到 ISwapRouter.sol
,编译器不会将它们视为相同的(毕竟两者都可能存在)。
正确的解决方案是使用标准 JSON 验证选项 - 这样您就可以提交框架传递给编译器的整个 JSON 输入,其中包括项目中的所有文件(包括库)和相关的编译器选项。问题是布朗尼不会直接给你这个输入。您可以从它存储在磁盘上的 JSON 重新创建它(标准 JSON 输入格式记录在 Compiler Input and Output JSON Description) but that's a bit of manual work. Unfortunately Brownie does not provide any way to request this on the command line. The only other way to get it that I know of is to use Brownie's API and call compiler.generate_input_json()
.
由于这是一个只有一个合同的简单项目并且没有很深的依赖关系,您可能更容易遵循@Jacopo Mosconi 的回答并通过将所有导入替换为直接粘贴到的源来“扁平化”合同主合同。您也可以尝试将文件复制到您的项目目录并更改导入,使其仅包含文件名,不包含任何路径组件——这可能会通过多文件验证。扁平化最终是 Brownie 和许多其他框架目前进行验证的方式,Etherscan 的检查足够宽松以允许以这种方式修改源 - 它只检查字节码,因此即使您完全更改导入结构、名称、注释甚至您仍然可以验证任何被优化器删除的代码。
我正在尝试使用 Uniswap 在我自己的 Kovan 测试网上的 SmartContract 中执行从 DAI 到 WETH 的简单交换。不幸的是,即使在手动设置气体限制后,我的交易仍然被还原。
我还发现我无法通过 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 导入库并使用相对路径
- 布朗尼中各种不同的编译器重映射-config.yaml
- 手动添加所有依赖文件到项目文件夹
这里是 link 我的代码,用于重现我的错误: https://github.com/MjCage/swap-demo
如果有人能提供帮助就太好了。
编译器找不到ISwapRouter.sol
您可以直接在 swap.sol 上添加 ISwapRouter.sol 的代码,并从您的代码中删除该行,这是代码 https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol
不太可能出现“编译过程中出错”的情况。如果你的合约编译但它所做的与源不匹配,你在编译器中发现了一个非常严重的代码生成错误,你应该 report it 以便它可以快速修复。根据经验,我会说你的合同中更有可能存在错误。
至于验证过程中的错误 - 问题是要正确编译多文件项目,您必须提供所有源文件并将它们放在正确的目录中。这也适用于库代码,因此如果您的合同导入 ISwapRouter.sol
,您还需要提交该文件以及它依次导入的所有文件。
下一个障碍是,据我所知,Etherscan 的多文件验证选项只允许您从单个目录提交文件,因此它只获取文件名,而不是整个路径(不确定是否通过 API 是不同的)。您需要 Etherscan 将文件视为 @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol
,但它只会看到 ISwapRouter.sol
,编译器不会将它们视为相同的(毕竟两者都可能存在)。
正确的解决方案是使用标准 JSON 验证选项 - 这样您就可以提交框架传递给编译器的整个 JSON 输入,其中包括项目中的所有文件(包括库)和相关的编译器选项。问题是布朗尼不会直接给你这个输入。您可以从它存储在磁盘上的 JSON 重新创建它(标准 JSON 输入格式记录在 Compiler Input and Output JSON Description) but that's a bit of manual work. Unfortunately Brownie does not provide any way to request this on the command line. The only other way to get it that I know of is to use Brownie's API and call compiler.generate_input_json()
.
由于这是一个只有一个合同的简单项目并且没有很深的依赖关系,您可能更容易遵循@Jacopo Mosconi 的回答并通过将所有导入替换为直接粘贴到的源来“扁平化”合同主合同。您也可以尝试将文件复制到您的项目目录并更改导入,使其仅包含文件名,不包含任何路径组件——这可能会通过多文件验证。扁平化最终是 Brownie 和许多其他框架目前进行验证的方式,Etherscan 的检查足够宽松以允许以这种方式修改源 - 它只检查字节码,因此即使您完全更改导入结构、名称、注释甚至您仍然可以验证任何被优化器删除的代码。