diff --git a/hardhat.config.ts b/hardhat.config.ts index 75a1d05f6..c50f7fb7c 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,5 +1,8 @@ -require("@nomiclabs/hardhat-waffle"); -require("@nomiclabs/hardhat-etherscan"); +import "@nomiclabs/hardhat-waffle"; +import "@nomiclabs/hardhat-etherscan"; +import "@nomiclabs/hardhat-ethers"; +import "./tasks/compileOne"; +import "./tasks/verify"; require("dotenv").config(); @@ -33,7 +36,9 @@ module.exports = { }, etherscan: { // Your API key for Snowtrace - apiKey: process.env.SNOWTRACE_KEY, + apiKey: { + avalanche: process.env.SNOWTRACE_KEY, + }, }, solidity: { compilers: [ diff --git a/tasks/compileOne.ts b/tasks/compileOne.ts new file mode 100644 index 000000000..179fc2416 --- /dev/null +++ b/tasks/compileOne.ts @@ -0,0 +1,44 @@ +import { task } from "hardhat/config"; +import { + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, + TASK_COMPILE_SOLIDITY_COMPILE_JOB +} from "hardhat/builtin-tasks/task-names"; + +import * as taskTypes from "hardhat/types/builtin-tasks"; + +task("compileOne", "Compiles a single contract in isolation") + .addPositionalParam("contractName") + .setAction(async function(args, env) { + + const sourceName = env.artifacts.readArtifactSync(args.contractName).sourceName; + + const dependencyGraph: taskTypes.DependencyGraph = await env.run( + TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, + { sourceNames: [sourceName] } + ); + + const resolvedFiles = dependencyGraph + .getResolvedFiles() + .filter(resolvedFile => { + return resolvedFile.sourceName === sourceName; + }); + + const compilationJob: taskTypes.CompilationJob = await env.run( + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + { + dependencyGraph, + file: resolvedFiles[0], + } + ); + + await env.run(TASK_COMPILE_SOLIDITY_COMPILE_JOB, { + compilationJob, + compilationJobs: [compilationJob], + compilationJobIndex: 0, + emitsArtifacts: true, + quiet: true, + }); + + //await env.run("typechain"); +}); diff --git a/tasks/verify.ts b/tasks/verify.ts new file mode 100644 index 000000000..1fe0dbd37 --- /dev/null +++ b/tasks/verify.ts @@ -0,0 +1,48 @@ +// Runtime Environment's members available in the global scope. +import { task } from "hardhat/config"; + +task("verifyOne", "veryify a single contract from a fresh deployment") + .addPositionalParam("address") + .addPositionalParam("contractName") + .addPositionalParam("file") + .setAction(async function(args, hre) { + + let contract_name: string + let address: string + let file: string + let constructor_args: string[] + let constructor_arg_values: string[] = [] + + address = args.address; + contract_name = args.contractName; + file = args.file; + + // set constructor arguements + if (contract_name.startsWith('SnowGlobe')) { + constructor_args = ['token', 'governance', 'timelock', 'controller'] + } else if (contract_name.startsWith('Strategy')) { + constructor_args = ['governance', 'strategist', 'controller', 'timelock' ] + } else if (contract_name.startsWith('Gauge')) { + constructor_args = [ 'TOKEN', 'governance'] + } else if (contract_name.endsWith('Controller')) { + constructor_args = [ 'governance', 'strategist', 'timelock', 'devfund', 'treasury'] + } else { + console.log("unsupported contract type verification : ", contract_name); + return; + } + + // get current values from address + const [signer] = await hre.ethers.getSigners(); + const factory = await hre.ethers.getContractFactory(contract_name); + const contract = await factory.attach(address); + for (let f in constructor_args) { + constructor_arg_values.push( (await contract.functions[constructor_args[f]]()).toString() ) + } + + // attempt to verify + await hre.run("verify:verify", { + address: address, + contract: `${file}:${contract_name}`, + constructorArguments: constructor_arg_values, + }); +});