Merge pull request #3771 from ethereum/scriptUpdate2

update verify script to support proxy contract verification
pull/3671/head^2
yann300 1 year ago committed by GitHub
commit c9356c38d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      apps/etherscan/src/app/RemixPlugin.tsx
  2. 13
      apps/etherscan/src/app/utils/scripts.ts
  3. 8
      apps/remix-ide/src/app/tabs/locales/en/filePanel.json
  4. 8
      apps/remix-ide/src/app/tabs/locales/es/filePanel.json
  5. 8
      apps/remix-ide/src/app/tabs/locales/fr/filePanel.json
  6. 8
      apps/remix-ide/src/app/tabs/locales/zh/filePanel.json
  7. 9
      libs/remix-ui/workspace/src/lib/scripts/etherscan/receiptGuidScript.ts
  8. 14
      libs/remix-ui/workspace/src/lib/scripts/etherscan/verifyScript.ts

@ -1,6 +1,6 @@
import { PluginClient } from '@remixproject/plugin'; import { PluginClient } from '@remixproject/plugin';
import { verify, EtherScanReturn } from './utils/verify'; import { verify, EtherScanReturn } from './utils/verify';
import { getReceiptStatus, getEtherScanApi, getNetworkName } from './utils'; import { getReceiptStatus, getEtherScanApi, getNetworkName, getProxyContractReceiptStatus } from './utils';
export class RemixClient extends PluginClient { export class RemixClient extends PluginClient {
@ -8,20 +8,23 @@ export class RemixClient extends PluginClient {
return this.onload() return this.onload()
} }
async verify (apiKey: string, contractAddress: string, contractArguments: string, contractName: string, compilationResultParam: any) { async verify (apiKey: string, contractAddress: string, contractArguments: string, contractName: string, compilationResultParam: any, chainRef?: number | string, isProxyContract?: boolean, expectedImplAddress?: string) {
const result = await verify(apiKey, contractAddress, contractArguments, contractName, compilationResultParam, null, false, null, this, const result = await verify(apiKey, contractAddress, contractArguments, contractName, compilationResultParam, chainRef, isProxyContract, expectedImplAddress, this,
(value: EtherScanReturn) => {}, (value: string) => {}) (value: EtherScanReturn) => {}, (value: string) => {})
return result return result
} }
async receiptStatus (receiptGuid: string, apiKey: string) { async receiptStatus (receiptGuid: string, apiKey: string, isProxyContract: boolean) {
try { try {
const { network, networkId } = await getNetworkName(this) const { network, networkId } = await getNetworkName(this)
if (network === "vm") { if (network === "vm") {
throw new Error("Cannot check the receipt status in the selected network") throw new Error("Cannot check the receipt status in the selected network")
} }
const etherscanApi = getEtherScanApi(networkId) const etherscanApi = getEtherScanApi(networkId)
const receiptStatus = await getReceiptStatus(receiptGuid, apiKey, etherscanApi) let receiptStatus
if (isProxyContract) receiptStatus = await getProxyContractReceiptStatus(receiptGuid, apiKey, etherscanApi)
else receiptStatus = await getReceiptStatus(receiptGuid, apiKey, etherscanApi)
return { return {
message: receiptStatus.result, message: receiptStatus.result,
succeed: receiptStatus.status === '0' ? false : true succeed: receiptStatus.status === '0' ? false : true

@ -5,23 +5,26 @@ export const verifyScript = `
* @param {string} contractArguments - Parameters used in the contract constructor during the initial deployment. It should be the hex encoded value * @param {string} contractArguments - Parameters used in the contract constructor during the initial deployment. It should be the hex encoded value
* @param {string} contractName - Name of the contract * @param {string} contractName - Name of the contract
* @param {string} contractFile - File where the contract is located * @param {string} contractFile - File where the contract is located
* @param {number | string} chainRef - Network chain id or API URL * @param {number | string} chainRef - Network chain id or API URL (optional)
* @param {boolean} isProxyContract - true, if contract is a proxy contract (optional)
* @param {string} expectedImplAddress - Implementation contract address, in case of proxy contract verification (optional)
* @returns {{ guid, status, message, succeed }} verification result * @returns {{ guid, status, message, succeed }} verification result
*/ */
export const verify = async (apikey: string, contractAddress: string, contractArguments: string, contractName: string, contractFile: string, chainRef: number | string) => { export const verify = async (apikey: string, contractAddress: string, contractArguments: string, contractName: string, contractFile: string, chainRef?: number | string, isProxyContract?: boolean, expectedImplAddress?: string) => {
const compilationResultParam = await remix.call('compilerArtefacts' as any, 'getCompilerAbstract', contractFile) const compilationResultParam = await remix.call('compilerArtefacts' as any, 'getCompilerAbstract', contractFile)
console.log('verifying.. ' + contractName) console.log('verifying.. ' + contractName)
// update apiKey and chainRef to verify contract on multiple networks // update apiKey and chainRef to verify contract on multiple networks
return await remix.call('etherscan' as any, 'verify', apikey, contractAddress, contractArguments, contractName, compilationResultParam, chainRef) return await remix.call('etherscan' as any, 'verify', apikey, contractAddress, contractArguments, contractName, compilationResultParam, chainRef, isProxyContract, expectedImplAddress)
}` }`
export const receiptGuidScript = ` export const receiptGuidScript = `
/** /**
* @param {string} apikey - etherscan api key * @param {string} apikey - etherscan api key
* @param {string} guid - receipt id * @param {string} guid - receipt id
* @param {boolean} isProxyContract - true, if contract is a proxy contract (optional)
* @returns {{ status, message, succeed }} receiptStatus * @returns {{ status, message, succeed }} receiptStatus
*/ */
export const receiptStatus = async (apikey: string, guid: string) => { export const receiptStatus = async (apikey: string, guid: string, isProxyContract?: boolean) => {
return await remix.call('etherscan' as any, 'receiptStatus', guid, apikey) return await remix.call('etherscan' as any, 'receiptStatus', guid, apikey, isProxyContract)
} }
` `

@ -27,10 +27,10 @@
"filePanel.solghaction": "Solidity Test Workflow", "filePanel.solghaction": "Solidity Test Workflow",
"filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI", "filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI",
"filePanel.tssoltestghaction": "Mocha Chai Test Workflow", "filePanel.tssoltestghaction": "Mocha Chai Test Workflow",
"filePanel.workspace.addscriptetherscan": "Adds a scripts which can be used to interact with the etherscan API.", "filePanel.workspace.addscriptetherscan": "Adds scripts which can be used to interact with the Etherscan API",
"filePanel.addscriptetherscan": "Add Etherscan script", "filePanel.addscriptetherscan": "Add Etherscan scripts",
"filePanel.workspace.addscriptdeployer": "Adds a scripts which can be used to deploy contracts.", "filePanel.workspace.addscriptdeployer": "Adds scripts which can be used to deploy contracts",
"filePanel.addscriptdeployer": "Add Contract deployer script", "filePanel.addscriptdeployer": "Add contract deployer scripts",
"filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI", "filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI",
"filePanel.slitherghaction": "Slither Workflow", "filePanel.slitherghaction": "Slither Workflow",
"filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory", "filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory",

@ -27,10 +27,10 @@
"filePanel.solghaction": "Solidity Test Workflow", "filePanel.solghaction": "Solidity Test Workflow",
"filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI", "filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI",
"filePanel.tssoltestghaction": "Mocha Chai Test Workflow", "filePanel.tssoltestghaction": "Mocha Chai Test Workflow",
"filePanel.workspace.addscriptetherscan": "Adds a scripts which can be used to interact with the etherscan API.", "filePanel.workspace.addscriptetherscan": "Adds scripts which can be used to interact with the Etherscan API",
"filePanel.addscriptetherscan": "Add Etherscan script", "filePanel.addscriptetherscan": "Add Etherscan scripts",
"filePanel.workspace.addscriptdeployer": "Adds a scripts which can be used to deploy contracts.", "filePanel.workspace.addscriptdeployer": "Adds scripts which can be used to deploy contracts",
"filePanel.addscriptdeployer": "Add Contract deployer script", "filePanel.addscriptdeployer": "Add contract deployer scripts",
"filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI", "filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI",
"filePanel.slitherghaction": "Slither Workflow", "filePanel.slitherghaction": "Slither Workflow",
"filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory", "filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory",

@ -27,10 +27,10 @@
"filePanel.solghaction": "Solidity Test Workflow", "filePanel.solghaction": "Solidity Test Workflow",
"filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI", "filePanel.workspace.tssoltestghaction": "Adds a preset yml file to run mocha and chai tests for solidity on github actions CI",
"filePanel.tssoltestghaction": "Mocha Chai Test Workflow", "filePanel.tssoltestghaction": "Mocha Chai Test Workflow",
"filePanel.workspace.addscriptetherscan": "Adds a scripts which can be used to interact with the etherscan API.", "filePanel.workspace.addscriptetherscan": "Adds scripts which can be used to interact with the Etherscan API",
"filePanel.addscriptetherscan": "Add Etherscan script", "filePanel.addscriptetherscan": "Add Etherscan scripts",
"filePanel.workspace.addscriptdeployer": "Adds a scripts which can be used to deploy contracts.", "filePanel.workspace.addscriptdeployer": "Adds scripts which can be used to deploy contracts",
"filePanel.addscriptdeployer": "Add Contract deployer script", "filePanel.addscriptdeployer": "Add contract deployer scripts",
"filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI", "filePanel.workspace.slitherghaction": "Adds a preset yml file to run slither analysis on github actions CI",
"filePanel.slitherghaction": "Slither Workflow", "filePanel.slitherghaction": "Slither Workflow",
"filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory", "filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory",

@ -27,10 +27,10 @@
"filePanel.solghaction": "Solidity 测试工作流", "filePanel.solghaction": "Solidity 测试工作流",
"filePanel.workspace.tssoltestghaction": "添加一个预设的 yml 文件,这样就可以在 github actions CI 上为 solidity 运行 mocha 和 chai 测试", "filePanel.workspace.tssoltestghaction": "添加一个预设的 yml 文件,这样就可以在 github actions CI 上为 solidity 运行 mocha 和 chai 测试",
"filePanel.tssoltestghaction": "Mocha Chai 测试工作流", "filePanel.tssoltestghaction": "Mocha Chai 测试工作流",
"filePanel.workspace.addscriptetherscan": "Adds a scripts which can be used to interact with the etherscan API.", "filePanel.workspace.addscriptetherscan": "Adds scripts which can be used to interact with the Etherscan API",
"filePanel.addscriptetherscan": "Add Etherscan script", "filePanel.addscriptetherscan": "Add Etherscan scripts",
"filePanel.workspace.addscriptdeployer": "Adds a scripts which can be used to deploy contracts.", "filePanel.workspace.addscriptdeployer": "Adds scripts which can be used to deploy contracts",
"filePanel.addscriptdeployer": "Add Contract deployer script", "filePanel.addscriptdeployer": "Add contract deployer scripts",
"filePanel.workspace.slitherghaction": "添加一个预设的 yml 文件,这样就可以在 github actions CI 上运行 slither 分析", "filePanel.workspace.slitherghaction": "添加一个预设的 yml 文件,这样就可以在 github actions CI 上运行 slither 分析",
"filePanel.slitherghaction": "Slither 工作流", "filePanel.slitherghaction": "Slither 工作流",
"filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory", "filePanel.workspace.helperscripts": "Adds convenient scripts to the 'scripts' directory",

@ -1,8 +1,9 @@
/** /**
* @param {string} apikey - etherscan api key. * @param {string} apikey - etherscan api key
* @param {string} guid - receipt id. * @param {string} guid - receipt id
* @param {boolean} isProxyContract - true, if contract is a proxy contract (optional)
* @returns {{ status, message, succeed }} receiptStatus * @returns {{ status, message, succeed }} receiptStatus
*/ */
export const receiptStatus = async (apikey: string, guid: string) => { export const receiptStatus = async (apikey: string, guid: string, isProxyContract?: boolean) => {
return await remix.call('etherscan' as any, 'receiptStatus', guid, apikey) return await remix.call('etherscan' as any, 'receiptStatus', guid, apikey, isProxyContract)
} }

@ -1,13 +1,17 @@
/** /**
* @param {string} apikey - etherscan api key. * @param {string} apikey - etherscan api key
* @param {string} contractAddress - Address of the contract to verify. * @param {string} contractAddress - Address of the contract to verify
* @param {string} contractArguments - Parameters used in the contract constructor during the initial deployment. It should be the hex encoded value. * @param {string} contractArguments - Parameters used in the contract constructor during the initial deployment. It should be the hex encoded value
* @param {string} contractName - Name of the contract * @param {string} contractName - Name of the contract
* @param {string} contractFile - File where the contract is located * @param {string} contractFile - File where the contract is located
* @param {number | string} chainRef - Network chain id or API URL (optional)
* @param {boolean} isProxyContract - true, if contract is a proxy contract (optional)
* @param {string} expectedImplAddress - Implementation contract address, in case of proxy contract verification (optional)
* @returns {{ guid, status, message, succeed }} verification result * @returns {{ guid, status, message, succeed }} verification result
*/ */
export const verify = async (apikey: string, contractAddress: string, contractArguments: string, contractName: string, contractFile: string) => { export const verify = async (apikey: string, contractAddress: string, contractArguments: string, contractName: string, contractFile: string, chainRef?: number | string, isProxyContract?: boolean, expectedImplAddress?: string) => {
const compilationResultParam = await remix.call('compilerArtefacts' as any, 'getCompilerAbstract', contractFile) const compilationResultParam = await remix.call('compilerArtefacts' as any, 'getCompilerAbstract', contractFile)
console.log('verifying.. ' + contractName) console.log('verifying.. ' + contractName)
return await remix.call('etherscan' as any, 'verify', apikey, contractAddress, contractArguments, contractName, compilationResultParam) // update apiKey and chainRef to verify contract on multiple networks
return await remix.call('etherscan' as any, 'verify', apikey, contractAddress, contractArguments, contractName, compilationResultParam, chainRef, isProxyContract, expectedImplAddress)
} }
Loading…
Cancel
Save