Skip to content

Commit

Permalink
feat: deploy subgraph service using ignition
Browse files Browse the repository at this point in the history
Signed-off-by: Tomás Migone <[email protected]>
  • Loading branch information
tmigone committed Sep 17, 2024
1 parent bf02979 commit e2e3bda
Show file tree
Hide file tree
Showing 21 changed files with 596 additions and 100 deletions.
5 changes: 4 additions & 1 deletion packages/horizon/ignition/modules/core/GraphPayments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
import GraphPeripheryModule from '../periphery'
import HorizonProxiesModule from './HorizonProxies'

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

// TODO: transfer ownership of ProxyAdmin???
export default buildModule('GraphPayments', (m) => {
const { Controller, PeripheryRegistered } = m.useModule(GraphPeripheryModule)
Expand All @@ -12,6 +14,7 @@ export default buildModule('GraphPayments', (m) => {

// Deploy GraphPayments implementation
const GraphPaymentsImplementation = m.contract('GraphPayments',
GraphPaymentsArtifact,
[Controller, protocolPaymentCut],
{
after: [PeripheryRegistered, HorizonRegistered],
Expand All @@ -22,7 +25,7 @@ export default buildModule('GraphPayments', (m) => {
m.call(GraphPaymentsProxyAdmin, 'upgradeAndCall', [GraphPaymentsProxy, GraphPaymentsImplementation, m.encodeFunctionCall(GraphPaymentsImplementation, 'initialize', [])])

// Load contract with implementation ABI
const GraphPayments = m.contractAt('GraphPayments', GraphPaymentsProxy, { id: 'GraphPayments_Instance' })
const GraphPayments = m.contractAt('GraphPayments', GraphPaymentsArtifact, GraphPaymentsProxy, { id: 'GraphPayments_Instance' })

return { GraphPayments }
})
4 changes: 3 additions & 1 deletion packages/horizon/ignition/modules/core/HorizonProxies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { ethers } from 'ethers'

import GraphPeripheryModule from '../periphery'
import GraphProxyAdminModule from '../periphery/GraphProxyAdmin'

import DummyArtifact from '../../../build/contracts/contracts/mocks/Dummy.sol/Dummy.json'
import GraphProxyArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxy.sol/GraphProxy.json'

const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
Expand All @@ -27,7 +29,7 @@ export default buildModule('HorizonProxies', (m) => {
const setProxyPaymentsEscrow = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { id: 'setContractProxy_PaymentsEscrow' })

// Deploy dummy contract to signal that all periphery contracts are registered
const HorizonRegistered = m.contract('Dummy', [], {
const HorizonRegistered = m.contract('Dummy', DummyArtifact, [], {
id: 'RegisteredDummy',
after: [
setProxyHorizonStaking,
Expand Down
5 changes: 4 additions & 1 deletion packages/horizon/ignition/modules/core/HorizonStaking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import GraphPeripheryModule from '../periphery'
import HorizonProxiesModule from './HorizonProxies'
import HorizonStakingExtensionModule from './HorizonStakingExtension'

import HorizonStakingArtifact from '../../../build/contracts/contracts/staking/HorizonStaking.sol/HorizonStaking.json'

export default buildModule('HorizonStaking', (m) => {
const { Controller, GraphProxyAdmin, PeripheryRegistered } = m.useModule(GraphPeripheryModule)
const { HorizonStakingProxy, HorizonRegistered } = m.useModule(HorizonProxiesModule)
Expand All @@ -13,6 +15,7 @@ export default buildModule('HorizonStaking', (m) => {

// Deploy HorizonStaking implementation
const HorizonStakingImplementation = m.contract('HorizonStaking',
HorizonStakingArtifact,
[
Controller,
HorizonStakingExtension,
Expand All @@ -28,7 +31,7 @@ export default buildModule('HorizonStaking', (m) => {
const acceptCall = m.call(GraphProxyAdmin, 'acceptProxy', [HorizonStakingImplementation, HorizonStakingProxy], { after: [upgradeCall] })

// Load contract with implementation ABI
const HorizonStaking = m.contractAt('HorizonStaking', HorizonStakingProxy, { after: [acceptCall], id: 'HorizonStaking_Instance' })
const HorizonStaking = m.contractAt('HorizonStaking', HorizonStakingArtifact, HorizonStakingProxy, { after: [acceptCall], id: 'HorizonStaking_Instance' })

return { HorizonStakingProxy, HorizonStakingImplementation, HorizonStaking }
})
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
import GraphPeripheryModule from '../periphery'
import HorizonProxiesModule from './HorizonProxies'

import ExponentialRebatesArtifact from '../../../build/contracts/contracts/staking/libraries/ExponentialRebates.sol/ExponentialRebates.json'
import HorizonStakingExtensionArtifact from '../../../build/contracts/contracts/staking/HorizonStakingExtension.sol/HorizonStakingExtension.json'

export default buildModule('HorizonStakingExtension', (m) => {
const { Controller, PeripheryRegistered } = m.useModule(GraphPeripheryModule)
const { HorizonRegistered } = m.useModule(HorizonProxiesModule)

const subgraphServiceAddress = m.getParameter('subgraphServiceAddress')

const ExponentialRebates = m.library('ExponentialRebates')
const ExponentialRebates = m.library('ExponentialRebates', ExponentialRebatesArtifact)
const HorizonStakingExtension = m.contract('HorizonStakingExtension',
HorizonStakingExtensionArtifact,
[Controller, subgraphServiceAddress], {
libraries: {
ExponentialRebates: ExponentialRebates,
Expand Down
5 changes: 4 additions & 1 deletion packages/horizon/ignition/modules/core/PaymentsEscrow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
import GraphPeripheryModule from '../periphery'
import HorizonProxiesModule from './HorizonProxies'

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

// TODO: transfer ownership of ProxyAdmin???
export default buildModule('PaymentsEscrow', (m) => {
const { Controller, PeripheryRegistered } = m.useModule(GraphPeripheryModule)
Expand All @@ -13,6 +15,7 @@ export default buildModule('PaymentsEscrow', (m) => {

// Deploy PaymentsEscrow implementation
const PaymentsEscrowImplementation = m.contract('PaymentsEscrow',
PaymentsEscrowArtifact,
[Controller, revokeCollectorThawingPeriod, withdrawEscrowThawingPeriod],
{
after: [PeripheryRegistered, HorizonRegistered],
Expand All @@ -23,7 +26,7 @@ export default buildModule('PaymentsEscrow', (m) => {
m.call(PaymentsEscrowProxyAdmin, 'upgradeAndCall', [PaymentsEscrowProxy, PaymentsEscrowImplementation, m.encodeFunctionCall(PaymentsEscrowImplementation, 'initialize', [])])

// Load contract with implementation ABI
const PaymentsEscrow = m.contractAt('PaymentsEscrow', PaymentsEscrowProxy, { id: 'PaymentsEscrow_Instance' })
const PaymentsEscrow = m.contractAt('PaymentsEscrow', PaymentsEscrowArtifact, PaymentsEscrowProxy, { id: 'PaymentsEscrow_Instance' })

return { PaymentsEscrow }
})
4 changes: 3 additions & 1 deletion packages/horizon/ignition/modules/core/TAPCollector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
import GraphPeripheryModule from '../periphery'
import HorizonProxiesModule from './HorizonProxies'

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

export default buildModule('TAPCollector', (m) => {
const { Controller, PeripheryRegistered } = m.useModule(GraphPeripheryModule)
const { HorizonRegistered } = m.useModule(HorizonProxiesModule)

const name = m.getParameter('eip712Name')
const version = m.getParameter('eip712Version')

const TAPCollector = m.contract('TAPCollector', [name, version, Controller], { after: [PeripheryRegistered, HorizonRegistered] })
const TAPCollector = m.contract('TAPCollector', TAPCollectorArtifact, [name, version, Controller], { after: [PeripheryRegistered, HorizonRegistered] })

return { TAPCollector }
})
4 changes: 3 additions & 1 deletion packages/horizon/ignition/modules/periphery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import GraphTokenGatewayModule from './periphery/GraphTokenGateway'
import GraphTokenModule from './periphery/GraphToken'
import RewardsManagerModule from './periphery/RewardsManager'

import DummyArtifact from '../../build/contracts/contracts/mocks/Dummy.sol/Dummy.json'

export default buildModule('GraphHorizon_Periphery', (m) => {
const { BridgeEscrow } = m.useModule(BridgeEscrowModule)
const { Controller } = m.useModule(ControllerModule)
Expand All @@ -30,7 +32,7 @@ export default buildModule('GraphHorizon_Periphery', (m) => {
const setProxyCuration = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Curation')), Curation], { id: 'setContractProxy_Curation' })

// Deploy dummy contract to signal that all periphery contracts are registered
const PeripheryRegistered = m.contract('Dummy', [], {
const PeripheryRegistered = m.contract('Dummy', DummyArtifact, [], {
after: [
setProxyEpochManager,
setProxyRewardsManager,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { IgnitionModuleBuilder } from '@nomicfoundation/ignition-core'

import DummyArtifact from '../../../build/contracts/contracts/mocks/Dummy.sol/Dummy.json'
import ProxyAdminArtifact from '@openzeppelin/contracts/build/contracts/ProxyAdmin.json'
import TransparentUpgradeableProxyArtifact from '@openzeppelin/contracts/build/contracts/TransparentUpgradeableProxy.json'

Expand All @@ -9,7 +10,7 @@ import TransparentUpgradeableProxyArtifact from '@openzeppelin/contracts/build/c
export function deployWithOZProxy(m: IgnitionModuleBuilder, contractName: string) {
const deployer = m.getAccount(0)

const dummy = m.contract('Dummy', [], { id: `OZProxyDummy_${contractName}` })
const dummy = m.contract('Dummy', DummyArtifact, [], { id: `OZProxyDummy_${contractName}` })
const Proxy = m.contract('TransparentUpgradeableProxy', TransparentUpgradeableProxyArtifact, [
dummy,
deployer,
Expand Down
4 changes: 2 additions & 2 deletions packages/horizon/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"lint:sol": "prettier --write contracts/**/*.sol && solhint --noPrompt --fix contracts/**/*.sol --config node_modules/solhint-graph-config/index.js",
"lint": "yarn lint:ts && yarn lint:sol",
"clean": "rm -rf build cache typechain-types",
"build": "forge build contracts && hardhat compile",
"test": "forge test -vvv && hardhat test"
"build": "forge build && hardhat compile",
"test": "forge test && hardhat test"
},
"devDependencies": {
"@graphprotocol/contracts": "workspace:^7.0.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/subgraph-service/hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import '@nomicfoundation/hardhat-foundry'
import '@nomicfoundation/hardhat-ignition-ethers'
import '@nomicfoundation/hardhat-toolbox'
import 'hardhat-contract-sizer'
import 'hardhat-storage-layout'
Expand All @@ -10,7 +11,6 @@ const config: HardhatUserConfig = {
solidity: {
version: '0.8.27',
settings: {
viaIR: true,
optimizer: {
enabled: true,
runs: 200,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"DisputeManager": {
"arbitrator": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0",
"disputePeriod": 2419200,
"disputeDeposit": "10000000000000000000000n",
"fishermanRewardCut": 500000,
"maxSlashingCut": 1000000
},
"SubgraphService": {
"minimumProvisionTokens": "100000000000000000000000n",
"maximumDelegationRatio": 16
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"BridgeEscrow#BridgeEscrow": "0xFD471836031dc5108809D173A067e8486B9047A3",
"Controller#Controller": "0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc",
"Curation#Curation": "0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f",
"Curation#GraphCurationToken": "0xB0D4afd8879eD9F52b28595d31B441D079B2Ca07",
"EpochManager#EpochManager": "0x162A433068F51e18b7d13932F27e66a3f99E6890",
"GraphProxyAdmin#GraphProxyAdmin": "0x922D6956C99E12DFeB3224DEA977D0939758A1Fe",
"GraphToken#GraphToken": "0x5081a39b8A5f0E35a8D959395a630b68B74Dd30f",
"GraphTokenGateway#GraphTokenGateway": "0x1fA02b2d6A771842690194Cf62D91bdd92BfE28d",
"HorizonProxies#OZProxyDummy_GraphPayments": "0xdbC43Ba45381e02825b14322cDdd15eC4B3164E6",
"HorizonProxies#OZProxyDummy_PaymentsEscrow": "0x04C89607413713Ec9775E14b954286519d836FEf",
"HorizonStakingExtension#ExponentialRebates": "0x4C4a2f8c81640e47606d3fd77B353E87Ba015584",
"RewardsManager#RewardsManager": "0x21dF544947ba3E8b3c32561399E88B52Dc8b2823",
"HorizonProxies#TransparentUpgradeableProxy_GraphPayments": "0x51A1ceB83B83F1985a81C295d1fF28Afef186E02",
"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow": "0x36b58F5C1969B7b6591D752ea6F5486D069010AB",
"BridgeEscrow#GraphProxy": "0x8198f5d8F8CfFE8f9C413d98a0A55aEB8ab9FbB7",
"Curation#GraphProxy": "0x0355B7B8cb128fA5692729Ab3AAa199C1753f726",
"EpochManager#GraphProxy": "0x202CCe504e04bEd6fC0521238dDf04Bc9E8E15aB",
"GraphToken#GraphProxy": "0x172076E0166D1F9Cc711C77Adf8488051744980C",
"GraphTokenGateway#GraphProxy": "0x4EE6eCAD1c2Dae9f525404De8555724e3c35d07B",
"RewardsManager#GraphProxy": "0x2B0d36FACD61B71CC05ab8F3D2355ec3631C0dd5",
"BridgeEscrow#BridgeEscrow_Instance": "0x8198f5d8F8CfFE8f9C413d98a0A55aEB8ab9FbB7",
"Curation#Curation_Instance": "0x0355B7B8cb128fA5692729Ab3AAa199C1753f726",
"EpochManager#EpochManager_Instance": "0x202CCe504e04bEd6fC0521238dDf04Bc9E8E15aB",
"GraphToken#GraphToken_Instance": "0x172076E0166D1F9Cc711C77Adf8488051744980C",
"GraphTokenGateway#GraphTokenGateway_Instance": "0x4EE6eCAD1c2Dae9f525404De8555724e3c35d07B",
"HorizonProxies#ProxyAdmin_GraphPayments": "0x724dbC61127E39A610Be416b455deb800d51A3B2",
"HorizonProxies#ProxyAdmin_PaymentsEscrow": "0x4a057D0eaA196191D22150F22EbBA8703E8ce165",
"RewardsManager#RewardsManager_Instance": "0x2B0d36FACD61B71CC05ab8F3D2355ec3631C0dd5",
"GraphHorizon_Periphery#Dummy": "0xD5ac451B0c50B9476107823Af206eD814a2e2580",
"HorizonProxies#GraphProxy_HorizonStaking": "0xF8e31cb472bc70500f08Cd84917E5A1912Ec8397",
"HorizonProxies#RegisteredDummy": "0xc96304e3c037f81dA488ed9dEa1D8F2a48278a75",
"GraphPayments#GraphPayments": "0x34B40BA116d5Dec75548a9e9A8f15411461E8c70",
"GraphPayments#GraphPayments_Instance": "0x51A1ceB83B83F1985a81C295d1fF28Afef186E02",
"HorizonStakingExtension#HorizonStakingExtension": "0xD0141E899a65C95a556fE2B27e5982A6DE7fDD7A",
"PaymentsEscrow#PaymentsEscrow": "0x07882Ae1ecB7429a84f1D53048d35c4bB2056877",
"PaymentsEscrow#PaymentsEscrow_Instance": "0x36b58F5C1969B7b6591D752ea6F5486D069010AB",
"TAPCollector#TAPCollector": "0x22753E4264FDDc6181dc7cce468904A80a363E44",
"HorizonStaking#HorizonStaking": "0xA7c59f010700930003b33aB25a7a0679C860f29c",
"HorizonStaking#HorizonStaking_Instance": "0xF8e31cb472bc70500f08Cd84917E5A1912Ec8397"
}
Loading

0 comments on commit e2e3bda

Please sign in to comment.