Skip to content

Commit bfb85ca

Browse files
committed
chore: refactor ignition deployment modules
Signed-off-by: Tomás Migone <[email protected]>
1 parent 6494bf8 commit bfb85ca

28 files changed

+627
-530
lines changed

packages/horizon/hardhat.config.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { vars } from 'hardhat/config'
2+
23
import type { HardhatUserConfig } from 'hardhat/config'
34

45
// Hardhat plugins
@@ -13,11 +14,13 @@ import 'hardhat-secure-accounts'
1314
// Environment variables
1415
const ETHERSCAN_API_KEY = vars.get('ETHERSCAN_API_KEY', '')
1516
const ARBITRUM_VIRTUAL_TESTNET_URL = vars.get('ARBITRUM_VIRTUAL_TESTNET_URL', '')
17+
const DEPLOYER_PRIVATE_KEY = vars.get('DEPLOYER_PRIVATE_KEY')
18+
const GOVERNOR_PRIVATE_KEY = vars.get('GOVERNOR_PRIVATE_KEY')
1619

1720
const getNetworkAccounts = () => {
1821
const accounts: string[] = []
19-
if (process.env.DEPLOYER_PRIVATE_KEY) accounts.push(process.env.DEPLOYER_PRIVATE_KEY)
20-
if (process.env.GOVERNOR_PRIVATE_KEY) accounts.push(process.env.GOVERNOR_PRIVATE_KEY)
22+
if (vars.has('DEPLOYER_PRIVATE_KEY')) accounts.push(DEPLOYER_PRIVATE_KEY)
23+
if (vars.has('GOVERNOR_PRIVATE_KEY')) accounts.push(GOVERNOR_PRIVATE_KEY)
2124
return accounts.length > 0 ? accounts : undefined
2225
}
2326

@@ -50,6 +53,16 @@ const config: HardhatUserConfig = {
5053
accounts: {
5154
mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect',
5255
},
56+
forking: {
57+
url: 'https://graph:[email protected]/',
58+
},
59+
},
60+
fork: {
61+
secureAccounts: {
62+
enabled: false,
63+
},
64+
url: 'http://localhost:8545',
65+
accounts: getNetworkAccounts(),
5366
},
5467
arbitrumSepolia: {
5568
chainId: 421614,

packages/horizon/ignition/configs/horizon-migrate.hardhat.json5

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"RewardsManager": {
1515
"rewardsManagerProxyAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79"
1616
},
17-
"Curation": {
17+
"L2Curation": {
1818
"graphCurationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5"
1919
},
2020
"HorizonStaking": {
Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
2+
import { deployImplementation } from '../proxy/implementation'
3+
import { upgradeTransparentUpgradeableProxyNoLoad } from '../proxy/TransparentUpgradeableProxy'
24

3-
import GraphPeripheryModule from '../periphery'
5+
import GraphPeripheryModule from '../periphery/periphery'
46
import HorizonProxiesModule from './HorizonProxies'
57

68
import GraphPaymentsArtifact from '../../../build/contracts/contracts/payments/GraphPayments.sol/GraphPayments.json'
79

8-
// TODO: transfer ownership of ProxyAdmin???
910
export default buildModule('GraphPayments', (m) => {
1011
const { Controller } = m.useModule(GraphPeripheryModule)
1112
const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(HorizonProxiesModule)
1213

1314
const protocolPaymentCut = m.getParameter('protocolPaymentCut')
1415

15-
// Deploy GraphPayments implementation
16-
const GraphPaymentsImplementation = m.contract('GraphPayments',
17-
GraphPaymentsArtifact,
18-
[Controller, protocolPaymentCut],
19-
{
20-
after: [GraphPeripheryModule, HorizonProxiesModule],
21-
},
22-
)
16+
// Deploy GraphPayments implementation - requires periphery and proxies to be registered in the controller
17+
const GraphPaymentsImplementation = deployImplementation(m, {
18+
name: 'GraphPayments',
19+
artifact: GraphPaymentsArtifact,
20+
constructorArgs: [Controller, protocolPaymentCut],
21+
}, { after: [GraphPeripheryModule, HorizonProxiesModule] })
2322

2423
// Upgrade proxy to implementation contract
25-
m.call(GraphPaymentsProxyAdmin, 'upgradeAndCall', [GraphPaymentsProxy, GraphPaymentsImplementation, m.encodeFunctionCall(GraphPaymentsImplementation, 'initialize', [])])
26-
27-
// Load contract with implementation ABI
28-
const GraphPayments = m.contractAt('GraphPayments', GraphPaymentsArtifact, GraphPaymentsProxy, { id: 'GraphPayments_Instance' })
29-
30-
return { GraphPayments, GraphPaymentsImplementation }
24+
const GraphPayments = upgradeTransparentUpgradeableProxyNoLoad(m,
25+
GraphPaymentsProxyAdmin,
26+
GraphPaymentsProxy,
27+
GraphPaymentsImplementation, {
28+
name: 'GraphPayments',
29+
artifact: GraphPaymentsArtifact,
30+
initArgs: [],
31+
})
32+
33+
return { GraphPayments, GraphPaymentsProxyAdmin }
3134
})
Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,55 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
2-
import { deployWithOZProxy } from '../proxy/TransparentUpgradeableProxy'
2+
import { deployGraphProxy } from '../proxy/GraphProxy'
3+
import { deployTransparentUpgradeableProxy } from '../proxy/TransparentUpgradeableProxy'
34
import { ethers } from 'ethers'
45

5-
import GraphPeripheryModule from '../periphery'
6-
import GraphProxyAdminModule from '../periphery/GraphProxyAdmin'
6+
import GraphPeripheryModule from '../periphery/periphery'
77

8-
import GraphProxyArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxy.sol/GraphProxy.json'
8+
import GraphPaymentsArtifact from '../../../build/contracts/contracts/payments/GraphPayments.sol/GraphPayments.json'
9+
import PaymentsEscrowArtifact from '../../../build/contracts/contracts/payments/PaymentsEscrow.sol/PaymentsEscrow.json'
910

10-
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
11-
12-
// HorizonStaking, GraphPayments and PaymentsEscrow use GraphDirectory but they also in the directory.
11+
// HorizonStaking, GraphPayments and PaymentsEscrow use GraphDirectory but they are also in the directory.
1312
// So we need to deploy their proxies, register them in the controller before being able to deploy the implementations
1413
export default buildModule('HorizonProxies', (m) => {
15-
const { Controller } = m.useModule(GraphPeripheryModule)
16-
const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule)
17-
18-
const isMigrate = m.getParameter('isMigrate', false)
19-
20-
// Deploy HorizonStaking proxy without an implementation
21-
let HorizonStakingProxy
22-
if (isMigrate) {
23-
const horizonStakingProxyAddress = m.getParameter('horizonStakingProxyAddress')
24-
HorizonStakingProxy = m.contractAt('GraphProxy', GraphProxyArtifact, horizonStakingProxyAddress, { id: 'GraphProxy_HorizonStaking' })
25-
} else {
26-
HorizonStakingProxy = m.contract('GraphProxy', GraphProxyArtifact, [ZERO_ADDRESS, GraphProxyAdmin], { id: 'GraphProxy_HorizonStaking' })
27-
m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Staking')), HorizonStakingProxy], { id: 'setContractProxy_HorizonStaking' })
28-
}
29-
30-
// Deploy proxies for payments contracts using OZ TransparentUpgradeableProxy
31-
const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployWithOZProxy(m, 'GraphPayments')
32-
const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployWithOZProxy(m, 'PaymentsEscrow')
33-
34-
// Register the proxies in the controller
35-
// if isMigrate then use from: governor
36-
const options = isMigrate ? { from: m.getAccount(1) } : {}
37-
m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { ...options, id: 'setContractProxy_GraphPayments' })
38-
m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { ...options, id: 'setContractProxy_PaymentsEscrow' })
14+
const { Controller, GraphProxyAdmin } = m.useModule(GraphPeripheryModule)
15+
16+
// Deploy HorizonStaking proxy with no implementation
17+
const HorizonStakingProxy = deployGraphProxy(m, GraphProxyAdmin)
18+
m.call(Controller, 'setContractProxy',
19+
[ethers.keccak256(ethers.toUtf8Bytes('Staking')), HorizonStakingProxy],
20+
{ id: 'setContractProxy_HorizonStaking' },
21+
)
22+
23+
// Deploy GraphPayments proxy
24+
const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployTransparentUpgradeableProxy(m, {
25+
name: 'GraphPayments',
26+
artifact: GraphPaymentsArtifact,
27+
})
28+
m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { id: 'setContractProxy_GraphPayments' })
29+
30+
// Deploy PaymentsEscrow proxy
31+
const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployTransparentUpgradeableProxy(m, {
32+
name: 'PaymentsEscrow',
33+
artifact: PaymentsEscrowArtifact,
34+
})
35+
m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { id: 'setContractProxy_PaymentsEscrow' })
3936

4037
return { HorizonStakingProxy, GraphPaymentsProxy, PaymentsEscrowProxy, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin }
4138
})
39+
40+
// export const UpgradeHorizonProxiesModule = buildModule('HorizonProxies', (m) => {
41+
// const governor = m.getAccount(1)
42+
43+
// const controllerAddress = m.getParameter('controllerAddress')
44+
45+
// // Deploy proxies for payments contracts using OZ TransparentUpgradeableProxy
46+
// const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployWithOZProxy(m, 'GraphPayments')
47+
// const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployWithOZProxy(m, 'PaymentsEscrow')
48+
49+
// // Register the proxies in the controller
50+
// const Controller = m.contractAt('Controller', controllerAddress, { id: 'Controller' })
51+
// m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { id: 'setContractProxy_GraphPayments', from: governor })
52+
// m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { id: 'setContractProxy_PaymentsEscrow', from: governor })
53+
54+
// return { GraphPaymentsProxy, PaymentsEscrowProxy, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin }
55+
// })
Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,78 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
2+
import { deployImplementation } from '../proxy/implementation'
3+
import { upgradeGraphProxyNoLoad } from '../proxy/GraphProxy'
4+
import { ethers } from 'ethers'
25

3-
import GraphPeripheryModule from '../periphery'
6+
import GraphPeripheryModule from '../periphery/periphery'
47
import HorizonProxiesModule from './HorizonProxies'
5-
import HorizonStakingExtensionModule from './HorizonStakingExtension'
68

9+
import ExponentialRebatesArtifact from '../../../build/contracts/contracts/staking/libraries/ExponentialRebates.sol/ExponentialRebates.json'
710
import HorizonStakingArtifact from '../../../build/contracts/contracts/staking/HorizonStaking.sol/HorizonStaking.json'
11+
import HorizonStakingExtensionArtifact from '../../../build/contracts/contracts/staking/HorizonStakingExtension.sol/HorizonStakingExtension.json'
812

913
export default buildModule('HorizonStaking', (m) => {
1014
const { Controller, GraphProxyAdmin } = m.useModule(GraphPeripheryModule)
1115
const { HorizonStakingProxy } = m.useModule(HorizonProxiesModule)
12-
const { HorizonStakingExtension } = m.useModule(HorizonStakingExtensionModule)
1316

1417
const subgraphServiceAddress = m.getParameter('subgraphServiceAddress')
1518

16-
// Deploy HorizonStaking implementation
17-
const HorizonStakingImplementation = m.contract('HorizonStaking',
18-
HorizonStakingArtifact,
19-
[
20-
Controller,
21-
HorizonStakingExtension,
22-
subgraphServiceAddress,
23-
],
24-
{
19+
// Deploy HorizonStakingExtension - requires periphery and proxies to be registered in the controller
20+
const ExponentialRebates = m.library('ExponentialRebates', ExponentialRebatesArtifact)
21+
const HorizonStakingExtension = m.contract('HorizonStakingExtension',
22+
HorizonStakingExtensionArtifact,
23+
[Controller, subgraphServiceAddress], {
24+
libraries: {
25+
ExponentialRebates: ExponentialRebates,
26+
},
2527
after: [GraphPeripheryModule, HorizonProxiesModule],
26-
},
27-
)
28+
})
2829

29-
// Upgrade proxy to implementation contract
30-
const isMigrate = m.getParameter('isMigrate')
31-
const governor = m.getAccount(1)
32-
const options = isMigrate ? { from: governor } : {}
33-
const upgradeCall = m.call(GraphProxyAdmin, 'upgrade', [HorizonStakingProxy, HorizonStakingImplementation], options)
34-
const acceptCall = m.call(GraphProxyAdmin, 'acceptProxy', [HorizonStakingImplementation, HorizonStakingProxy], { ...options, after: [upgradeCall] })
30+
// Deploy HorizonStaking implementation
31+
const HorizonStakingImplementation = deployImplementation(m, {
32+
name: 'HorizonStaking',
33+
artifact: HorizonStakingArtifact,
34+
constructorArgs: [Controller, HorizonStakingExtension, subgraphServiceAddress],
35+
})
3536

36-
// Load contract with implementation ABI
37-
const HorizonStaking = m.contractAt('HorizonStaking', HorizonStakingArtifact, HorizonStakingProxy, { after: [acceptCall], id: 'HorizonStaking_Instance' })
38-
m.call(HorizonStaking, 'setMaxThawingPeriod', [m.getParameter('maxThawingPeriod')], options)
37+
// Upgrade proxy to implementation contract
38+
const HorizonStaking = upgradeGraphProxyNoLoad(m, GraphProxyAdmin, HorizonStakingProxy, HorizonStakingImplementation, {
39+
name: 'HorizonStaking',
40+
artifact: HorizonStakingArtifact,
41+
})
3942

40-
return { HorizonStakingProxy, HorizonStakingImplementation, HorizonStaking }
43+
return { HorizonStaking }
4144
})
45+
46+
// export const UpgradeHorizonStakingModule = buildModule('HorizonStaking', (m) => {
47+
// const { Controller, GraphProxyAdmin } = m.useModule(GraphPeripheryModule)
48+
// const { HorizonStakingProxy } = m.useModule(HorizonProxiesModule)
49+
// const { HorizonStakingExtension } = m.useModule(HorizonStakingExtensionModule)
50+
51+
// const subgraphServiceAddress = m.getParameter('subgraphServiceAddress')
52+
53+
// // Deploy HorizonStaking implementation
54+
// const HorizonStakingImplementation = m.contract('HorizonStaking',
55+
// HorizonStakingArtifact,
56+
// [
57+
// Controller,
58+
// HorizonStakingExtension,
59+
// subgraphServiceAddress,
60+
// ],
61+
// {
62+
// after: [GraphPeripheryModule, HorizonProxiesModule],
63+
// },
64+
// )
65+
66+
// // Upgrade proxy to implementation contract
67+
// const isMigrate = m.getParameter('isMigrate')
68+
// const governor = m.getAccount(1)
69+
// const options = isMigrate ? { from: governor } : {}
70+
// const upgradeCall = m.call(GraphProxyAdmin, 'upgrade', [HorizonStakingProxy, HorizonStakingImplementation], options)
71+
// const acceptCall = m.call(GraphProxyAdmin, 'acceptProxy', [HorizonStakingImplementation, HorizonStakingProxy], { ...options, after: [upgradeCall] })
72+
73+
// // Load contract with implementation ABI
74+
// const HorizonStaking = m.contractAt('HorizonStaking', HorizonStakingArtifact, HorizonStakingProxy, { after: [acceptCall], id: 'HorizonStaking_Instance' })
75+
// m.call(HorizonStaking, 'setMaxThawingPeriod', [m.getParameter('maxThawingPeriod')], options)
76+
77+
// return { HorizonStakingProxy, HorizonStakingImplementation, HorizonStaking }
78+
// })

packages/horizon/ignition/modules/core/HorizonStakingExtension.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
2+
import { deployImplementation } from '../proxy/implementation'
3+
import { upgradeTransparentUpgradeableProxyNoLoad } from '../proxy/TransparentUpgradeableProxy'
24

3-
import GraphPeripheryModule from '../periphery'
5+
import GraphPeripheryModule from '../periphery/periphery'
46
import HorizonProxiesModule from './HorizonProxies'
57

68
import PaymentsEscrowArtifact from '../../../build/contracts/contracts/payments/PaymentsEscrow.sol/PaymentsEscrow.json'
79

8-
// TODO: transfer ownership of ProxyAdmin???
910
export default buildModule('PaymentsEscrow', (m) => {
1011
const { Controller } = m.useModule(GraphPeripheryModule)
1112
const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(HorizonProxiesModule)
1213

1314
const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod')
1415

15-
// Deploy PaymentsEscrow implementation
16-
const PaymentsEscrowImplementation = m.contract('PaymentsEscrow',
17-
PaymentsEscrowArtifact,
18-
[Controller, withdrawEscrowThawingPeriod],
19-
{
20-
after: [GraphPeripheryModule, HorizonProxiesModule],
21-
},
22-
)
16+
// Deploy PaymentsEscrow implementation - requires periphery and proxies to be registered in the controller
17+
const PaymentsEscrowImplementation = deployImplementation(m, {
18+
name: 'PaymentsEscrow',
19+
artifact: PaymentsEscrowArtifact,
20+
constructorArgs: [Controller, withdrawEscrowThawingPeriod],
21+
}, { after: [GraphPeripheryModule, HorizonProxiesModule] })
2322

2423
// Upgrade proxy to implementation contract
25-
m.call(PaymentsEscrowProxyAdmin, 'upgradeAndCall', [PaymentsEscrowProxy, PaymentsEscrowImplementation, m.encodeFunctionCall(PaymentsEscrowImplementation, 'initialize', [])])
26-
27-
// Load contract with implementation ABI
28-
const PaymentsEscrow = m.contractAt('PaymentsEscrow', PaymentsEscrowArtifact, PaymentsEscrowProxy, { id: 'PaymentsEscrow_Instance' })
29-
30-
return { PaymentsEscrow, PaymentsEscrowImplementation }
24+
const PaymentsEscrow = upgradeTransparentUpgradeableProxyNoLoad(m,
25+
PaymentsEscrowProxyAdmin,
26+
PaymentsEscrowProxy,
27+
PaymentsEscrowImplementation, {
28+
name: 'PaymentsEscrow',
29+
artifact: PaymentsEscrowArtifact,
30+
initArgs: [],
31+
})
32+
33+
return { PaymentsEscrow, PaymentsEscrowProxyAdmin }
3134
})

packages/horizon/ignition/modules/core/TAPCollector.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
22

3-
import GraphPeripheryModule from '../periphery'
3+
import GraphPeripheryModule from '../periphery/periphery'
44
import HorizonProxiesModule from './HorizonProxies'
55

66
import TAPCollectorArtifact from '../../../build/contracts/contracts/payments/collectors/TAPCollector.sol/TAPCollector.json'

packages/horizon/ignition/modules/core.ts renamed to packages/horizon/ignition/modules/core/core.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
22

3-
import GraphPaymentsModule from './core/GraphPayments'
4-
import HorizonStakingModule from './core/HorizonStaking'
5-
import PaymentsEscrowModule from './core/PaymentsEscrow'
6-
import TAPCollectorModule from './core/TAPCollector'
3+
import GraphPaymentsModule from './GraphPayments'
4+
import HorizonStakingModule from './HorizonStaking'
5+
import PaymentsEscrowModule from './PaymentsEscrow'
6+
import TAPCollectorModule from './TAPCollector'
77

88
export default buildModule('GraphHorizon_Core', (m) => {
99
const { HorizonStaking } = m.useModule(HorizonStakingModule)

0 commit comments

Comments
 (0)