From 67e409d79b9d3510d59f8e38dd73c45abc6f880a Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Thu, 11 Jan 2024 16:56:23 +0100 Subject: [PATCH 1/2] new scripts to clone an ERC20 --- scripts/clone.ts | 182 ++++++++++++++++++++++++++++++++++++++++ scripts/getRoleBytes.js | 6 ++ 2 files changed, 188 insertions(+) create mode 100644 scripts/clone.ts create mode 100644 scripts/getRoleBytes.js diff --git a/scripts/clone.ts b/scripts/clone.ts new file mode 100644 index 0000000..5b11798 --- /dev/null +++ b/scripts/clone.ts @@ -0,0 +1,182 @@ +import { artifacts, ethers } from "hardhat"; +import fs from "fs"; +import path from "path"; +import type { BigNumber } from 'ethers'; + +import tokenHolders from "../ZinneTokenHolders.json"; + +const profileContractAddress = "0xcA1B9EC1117340818C1c1fdd1B48Ea79E57C140F"; +const sourceTokenAddress = "0x0785d720279f42326846d5396b5f44b97d0bfecd"; +const newTokenAddress = "0x230542eda83346929e4E54f4a98e1ca1A4BFc0c3"; + +const deployerPrivateKey = process.env.DEPLOYER_PRIVATE_KEY; +if (!deployerPrivateKey) { + console.log('DEPLOYER_PRIVATE_KEY is not set in .env file'); + process.exit(1); +} + +const networkName = hre.network.name; +if (!networkName) { + console.log('HARDHAT_NETWORK is not set in .env file'); + process.exit(1); +} + +function getABI(jsonPath: string): any { + const filePath = path.join(__dirname, jsonPath); + const fileContents = fs.readFileSync(filePath, 'utf8'); + return JSON.parse(fileContents).abi; +} + +const tokenABI = getABI("../artifacts/contracts/tokens/UpgradeableCommunityToken.sol/UpgradeableCommunityToken.json"); +const profileABI = getABI("../artifacts/contracts/apps/Profile.sol/Profile.json"); +const contractInterface = new ethers.utils.Interface(tokenABI); +type TokenHolder = { + address: string, + balance: BigNumber, + username?: string +}; + +type AddressMapping = { [key: string]: string }; + +const skip = {"0xaa0f7EddCF6CaA17d2DBC919D0Fd6232D1b345c4": true, "0x4053289aa2e0E8556c6e1c6F6CD7D1183e2232ac": true}; +// const skip = { +// "0xaa0f7EddCF6CaA17d2DBC919D0Fd6232D1b345c4": true, +// "0x3E483246e3178e9834549f2be9cC6547db750777": true, +// "0xCF1A8e25982E8B8e9C43B30D5F104940Aa5b13F2": true, +// "0xCc7142DE40Ed1c2D86308145DcC6836eFb370D6c": true, +// "0x2b4ACB6305fEF10be4Bc34a1FEF1Cf912ac39638": true, +// "0xB771864AC27Cd3e4F26a307DB05517bf10fF42A9": true, +// "0xe4f2633eb55A66473B50c9630EC8550945268874": true, +// "0x4053289aa2e0E8556c6e1c6F6CD7D1183e2232ac": true }; + +const mapping: AddressMapping = { + "0xadDCA8E4b04AA119168b37DFa11C97827493ABe4": "0x39F2638B50DED59f9385BC76C96E44374f0A2119", // @bank + "0xb1F9B11D8D5A0C69c0a4c337c5FdA823617cAF44": "0xaa34c2d6C923c176eCa418E681Aa7520c0e7BCFD", // @bank2 + "0x323b57416eb47aEeCE53F35E207228Eed765105F": "0x508846a71989ea4e07da68F4a838C9A5442dA617", // @kevex91 + "0x5EBfd5359D819AbB9c067b1d57f28597f8e949da": "0x34C4360bd268a9d615Bc3382f35792e03C026Ca7", // @bar + "0xCF1A8e25982E8B8e9C43B30D5F104940Aa5b13F2": "0xabf962E0DaFa36126DB6C38F7599fe889837c320" // Xavier +}; + +// const tokenHolders: string[] = [ +// "0xaa0f7EddCF6CaA17d2DBC919D0Fd6232D1b345c4", +// "0x4053289aa2e0E8556c6e1c6F6CD7D1183e2232ac", +// "0xe0aB8F24c97d0BF1c1AB7aAbD76f861C7ca1e70A", +// "0x1f16E4425144cE4A9C7f55c74756Df793A3AE32f", +// "0x5EBfd5359D819AbB9c067b1d57f28597f8e949da"]; + +const options = { + maxFeePerGas: ethers.utils.parseUnits("150", 'gwei'), + maxPriorityFeePerGas: ethers.utils.parseUnits("31", 'gwei') +}; + +console.log(">>> using", options); + +async function main() { + // Replace with your contract addresses and ABIs + + const deployerWallet = new ethers.Wallet(deployerPrivateKey, ethers.provider); + const currentNonce = await deployerWallet.getTransactionCount(); + console.log(">>> currentNonce", currentNonce); + const [signer] = await ethers.getSigners(); + + const sourceToken = new ethers.Contract(sourceTokenAddress, tokenABI, signer); + const profileContract = new ethers.Contract(profileContractAddress, profileABI, signer); + const newToken = new ethers.Contract(newTokenAddress, tokenABI, deployerWallet); + // console.log("Granting MINTER_ROLE to", deployerWallet.address); + // await newToken.grantRole("0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6", deployerWallet.address); + const balanceHolders:TokenHolder[] = []; + + for (const tokenHolder of tokenHolders) { + let username, balance, holder:TokenHolder; + if (typeof tokenHolder === "string" && tokenHolder.startsWith("0x")) { + const balance = await sourceToken.balanceOf(tokenHolder); + holder = {address: tokenHolder, balance }; + try { + const profileBytes = await profileContract.usernames(tokenHolder); + if (profileBytes !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + holder.username = (ethers.utils.toUtf8String(profileBytes)).trim(); + } + } catch (e) { + console.log("!!!", e); + } + if (balance > 0) { + balanceHolders.push(holder); + } + } + else { + holder = { + address: tokenHolder.address, + balance: ethers.BigNumber.from(tokenHolder.balance), + username: tokenHolder.username + }; + balanceHolders.push(holder); + } + console.log(`${holder.address}\t${ethers.utils.formatUnits(holder.balance, 6)}\t`, holder.username && `@${holder.username}`); + } + + console.log("\n"); + let totalSupply = 0, i=0; + for(const holder of balanceHolders) { + let accountAddress: string = holder.address; + if (skip[accountAddress]) { + console.log("Skipping", accountAddress); + } else { + if (mapping[holder.address]) { + accountAddress = mapping[holder.address]; + console.log(`Minting ${ethers.utils.formatUnits(holder.balance, 6)} tokens to new address ${accountAddress}`); + } else { + console.log(`Minting ${ethers.utils.formatUnits(holder.balance, 6)} tokens to ${accountAddress}`); + } + totalSupply += parseFloat(ethers.utils.formatUnits(holder.balance, 6)); + + // ... + + let estimatedGasLimit: BigNumber; + try { + estimatedGasLimit = await newToken.estimateGas.mint(accountAddress, holder.balance, "recovered from old token"); + options.gasLimit = estimatedGasLimit.mul(110).div(100); + } catch (error) { + console.error("Error estimating gas:", error); + // Handle the error appropriately + + } + const data = contractInterface.encodeFunctionData('mint', [accountAddress, holder.balance, "recovered from old token"]); + + const tx = { + to: newTokenAddress, // or another address if you prefer + data, + value: ethers.utils.parseEther("0"), + // nonce: currentNonce + i, // Nonce of the stuck transaction + maxFeePerGas: options.maxFeePerGas, // Higher gas price + maxPriorityFeePerGas: options.maxPriorityFeePerGas, // Higher gas price + gasLimit: options.gasLimit, // Minimum gas limit for a simple transaction + }; + try { + // const transactionResponse = await deployerWallet.sendTransaction(tx); + // const transactionResponse = await newToken.mint(accountAddress, holder.balance, "recovered from old token", options); + console.log(">>> hash", transactionResponse.hash); + const transactionReceipt = await transactionResponse.wait(); + console.log(">>> block number", transactionReceipt.blockNumber); + console.log(">>> gas limit / used", options.gasLimit.toString(), transactionReceipt.gasUsed.toString()); + console.log(">>> effective gas price", transactionReceipt.effectiveGasPrice.toString()); + i++; + } catch (error) { + console.error("Minting failed with error: ", error); + process.exit(1); + } + // process.exit(1); + } + } + + console.log(">>> balanceHolders", balanceHolders.length, " - Total supply", totalSupply); + if (balanceHolders.length != tokenHolders.length) { + console.log(">>> To speed up next execution, import this JSON", JSON.stringify(balanceHolders, null, 2)); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/getRoleBytes.js b/scripts/getRoleBytes.js new file mode 100644 index 0000000..a9d2a89 --- /dev/null +++ b/scripts/getRoleBytes.js @@ -0,0 +1,6 @@ +const ethers = require("ethers"); + +const roleName = process.argv[2] || "MINTER_ROLE"; // replace with the actual role name +const roleHash = ethers.utils.id(roleName); + +console.log(roleName, roleHash); From d4c4620b3e5bce3c5b5c10bb131807ac41759fa8 Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Thu, 11 Jan 2024 16:57:00 +0100 Subject: [PATCH 2/2] update deploy-community --- hardhat.config.ts | 2 +- package-lock.json | 218 +++++++++++++++++++++++++++++++++--- package.json | 4 +- scripts/deploy-community.ts | 2 +- 4 files changed, 207 insertions(+), 19 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 1f0d234..38bc9fd 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -25,7 +25,7 @@ const hhconfig: HardhatUserConfig = { polygon_mainnet: { url: process.env.POLYGON_MAINNET_RPC_URL, accounts: [process.env.DEPLOYER_PRIVATE_KEY || "0x0"], - gasPrice: 90000000000, // this is 90 Gwei + gasPrice: 190000000000, // this is 190 Gwei timeout: 999999, throwOnTransactionFailures: true, throwOnCallFailures: true, diff --git a/package-lock.json b/package-lock.json index 4a2a868..d3f91a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "node-fetch": "^3.3.2", "userop": "^0.3.3" }, "devDependencies": { @@ -18,6 +19,7 @@ "@openzeppelin/contracts-upgradeable": "^4.9.3", "@openzeppelin/hardhat-upgrades": "^1.25.0", "@openzeppelin/test-helpers": "^0.5.16", + "@types/node": "^20.10.3", "@types/terminal-kit": "^2.5.6", "dotenv": "^16.1.3", "hardhat": "^2.19.1", @@ -1623,6 +1625,26 @@ "node-fetch": "^2.6.0" } }, + "node_modules/@openzeppelin/defender-base-client/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@openzeppelin/hardhat-upgrades": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz", @@ -1744,6 +1766,26 @@ "follow-redirects": "^1.14.0" } }, + "node_modules/@openzeppelin/platform-deploy-client/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@openzeppelin/test-helpers": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", @@ -2365,6 +2407,26 @@ "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", "dev": true }, + "node_modules/@truffle/contract/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@truffle/contract/node_modules/scrypt-js": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", @@ -2838,6 +2900,26 @@ "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", "dev": true }, + "node_modules/@truffle/interface-adapter/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", @@ -3392,9 +3474,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5021,6 +5103,26 @@ "node-fetch": "^2.6.12" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -5105,6 +5207,14 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", @@ -6346,6 +6456,28 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6484,6 +6616,17 @@ "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", "dev": true }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -7985,6 +8128,26 @@ "unfetch": "^4.2.0" } }, + "node_modules/isomorphic-unfetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -9089,6 +9252,24 @@ "node": ">=v0.6.5" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -9100,23 +9281,20 @@ } }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-gyp-build": { @@ -12591,6 +12769,14 @@ "extsprintf": "^1.2.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, "node_modules/web3": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.3.tgz", diff --git a/package.json b/package.json index 94a2504..e3d8e3e 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@openzeppelin/contracts-upgradeable": "^4.9.3", "@openzeppelin/hardhat-upgrades": "^1.25.0", "@openzeppelin/test-helpers": "^0.5.16", + "@types/node": "^20.10.3", "@types/terminal-kit": "^2.5.6", "dotenv": "^16.1.3", "hardhat": "^2.19.1", @@ -27,6 +28,7 @@ "terminal-kit": "^3.0.1" }, "dependencies": { + "node-fetch": "^3.3.2", "userop": "^0.3.3" } -} \ No newline at end of file +} diff --git a/scripts/deploy-community.ts b/scripts/deploy-community.ts index 4c62502..685d5a7 100644 --- a/scripts/deploy-community.ts +++ b/scripts/deploy-community.ts @@ -209,7 +209,7 @@ async function deployContract( term("Do you want to verify this new contract on etherscan? [Y/n]"); const confirmVerify = await term.yesOrNo({ yes: ["y", "ENTER"], no: ["n"] }) if (confirmVerify) { - execSync(`npx hardhat verify --contract contracts/tokens/${contractName}.sol:${contractName} --network ${networkName} ${deployedContract.address} ${tokenDecimals} --network ${networkName}`, { stdio: "inherit" }); + execSync(`npx hardhat verify --contract contracts/tokens/${contractName}.sol:${contractName} --network ${networkName} ${deployedContract.address} ${tokenDecimals}`, { stdio: "inherit" }); } term("\n"); term("Do you want to deploy a community entry point for this token? [Y/n]");