Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/hardhat-graph-protocol/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"
Expand Down
107 changes: 107 additions & 0 deletions packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts
Original file line number Diff line number Diff line change
@@ -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<EtherscanConfig> = {
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<EtherscanConfig> } = {
solidity: solidityUserConfig,
paths: projectPathsUserConfig,
secureAccounts: {
enabled: false,
},
networks: networksUserConfig,
graph: {
deployments: {
horizon: {
addressBook: 'addresses.json',
},
},
},
etherscan: etherscanUserConfig,
}

export default hardhatBaseConfig
4 changes: 2 additions & 2 deletions packages/hardhat-graph-protocol/src/sdk/ignition/ignition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
4 changes: 3 additions & 1 deletion packages/hardhat-graph-protocol/src/sdk/index.ts
Original file line number Diff line number Diff line change
@@ -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 }
10 changes: 8 additions & 2 deletions packages/horizon/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <variable>
```

## Build
Expand Down
90 changes: 2 additions & 88 deletions packages/horizon/hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion packages/horizon/scripts/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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, {
Expand Down
2 changes: 1 addition & 1 deletion packages/horizon/scripts/migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
4 changes: 3 additions & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand Down
Loading