diff --git a/package-lock.json b/package-lock.json index 51a581a3a..5c24ce85e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3061,6 +3061,106 @@ "node": ">=10.0.0" } }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", + "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "license": "MIT", @@ -20084,6 +20184,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "dev": true, @@ -31896,6 +32002,7 @@ "@metamask/eth-sig-util": "7.0.1", "@nomicfoundation/hardhat-chai-matchers": "1.0.5", "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomicfoundation/hardhat-verify": "2.0.11", "@opengsn/provider": "2.2.6", "@openzeppelin/hardhat-upgrades": "1.22.1", "@streamr/config": "^5.0.0", diff --git a/packages/network-contracts/build.sh b/packages/network-contracts/build.sh index 3ba35f71a..2608f93f5 100755 --- a/packages/network-contracts/build.sh +++ b/packages/network-contracts/build.sh @@ -2,8 +2,7 @@ set -ex rm -rf artifacts -hardhat compile -cp ../../node_modules/@ensdomains/ens-contracts/deployments/archive/PublicResolver_mainnet_9412610.sol/PublicResolver_mainnet_9412610.json artifacts/PublicResolver_mainnet_9412610.json +npm run compile rm -rf dist tsc -p tsconfig.build.json diff --git a/packages/network-contracts/hardhat.config.ts b/packages/network-contracts/hardhat.config.ts index bc17cfbb2..535e773ee 100644 --- a/packages/network-contracts/hardhat.config.ts +++ b/packages/network-contracts/hardhat.config.ts @@ -8,12 +8,16 @@ import "@nomiclabs/hardhat-etherscan" import "hardhat-contract-sizer" // import "hardhat-gas-reporter" +import "./tasks/copyFilesAfterCompilation" + import { HardhatUserConfig } from "hardhat/types" declare module "hardhat/types/config" { interface HardhatUserConfig { - dependencyCompiler?: any; - contractSizer?: any; + dependencyCompiler?: any; + contractSizer?: any; + warnings?: any; + etherscan?: any; } } @@ -90,7 +94,7 @@ const config: HardhatUserConfig = { chainId: 3338, url: "https://peaq.api.onfinality.io/public", accounts: [process.env.KEY || "0x5e98cce00cff5dea6b454889f359a4ec06b9fa6b88e9d69b86de8e1c81887da0"] // dummy key - } + }, }, dependencyCompiler: { paths: [ @@ -107,6 +111,10 @@ const config: HardhatUserConfig = { "@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol", // exported in exports.ts ], }, + copyFilesAfterCompilation: [{ + from: "@ensdomains/ens-contracts/deployments/archive/PublicResolver_mainnet_9412610.sol/PublicResolver_mainnet_9412610.json", + to: "./artifacts/PublicResolver_mainnet_9412610.json" + }], solidity: { compilers: [ { diff --git a/packages/network-contracts/package.json b/packages/network-contracts/package.json index f28b1ec3f..8f0211030 100644 --- a/packages/network-contracts/package.json +++ b/packages/network-contracts/package.json @@ -62,6 +62,7 @@ "@metamask/eth-sig-util": "7.0.1", "@nomicfoundation/hardhat-chai-matchers": "1.0.5", "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomicfoundation/hardhat-verify": "2.0.11", "@opengsn/provider": "2.2.6", "@openzeppelin/hardhat-upgrades": "1.22.1", "@streamr/config": "^5.0.0", diff --git a/packages/network-contracts/scripts/2024-11-14-streamregistry-v5.sh b/packages/network-contracts/scripts/2024-11-14-streamregistry-v5.sh new file mode 100755 index 000000000..ba2ce68fb --- /dev/null +++ b/packages/network-contracts/scripts/2024-11-14-streamregistry-v5.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euxo pipefail + +export CHAIN=polygon + +# export CHAIN=polygonAmoy +# export GAS_PRICE_GWEI=30 # prevent error about zero gas price + +if declare -p KEY >/dev/null 2>&1; then + echo "Using deployer private key from environment variable KEY" +else + read -p "Enter deployer private key: " KEY + export KEY="$KEY" +fi + +export CONTRACT_NAME=StreamRegistryV5 +export OUTPUT_FILE=newImplementationAddress.txt +export SCRIPT_FILE=scripts/upgradeStreamRegistry.ts +npm run hardhatScript + +# Verify & publish the contract source code on Polygonscan + +if declare -p ETHERSCAN_KEY >/dev/null 2>&1; then + echo "Using *scan API key from environment variable ETHERSCAN_KEY" +else + read -p "Enter Polygonscan API key: " ETHERSCAN_KEY + export ETHERSCAN_KEY="$ETHERSCAN_KEY" +fi + +export ADDRESS=$(cat newImplementationAddress.txt) +npm run verify + +rm newImplementationAddress.txt diff --git a/packages/network-contracts/scripts/upgradeStreamRegistry.ts b/packages/network-contracts/scripts/upgradeStreamRegistry.ts index c9718411b..a6c38df77 100755 --- a/packages/network-contracts/scripts/upgradeStreamRegistry.ts +++ b/packages/network-contracts/scripts/upgradeStreamRegistry.ts @@ -63,7 +63,7 @@ async function main() { // log("Estimated gas cost: %s ETH (gas price %s gwei)", formatEther(estimatedGasCost), formatUnits(gasPrice, "gwei")) const balanceBefore = await provider.getBalance(signer.address) - log("Balance of %s: %s ETH", signer.address, formatEther(balanceBefore)) + log("Balance of %s: %s native tokens", signer.address, formatEther(balanceBefore)) // if (balanceBefore.lt(estimatedGasCost)) { // if (!IGNORE_BALANCE) { // throw new Error( @@ -78,7 +78,11 @@ async function main() { await getContractFactory(CONTRACT_NAME, { signer, txOverrides }) ) as StreamRegistryV5 log("Checking new StreamRegistry at %s", upgradedStreamRegistry.address) - log(" %s [OK]", await upgradedStreamRegistry.getUserKeyForUserId("test.eth/1", "0x1234")) + try { + log(" %s [OK]", await upgradedStreamRegistry.getUserKeyForUserId("test.eth/1", "0x1234")) + } catch (error: any) { + log("Error calling getUserKeyForUserId: %o", error.message) + } const implementationAddress = await upgrades.erc1967.getImplementationAddress(streamRegistry.address) log("Implementation address: %s", implementationAddress) diff --git a/packages/network-contracts/tasks/copyFilesAfterCompilation.ts b/packages/network-contracts/tasks/copyFilesAfterCompilation.ts new file mode 100644 index 000000000..4c99e6869 --- /dev/null +++ b/packages/network-contracts/tasks/copyFilesAfterCompilation.ts @@ -0,0 +1,43 @@ +import { copyFileSync, existsSync } from "fs" + +import { task } from "hardhat/config" +import { TASK_COMPILE } from "hardhat/builtin-tasks/task-names" + +declare module "hardhat/types/config" { + interface HardhatUserConfig { + /** Copy files after compilation has finished successfully + * @param from Source file to copy + * @param to Destination filename + */ + copyFilesAfterCompilation?: { + from: string, + /** Destination directory + filename */ + to: string, + }[]; + } + + interface HardhatConfig { + copyFilesAfterCompilation: [{ + from: string, + to: string, + }] + } +} + +const prefixes = [ + "./", + "./node_modules/", + "../../node_modules/", + "", +] + +task(TASK_COMPILE, async (_, hre, runSuper) => { + await runSuper() + hre?.config?.copyFilesAfterCompilation?.forEach(({ from, to }) => { + const fromPath = prefixes.map((prefix) => prefix + from).find(existsSync) + if (!fromPath) { + throw new Error(`copyFilesAfterCompilation: File not found: ${from}`) + } + copyFileSync(fromPath, to) + }) +})