我试图在Kovan上使用Uniswap在我自己的SmartContract中执行一个从DAI到WETH的简单交换。不幸的是,即使在手动设置了气体限制之后,我的交易仍然会被恢复。
我还发现,我无法通过以太扫描-API或手动验证在科万的合同。相反,每次导入库时,我都会得到这个错误:
Source "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol" not found: File import callback not supported因此,我觉得在编译过程中有些地方出了问题,我没有任何进一步的想法来解决我的问题。
下面是一些关于我已经尝试过的内容以及如何复制的信息:BrownieVersion1.16.4,在Windows 10和Ubuntu21.04上进行了测试
我试过:
以下是用于复制错误的代码链接:https://github.com/MjCage/swap-demo
如果有人能帮忙那就太好了。
发布于 2021-10-10 20:18:45
“编译过程中出错”的可能性很小。如果您的契约编译,但它与源代码不匹配,您已经在编译器中发现了一个非常严重的codegen错误,您应该使用报告它来快速修复它。但是,从经验来看,你的合同中有错误的可能性要大得多。
至于验证过程中的错误,问题是要正确编译多文件项目,您必须提供所有源文件,并将它们放在正确的目录中。这也适用于库代码,因此如果您的合同导入了ISwapRouter.sol,您还需要提交该文件并依次导入它的所有文件。
下一个障碍是,据我所知,Etherscan的多文件验证选项只允许您从单个目录提交文件,因此它只能获得它们的名称,而不是整个路径(不确定通过API是否不同)。您需要以太扫描将文件视为@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol,但它只看到ISwapRouter.sol,编译器将不会将它们视为相同(毕竟两者都可能存在)。
正确的解决方案是使用Standard验证选项--通过这种方式提交框架传递给编译器的整个JSON输入,该输入包含项目中的所有文件(包括库)和相关的编译器选项。问题是Brownie没有直接给你这个输入。您可能可以从它存储在磁盘上的JSON重新创建它(标准JSON输入格式记录在编译器输入和输出JSON描述上),但这是一种手工操作。不幸的是,Brownie没有在命令行中提供任何方法来请求它。据我所知,获得它的唯一其他方法是使用Brownie的API并调用compiler.generate_input_json()。
因为这是一个简单的项目,只有一个合同,并且没有很深的依赖关系,所以您可能更容易遵循@Jacopo莫斯科科尼的回答,并通过直接粘贴到主合同中的所有源替换所有的进口产品,从而使合同变得“扁平”。您还可以尝试将文件复制到项目dir并更改导入,以便它只包含文件名,而不包含任何路径组件--这可能通过多文件验证。最终,Brownie和许多其他框架是如何进行验证的,而Etherscan的检查不够严格,允许以这种方式修改源代码--它只检查字节码,因此即使完全更改了导入结构、名称、注释,甚至任何被优化器删除的代码,也仍然可以进行验证。
发布于 2021-10-10 17:38:26
编译器找不到ISwapRouter.sol
您可以将ISwapRouter.sol的代码直接添加到您的swap.sol上,并将该行从代码中分离出来,这是代码https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol
https://stackoverflow.com/questions/69504959
复制相似问题