当我使用与标准编译器版本不同的 evm 版本时,我在使用 Etherscan API 验证合约时遇到问题。
详细来说,我正在使用 v0.8.21 进行编译,并针对巴黎(对于 L2)。
一旦我通过 API 提交验证,如下所示:
curl --location 'https://api-goerli.etherscan.io/api' \
--form 'apikey="<MY-API-KEY>"' \
--form 'module="contract"' \
--form 'action="verifysourcecode"' \
--form 'contractaddress="<MY-CONTRACT ADDRESS>"' \
--form 'sourceCode="// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
/**
* @title Storage
* @dev Store & retrieve value in a variable
*/
contract Storage {
uint256 number;
/**
* @dev Store value in variable
* @param num value to store
*/
function store(uint256 num) public {
number = num;
}
/**
* @dev Return value
* @return value of '\''number'\''
*/
function retrieve() public view returns (uint256){
return number;
}
}"' \
--form 'contractname="Storage"' \
--form 'compilerversion="v0.8.21+commit.d9974bed"' \
--form 'optimizationUsed="1"' \
--form 'runs="200"' \
--form 'constructorArguements=""' \
--form 'evmversion="paris"' \
--form 'licenseType="3"'
我收到以下错误:
Fail - Unable to verify. Compiled contract deployment bytecode does NOT match the transaction deployment bytecode.
如果我尝试使用此处的 API 演示,它也会失败 https://etherscan.io/sourcecode-demo.html
但是如果我从 etherscan 网站上的合约页面本身手动验证,它就可以工作。
我认为它没有通过 API 直接读取 `evmversion` 参数。
您有遇到过类似的问题吗?
--form 'compilerversion="<YOUR-COMPILER-VERSION>"'
如果您指定的版本与编译时使用的版本不同,则会出现此错误。
我使用版本
v0.8.18+commit.87f61d96
进行编译,并在标志中指定版本,它可以工作。
--form 'compilerversion="v0.8.18+commit.87f61d96"'