@openzeppelin/ui-builder-adapter-evm 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/metadata.ts
21
+ var metadata_exports = {};
22
+ __export(metadata_exports, {
23
+ ecosystemMetadata: () => ecosystemMetadata
24
+ });
25
+ module.exports = __toCommonJS(metadata_exports);
26
+ var import_react = require("@web3icons/react");
27
+ var ecosystemMetadata = {
28
+ id: "evm",
29
+ name: "Ethereum (EVM)",
30
+ description: "Ethereum is a decentralized, open-source blockchain with smart contract functionality. It supports the Ethereum Virtual Machine (EVM) and uses the native cryptocurrency Ether (ETH).",
31
+ explorerGuidance: "Etherscan verified contracts",
32
+ addressExample: "0x...",
33
+ iconComponent: import_react.NetworkEthereum,
34
+ bgColorClass: "bg-blue-100",
35
+ textColorClass: "text-blue-900",
36
+ defaultFeatureConfig: { enabled: true, showInUI: true }
37
+ };
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ ecosystemMetadata
41
+ });
42
+ //# sourceMappingURL=metadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metadata.ts"],"sourcesContent":["import { NetworkEthereum } from '@web3icons/react';\n\nimport type { EcosystemMetadata } from '@openzeppelin/ui-types';\n\nexport const ecosystemMetadata: EcosystemMetadata = {\n id: 'evm',\n name: 'Ethereum (EVM)',\n description:\n 'Ethereum is a decentralized, open-source blockchain with smart contract functionality. It supports the Ethereum Virtual Machine (EVM) and uses the native cryptocurrency Ether (ETH).',\n explorerGuidance: 'Etherscan verified contracts',\n addressExample: '0x...',\n iconComponent: NetworkEthereum,\n bgColorClass: 'bg-blue-100',\n textColorClass: 'text-blue-900',\n defaultFeatureConfig: { enabled: true, showInUI: true },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAIzB,IAAM,oBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,aACE;AAAA,EACF,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,sBAAsB,EAAE,SAAS,MAAM,UAAU,KAAK;AACxD;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { EcosystemMetadata } from '@openzeppelin/ui-types';
2
+
3
+ declare const ecosystemMetadata: EcosystemMetadata;
4
+
5
+ export { ecosystemMetadata };
@@ -0,0 +1,5 @@
1
+ import { EcosystemMetadata } from '@openzeppelin/ui-types';
2
+
3
+ declare const ecosystemMetadata: EcosystemMetadata;
4
+
5
+ export { ecosystemMetadata };
@@ -0,0 +1,17 @@
1
+ // src/metadata.ts
2
+ import { NetworkEthereum } from "@web3icons/react";
3
+ var ecosystemMetadata = {
4
+ id: "evm",
5
+ name: "Ethereum (EVM)",
6
+ description: "Ethereum is a decentralized, open-source blockchain with smart contract functionality. It supports the Ethereum Virtual Machine (EVM) and uses the native cryptocurrency Ether (ETH).",
7
+ explorerGuidance: "Etherscan verified contracts",
8
+ addressExample: "0x...",
9
+ iconComponent: NetworkEthereum,
10
+ bgColorClass: "bg-blue-100",
11
+ textColorClass: "text-blue-900",
12
+ defaultFeatureConfig: { enabled: true, showInUI: true }
13
+ };
14
+ export {
15
+ ecosystemMetadata
16
+ };
17
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metadata.ts"],"sourcesContent":["import { NetworkEthereum } from '@web3icons/react';\n\nimport type { EcosystemMetadata } from '@openzeppelin/ui-types';\n\nexport const ecosystemMetadata: EcosystemMetadata = {\n id: 'evm',\n name: 'Ethereum (EVM)',\n description:\n 'Ethereum is a decentralized, open-source blockchain with smart contract functionality. It supports the Ethereum Virtual Machine (EVM) and uses the native cryptocurrency Ether (ETH).',\n explorerGuidance: 'Etherscan verified contracts',\n addressExample: '0x...',\n iconComponent: NetworkEthereum,\n bgColorClass: 'bg-blue-100',\n textColorClass: 'text-blue-900',\n defaultFeatureConfig: { enabled: true, showInUI: true },\n};\n"],"mappings":";AAAA,SAAS,uBAAuB;AAIzB,IAAM,oBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,aACE;AAAA,EACF,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,sBAAsB,EAAE,SAAS,MAAM,UAAU,KAAK;AACxD;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/ui-builder-adapter-evm",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "private": false,
5
5
  "description": "EVM Adapter for UI Builder",
6
6
  "keywords": [
@@ -37,10 +37,10 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@openzeppelin/relayer-sdk": "1.9.0",
40
- "@openzeppelin/ui-components": "^1.2.0",
40
+ "@openzeppelin/ui-components": "^1.3.0",
41
41
  "@openzeppelin/ui-react": "^1.1.0",
42
- "@openzeppelin/ui-types": "^1.5.0",
43
- "@openzeppelin/ui-utils": "^1.2.0",
42
+ "@openzeppelin/ui-types": "^1.10.0",
43
+ "@openzeppelin/ui-utils": "^1.3.0",
44
44
  "@wagmi/connectors": "5.7.13",
45
45
  "@wagmi/core": "^2.20.3",
46
46
  "@web3icons/react": "^4.0.19",
@@ -59,7 +59,7 @@
59
59
  "viem": "^2.33.3",
60
60
  "vitest": "^3.2.4",
61
61
  "wagmi": "^2.16.1",
62
- "@openzeppelin/ui-builder-adapter-evm-core": "1.0.0"
62
+ "@openzeppelin/ui-builder-adapter-evm-core": "1.1.0"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "@rainbow-me/rainbowkit": "^2.2.8",
@@ -74,6 +74,11 @@
74
74
  "import": "./dist/index.js",
75
75
  "require": "./dist/index.cjs"
76
76
  },
77
+ "./metadata": {
78
+ "types": "./dist/metadata.d.ts",
79
+ "import": "./dist/metadata.js",
80
+ "require": "./dist/metadata.cjs"
81
+ },
77
82
  "./dist/config.js": {
78
83
  "types": "./dist/config.d.ts",
79
84
  "import": "./dist/config.js",
@@ -178,7 +178,7 @@ describe('getEvmDefaultServiceConfig', () => {
178
178
  it('should return null for unknown service IDs', () => {
179
179
  const networkConfig = createMockNetworkConfig();
180
180
 
181
- expect(getEvmDefaultServiceConfig(networkConfig, 'indexer')).toBeNull();
181
+ expect(getEvmDefaultServiceConfig(networkConfig, 'access-control-indexer')).toBeNull();
182
182
  expect(getEvmDefaultServiceConfig(networkConfig, 'unknown')).toBeNull();
183
183
  });
184
184
  });
package/src/adapter.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  compareContractDefinitions as coreCompareContractDefinitions,
7
7
  hashContractDefinition as coreHashContractDefinition,
8
8
  validateContractDefinition as coreValidateContractDefinition,
9
+ createEvmAccessControlService,
9
10
  EvmProviderKeys,
10
11
  executeEvmTransaction,
11
12
  formatEvmFunctionResult,
@@ -33,11 +34,13 @@ import {
33
34
  validateEvmNetworkServiceConfig,
34
35
  validateEvmRpcEndpoint,
35
36
  waitForEvmTransactionConfirmation,
37
+ type EvmAccessControlService,
36
38
  type EvmContractDefinitionProviderKey,
37
39
  type TypedEvmNetworkConfig,
38
40
  type WriteContractParameters,
39
41
  } from '@openzeppelin/ui-builder-adapter-evm-core';
40
42
  import type {
43
+ AccessControlService,
41
44
  AvailableUiKit,
42
45
  Connector,
43
46
  ContractAdapter,
@@ -109,6 +112,13 @@ export class EvmAdapter implements ContractAdapter {
109
112
  readonly networkConfig: TypedEvmNetworkConfig;
110
113
  readonly initialAppServiceKitName: UiKitConfiguration['kitName'];
111
114
 
115
+ /**
116
+ * Lazily initialized access control service (NFR-004).
117
+ * Created on the first call to `getAccessControlService()` to avoid
118
+ * unnecessary initialization overhead when access control is not used.
119
+ */
120
+ private accessControlService: EvmAccessControlService | null = null;
121
+
112
122
  constructor(networkConfig: TypedEvmNetworkConfig) {
113
123
  if (!isTypedEvmNetworkConfig(networkConfig)) {
114
124
  throw new Error('EvmAdapter requires a valid EVM network configuration.');
@@ -740,6 +750,42 @@ Get your WalletConnect projectId from <a href="https://cloud.walletconnect.com"
740
750
  return coreHashContractDefinition(definition);
741
751
  }
742
752
 
753
+ /**
754
+ * @inheritdoc
755
+ *
756
+ * Returns a lazily initialized `EvmAccessControlService` instance.
757
+ * The service is created on first call with an `executeTransaction` callback
758
+ * that wraps `signAndBroadcast`, decoupling the access control module from
759
+ * wallet/signing infrastructure.
760
+ *
761
+ * @returns The AccessControlService for this adapter's network
762
+ * @see research.md §R9 — Service Lifecycle and Transaction Execution
763
+ */
764
+ public getAccessControlService(): AccessControlService {
765
+ if (!this.accessControlService) {
766
+ logger.info(
767
+ 'EvmAdapter:getAccessControlService',
768
+ 'Initializing EvmAccessControlService (lazy, first call)'
769
+ );
770
+
771
+ this.accessControlService = createEvmAccessControlService(
772
+ this.networkConfig,
773
+ async (txData, executionConfig, onStatusChange, runtimeApiKey) => {
774
+ const defaultStatusHandler = onStatusChange ?? (() => {});
775
+ const result = await this.signAndBroadcast(
776
+ txData,
777
+ executionConfig,
778
+ defaultStatusHandler,
779
+ runtimeApiKey
780
+ );
781
+ return { id: result.txHash };
782
+ }
783
+ );
784
+ }
785
+
786
+ return this.accessControlService;
787
+ }
788
+
743
789
  /**
744
790
  * @inheritdoc
745
791
  */
@@ -12,7 +12,7 @@ import { appConfigService, userNetworkServiceConfigService } from '@openzeppelin
12
12
  * Used for proactive health checks when no user overrides are configured.
13
13
  *
14
14
  * @param networkConfig The network configuration
15
- * @param serviceId The service identifier (e.g., 'rpc', 'explorer', 'contract-definitions')
15
+ * @param serviceId The service identifier (e.g., 'rpc', 'explorer', 'contract-definitions', 'access-control-indexer')
16
16
  * @returns The default configuration values, or null if not available
17
17
  */
18
18
  export function getEvmDefaultServiceConfig(
@@ -41,6 +41,14 @@ export function getEvmDefaultServiceConfig(
41
41
  }
42
42
  break;
43
43
  }
44
+ case 'access-control-indexer': {
45
+ // Access control indexer is optional — return default URL from network config if available
46
+ const typedNetworkConfig = networkConfig as TypedEvmNetworkConfig;
47
+ if (typedNetworkConfig.accessControlIndexerUrl) {
48
+ return { accessControlIndexerUrl: typedNetworkConfig.accessControlIndexerUrl };
49
+ }
50
+ return null;
51
+ }
44
52
  case 'contract-definitions':
45
53
  // No connection test for contract definitions service
46
54
  return null;
@@ -183,6 +191,27 @@ export function getEvmNetworkServiceForms(
183
191
  },
184
192
  ],
185
193
  },
194
+ {
195
+ id: 'access-control-indexer',
196
+ label: 'Access Control Indexer',
197
+ description:
198
+ 'Optional GraphQL indexer endpoint for historical access control data. Overrides the default indexer URL for this network.',
199
+ supportsConnectionTest: true,
200
+ requiredFeature: 'access_control_indexer',
201
+ fields: [
202
+ {
203
+ id: 'evm-access-control-indexer-url',
204
+ name: 'accessControlIndexerUrl',
205
+ type: 'text',
206
+ label: 'Access Control Indexer GraphQL Endpoint',
207
+ placeholder: 'https://gateway.subquery.network/query/...',
208
+ validation: { required: false, pattern: '^https?://.+' },
209
+ width: 'full',
210
+ helperText:
211
+ 'Optional. Used for querying historical access control events and role discovery on non-enumerable contracts.',
212
+ },
213
+ ],
214
+ },
186
215
  {
187
216
  id: 'contract-definitions',
188
217
  label: 'Contract Definitions',
package/src/index.ts CHANGED
@@ -1,7 +1,22 @@
1
- // Re-export the main adapter class
1
+ import type { TypedEvmNetworkConfig } from '@openzeppelin/ui-builder-adapter-evm-core';
2
+ import type { EcosystemExport } from '@openzeppelin/ui-types';
3
+
4
+ import { EvmAdapter } from './adapter';
5
+ import { evmAdapterConfig } from './config';
6
+ import { ecosystemMetadata } from './metadata';
7
+ import { evmNetworks } from './networks';
8
+
9
+ export { ecosystemMetadata } from './metadata';
2
10
  export { EvmAdapter } from './adapter';
3
11
 
4
- // Export RainbowKit customization types (re-exported from core via rainbowkit/index.ts)
12
+ export const ecosystemDefinition: EcosystemExport = {
13
+ ...ecosystemMetadata,
14
+ networks: evmNetworks,
15
+ createAdapter: (config) => new EvmAdapter(config as TypedEvmNetworkConfig),
16
+ adapterConfig: evmAdapterConfig,
17
+ };
18
+
19
+ // RainbowKit customization types (re-exported from core via rainbowkit/index.ts)
5
20
  export type {
6
21
  AppInfo,
7
22
  RainbowKitConnectButtonProps,
@@ -11,12 +26,8 @@ export type {
11
26
  } from './wallet/rainbowkit';
12
27
  export { isRainbowKitCustomizations, extractRainbowKitCustomizations } from './wallet/rainbowkit';
13
28
 
14
- // Export EVM networks
29
+ // Individual network exports (useful for specific references)
15
30
  export {
16
- evmNetworks,
17
- evmMainnetNetworks,
18
- evmTestnetNetworks,
19
- // Individual networks
20
31
  ethereumMainnet,
21
32
  arbitrumMainnet,
22
33
  polygonMainnet,
@@ -39,13 +50,9 @@ export {
39
50
  lineaSepolia,
40
51
  scrollSepolia,
41
52
  zksyncSepoliaTestnet,
42
- // ... other individual network exports
43
53
  } from './networks';
44
54
 
45
- // Export adapter configuration
46
- export { evmAdapterConfig } from './config';
47
-
48
- // Re-export core types for public API compatibility
55
+ // Core types for public API compatibility
49
56
  export type {
50
57
  TypedEvmNetworkConfig,
51
58
  WriteContractParameters,
@@ -56,5 +63,4 @@ export {
56
63
  abiComparisonService,
57
64
  } from '@openzeppelin/ui-builder-adapter-evm-core';
58
65
 
59
- // Export adapter-specific types
60
66
  export type { EvmRelayerTransactionOptions } from '@openzeppelin/ui-builder-adapter-evm-core';
@@ -0,0 +1,16 @@
1
+ import { NetworkEthereum } from '@web3icons/react';
2
+
3
+ import type { EcosystemMetadata } from '@openzeppelin/ui-types';
4
+
5
+ export const ecosystemMetadata: EcosystemMetadata = {
6
+ id: 'evm',
7
+ name: 'Ethereum (EVM)',
8
+ description:
9
+ 'Ethereum is a decentralized, open-source blockchain with smart contract functionality. It supports the Ethereum Virtual Machine (EVM) and uses the native cryptocurrency Ether (ETH).',
10
+ explorerGuidance: 'Etherscan verified contracts',
11
+ addressExample: '0x...',
12
+ iconComponent: NetworkEthereum,
13
+ bgColorClass: 'bg-blue-100',
14
+ textColorClass: 'text-blue-900',
15
+ defaultFeatureConfig: { enabled: true, showInUI: true },
16
+ };
@@ -47,6 +47,7 @@ export const ethereumMainnet: TypedEvmNetworkConfig = {
47
47
  decimals: 18,
48
48
  },
49
49
  viemChain: viemMainnet,
50
+ accessControlIndexerUrl: 'https://openzeppelin-ethereum-mainnet.graphql.subquery.network/',
50
51
  };
51
52
 
52
53
  export const arbitrumMainnet: TypedEvmNetworkConfig = {
@@ -70,6 +71,7 @@ export const arbitrumMainnet: TypedEvmNetworkConfig = {
70
71
  decimals: 18,
71
72
  },
72
73
  viemChain: viemArbitrum,
74
+ accessControlIndexerUrl: 'https://openzeppelin-arbitrum-mainnet.graphql.subquery.network/',
73
75
  };
74
76
 
75
77
  export const polygonMainnet: TypedEvmNetworkConfig = {
@@ -93,6 +95,7 @@ export const polygonMainnet: TypedEvmNetworkConfig = {
93
95
  decimals: 18,
94
96
  },
95
97
  viemChain: viemPolygon,
98
+ accessControlIndexerUrl: 'https://openzeppelin-polygon-mainnet.graphql.subquery.network/',
96
99
  };
97
100
 
98
101
  export const polygonZkEvmMainnet: TypedEvmNetworkConfig = {
@@ -116,6 +119,7 @@ export const polygonZkEvmMainnet: TypedEvmNetworkConfig = {
116
119
  decimals: 18,
117
120
  },
118
121
  viemChain: viemPolygonZkEvm,
122
+ accessControlIndexerUrl: 'https://openzeppelin-polygon-zkevm-mainnet.graphql.subquery.network/',
119
123
  };
120
124
 
121
125
  export const baseMainnet: TypedEvmNetworkConfig = {
@@ -139,6 +143,7 @@ export const baseMainnet: TypedEvmNetworkConfig = {
139
143
  decimals: 18,
140
144
  },
141
145
  viemChain: viemBase,
146
+ accessControlIndexerUrl: 'https://openzeppelin-base-mainnet.graphql.subquery.network/',
142
147
  };
143
148
 
144
149
  export const bscMainnet: TypedEvmNetworkConfig = {
@@ -162,6 +167,7 @@ export const bscMainnet: TypedEvmNetworkConfig = {
162
167
  decimals: 18,
163
168
  },
164
169
  viemChain: viemBsc,
170
+ accessControlIndexerUrl: 'https://openzeppelin-bsc-mainnet.graphql.subquery.network/',
165
171
  };
166
172
 
167
173
  export const optimismMainnet: TypedEvmNetworkConfig = {
@@ -185,6 +191,7 @@ export const optimismMainnet: TypedEvmNetworkConfig = {
185
191
  decimals: 18,
186
192
  },
187
193
  viemChain: viemOptimism,
194
+ accessControlIndexerUrl: 'https://openzeppelin-optimism-mainnet.graphql.subquery.network/',
188
195
  };
189
196
 
190
197
  export const avalancheMainnet: TypedEvmNetworkConfig = {
@@ -208,6 +215,7 @@ export const avalancheMainnet: TypedEvmNetworkConfig = {
208
215
  decimals: 18,
209
216
  },
210
217
  viemChain: viemAvalanche,
218
+ accessControlIndexerUrl: 'https://openzeppelin-avalanche-mainnet.graphql.subquery.network/',
211
219
  };
212
220
 
213
221
  // TODO: test and setup the api and explorer config
@@ -232,6 +240,7 @@ export const zkSyncEraMainnet: TypedEvmNetworkConfig = {
232
240
  decimals: 18,
233
241
  },
234
242
  viemChain: viemZkSync,
243
+ accessControlIndexerUrl: 'https://openzeppelin-zksync-era-mainnet.graphql.subquery.network/',
235
244
  };
236
245
 
237
246
  export const scrollMainnet: TypedEvmNetworkConfig = {
@@ -255,6 +264,7 @@ export const scrollMainnet: TypedEvmNetworkConfig = {
255
264
  decimals: 18,
256
265
  },
257
266
  viemChain: viemScroll,
267
+ accessControlIndexerUrl: 'https://openzeppelin-scroll-mainnet.graphql.subquery.network/',
258
268
  };
259
269
 
260
270
  export const lineaMainnet: TypedEvmNetworkConfig = {
@@ -278,6 +288,7 @@ export const lineaMainnet: TypedEvmNetworkConfig = {
278
288
  decimals: 18,
279
289
  },
280
290
  viemChain: viemLinea,
291
+ accessControlIndexerUrl: 'https://openzeppelin-linea-mainnet.graphql.subquery.network/',
281
292
  };
282
293
 
283
294
  // TODO: Add other EVM mainnet networks with their public RPCs and viemChain objects
@@ -49,6 +49,7 @@ export const ethereumSepolia: TypedEvmNetworkConfig = {
49
49
  decimals: 18,
50
50
  },
51
51
  viemChain: viemSepolia,
52
+ accessControlIndexerUrl: 'https://openzeppelin-ethereum-sepolia.graphql.subquery.network/',
52
53
  };
53
54
 
54
55
  export const arbitrumSepolia: TypedEvmNetworkConfig = {
@@ -72,6 +73,7 @@ export const arbitrumSepolia: TypedEvmNetworkConfig = {
72
73
  decimals: 18,
73
74
  },
74
75
  viemChain: viemArbitrumSepolia,
76
+ accessControlIndexerUrl: 'https://openzeppelin-arbitrum-sepolia.graphql.subquery.network/',
75
77
  };
76
78
 
77
79
  export const polygonAmoy: TypedEvmNetworkConfig = {
@@ -95,6 +97,7 @@ export const polygonAmoy: TypedEvmNetworkConfig = {
95
97
  decimals: 18,
96
98
  },
97
99
  viemChain: viemPolygonAmoy,
100
+ accessControlIndexerUrl: 'https://openzeppelin-polygon-amoy.graphql.subquery.network/',
98
101
  };
99
102
 
100
103
  export const polygonZkEvmCardona: TypedEvmNetworkConfig = {
@@ -118,6 +121,7 @@ export const polygonZkEvmCardona: TypedEvmNetworkConfig = {
118
121
  decimals: 18,
119
122
  },
120
123
  viemChain: viemPolygonZkEvmCardona,
124
+ accessControlIndexerUrl: 'https://openzeppelin-polygon-zkevm-cardona.graphql.subquery.network/',
121
125
  };
122
126
 
123
127
  export const baseSepolia: TypedEvmNetworkConfig = {
@@ -141,6 +145,7 @@ export const baseSepolia: TypedEvmNetworkConfig = {
141
145
  decimals: 18,
142
146
  },
143
147
  viemChain: viemBaseSepolia,
148
+ accessControlIndexerUrl: 'https://openzeppelin-base-sepolia.graphql.subquery.network/',
144
149
  };
145
150
 
146
151
  export const bscTestnet: TypedEvmNetworkConfig = {
@@ -164,6 +169,7 @@ export const bscTestnet: TypedEvmNetworkConfig = {
164
169
  decimals: 18,
165
170
  },
166
171
  viemChain: viemBscTestnet,
172
+ accessControlIndexerUrl: 'https://openzeppelin-bsc-testnet.graphql.subquery.network/',
167
173
  };
168
174
 
169
175
  export const optimismSepolia: TypedEvmNetworkConfig = {
@@ -187,6 +193,7 @@ export const optimismSepolia: TypedEvmNetworkConfig = {
187
193
  decimals: 18,
188
194
  },
189
195
  viemChain: viemOptimismSepolia,
196
+ accessControlIndexerUrl: 'https://openzeppelin-optimism-sepolia.graphql.subquery.network/',
190
197
  };
191
198
 
192
199
  export const avalancheFuji: TypedEvmNetworkConfig = {
@@ -211,6 +218,7 @@ export const avalancheFuji: TypedEvmNetworkConfig = {
211
218
  decimals: 18,
212
219
  },
213
220
  viemChain: viemAvalancheFuji,
221
+ accessControlIndexerUrl: 'https://openzeppelin-avalanche-fuji.graphql.subquery.network/',
214
222
  };
215
223
 
216
224
  // TODO: test and setup the api and explorer config
@@ -235,6 +243,7 @@ export const zksyncSepoliaTestnet: TypedEvmNetworkConfig = {
235
243
  decimals: 18,
236
244
  },
237
245
  viemChain: viemZkSyncSepoliaTestnet,
246
+ accessControlIndexerUrl: 'https://openzeppelin-zksync-era-sepolia.graphql.subquery.network/',
238
247
  };
239
248
 
240
249
  export const scrollSepolia: TypedEvmNetworkConfig = {
@@ -258,6 +267,7 @@ export const scrollSepolia: TypedEvmNetworkConfig = {
258
267
  decimals: 18,
259
268
  },
260
269
  viemChain: viemScrollSepolia,
270
+ accessControlIndexerUrl: 'https://openzeppelin-scroll-sepolia.graphql.subquery.network/',
261
271
  };
262
272
 
263
273
  export const lineaSepolia: TypedEvmNetworkConfig = {
@@ -281,6 +291,7 @@ export const lineaSepolia: TypedEvmNetworkConfig = {
281
291
  decimals: 18,
282
292
  },
283
293
  viemChain: viemLineaSepolia,
294
+ accessControlIndexerUrl: 'https://openzeppelin-linea-sepolia.graphql.subquery.network/',
284
295
  };
285
296
 
286
297
  export const monadTestnet: TypedEvmNetworkConfig = {
@@ -304,6 +315,7 @@ export const monadTestnet: TypedEvmNetworkConfig = {
304
315
  decimals: 18,
305
316
  },
306
317
  viemChain: viemMonadTestnet,
318
+ accessControlIndexerUrl: 'https://openzeppelin-monad-testnet.graphql.subquery.network/',
307
319
  };
308
320
 
309
321
  // TODO: Add other EVM testnet networks as needed (e.g., Arbitrum Sepolia)