diff --git a/packages/hardhat-graph-protocol/package.json b/packages/hardhat-graph-protocol/package.json index 512db9dec..e484a0643 100644 --- a/packages/hardhat-graph-protocol/package.json +++ b/packages/hardhat-graph-protocol/package.json @@ -47,6 +47,7 @@ "json5": "^2.2.3" }, "devDependencies": { + "@nomicfoundation/hardhat-verify": "^2.0.12", "@types/chai": "^4.0.0", "@types/debug": "^4.1.12", "@types/mocha": "^10.0.9", @@ -55,6 +56,7 @@ "eslint-graph-config": "workspace:^0.0.1", "ethers": "^6.13.4", "hardhat": "^2.22.16", + "hardhat-secure-accounts": "^1.0.4", "mocha": "^10.8.2", "ts-node": "^8.0.0", "typescript": "^5.6.3" diff --git a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts new file mode 100644 index 000000000..2cd1de5da --- /dev/null +++ b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts @@ -0,0 +1,107 @@ +import { vars } from 'hardhat/config' + +import type { HardhatUserConfig, NetworksUserConfig, ProjectPathsUserConfig, SolidityUserConfig } from 'hardhat/types' +import type { EtherscanConfig } from '@nomicfoundation/hardhat-verify/types' + +// This next import ensures secure accounts config is correctly typed +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import type { SecureAccountsOptions } from 'hardhat-secure-accounts/src/type-extensions' + +// Environment variables +const ARBISCAN_API_KEY = vars.get('ARBISCAN_API_KEY', undefined) + +// RPCs +const VIRTUAL_ARBITRUM_SEPOLIA_RPC = vars.has('VIRTUAL_ARBITRUM_SEPOLIA_RPC') ? vars.get('VIRTUAL_ARBITRUM_SEPOLIA_RPC') : undefined +const ARBITRUM_SEPOLIA_RPC = vars.get('ARBITRUM_SEPOLIA_RPC', 'https://sepolia-rollup.arbitrum.io/rpc') + +// Accounts +const DEPLOYER_PRIVATE_KEY = vars.get('DEPLOYER_PRIVATE_KEY', undefined) +const GOVERNOR_PRIVATE_KEY = vars.get('GOVERNOR_PRIVATE_KEY', undefined) +const getTestnetAccounts = () => { + const accounts: string[] = [] + if (DEPLOYER_PRIVATE_KEY) accounts.push(DEPLOYER_PRIVATE_KEY) + if (GOVERNOR_PRIVATE_KEY) accounts.push(GOVERNOR_PRIVATE_KEY) + return accounts.length > 0 ? accounts : undefined +} +const getHardhatAccounts = () => { + return { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + } +} + +export const solidityUserConfig: SolidityUserConfig = { + version: '0.8.27', + settings: { + optimizer: { + enabled: true, + runs: 1, + }, + }, +} + +export const projectPathsUserConfig: ProjectPathsUserConfig = { + artifacts: './build/contracts', + sources: './contracts', +} + +export const etherscanUserConfig: Partial = { + apiKey: { + arbitrumSepolia: ARBISCAN_API_KEY, + }, + customChains: [ + { + network: 'arbitrumSepolia', + chainId: 421614, + urls: { apiURL: 'https://api-sepolia.arbiscan.io/api', browserURL: 'https://sepolia.arbiscan.io/' }, + }, + ], +} + +// In general: +// - hardhat is used for unit tests +// - localhost is used for local development on a hardhat network or fork +// - virtualArbitrumSepolia is for Tenderly Virtual Testnet +export const networksUserConfig: NetworksUserConfig = { + hardhat: { + chainId: 31337, + accounts: getHardhatAccounts(), + }, + localhost: { + chainId: 31337, + url: 'http://localhost:8545', + accounts: getTestnetAccounts(), + }, + arbitrumSepolia: { + chainId: 421614, + url: ARBITRUM_SEPOLIA_RPC, + secureAccounts: { + enabled: true, + }, + }, + ...(VIRTUAL_ARBITRUM_SEPOLIA_RPC && { + virtualArbitrumSepolia: { + chainId: 421615, + url: VIRTUAL_ARBITRUM_SEPOLIA_RPC, + accounts: getTestnetAccounts(), + }, + }), +} + +export const hardhatBaseConfig: HardhatUserConfig & { etherscan: Partial } = { + solidity: solidityUserConfig, + paths: projectPathsUserConfig, + secureAccounts: { + enabled: false, + }, + networks: networksUserConfig, + graph: { + deployments: { + horizon: { + addressBook: 'addresses.json', + }, + }, + }, + etherscan: etherscanUserConfig, +} + +export default hardhatBaseConfig diff --git a/packages/hardhat-graph-protocol/src/sdk/ignition/ignition.ts b/packages/hardhat-graph-protocol/src/sdk/ignition/ignition.ts index c0aaa7cfd..89581ece6 100644 --- a/packages/hardhat-graph-protocol/src/sdk/ignition/ignition.ts +++ b/packages/hardhat-graph-protocol/src/sdk/ignition/ignition.ts @@ -6,8 +6,8 @@ import path from 'path' export function loadConfig(configPath: string, prefix: string, networkName: string): any { const configFileCandidates = [ - path.join(require.main?.path ?? '', configPath, `${prefix}.${networkName}.json5`), - path.join(require.main?.path ?? '', configPath, `${prefix}.default.json5`), + path.resolve(process.cwd(), configPath, `${prefix}.${networkName}.json5`), + path.resolve(process.cwd(), configPath, `${prefix}.default.json5`), ] const configFile = configFileCandidates.find(file => fs.existsSync(file)) diff --git a/packages/hardhat-graph-protocol/src/sdk/index.ts b/packages/hardhat-graph-protocol/src/sdk/index.ts index 9276b9940..7e174cc9c 100644 --- a/packages/hardhat-graph-protocol/src/sdk/index.ts +++ b/packages/hardhat-graph-protocol/src/sdk/index.ts @@ -1,3 +1,5 @@ import { loadConfig, saveAddressBook } from './ignition/ignition' +import { hardhatBaseConfig } from './hardhat.base.config' -export const IgnitionHelper = { saveAddressBook, loadConfig } +const IgnitionHelper = { saveAddressBook, loadConfig } +export { hardhatBaseConfig, IgnitionHelper } diff --git a/packages/horizon/README.md b/packages/horizon/README.md index b19406cd5..d541684af 100644 --- a/packages/horizon/README.md +++ b/packages/horizon/README.md @@ -6,12 +6,18 @@ Graph Horizon is the next evolution of the Graph Protocol. The following environment variables might be required: -- `ETHERSCAN_API_KEY`: Etherscan API key +| Variable | Description | +|----------|-------------| +| `ARBISCAN_API_KEY` | Arbiscan API key | +| `DEPLOYER_PRIVATE_KEY` | Deployer private key - for testnet deployments | +| `GOVERNOR_PRIVATE_KEY` | Governor private key - for testnet deployments | +| `ARBITRUM_SEPOLIA_RPC` | Arbitrum Sepolia RPC URL | +| `VIRTUAL_ARBITRUM_SEPOLIA_RPC` | Virtual Arbitrum Sepolia RPC URL | You can set them using Hardhat: ```bash -npx hardhat vars set ETHERSCAN_API_KEY +npx hardhat vars set ``` ## Build @@ -23,6 +29,8 @@ yarn build ## Deploy +Note that this instructions will help you deploy Graph Horizon contracts, but no data service will be deployed. If you want to deploy the Subgraph Service please refer to the [Subgraph Service README](../subgraph-service/README.md) for deploy instructions. + ### New deployment To deploy Graph Horizon from scratch run the following command: @@ -30,13 +38,11 @@ To deploy Graph Horizon from scratch run the following command: npx hardhat run scripts/deploy.ts --network hardhat ``` -Note that this will deploy a standalone version of Graph Horizon contracts, meaning the Subgraph Service or any other data service will not be deployed. If you want to deploy the Subgraph Service please refer to the [Subgraph Service README](../subgraph-service/README.md) for deploy instructions. - ### Upgrade deployment To upgrade an existing deployment of the original Graph Protocol to Graph Horizon, run the following command: ```bash -npx hardhat run scripts/migrate.ts --network hardhat +npx hardhat run scripts/migrate.ts --network localhost ``` -Note that this will deploy a standalone version of Graph Horizon contracts, meaning the Subgraph Service or any other data service will not be deployed. If you want to deploy the Subgraph Service please refer to the [Subgraph Service README](../subgraph-service/README.md) for deploy instructions. \ No newline at end of file +Usually you would run this against a network (or a fork) where the original Graph Protocol was previously deployed. \ No newline at end of file diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index 6e94f365f..7e7dbc11e 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -1,101 +1,15 @@ -import { vars } from 'hardhat/config' - -import type { HardhatUserConfig } from 'hardhat/config' +import { hardhatBaseConfig } from 'hardhat-graph-protocol/sdk' // Hardhat plugins import '@nomicfoundation/hardhat-foundry' import '@nomicfoundation/hardhat-toolbox' import '@nomicfoundation/hardhat-ignition-ethers' -import '@tenderly/hardhat-tenderly' import 'hardhat-storage-layout' import 'hardhat-contract-sizer' import 'hardhat-secure-accounts' -// Environment variables -const ETHERSCAN_API_KEY = vars.get('ETHERSCAN_API_KEY', '') -const ARBITRUM_VIRTUAL_TESTNET_URL = vars.get('ARBITRUM_VIRTUAL_TESTNET_URL', '') -const DEPLOYER_PRIVATE_KEY = vars.get('DEPLOYER_PRIVATE_KEY') -const GOVERNOR_PRIVATE_KEY = vars.get('GOVERNOR_PRIVATE_KEY') - -const getNetworkAccounts = () => { - const accounts: string[] = [] - if (vars.has('DEPLOYER_PRIVATE_KEY')) accounts.push(DEPLOYER_PRIVATE_KEY) - if (vars.has('GOVERNOR_PRIVATE_KEY')) accounts.push(GOVERNOR_PRIVATE_KEY) - return accounts.length > 0 ? accounts : undefined -} - if (process.env.BUILD_RUN !== 'true') { require('hardhat-graph-protocol') } -const config: HardhatUserConfig = { - solidity: { - version: '0.8.27', - settings: { - optimizer: { - enabled: true, - runs: 1, - }, - }, - }, - paths: { - artifacts: './build/contracts', - sources: './contracts', - }, - secureAccounts: { - enabled: false, - }, - networks: { - hardhat: { - chainId: 31337, - accounts: { - mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', - }, - }, - localhost: { - chainId: 31337, - url: 'http://localhost:8545', - accounts: getNetworkAccounts(), - }, - arbitrumSepolia: { - chainId: 421614, - secureAccounts: { - enabled: true, - }, - url: 'https://sepolia-rollup.arbitrum.io/rpc', - }, - arbitrumVirtualTestnet: { - chainId: 421615, - url: ARBITRUM_VIRTUAL_TESTNET_URL, - accounts: getNetworkAccounts(), - }, - }, - tenderly: { - project: 'graph-network', - username: 'graphprotocol', - }, - graph: { - deployments: { - horizon: { - addressBook: 'addresses.json', - }, - }, - }, - etherscan: { - apiKey: { - arbitrumSepolia: ETHERSCAN_API_KEY, - }, - customChains: [ - { - network: 'arbitrumSepolia', - chainId: 421614, - urls: { - apiURL: 'https://api-sepolia.arbiscan.io/api', - browserURL: 'https://sepolia.arbiscan.io/', - }, - }, - ], - }, -} - -export default config +export default hardhatBaseConfig diff --git a/packages/horizon/ignition/configs/horizon.hardhat.json5 b/packages/horizon/ignition/configs/horizon.default.json5 similarity index 93% rename from packages/horizon/ignition/configs/horizon.hardhat.json5 rename to packages/horizon/ignition/configs/horizon.default.json5 index e10843810..bab832adb 100644 --- a/packages/horizon/ignition/configs/horizon.hardhat.json5 +++ b/packages/horizon/ignition/configs/horizon.default.json5 @@ -1,12 +1,11 @@ { "$global": { - "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", "pauseGuardian": "0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC", - "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", // Placeholder address for a standalone Horizon deployment, see README.md for more details "subgraphServiceAddress": "0x0000000000000000000000000000000000000000" }, "RewardsManager": { + "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", "issuancePerBlock": "114155251141552511415n" }, "EpochManager": { diff --git a/packages/horizon/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts index e766afac2..79a11a679 100644 --- a/packages/horizon/ignition/modules/core/GraphPayments.ts +++ b/packages/horizon/ignition/modules/core/GraphPayments.ts @@ -11,6 +11,7 @@ export default buildModule('GraphPayments', (m) => { const { Controller } = m.useModule(GraphPeripheryModule) const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(HorizonProxiesModule) + const governor = m.getAccount(1) const protocolPaymentCut = m.getParameter('protocolPaymentCut') // Deploy GraphPayments implementation - requires periphery and proxies to be registered in the controller @@ -30,6 +31,8 @@ export default buildModule('GraphPayments', (m) => { initArgs: [], }) + m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphPayments] }) + return { GraphPayments, GraphPaymentsProxyAdmin } }) @@ -37,6 +40,7 @@ export const MigrateGraphPaymentsModule = buildModule('GraphPayments', (m) => { const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(MigrateHorizonProxiesModule) const { Controller } = m.useModule(MigratePeripheryModule) + const governor = m.getAccount(1) const protocolPaymentCut = m.getParameter('protocolPaymentCut') // Deploy GraphPayments implementation @@ -56,5 +60,7 @@ export const MigrateGraphPaymentsModule = buildModule('GraphPayments', (m) => { initArgs: [], }) + m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphPayments] }) + return { GraphPayments, GraphPaymentsProxyAdmin } }) diff --git a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts index a1d054008..e509a84bc 100644 --- a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts +++ b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts @@ -11,6 +11,7 @@ export default buildModule('PaymentsEscrow', (m) => { const { Controller } = m.useModule(GraphPeripheryModule) const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(HorizonProxiesModule) + const governor = m.getAccount(1) const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod') // Deploy PaymentsEscrow implementation - requires periphery and proxies to be registered in the controller @@ -30,6 +31,8 @@ export default buildModule('PaymentsEscrow', (m) => { initArgs: [], }) + m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [PaymentsEscrow] }) + return { PaymentsEscrow, PaymentsEscrowProxyAdmin } }) @@ -37,6 +40,7 @@ export const MigratePaymentsEscrowModule = buildModule('PaymentsEscrow', (m) => const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(MigrateHorizonProxiesModule) const { Controller } = m.useModule(MigratePeripheryModule) + const governor = m.getAccount(1) const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod') // Deploy PaymentsEscrow implementation @@ -56,5 +60,7 @@ export const MigratePaymentsEscrowModule = buildModule('PaymentsEscrow', (m) => initArgs: [], }) + m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [PaymentsEscrow] }) + return { PaymentsEscrow, PaymentsEscrowProxyAdmin } }) diff --git a/packages/horizon/ignition/modules/deploy.ts b/packages/horizon/ignition/modules/deploy.ts index ebcd075f0..f540d13c7 100644 --- a/packages/horizon/ignition/modules/deploy.ts +++ b/packages/horizon/ignition/modules/deploy.ts @@ -20,6 +20,16 @@ export default buildModule('GraphHorizon_Deploy', (m) => { TAPCollector, } = m.useModule(GraphHorizonCoreModule) + const governor = m.getAccount(1) + + // BUG?: acceptOwnership should be called after everything in GraphHorizonCoreModule and GraphPeripheryModule is resolved + // but it seems that it's not waiting for interal calls. Waiting on HorizonStaking seems to fix the issue for some reason + // Removing HorizonStaking from the after list will trigger the bug + + // Accept ownership of Graph Governed based contracts + m.call(Controller, 'acceptOwnership', [], { from: governor, after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking] }) + m.call(GraphProxyAdmin, 'acceptOwnership', [], { from: governor, after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking] }) + return { Controller, L2Curation, diff --git a/packages/horizon/ignition/modules/migrate.ts b/packages/horizon/ignition/modules/migrate.ts index a75db01df..5488eebcd 100644 --- a/packages/horizon/ignition/modules/migrate.ts +++ b/packages/horizon/ignition/modules/migrate.ts @@ -4,8 +4,22 @@ import { MigrateHorizonCoreModule } from './core/core' import { MigratePeripheryModule } from './periphery/periphery' export default buildModule('GraphHorizon_Migrate', (m) => { - const { L2Curation, RewardsManager, Controller, GraphProxyAdmin, EpochManager, GraphToken, GraphTokenGateway } = m.useModule(MigratePeripheryModule) - const { HorizonStaking, GraphPayments, PaymentsEscrow, TAPCollector } = m.useModule(MigrateHorizonCoreModule) + const { + L2Curation, + RewardsManager, + Controller, + GraphProxyAdmin, + EpochManager, + GraphToken, + GraphTokenGateway, + } = m.useModule(MigratePeripheryModule) + + const { + HorizonStaking, + GraphPayments, + PaymentsEscrow, + TAPCollector, + } = m.useModule(MigrateHorizonCoreModule) return { L2Curation, diff --git a/packages/horizon/ignition/modules/periphery/Controller.ts b/packages/horizon/ignition/modules/periphery/Controller.ts index d8975ef2a..d0946a4f2 100644 --- a/packages/horizon/ignition/modules/periphery/Controller.ts +++ b/packages/horizon/ignition/modules/periphery/Controller.ts @@ -7,13 +7,13 @@ import { MigrateGraphProxyAdminModule } from './GraphProxyAdmin' import ControllerArtifact from '@graphprotocol/contracts/build/contracts/contracts/governance/Controller.sol/Controller.json' export default buildModule('Controller', (m) => { - const governor = m.getParameter('governor') + const governor = m.getAccount(1) const pauseGuardian = m.getParameter('pauseGuardian') const Controller = m.contract('Controller', ControllerArtifact) m.call(Controller, 'setPauseGuardian', [pauseGuardian]) - m.call(Controller, 'transferOwnership', [governor]) m.call(Controller, 'setPaused', [false]) + m.call(Controller, 'transferOwnership', [governor]) return { Controller } }) diff --git a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts index 8e41e5ed2..c727620c2 100644 --- a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts +++ b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts @@ -3,7 +3,7 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' import GraphProxyAdminArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' export default buildModule('GraphProxyAdmin', (m) => { - const governor = m.getParameter('governor') + const governor = m.getAccount(1) const GraphProxyAdmin = m.contract('GraphProxyAdmin', GraphProxyAdminArtifact) m.call(GraphProxyAdmin, 'transferOwnership', [governor]) diff --git a/packages/horizon/ignition/modules/periphery/GraphToken.ts b/packages/horizon/ignition/modules/periphery/GraphToken.ts index 87b6563fa..1a9617ab6 100644 --- a/packages/horizon/ignition/modules/periphery/GraphToken.ts +++ b/packages/horizon/ignition/modules/periphery/GraphToken.ts @@ -13,7 +13,7 @@ export default buildModule('L2GraphToken', (m) => { const { GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) const deployer = m.getAccount(0) - const governor = m.getParameter('governor') + const governor = m.getAccount(1) const initialSupply = m.getParameter('initialSupply') const GraphToken = deployWithGraphProxy(m, GraphProxyAdmin, { @@ -22,11 +22,14 @@ export default buildModule('L2GraphToken', (m) => { initArgs: [deployer], }) - m.call(GraphToken, 'mint', [deployer, initialSupply]) - m.call(GraphToken, 'renounceMinter', []) - m.call(GraphToken, 'addMinter', [RewardsManager], { id: 'addMinterRewardsManager' }) - m.call(GraphToken, 'addMinter', [GraphTokenGateway], { id: 'addMinterGateway' }) - m.call(GraphToken, 'transferOwnership', [governor]) + const mintCall = m.call(GraphToken, 'mint', [deployer, initialSupply]) + const renounceMinterCall = m.call(GraphToken, 'renounceMinter', []) + const addMinterRewardsManagerCall = m.call(GraphToken, 'addMinter', [RewardsManager], { id: 'addMinterRewardsManager' }) + const addMinterGatewayCall = m.call(GraphToken, 'addMinter', [GraphTokenGateway], { id: 'addMinterGateway' }) + + // No further calls are needed so we can transfer ownership now + const transferOwnershipCall = m.call(GraphToken, 'transferOwnership', [governor], { after: [mintCall, renounceMinterCall, addMinterRewardsManagerCall, addMinterGatewayCall] }) + m.call(GraphToken, 'acceptOwnership', [], { from: governor, after: [transferOwnershipCall] }) return { GraphToken } }) diff --git a/packages/horizon/scripts/deploy.ts b/packages/horizon/scripts/deploy.ts index f9303edd6..1b6eeac37 100644 --- a/packages/horizon/scripts/deploy.ts +++ b/packages/horizon/scripts/deploy.ts @@ -4,7 +4,7 @@ import { IgnitionHelper } from 'hardhat-graph-protocol/sdk' import DeployModule from '../ignition/modules/deploy' async function main() { - const HorizonConfig = IgnitionHelper.loadConfig('../ignition/configs/', 'horizon', hre.network.name) + const HorizonConfig = IgnitionHelper.loadConfig('./ignition/configs/', 'horizon', hre.network.name) // Deploy Horizon const deployment = await ignition.deploy(DeployModule, { diff --git a/packages/horizon/scripts/migrate.ts b/packages/horizon/scripts/migrate.ts index bdcf1ba27..426b207f9 100644 --- a/packages/horizon/scripts/migrate.ts +++ b/packages/horizon/scripts/migrate.ts @@ -5,7 +5,7 @@ import MigrateModule from '../ignition/modules/migrate' async function main() { console.log(getHorizonBanner()) - const HorizonMigrateConfig = IgnitionHelper.loadConfig('../ignition/configs/', 'horizon-migrate', hre.network.name) + const HorizonMigrateConfig = IgnitionHelper.loadConfig('./ignition/configs/', 'horizon-migrate', hre.network.name) const signers = await hre.ethers.getSigners() const deployer = signers[0] diff --git a/yarn.lock b/yarn.lock index d0e5549b5..2aad2064b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5380,7 +5380,7 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-verify@npm:^2.0.8": +"@nomicfoundation/hardhat-verify@npm:^2.0.12, @nomicfoundation/hardhat-verify@npm:^2.0.8": version: 2.0.12 resolution: "@nomicfoundation/hardhat-verify@npm:2.0.12" dependencies: @@ -15716,6 +15716,7 @@ __metadata: "@graphprotocol/horizon": "workspace:^0.0.1" "@graphprotocol/subgraph-service": "workspace:^0.0.1" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" + "@nomicfoundation/hardhat-verify": "npm:^2.0.12" "@types/chai": "npm:^4.0.0" "@types/debug": "npm:^4.1.12" "@types/mocha": "npm:^10.0.9" @@ -15725,6 +15726,7 @@ __metadata: eslint-graph-config: "workspace:^0.0.1" ethers: "npm:^6.13.4" hardhat: "npm:^2.22.16" + hardhat-secure-accounts: "npm:^1.0.4" json5: "npm:^2.2.3" mocha: "npm:^10.8.2" ts-node: "npm:^8.0.0"