From e8e2e9f74ade4611bc33a9bc33a408e8c2e922ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Mon, 27 Jan 2025 16:44:29 -0300 Subject: [PATCH 1/4] feat: create a base hardhat config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/hardhat-graph-protocol/package.json | 2 + .../src/sdk/hardhat.base.config.ts | 107 ++++++++++++++++++ .../src/sdk/ignition/ignition.ts | 4 +- .../hardhat-graph-protocol/src/sdk/index.ts | 4 +- packages/horizon/README.md | 10 +- packages/horizon/hardhat.config.ts | 90 +-------------- ...on.hardhat.json5 => horizon.default.json5} | 0 packages/horizon/scripts/deploy.ts | 2 +- packages/horizon/scripts/migrate.ts | 2 +- yarn.lock | 4 +- 10 files changed, 129 insertions(+), 96 deletions(-) create mode 100644 packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts rename packages/horizon/ignition/configs/{horizon.hardhat.json5 => horizon.default.json5} (100%) 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..a1d057ed0 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 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 100% rename from packages/horizon/ignition/configs/horizon.hardhat.json5 rename to packages/horizon/ignition/configs/horizon.default.json5 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" From e7b02ae734734662a6db84b40b41be0dbfdd494c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Mon, 27 Jan 2025 17:57:57 -0300 Subject: [PATCH 2/4] feat: ensure ignition deploy script handles contract ownership MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- .../ignition/configs/horizon.default.json5 | 3 +-- packages/horizon/ignition/modules/core/core.ts | 6 +++--- packages/horizon/ignition/modules/deploy.ts | 15 +++++++++++++++ .../ignition/modules/periphery/Controller.ts | 4 ++-- .../ignition/modules/periphery/GraphProxyAdmin.ts | 2 +- .../ignition/modules/periphery/GraphToken.ts | 15 +++++++++------ 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/horizon/ignition/configs/horizon.default.json5 b/packages/horizon/ignition/configs/horizon.default.json5 index e10843810..bab832adb 100644 --- a/packages/horizon/ignition/configs/horizon.default.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/core.ts b/packages/horizon/ignition/modules/core/core.ts index d623eca45..51fb45874 100644 --- a/packages/horizon/ignition/modules/core/core.ts +++ b/packages/horizon/ignition/modules/core/core.ts @@ -7,11 +7,11 @@ import TAPCollectorModule, { MigrateTAPCollectorModule } from './TAPCollector' export default buildModule('GraphHorizon_Core', (m) => { const { HorizonStaking } = m.useModule(HorizonStakingModule) - const { GraphPayments } = m.useModule(GraphPaymentsModule) - const { PaymentsEscrow } = m.useModule(PaymentsEscrowModule) + const { GraphPayments, GraphPaymentsProxyAdmin } = m.useModule(GraphPaymentsModule) + const { PaymentsEscrow, PaymentsEscrowProxyAdmin } = m.useModule(PaymentsEscrowModule) const { TAPCollector } = m.useModule(TAPCollectorModule) - return { HorizonStaking, GraphPayments, PaymentsEscrow, TAPCollector } + return { HorizonStaking, GraphPayments, PaymentsEscrow, TAPCollector, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin } }) export const MigrateHorizonCoreModule = buildModule('GraphHorizon_Core', (m) => { diff --git a/packages/horizon/ignition/modules/deploy.ts b/packages/horizon/ignition/modules/deploy.ts index ebcd075f0..2f1cf65c1 100644 --- a/packages/horizon/ignition/modules/deploy.ts +++ b/packages/horizon/ignition/modules/deploy.ts @@ -18,8 +18,23 @@ export default buildModule('GraphHorizon_Deploy', (m) => { GraphPayments, PaymentsEscrow, TAPCollector, + GraphPaymentsProxyAdmin, + PaymentsEscrowProxyAdmin, } = m.useModule(GraphHorizonCoreModule) + const governor = m.getAccount(1) + + // Accept ownership of Graph Governed based contracts + // 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 + m.call(Controller, 'acceptOwnership', [], { from: governor, after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking] }) + m.call(GraphProxyAdmin, 'acceptOwnership', [], { from: governor, after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking] }) + + // Transfer ownership of TransparentUpgradeableProxy based contracts + m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphHorizonCoreModule, HorizonStaking] }) + m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [GraphHorizonCoreModule, HorizonStaking] }) + return { Controller, 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 } }) From 07aa0a21ec6efe705037946c811788a148d459cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Tue, 28 Jan 2025 10:32:54 -0300 Subject: [PATCH 3/4] chore: move ownership calls for payments contract to their modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- .../ignition/modules/core/GraphPayments.ts | 3 +++ .../ignition/modules/core/PaymentsEscrow.ts | 3 +++ packages/horizon/ignition/modules/core/core.ts | 6 +++--- packages/horizon/ignition/modules/deploy.ts | 9 ++------- packages/horizon/ignition/modules/migrate.ts | 17 +++++++++++++++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/horizon/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts index e766afac2..e9069d3bb 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 } }) diff --git a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts index a1d054008..e47711354 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 } }) diff --git a/packages/horizon/ignition/modules/core/core.ts b/packages/horizon/ignition/modules/core/core.ts index 51fb45874..d623eca45 100644 --- a/packages/horizon/ignition/modules/core/core.ts +++ b/packages/horizon/ignition/modules/core/core.ts @@ -7,11 +7,11 @@ import TAPCollectorModule, { MigrateTAPCollectorModule } from './TAPCollector' export default buildModule('GraphHorizon_Core', (m) => { const { HorizonStaking } = m.useModule(HorizonStakingModule) - const { GraphPayments, GraphPaymentsProxyAdmin } = m.useModule(GraphPaymentsModule) - const { PaymentsEscrow, PaymentsEscrowProxyAdmin } = m.useModule(PaymentsEscrowModule) + const { GraphPayments } = m.useModule(GraphPaymentsModule) + const { PaymentsEscrow } = m.useModule(PaymentsEscrowModule) const { TAPCollector } = m.useModule(TAPCollectorModule) - return { HorizonStaking, GraphPayments, PaymentsEscrow, TAPCollector, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin } + return { HorizonStaking, GraphPayments, PaymentsEscrow, TAPCollector } }) export const MigrateHorizonCoreModule = buildModule('GraphHorizon_Core', (m) => { diff --git a/packages/horizon/ignition/modules/deploy.ts b/packages/horizon/ignition/modules/deploy.ts index 2f1cf65c1..f540d13c7 100644 --- a/packages/horizon/ignition/modules/deploy.ts +++ b/packages/horizon/ignition/modules/deploy.ts @@ -18,23 +18,18 @@ export default buildModule('GraphHorizon_Deploy', (m) => { GraphPayments, PaymentsEscrow, TAPCollector, - GraphPaymentsProxyAdmin, - PaymentsEscrowProxyAdmin, } = m.useModule(GraphHorizonCoreModule) const governor = m.getAccount(1) - // Accept ownership of Graph Governed based contracts // 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] }) - // Transfer ownership of TransparentUpgradeableProxy based contracts - m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphHorizonCoreModule, HorizonStaking] }) - m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [GraphHorizonCoreModule, HorizonStaking] }) - return { Controller, L2Curation, diff --git a/packages/horizon/ignition/modules/migrate.ts b/packages/horizon/ignition/modules/migrate.ts index a75db01df..0b6652f2b 100644 --- a/packages/horizon/ignition/modules/migrate.ts +++ b/packages/horizon/ignition/modules/migrate.ts @@ -4,8 +4,21 @@ 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, From ea217395c62fed548ed7cf2d221dc531b4073d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Tue, 28 Jan 2025 10:42:33 -0300 Subject: [PATCH 4/4] fix: transfer payments contracts ownership to governor in migrate script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/horizon/README.md | 8 ++++---- packages/horizon/ignition/modules/core/GraphPayments.ts | 3 +++ packages/horizon/ignition/modules/core/PaymentsEscrow.ts | 3 +++ packages/horizon/ignition/modules/migrate.ts | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/horizon/README.md b/packages/horizon/README.md index a1d057ed0..d541684af 100644 --- a/packages/horizon/README.md +++ b/packages/horizon/README.md @@ -29,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: @@ -36,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/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts index e9069d3bb..79a11a679 100644 --- a/packages/horizon/ignition/modules/core/GraphPayments.ts +++ b/packages/horizon/ignition/modules/core/GraphPayments.ts @@ -40,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 @@ -59,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 e47711354..e509a84bc 100644 --- a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts +++ b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts @@ -40,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 @@ -59,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/migrate.ts b/packages/horizon/ignition/modules/migrate.ts index 0b6652f2b..5488eebcd 100644 --- a/packages/horizon/ignition/modules/migrate.ts +++ b/packages/horizon/ignition/modules/migrate.ts @@ -13,6 +13,7 @@ export default buildModule('GraphHorizon_Migrate', (m) => { GraphToken, GraphTokenGateway, } = m.useModule(MigratePeripheryModule) + const { HorizonStaking, GraphPayments,