From 8ddd3e4c24cf2f3c8e9e5777673a9841910c1f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 10:10:58 +0200 Subject: [PATCH 01/10] Use @nomiclabs/hardhat-etherscan for Etherscan verification @nomiclabs/hardhat-etherscan exposes verification functions for Etherscan that are recommended by the hardhat team. See https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-etherscan Previously we were using `etherscan-verify` from `hardhat-deploy` plugin, which had problems with verification of some contracts. Note: We introduce temporary changes helping with testing of the new verification method. They will be removed before merge to `main`. --- .github/workflows/contracts.yaml | 143 +++++++++-------------- deploy/01_deploy_t.ts | 6 +- deploy/03_deploy_vending_machine_keep.ts | 4 + deploy/04_deploy_vending_machine_nu.ts | 4 + deploy/06_deploy_keep_stake.ts | 6 +- deploy/07_deploy_token_staking.ts | 6 +- deploy/30_deploy_tokenholder_timelock.ts | 6 +- deploy/31_deploy_tokenholder_governor.ts | 6 +- hardhat.config.ts | 5 +- package.json | 3 +- yarn.lock | 89 +++++++++++++- 11 files changed, 174 insertions(+), 104 deletions(-) diff --git a/.github/workflows/contracts.yaml b/.github/workflows/contracts.yaml index 829ede66..99c8d7ce 100644 --- a/.github/workflows/contracts.yaml +++ b/.github/workflows/contracts.yaml @@ -52,50 +52,51 @@ jobs: - './contracts/staking/**' - './test/system/**' - contracts-build-and-test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: "14.x" - cache: "yarn" - - - name: Install dependencies - run: yarn install - - - name: Build contracts - run: yarn build - - - name: Run tests - if: github.ref != 'refs/heads/dapp-development' - run: yarn test - - contracts-system-tests: - needs: contracts-detect-changes - if: | - needs.contracts-detect-changes.outputs.system-tests == 'true' - && github.ref != 'refs/heads/dapp-development' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: "14.x" - cache: "yarn" - - - name: Install dependencies - run: yarn install - - - name: Build contracts - run: yarn build - - - name: Run system tests - env: - FORKING_URL: ${{ secrets.MAINNET_ETH_HOSTNAME_HTTP }} - run: yarn test:system +# TODO: Uncomment before merge to `main` + # contracts-build-and-test: + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v3 + + # - uses: actions/setup-node@v3 + # with: + # node-version: "14.x" + # cache: "yarn" + + # - name: Install dependencies + # run: yarn install + + # - name: Build contracts + # run: yarn build + + # - name: Run tests + # if: github.ref != 'refs/heads/dapp-development' + # run: yarn test + + # contracts-system-tests: + # needs: contracts-detect-changes + # if: | + # needs.contracts-detect-changes.outputs.system-tests == 'true' + # && github.ref != 'refs/heads/dapp-development' + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v3 + + # - uses: actions/setup-node@v3 + # with: + # node-version: "14.x" + # cache: "yarn" + + # - name: Install dependencies + # run: yarn install + + # - name: Build contracts + # run: yarn build + + # - name: Run system tests + # env: + # FORKING_URL: ${{ secrets.MAINNET_ETH_HOSTNAME_HTTP }} + # run: yarn test:system contracts-deployment-dry-run: runs-on: ubuntu-latest @@ -114,7 +115,8 @@ jobs: run: yarn deploy contracts-deployment-testnet: - needs: [contracts-build-and-test] + # TODO: Uncomment before merge to `main` + # needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' && github.ref != 'refs/heads/dapp-development' @@ -144,6 +146,7 @@ jobs: CHAIN_API_URL: ${{ secrets.GOERLI_ETH_HOSTNAME_HTTP }} CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY: ${{ secrets.GOERLI_ETH_CONTRACT_OWNER_PRIVATE_KEY }} KEEP_CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY: ${{ secrets.GOERLI_KEEP_ETH_CONTRACT_OWNER_PRIVATE_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} run: yarn deploy --network ${{ github.event.inputs.environment }} - name: Bump up package version @@ -157,7 +160,8 @@ jobs: - name: Publish to npm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npm publish --access=public --network=${{ github.event.inputs.environment }} --tag ${{ github.event.inputs.environment }} + # TODO: Remove `--dry-run` before merge to `main` + run: npm publish --access=public --network=${{ github.event.inputs.environment }} --tag ${{ github.event.inputs.environment }} --dry-run - name: Notify CI about completion of the workflow uses: keep-network/ci/actions/notify-workflow-completed@v2 @@ -171,55 +175,13 @@ jobs: upstream_ref: ${{ github.event.inputs.upstream_ref }} version: ${{ steps.npm-version-bump.outputs.version }} - - name: Upload files needed for etherscan verification - uses: actions/upload-artifact@v3 - with: - name: Artifacts for etherscan verifcation - path: | - ./deployments - ./package.json - ./yarn.lock - - contracts-etherscan-verification: - needs: [contracts-deployment-testnet] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Download files needed for etherscan verification - uses: actions/download-artifact@v3 - with: - name: Artifacts for etherscan verifcation - - - uses: actions/setup-node@v3 - with: - node-version: "14.x" - cache: "yarn" - - - name: Install needed dependencies - run: yarn install --frozen-lockfile - - # If we don't remove the `keep-core` contracts from `node-modules`, the - # `etherscan-verify` plugins tries to verify them, which is not desired. - - name: Prepare for verification on Etherscan - run: | - rm -rf ./node_modules/@keep-network/keep-core - rm -rf ./external/npm - - - name: Verify contracts on Etherscan - env: - ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} - CHAIN_API_URL: ${{ secrets.GOERLI_ETH_HOSTNAME_HTTP }} - run: | - yarn run hardhat --network ${{ github.event.inputs.environment }} \ - etherscan-verify --license GPL-3.0 --force-license - # This job is responsible for publishing packages from `dapp-development` # branch, which are slightly modified to help with the process of testing some # features on the Threshold Token dApp. The job starts only if workflow gets # triggered by the `workflow_dispatch` event on the branch `dapp-development`. contracts-dapp-development-deployment-testnet: - needs: [contracts-build-and-test] + # TODO: Uncomment before merge to `main` + # needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/dapp-development' @@ -244,6 +206,7 @@ jobs: CHAIN_API_URL: ${{ secrets.GOERLI_ETH_HOSTNAME_HTTP }} CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY: ${{ secrets.DAPP_DEV_GOERLI_ETH_CONTRACT_OWNER_PRIVATE_KEY }} KEEP_CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY: ${{ secrets.GOERLI_KEEP_ETH_CONTRACT_OWNER_PRIVATE_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} run: yarn deploy --network ${{ github.event.inputs.environment }} - name: Bump up package version diff --git a/deploy/01_deploy_t.ts b/deploy/01_deploy_t.ts index 32314b8b..7cfdd46a 100644 --- a/deploy/01_deploy_t.ts +++ b/deploy/01_deploy_t.ts @@ -2,7 +2,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types" import { DeployFunction } from "hardhat-deploy/types" const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { getNamedAccounts, deployments } = hre + const { getNamedAccounts, deployments, helpers } = hre const { deployer } = await getNamedAccounts() const T = await deployments.deploy("T", { @@ -10,6 +10,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(T) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "T", diff --git a/deploy/03_deploy_vending_machine_keep.ts b/deploy/03_deploy_vending_machine_keep.ts index 1fea3b26..4b3689c9 100644 --- a/deploy/03_deploy_vending_machine_keep.ts +++ b/deploy/03_deploy_vending_machine_keep.ts @@ -29,6 +29,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(vendingMachine) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "VendingMachineKeep", diff --git a/deploy/04_deploy_vending_machine_nu.ts b/deploy/04_deploy_vending_machine_nu.ts index 7fb178b3..c94ef537 100644 --- a/deploy/04_deploy_vending_machine_nu.ts +++ b/deploy/04_deploy_vending_machine_nu.ts @@ -25,6 +25,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(vendingMachine) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "VendingMachineNuCypher", diff --git a/deploy/06_deploy_keep_stake.ts b/deploy/06_deploy_keep_stake.ts index 83599291..d5623262 100644 --- a/deploy/06_deploy_keep_stake.ts +++ b/deploy/06_deploy_keep_stake.ts @@ -2,7 +2,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types" import { DeployFunction } from "hardhat-deploy/types" const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { getNamedAccounts, deployments } = hre + const { getNamedAccounts, deployments, helpers } = hre const { deployer } = await getNamedAccounts() const KeepTokenStaking = await deployments.get("KeepTokenStaking") @@ -13,6 +13,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(KeepStake) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "KeepStake", diff --git a/deploy/07_deploy_token_staking.ts b/deploy/07_deploy_token_staking.ts index 0f0c084a..c98e8840 100644 --- a/deploy/07_deploy_token_staking.ts +++ b/deploy/07_deploy_token_staking.ts @@ -4,7 +4,7 @@ import { DeployFunction } from "hardhat-deploy/types" import { ethers, upgrades } from "hardhat" const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { getNamedAccounts, deployments } = hre + const { getNamedAccounts, deployments, helpers } = hre const { execute, log } = deployments const { deployer } = await getNamedAccounts() @@ -69,6 +69,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await execute("TokenStaking", { from: deployer }, "initialize") log("Initialized TokenStaking.") + + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(TokenStaking) + } } if (hre.network.tags.tenderly) { diff --git a/deploy/30_deploy_tokenholder_timelock.ts b/deploy/30_deploy_tokenholder_timelock.ts index 9d15fc59..a426479c 100644 --- a/deploy/30_deploy_tokenholder_timelock.ts +++ b/deploy/30_deploy_tokenholder_timelock.ts @@ -7,7 +7,7 @@ import { DeployFunction } from "hardhat-deploy/types" import { ethers } from "ethers" const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { getNamedAccounts, deployments } = hre + const { getNamedAccounts, deployments, helpers } = hre const { deployer } = await getNamedAccounts() const proposers = [] @@ -21,6 +21,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(timelock) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "TokenholderTimelock", diff --git a/deploy/31_deploy_tokenholder_governor.ts b/deploy/31_deploy_tokenholder_governor.ts index fb02389d..7ea43b30 100644 --- a/deploy/31_deploy_tokenholder_governor.ts +++ b/deploy/31_deploy_tokenholder_governor.ts @@ -2,7 +2,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types" import { DeployFunction } from "hardhat-deploy/types" const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { getNamedAccounts, deployments } = hre + const { getNamedAccounts, deployments, helpers } = hre const { deployer, thresholdCouncil } = await getNamedAccounts() // TODO: fail if thresholdCouncil is undefined on mainnet @@ -23,6 +23,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log: true, }) + if (hre.network.tags.etherscan) { + await helpers.etherscan.verify(timelock) + } + if (hre.network.tags.tenderly) { await hre.tenderly.verify({ name: "TokenholderGovernor", diff --git a/hardhat.config.ts b/hardhat.config.ts index 350ca43c..66695250 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,5 +1,6 @@ import { HardhatUserConfig } from "hardhat/config" +import "@nomiclabs/hardhat-etherscan" import "@keep-network/hardhat-helpers" import "@nomiclabs/hardhat-waffle" import "@openzeppelin/hardhat-upgrades" @@ -54,7 +55,7 @@ const config: HardhatUserConfig = { process.env.KEEP_CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY, ] : undefined, - tags: ["tenderly"], + tags: ["etherscan", "tenderly"], }, rinkeby: { url: process.env.CHAIN_API_URL || "", @@ -81,7 +82,7 @@ const config: HardhatUserConfig = { accounts: process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY ? [process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY] : undefined, - tags: ["tenderly"], + tags: ["etherscan", "tenderly"], }, }, tenderly: { diff --git a/package.json b/package.json index aeae012d..9f6cd6ad 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,10 @@ "prepublishOnly": "hardhat prepare-artifacts --network $npm_config_network" }, "devDependencies": { - "@keep-network/hardhat-helpers": "^0.6.0-pre.8", + "@keep-network/hardhat-helpers": "^0.6.0-pre.16", "@keep-network/prettier-config-keep": "github:keep-network/prettier-config-keep#d6ec02e", "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.1", "@openzeppelin/hardhat-upgrades": "^1.12.0", "@tenderly/hardhat-tenderly": "^1.0.12", diff --git a/yarn.lock b/yarn.lock index c2408755..5cbb2455 100644 --- a/yarn.lock +++ b/yarn.lock @@ -336,6 +336,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" +"@ethersproject/address@^5.0.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" @@ -384,6 +395,15 @@ "@ethersproject/logger" "^5.6.0" bn.js "^5.2.1" +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + "@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" @@ -398,6 +418,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" @@ -562,6 +589,14 @@ "@ethersproject/bytes" "^5.6.1" js-sha3 "0.8.0" +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + "@ethersproject/logger@5.5.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" @@ -572,6 +607,11 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + "@ethersproject/networks@5.5.2", "@ethersproject/networks@^5.5.0": version "5.5.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" @@ -699,6 +739,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" @@ -931,10 +979,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@keep-network/hardhat-helpers@^0.6.0-pre.8": - version "0.6.0-pre.8" - resolved "https://registry.yarnpkg.com/@keep-network/hardhat-helpers/-/hardhat-helpers-0.6.0-pre.8.tgz#6e0722889a0132dabed5182fb32f6424ff4a77d0" - integrity sha512-51oLHceBubutBYxfVk2pLjgyhvpcDC1ahKM3V9lOiTa9lbWyY18Dza7rnM9V04kq+8DbweQRM0M9/f+K26nl9g== +"@keep-network/hardhat-helpers@^0.6.0-pre.16": + version "0.6.0-pre.16" + resolved "https://registry.yarnpkg.com/@keep-network/hardhat-helpers/-/hardhat-helpers-0.6.0-pre.16.tgz#a610d44592393d054176857a0b8db37f33d85da5" + integrity sha512-wt9ot3/Bhb2E6hTCQLKzpHM7G8iHITxaBgGJVdR/hn4W0LfETvc7vSyb7SlT8vW+tAX4NfXxW7rLq7AxI8hC/A== "@keep-network/keep-core@>1.8.1-dev <1.8.1-goerli": version "1.8.1-dev.0" @@ -978,6 +1026,22 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" integrity sha512-A2gZAGB6kUvLx+kzM92HKuUF33F1FSe90L0TmkXkT2Hh0OKRpvWZURUSU2nghD2yC4DzfEZ3DftfeHGvZ2JTUw== +"@nomiclabs/hardhat-etherscan@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" + integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^5.0.2" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash "^4.17.11" + semver "^6.3.0" + table "^6.8.0" + undici "^5.4.0" + "@nomiclabs/hardhat-waffle@^2.0.1": version "2.0.2" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.2.tgz#6030aa6fd9ea05327bf79d1107356af906d8b1e4" @@ -2437,6 +2501,11 @@ bignumber.js@^9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== +bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2840,6 +2909,14 @@ cbor@^4.1.5: json-text-sequence "^0.1" nofilter "^1.0.3" +cbor@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== + dependencies: + bignumber.js "^9.0.1" + nofilter "^1.0.4" + cbor@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" @@ -7367,7 +7444,7 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== -nofilter@^1.0.3: +nofilter@^1.0.3, nofilter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== @@ -9337,7 +9414,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.9: +table@^6.0.9, table@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== From 10066980a19bab1dae0ed66e4dcfb0aff5074c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 11:10:06 +0200 Subject: [PATCH 02/10] Upgrade `hardhat-deploy` to `0.11.15` version Previously used `0.9.29` version was causing conflicts with the `@nomiclabs/hardhat-etherscan` plugin (`Property 'etherscan' must be of type 'EtherscanUserConfig', but here has type '{ apiKey?: string; }'` during `npm pubish`). According to https://github.com/wighawag/hardhat-deploy/issues/257 upgrading `hardhat-deploy` to version `0.10.0` or higher should fix the issue. --- package.json | 2 +- yarn.lock | 50 +++++++++++++++++++++++--------------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 9f6cd6ad..14ac820b 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "ethers": "^5.5.3", "hardhat": "^2.8.3", "hardhat-contract-sizer": "^2.5.0", - "hardhat-deploy": "^0.9.27", + "hardhat-deploy": "^0.11.15", "hardhat-gas-reporter": "^1.0.6", "prettier": "^2.3.2", "prettier-plugin-sh": "^0.7.1", diff --git a/yarn.lock b/yarn.lock index 5cbb2455..638370ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -236,7 +236,7 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": +"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== @@ -292,7 +292,7 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/web" "^5.6.1" -"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0": +"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== @@ -314,7 +314,7 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0": +"@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== @@ -377,7 +377,7 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/properties" "^5.6.0" -"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.5.0": +"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== @@ -404,7 +404,7 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0": +"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== @@ -425,7 +425,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0": +"@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== @@ -439,7 +439,7 @@ dependencies: "@ethersproject/bignumber" "^5.6.2" -"@ethersproject/contracts@5.5.0", "@ethersproject/contracts@^5.4.1": +"@ethersproject/contracts@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== @@ -656,7 +656,7 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/providers@5.5.3", "@ethersproject/providers@^5.4.4": +"@ethersproject/providers@5.5.3": version "5.5.3" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.3.tgz#56c2b070542ac44eb5de2ed3cf6784acd60a3130" integrity sha512-ZHXxXXXWHuwCQKrgdpIkbzMNJMvs+9YWemanwp1fA7XZEv7QlilseysPvQe0D7Q7DlkJX/w/bGA1MdgK2TbGvA== @@ -789,7 +789,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.5.0", "@ethersproject/solidity@^5.4.0": +"@ethersproject/solidity@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== @@ -831,7 +831,7 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.5.0": +"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== @@ -879,7 +879,7 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/wallet@5.5.0", "@ethersproject/wallet@^5.4.0": +"@ethersproject/wallet@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== @@ -5504,33 +5504,24 @@ hardhat-contract-sizer@^2.5.0: chalk "^4.0.0" cli-table3 "^0.6.0" -hardhat-deploy@^0.9.27: - version "0.9.29" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.9.29.tgz#b1177d4f3077f335ad3f50c55825d9417ec75968" - integrity sha512-8tIGszPFmOaXtyloCbASiZPvoAgLNGGL/Ubys3YW/oj4dvoPa8G6YDyaOCdsAhsENZ+QgR280NFSG9JdN7SU9Q== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.1" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.1" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/contracts" "^5.4.1" - "@ethersproject/providers" "^5.4.4" - "@ethersproject/solidity" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wallet" "^5.4.0" +hardhat-deploy@^0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.15.tgz#5b5f6f762caa3c4d30e6e2800379ea7817a861b5" + integrity sha512-7e/GfVLmSXlcVePVFbC/xZ8mD97ChR6gHeUbejWMvzXpZ6I5bjSPZuaH5AebRRlb/6LjeIrN1+bKnayY0Sw9aA== + dependencies: "@types/qs" "^6.9.7" axios "^0.21.1" chalk "^4.1.2" chokidar "^3.5.2" debug "^4.3.2" enquirer "^2.3.6" + ethers "^5.5.3" form-data "^4.0.0" fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" + zksync-web3 "^0.8.1" hardhat-gas-reporter@^1.0.6: version "1.0.8" @@ -10899,3 +10890,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.8.1.tgz#db289d8f6caf61f4d5ddc471fa3448d93208dc14" + integrity sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw== From b6b55e2b4514dd65980a74db27e22b055a8a143b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 11:53:51 +0200 Subject: [PATCH 03/10] Add contract argument to `helpers.etherscan.verify` Without it, deployment/verification was throwing following message: ``` Verifying contract 0x... on Etherscan... Nothing to compile NomicLabsHardhatPluginError: More than one contract was found to match the deployed bytecode. Please use the contract parameter with one of the following contracts: * contracts/governance/BaseTokenholderGovernor.sol:BaseTokenholderGovernor * contracts/governance/TokenholderGovernor.sol:TokenholderGovernor * contracts/test/TestGovernorTestSet.sol:TestTokenholderGovernor For example: hardhat verify --contract contracts/Example.sol:ExampleContract If you are running the verify subtask from within Hardhat instead: await run("verify:verify", { , contract: "contracts/Example.sol:ExampleContract" }; ``` --- .github/workflows/contracts.yaml | 6 +++--- deploy/31_deploy_tokenholder_governor.ts | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/contracts.yaml b/.github/workflows/contracts.yaml index 99c8d7ce..13f1344c 100644 --- a/.github/workflows/contracts.yaml +++ b/.github/workflows/contracts.yaml @@ -52,7 +52,7 @@ jobs: - './contracts/staking/**' - './test/system/**' -# TODO: Uncomment before merge to `main` + # TODO: Uncomment before merge to `main` # contracts-build-and-test: # runs-on: ubuntu-latest # steps: @@ -115,7 +115,7 @@ jobs: run: yarn deploy contracts-deployment-testnet: - # TODO: Uncomment before merge to `main` + # TODO: Uncomment before merge to `main` # needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' @@ -180,7 +180,7 @@ jobs: # features on the Threshold Token dApp. The job starts only if workflow gets # triggered by the `workflow_dispatch` event on the branch `dapp-development`. contracts-dapp-development-deployment-testnet: - # TODO: Uncomment before merge to `main` + # TODO: Uncomment before merge to `main` # needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' diff --git a/deploy/31_deploy_tokenholder_governor.ts b/deploy/31_deploy_tokenholder_governor.ts index 7ea43b30..f7a30c28 100644 --- a/deploy/31_deploy_tokenholder_governor.ts +++ b/deploy/31_deploy_tokenholder_governor.ts @@ -24,7 +24,10 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { - await helpers.etherscan.verify(timelock) + await helpers.etherscan.verify( + timelock, + "contracts/governance/TokenholderGovernor.sol:TokenholderGovernor" + ) } if (hre.network.tags.tenderly) { From 619d4b63ca8af50919aa635c9fb71eee8a383034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 12:44:03 +0200 Subject: [PATCH 04/10] Wait for 5 confirmations before veryfing TokenholderGovernor Without the change, the deployment/verification was logging: ``` Verifying contract 0x... on Etherscan... Nothing to compile NomicLabsHardhatPluginError: Failed to send contract verification request. Endpoint URL: https://api-goerli.etherscan.io/api Reason: The Etherscan API responded that the address 0x... does not have bytecode. This can happen if the contract was recently deployed and this fact hasn't propagated to the backend yet. Try waiting for a minute before verifying your contract. If you are invoking this from a script, try to wait for five confirmations of your contract deployment transaction before running the verification subtask. ``` --- deploy/31_deploy_tokenholder_governor.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deploy/31_deploy_tokenholder_governor.ts b/deploy/31_deploy_tokenholder_governor.ts index f7a30c28..d14fcbcc 100644 --- a/deploy/31_deploy_tokenholder_governor.ts +++ b/deploy/31_deploy_tokenholder_governor.ts @@ -24,6 +24,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + timelock.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify( timelock, "contracts/governance/TokenholderGovernor.sol:TokenholderGovernor" From e3ba3539a9f0f1e33236cdf1e42ff0e00beefe0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 15:04:19 +0200 Subject: [PATCH 05/10] Remove temporary config --- .github/workflows/contracts.yaml | 98 +++++++++++++++----------------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/.github/workflows/contracts.yaml b/.github/workflows/contracts.yaml index 13f1344c..2b313663 100644 --- a/.github/workflows/contracts.yaml +++ b/.github/workflows/contracts.yaml @@ -52,51 +52,50 @@ jobs: - './contracts/staking/**' - './test/system/**' - # TODO: Uncomment before merge to `main` - # contracts-build-and-test: - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v3 - - # - uses: actions/setup-node@v3 - # with: - # node-version: "14.x" - # cache: "yarn" - - # - name: Install dependencies - # run: yarn install - - # - name: Build contracts - # run: yarn build - - # - name: Run tests - # if: github.ref != 'refs/heads/dapp-development' - # run: yarn test - - # contracts-system-tests: - # needs: contracts-detect-changes - # if: | - # needs.contracts-detect-changes.outputs.system-tests == 'true' - # && github.ref != 'refs/heads/dapp-development' - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v3 - - # - uses: actions/setup-node@v3 - # with: - # node-version: "14.x" - # cache: "yarn" - - # - name: Install dependencies - # run: yarn install - - # - name: Build contracts - # run: yarn build - - # - name: Run system tests - # env: - # FORKING_URL: ${{ secrets.MAINNET_ETH_HOSTNAME_HTTP }} - # run: yarn test:system + contracts-build-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version: "14.x" + cache: "yarn" + + - name: Install dependencies + run: yarn install + + - name: Build contracts + run: yarn build + + - name: Run tests + if: github.ref != 'refs/heads/dapp-development' + run: yarn test + + contracts-system-tests: + needs: contracts-detect-changes + if: | + needs.contracts-detect-changes.outputs.system-tests == 'true' + && github.ref != 'refs/heads/dapp-development' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version: "14.x" + cache: "yarn" + + - name: Install dependencies + run: yarn install + + - name: Build contracts + run: yarn build + + - name: Run system tests + env: + FORKING_URL: ${{ secrets.MAINNET_ETH_HOSTNAME_HTTP }} + run: yarn test:system contracts-deployment-dry-run: runs-on: ubuntu-latest @@ -115,8 +114,7 @@ jobs: run: yarn deploy contracts-deployment-testnet: - # TODO: Uncomment before merge to `main` - # needs: [contracts-build-and-test] + needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' && github.ref != 'refs/heads/dapp-development' @@ -160,8 +158,7 @@ jobs: - name: Publish to npm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - # TODO: Remove `--dry-run` before merge to `main` - run: npm publish --access=public --network=${{ github.event.inputs.environment }} --tag ${{ github.event.inputs.environment }} --dry-run + run: npm publish --access=public --network=${{ github.event.inputs.environment }} --tag ${{ github.event.inputs.environment }} - name: Notify CI about completion of the workflow uses: keep-network/ci/actions/notify-workflow-completed@v2 @@ -180,8 +177,7 @@ jobs: # features on the Threshold Token dApp. The job starts only if workflow gets # triggered by the `workflow_dispatch` event on the branch `dapp-development`. contracts-dapp-development-deployment-testnet: - # TODO: Uncomment before merge to `main` - # needs: [contracts-build-and-test] + needs: [contracts-build-and-test] if: | github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/dapp-development' From 8b16caccf06c5d7e4ff662b79fe9ceb4f3ed7757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Mon, 19 Sep 2022 15:11:49 +0200 Subject: [PATCH 06/10] No longer support Ropsten and Rinkeby testnets Both testnets are soon to be deprecated (https://blog.ethereum.org/2022/06/21/testnet-deprecation). We've transisioned to using Goerli testnet instead and we no longer need to have any code relating to Ropsten/Rinkeby. --- deploy/00_resolve_nucypher_staking_escrow.ts | 1 - deploy/00_resolve_nucypher_token.ts | 1 - hardhat.config.ts | 21 -------------------- 3 files changed, 23 deletions(-) diff --git a/deploy/00_resolve_nucypher_staking_escrow.ts b/deploy/00_resolve_nucypher_staking_escrow.ts index 53188089..b7e8da36 100644 --- a/deploy/00_resolve_nucypher_staking_escrow.ts +++ b/deploy/00_resolve_nucypher_staking_escrow.ts @@ -26,7 +26,6 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { } else if ( // TODO: For testnets currently we deploy a stub contract. We should consider // switching to an actual contract. - hre.network.name !== "ropsten" && hre.network.name !== "goerli" && (!hre.network.tags.allowStubs || (hre.network.config as HardhatNetworkConfig)?.forking?.enabled) diff --git a/deploy/00_resolve_nucypher_token.ts b/deploy/00_resolve_nucypher_token.ts index cc35e53f..90b5237a 100644 --- a/deploy/00_resolve_nucypher_token.ts +++ b/deploy/00_resolve_nucypher_token.ts @@ -21,7 +21,6 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { } else if ( // TODO: For testnets currently we deploy a stub contract. We should consider // switching to an actual contract. - hre.network.name !== "ropsten" && hre.network.name !== "goerli" && (!hre.network.tags.allowStubs || (hre.network.config as HardhatNetworkConfig)?.forking?.enabled) diff --git a/hardhat.config.ts b/hardhat.config.ts index 66695250..beb1df44 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -57,25 +57,6 @@ const config: HardhatUserConfig = { : undefined, tags: ["etherscan", "tenderly"], }, - rinkeby: { - url: process.env.CHAIN_API_URL || "", - chainId: 4, - accounts: process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY - ? [process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY] - : undefined, - tags: ["tenderly"], - }, - ropsten: { - url: process.env.CHAIN_API_URL || "", - chainId: 3, - accounts: process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY - ? [ - process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY, - process.env.KEEP_CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY, - ] - : undefined, - tags: ["tenderly"], - }, mainnet: { url: process.env.CHAIN_API_URL || "", chainId: 1, @@ -111,7 +92,6 @@ const config: HardhatUserConfig = { // with `yarn link` command, uncomment the line below to use the linked // dependencies. // development: ["external/npm/@keep-network/keep-core/artifacts"], - ropsten: ["external/npm/@keep-network/keep-core/artifacts"], goerli: ["external/npm/@keep-network/keep-core/artifacts"], mainnet: ["./external/mainnet"], }, @@ -127,7 +107,6 @@ const config: HardhatUserConfig = { }, keepRegistryKeeper: { default: 1, // same as the deployer - ropsten: "0x923C5Dbf353e99394A21Aa7B67F3327Ca111C67D", goerli: "0x68ad60CC5e8f3B7cC53beaB321cf0e6036962dBc", }, }, From ca8a08bd85ceb6b1aa8822325c4556a3adc00640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Tue, 20 Sep 2022 11:58:55 +0200 Subject: [PATCH 07/10] Use fixed 3.0.4 version of @nomiclabs/hardhat-etherscan dependency Higher version (^3.1.0) reportedly causes problems with etherscan verification on Mainnet (`TypeError: customChains is not iterable`). See commit bf90cd570. --- package.json | 2 +- yarn.lock | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 14ac820b..7b5707b4 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@keep-network/hardhat-helpers": "^0.6.0-pre.16", "@keep-network/prettier-config-keep": "github:keep-network/prettier-config-keep#d6ec02e", "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-etherscan": "^3.1.0", + "@nomiclabs/hardhat-etherscan": "3.0.4", "@nomiclabs/hardhat-waffle": "^2.0.1", "@openzeppelin/hardhat-upgrades": "^1.12.0", "@tenderly/hardhat-tenderly": "^1.0.12", diff --git a/yarn.lock b/yarn.lock index 638370ba..83b89845 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1026,21 +1026,18 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" integrity sha512-A2gZAGB6kUvLx+kzM92HKuUF33F1FSe90L0TmkXkT2Hh0OKRpvWZURUSU2nghD2yC4DzfEZ3DftfeHGvZ2JTUw== -"@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" - integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== +"@nomiclabs/hardhat-etherscan@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.4.tgz#b12e3e226a5b73c4a66d0e6943f948bd093b2711" + integrity sha512-AZPlnyCYp3YObmhtsFo6RWgY/81fQKRF5h42iV22H4jz9MwP+SWeoB99YVPLnxId2fmAYu3VgCNeE9QpApv06g== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" cbor "^5.0.2" - chalk "^2.4.2" debug "^4.1.1" fs-extra "^7.0.1" - lodash "^4.17.11" semver "^6.3.0" - table "^6.8.0" - undici "^5.4.0" + undici "^4.14.1" "@nomiclabs/hardhat-waffle@^2.0.1": version "2.0.2" @@ -9405,7 +9402,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.9, table@^6.8.0: +table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== @@ -9824,6 +9821,11 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +undici@^4.14.1: + version "4.16.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" + integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== + undici@^5.4.0: version "5.9.1" resolved "https://registry.yarnpkg.com/undici/-/undici-5.9.1.tgz#fc9fd85dd488f965f153314a63d9426a11f3360b" From 6eb97fbaaf21ca16e0b4be926808c28fdee9fb91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Fri, 7 Oct 2022 14:32:25 +0200 Subject: [PATCH 08/10] Wait for 5 confirmations before veryfing contracts Without the change, the verification of contracts on Etherscan could sometimes fail with error like this: ``` Verifying contract 0x... on Etherscan... Nothing to compile NomicLabsHardhatPluginError: Failed to send contract verification request. Endpoint URL: https://api-goerli.etherscan.io/api Reason: The Etherscan API responded that the address 0x... does not have bytecode. This can happen if the contract was recently deployed and this fact hasn't propagated to the backend yet. Try waiting for a minute before verifying your contract. If you are invoking this from a script, try to wait for five confirmations of your contract depiloyment transaction before running the verification subtask. ``` --- deploy/01_deploy_t.ts | 5 +++++ deploy/03_deploy_vending_machine_keep.ts | 5 +++++ deploy/04_deploy_vending_machine_nu.ts | 5 +++++ deploy/06_deploy_keep_stake.ts | 5 +++++ deploy/07_deploy_token_staking.ts | 5 +++++ deploy/30_deploy_tokenholder_timelock.ts | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/deploy/01_deploy_t.ts b/deploy/01_deploy_t.ts index 7cfdd46a..1d38344e 100644 --- a/deploy/01_deploy_t.ts +++ b/deploy/01_deploy_t.ts @@ -11,6 +11,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + T.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(T) } diff --git a/deploy/03_deploy_vending_machine_keep.ts b/deploy/03_deploy_vending_machine_keep.ts index 4b3689c9..f88b84cb 100644 --- a/deploy/03_deploy_vending_machine_keep.ts +++ b/deploy/03_deploy_vending_machine_keep.ts @@ -30,6 +30,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + vendingMachine.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(vendingMachine) } diff --git a/deploy/04_deploy_vending_machine_nu.ts b/deploy/04_deploy_vending_machine_nu.ts index c94ef537..939b10e5 100644 --- a/deploy/04_deploy_vending_machine_nu.ts +++ b/deploy/04_deploy_vending_machine_nu.ts @@ -26,6 +26,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + vendingMachine.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(vendingMachine) } diff --git a/deploy/06_deploy_keep_stake.ts b/deploy/06_deploy_keep_stake.ts index d5623262..f24d71fa 100644 --- a/deploy/06_deploy_keep_stake.ts +++ b/deploy/06_deploy_keep_stake.ts @@ -14,6 +14,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + KeepStake.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(KeepStake) } diff --git a/deploy/07_deploy_token_staking.ts b/deploy/07_deploy_token_staking.ts index c98e8840..80f39e3a 100644 --- a/deploy/07_deploy_token_staking.ts +++ b/deploy/07_deploy_token_staking.ts @@ -71,6 +71,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { log("Initialized TokenStaking.") if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + TokenStaking.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(TokenStaking) } } diff --git a/deploy/30_deploy_tokenholder_timelock.ts b/deploy/30_deploy_tokenholder_timelock.ts index a426479c..23d3a775 100644 --- a/deploy/30_deploy_tokenholder_timelock.ts +++ b/deploy/30_deploy_tokenholder_timelock.ts @@ -22,6 +22,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { + await hre.ethers.provider.waitForTransaction( + timelock.transactionHash, + 5, + 300000 + ) await helpers.etherscan.verify(timelock) } From c12c494827f351610b9f9ba7070600ffb99e2210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Fri, 7 Oct 2022 15:43:13 +0200 Subject: [PATCH 09/10] Configure Etherscan API key for use with @nomiclabs/hardhat-etherscan In PR #126 (https://github.com/threshold-network/solidity-contracts/pull/126) we've upgraded the `hardhat-deploy` plugin to latest version (^0.11.15). As part of this change, the way of storing Etherscan API key has changed - to be different from how the key is stored for @nomiclabs/hardhat-etherscan plugin use. When we merged those changes from `main` to the current feature branch, we no longer had a correct format of the Etherscan API key config to use it with the `@nomiclabs/hardhat-etherscan` plugin. As we don't want to verify contracts using `hardhat-deploy` plugin anymore, we need to adjust the config to fit `@nomiclabs/hardhat-etherscan`'s syntax. --- hardhat.config.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 0aaa8f1c..beb1df44 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -70,10 +70,8 @@ const config: HardhatUserConfig = { username: "thesis", project: "thesis/threshold-network", }, - verify: { - etherscan: { - apiKey: process.env.ETHERSCAN_API_KEY, - }, + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY, }, external: { contracts: [ From e565fbf3334796329edab69741bd1da4addbe774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michalina=20Ciencia=C5=82a?= Date: Fri, 7 Oct 2022 16:34:37 +0200 Subject: [PATCH 10/10] Fix formatting --- deploy/01_deploy_t.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/deploy/01_deploy_t.ts b/deploy/01_deploy_t.ts index 1d38344e..73105066 100644 --- a/deploy/01_deploy_t.ts +++ b/deploy/01_deploy_t.ts @@ -11,11 +11,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { }) if (hre.network.tags.etherscan) { - await hre.ethers.provider.waitForTransaction( - T.transactionHash, - 5, - 300000 - ) + await hre.ethers.provider.waitForTransaction(T.transactionHash, 5, 300000) await helpers.etherscan.verify(T) }