1
+ import { setGRTBalance } from '../hardhat'
2
+ import { toBeHex } from 'ethers'
3
+
4
+ import type { Addressable } from 'ethers'
1
5
import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider'
2
- import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers'
6
+ import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers'
3
7
4
8
// The Graph convention for account derivation is:
5
9
// 0: Deployer
@@ -10,6 +14,15 @@ import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers'
10
14
// 5: Gateway/payer
11
15
// 6+: Test accounts
12
16
17
+ enum GraphAccountIndex {
18
+ Deployer = 0 ,
19
+ Governor = 1 ,
20
+ Arbitrator = 2 ,
21
+ PauseGuardian = 3 ,
22
+ SubgraphAvailabilityOracle = 4 ,
23
+ Gateway = 5 ,
24
+ }
25
+
13
26
export type GraphAccounts = {
14
27
deployer : HardhatEthersSigner
15
28
governor : HardhatEthersSigner
@@ -20,46 +33,64 @@ export type GraphAccounts = {
20
33
test : HardhatEthersSigner [ ]
21
34
}
22
35
23
- export async function getAccounts ( provider : HardhatEthersProvider ) : Promise < GraphAccounts > {
36
+ export async function getAccounts ( provider : HardhatEthersProvider , grtTokenAddress ?: string | Addressable ) : Promise < GraphAccounts > {
24
37
return {
25
- deployer : await getDeployer ( provider ) ,
26
- governor : await getGovernor ( provider ) ,
27
- arbitrator : await getArbitrator ( provider ) ,
28
- pauseGuardian : await getPauseGuardian ( provider ) ,
29
- subgraphAvailabilityOracle : await getSubgraphAvailabilityOracle ( provider ) ,
30
- gateway : await getGateway ( provider ) ,
31
- test : await getTestAccounts ( provider ) ,
38
+ deployer : await getDeployer ( provider , GraphAccountIndex . Deployer , grtTokenAddress ) ,
39
+ governor : await getGovernor ( provider , GraphAccountIndex . Governor , grtTokenAddress ) ,
40
+ arbitrator : await getArbitrator ( provider , GraphAccountIndex . Arbitrator , grtTokenAddress ) ,
41
+ pauseGuardian : await getPauseGuardian ( provider , GraphAccountIndex . PauseGuardian , grtTokenAddress ) ,
42
+ subgraphAvailabilityOracle : await getSubgraphAvailabilityOracle ( provider , GraphAccountIndex . SubgraphAvailabilityOracle , grtTokenAddress ) ,
43
+ gateway : await getGateway ( provider , GraphAccountIndex . Gateway , grtTokenAddress ) ,
44
+ test : await getTestAccounts ( provider , grtTokenAddress ) ,
32
45
}
33
46
}
34
47
35
- export async function getDeployer ( provider : HardhatEthersProvider , accountIndex = 0 ) {
36
- return provider . getSigner ( accountIndex )
48
+ export async function getDeployer ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . Deployer , grtTokenAddress ?: string | Addressable ) {
49
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
37
50
}
38
51
39
- export async function getGovernor ( provider : HardhatEthersProvider , accountIndex = 1 ) {
40
- return provider . getSigner ( accountIndex )
52
+ export async function getGovernor ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . Governor , grtTokenAddress ?: string | Addressable ) {
53
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
41
54
}
42
55
43
- export async function getArbitrator ( provider : HardhatEthersProvider , accountIndex = 2 ) {
44
- return provider . getSigner ( accountIndex )
56
+ export async function getArbitrator ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . Arbitrator , grtTokenAddress ?: string | Addressable ) {
57
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
45
58
}
46
59
47
- export async function getPauseGuardian ( provider : HardhatEthersProvider , accountIndex = 3 ) {
48
- return provider . getSigner ( accountIndex )
60
+ export async function getPauseGuardian ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . PauseGuardian , grtTokenAddress ?: string | Addressable ) {
61
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
49
62
}
50
63
51
- export async function getSubgraphAvailabilityOracle ( provider : HardhatEthersProvider , accountIndex = 4 ) {
52
- return provider . getSigner ( accountIndex )
64
+ export async function getSubgraphAvailabilityOracle ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . SubgraphAvailabilityOracle , grtTokenAddress ?: string | Addressable ) {
65
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
53
66
}
54
67
55
- export async function getGateway ( provider : HardhatEthersProvider , accountIndex = 5 ) {
56
- return provider . getSigner ( accountIndex )
68
+ export async function getGateway ( provider : HardhatEthersProvider , accountIndex = GraphAccountIndex . Gateway , grtTokenAddress ?: string | Addressable ) {
69
+ return _getAccount ( provider , accountIndex , grtTokenAddress )
57
70
}
58
71
59
- export async function getTestAccounts ( provider : HardhatEthersProvider ) {
72
+ export async function getTestAccounts ( provider : HardhatEthersProvider , grtTokenAddress ?: string | Addressable ) {
60
73
const accounts = await provider . send ( 'eth_accounts' , [ ] ) as string [ ]
61
- if ( accounts . length < 6 ) {
74
+ const numReservedAccounts = Object . values ( GraphAccountIndex ) . filter ( v => typeof v === 'number' ) . length
75
+ if ( accounts . length < numReservedAccounts ) {
62
76
return [ ]
63
77
}
64
- return await Promise . all ( accounts . slice ( 6 ) . map ( async account => await provider . getSigner ( account ) ) )
78
+ return await Promise . all (
79
+ accounts
80
+ . slice ( numReservedAccounts )
81
+ . map ( async account => await _getAccount ( provider , account , grtTokenAddress ) ) ,
82
+ )
83
+ }
84
+
85
+ async function _getAccount ( provider : HardhatEthersProvider , accountIndex : number | string , grtTokenAddress ?: string | Addressable ) {
86
+ const account = await provider . getSigner ( accountIndex )
87
+
88
+ // If the chain is local, send 10M GRT to the account
89
+ const chainId = await provider . send ( 'eth_chainId' , [ ] ) as string
90
+ const isLocal = [ toBeHex ( 1337 ) , toBeHex ( 31337 ) ] . includes ( toBeHex ( BigInt ( chainId ) ) )
91
+ if ( grtTokenAddress && isLocal ) {
92
+ await setGRTBalance ( provider , grtTokenAddress , account . address , 10_000_000n )
93
+ }
94
+
95
+ return account
65
96
}
0 commit comments