@openzeppelin/ui-builder-adapter-stellar 1.8.0 → 1.8.2

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.
package/dist/networks.cjs CHANGED
@@ -44,7 +44,7 @@ var stellarPublic = {
44
44
  networkPassphrase: "Public Global Stellar Network ; September 2015",
45
45
  explorerUrl: "https://stellar.expert/explorer/public",
46
46
  iconComponent: import_react.NetworkStellar,
47
- accessControlIndexerUrl: "https://openzeppelin-stellar-mainnet.graphql.subquery.network/"
47
+ accessControlIndexerUrl: "https://openzeppelin-stellar-mainnet.graphql.subquery.network"
48
48
  };
49
49
 
50
50
  // src/networks/testnet.ts
@@ -62,7 +62,7 @@ var stellarTestnet = {
62
62
  networkPassphrase: "Test SDF Network ; September 2015",
63
63
  explorerUrl: "https://stellar.expert/explorer/testnet",
64
64
  iconComponent: import_react2.NetworkStellar,
65
- accessControlIndexerUrl: "https://openzepplin-stellar-testnet.graphql.subquery.network"
65
+ accessControlIndexerUrl: "https://openzeppelin-stellar-testnet.graphql.subquery.network"
66
66
  };
67
67
 
68
68
  // src/networks/index.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks.ts","../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts"],"sourcesContent":["export * from './networks/index';\nexport { stellarNetworks as networks } from './networks/index';\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Public Network (Mainnet)\nexport const stellarPublic: StellarNetworkConfig = {\n id: 'stellar-public',\n exportConstName: 'stellarPublic',\n name: 'Stellar',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'mainnet',\n isTestnet: false,\n horizonUrl: 'https://horizon.stellar.org',\n sorobanRpcUrl: 'https://mainnet.sorobanrpc.com',\n networkPassphrase: 'Public Global Stellar Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/public',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network/',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Testnet\nexport const stellarTestnet: StellarNetworkConfig = {\n id: 'stellar-testnet',\n exportConstName: 'stellarTestnet',\n name: 'Stellar Testnet',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'testnet',\n isTestnet: true,\n horizonUrl: 'https://horizon-testnet.stellar.org',\n sorobanRpcUrl: 'https://soroban-testnet.stellar.org',\n networkPassphrase: 'Test SDF Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzepplin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\nimport { stellarPublic } from './mainnet';\nimport { stellarTestnet } from './testnet';\n\n// All mainnet networks\nexport const stellarMainnetNetworks: StellarNetworkConfig[] = [stellarPublic];\n\n// All testnet networks\nexport const stellarTestnetNetworks: StellarNetworkConfig[] = [stellarTestnet];\n\n// All Stellar networks\nexport const stellarNetworks: StellarNetworkConfig[] = [\n ...stellarMainnetNetworks,\n ...stellarTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { stellarPublic, stellarTestnet };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA+B;AAKxB,IAAM,gBAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACnBA,IAAAA,gBAA+B;AAKxB,IAAM,iBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACbO,IAAM,yBAAiD,CAAC,aAAa;AAGrE,IAAM,yBAAiD,CAAC,cAAc;AAGtE,IAAM,kBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AACL;","names":["import_react"]}
1
+ {"version":3,"sources":["../src/networks.ts","../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts"],"sourcesContent":["export * from './networks/index';\nexport { stellarNetworks as networks } from './networks/index';\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Public Network (Mainnet)\nexport const stellarPublic: StellarNetworkConfig = {\n id: 'stellar-public',\n exportConstName: 'stellarPublic',\n name: 'Stellar',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'mainnet',\n isTestnet: false,\n horizonUrl: 'https://horizon.stellar.org',\n sorobanRpcUrl: 'https://mainnet.sorobanrpc.com',\n networkPassphrase: 'Public Global Stellar Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/public',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Testnet\nexport const stellarTestnet: StellarNetworkConfig = {\n id: 'stellar-testnet',\n exportConstName: 'stellarTestnet',\n name: 'Stellar Testnet',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'testnet',\n isTestnet: true,\n horizonUrl: 'https://horizon-testnet.stellar.org',\n sorobanRpcUrl: 'https://soroban-testnet.stellar.org',\n networkPassphrase: 'Test SDF Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\nimport { stellarPublic } from './mainnet';\nimport { stellarTestnet } from './testnet';\n\n// All mainnet networks\nexport const stellarMainnetNetworks: StellarNetworkConfig[] = [stellarPublic];\n\n// All testnet networks\nexport const stellarTestnetNetworks: StellarNetworkConfig[] = [stellarTestnet];\n\n// All Stellar networks\nexport const stellarNetworks: StellarNetworkConfig[] = [\n ...stellarMainnetNetworks,\n ...stellarTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { stellarPublic, stellarTestnet };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA+B;AAKxB,IAAM,gBAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACnBA,IAAAA,gBAA+B;AAKxB,IAAM,iBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACbO,IAAM,yBAAiD,CAAC,aAAa;AAGrE,IAAM,yBAAiD,CAAC,cAAc;AAGtE,IAAM,kBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AACL;","names":["import_react"]}
package/dist/networks.js CHANGED
@@ -13,7 +13,7 @@ var stellarPublic = {
13
13
  networkPassphrase: "Public Global Stellar Network ; September 2015",
14
14
  explorerUrl: "https://stellar.expert/explorer/public",
15
15
  iconComponent: NetworkStellar,
16
- accessControlIndexerUrl: "https://openzeppelin-stellar-mainnet.graphql.subquery.network/"
16
+ accessControlIndexerUrl: "https://openzeppelin-stellar-mainnet.graphql.subquery.network"
17
17
  };
18
18
 
19
19
  // src/networks/testnet.ts
@@ -31,7 +31,7 @@ var stellarTestnet = {
31
31
  networkPassphrase: "Test SDF Network ; September 2015",
32
32
  explorerUrl: "https://stellar.expert/explorer/testnet",
33
33
  iconComponent: NetworkStellar2,
34
- accessControlIndexerUrl: "https://openzepplin-stellar-testnet.graphql.subquery.network"
34
+ accessControlIndexerUrl: "https://openzeppelin-stellar-testnet.graphql.subquery.network"
35
35
  };
36
36
 
37
37
  // src/networks/index.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts"],"sourcesContent":["import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Public Network (Mainnet)\nexport const stellarPublic: StellarNetworkConfig = {\n id: 'stellar-public',\n exportConstName: 'stellarPublic',\n name: 'Stellar',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'mainnet',\n isTestnet: false,\n horizonUrl: 'https://horizon.stellar.org',\n sorobanRpcUrl: 'https://mainnet.sorobanrpc.com',\n networkPassphrase: 'Public Global Stellar Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/public',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network/',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Testnet\nexport const stellarTestnet: StellarNetworkConfig = {\n id: 'stellar-testnet',\n exportConstName: 'stellarTestnet',\n name: 'Stellar Testnet',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'testnet',\n isTestnet: true,\n horizonUrl: 'https://horizon-testnet.stellar.org',\n sorobanRpcUrl: 'https://soroban-testnet.stellar.org',\n networkPassphrase: 'Test SDF Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzepplin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\nimport { stellarPublic } from './mainnet';\nimport { stellarTestnet } from './testnet';\n\n// All mainnet networks\nexport const stellarMainnetNetworks: StellarNetworkConfig[] = [stellarPublic];\n\n// All testnet networks\nexport const stellarTestnetNetworks: StellarNetworkConfig[] = [stellarTestnet];\n\n// All Stellar networks\nexport const stellarNetworks: StellarNetworkConfig[] = [\n ...stellarMainnetNetworks,\n ...stellarTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { stellarPublic, stellarTestnet };\n"],"mappings":";AAAA,SAAS,sBAAsB;AAKxB,IAAM,gBAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACnBA,SAAS,kBAAAA,uBAAsB;AAKxB,IAAM,iBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAeA;AAAA,EACf,yBAAyB;AAC3B;;;ACbO,IAAM,yBAAiD,CAAC,aAAa;AAGrE,IAAM,yBAAiD,CAAC,cAAc;AAGtE,IAAM,kBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AACL;","names":["NetworkStellar"]}
1
+ {"version":3,"sources":["../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts"],"sourcesContent":["import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Public Network (Mainnet)\nexport const stellarPublic: StellarNetworkConfig = {\n id: 'stellar-public',\n exportConstName: 'stellarPublic',\n name: 'Stellar',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'mainnet',\n isTestnet: false,\n horizonUrl: 'https://horizon.stellar.org',\n sorobanRpcUrl: 'https://mainnet.sorobanrpc.com',\n networkPassphrase: 'Public Global Stellar Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/public',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\n// Stellar Testnet\nexport const stellarTestnet: StellarNetworkConfig = {\n id: 'stellar-testnet',\n exportConstName: 'stellarTestnet',\n name: 'Stellar Testnet',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'testnet',\n isTestnet: true,\n horizonUrl: 'https://horizon-testnet.stellar.org',\n sorobanRpcUrl: 'https://soroban-testnet.stellar.org',\n networkPassphrase: 'Test SDF Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n iconComponent: NetworkStellar,\n accessControlIndexerUrl: 'https://openzeppelin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-types';\n\nimport { stellarPublic } from './mainnet';\nimport { stellarTestnet } from './testnet';\n\n// All mainnet networks\nexport const stellarMainnetNetworks: StellarNetworkConfig[] = [stellarPublic];\n\n// All testnet networks\nexport const stellarTestnetNetworks: StellarNetworkConfig[] = [stellarTestnet];\n\n// All Stellar networks\nexport const stellarNetworks: StellarNetworkConfig[] = [\n ...stellarMainnetNetworks,\n ...stellarTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { stellarPublic, stellarTestnet };\n"],"mappings":";AAAA,SAAS,sBAAsB;AAKxB,IAAM,gBAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,yBAAyB;AAC3B;;;ACnBA,SAAS,kBAAAA,uBAAsB;AAKxB,IAAM,iBAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eAAeA;AAAA,EACf,yBAAyB;AAC3B;;;ACbO,IAAM,yBAAiD,CAAC,aAAa;AAGrE,IAAM,yBAAiD,CAAC,cAAc;AAGtE,IAAM,kBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AACL;","names":["NetworkStellar"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/ui-builder-adapter-stellar",
3
- "version": "1.8.0",
3
+ "version": "1.8.2",
4
4
  "description": "Stellar Adapter for UI Builder",
5
5
  "keywords": [
6
6
  "openzeppelin",
@@ -50,14 +50,14 @@ describe('getStellarDefaultServiceConfig', () => {
50
50
  });
51
51
  });
52
52
 
53
- describe('indexer service', () => {
53
+ describe('access-control-indexer service', () => {
54
54
  it('should return indexer config when both URLs are present', () => {
55
55
  const networkConfig = createMockNetworkConfig({
56
56
  indexerUri: 'https://indexer.stellar.example/graphql',
57
57
  indexerWsUri: 'wss://indexer.stellar.example/graphql',
58
58
  });
59
59
 
60
- const result = getStellarDefaultServiceConfig(networkConfig, 'indexer');
60
+ const result = getStellarDefaultServiceConfig(networkConfig, 'access-control-indexer');
61
61
 
62
62
  expect(result).toEqual({
63
63
  indexerUri: 'https://indexer.stellar.example/graphql',
@@ -70,7 +70,7 @@ describe('getStellarDefaultServiceConfig', () => {
70
70
  indexerWsUri: 'wss://indexer.stellar.example/graphql',
71
71
  });
72
72
 
73
- const result = getStellarDefaultServiceConfig(networkConfig, 'indexer');
73
+ const result = getStellarDefaultServiceConfig(networkConfig, 'access-control-indexer');
74
74
 
75
75
  expect(result).toBeNull();
76
76
  });
@@ -80,7 +80,7 @@ describe('getStellarDefaultServiceConfig', () => {
80
80
  indexerUri: 'https://indexer.stellar.example/graphql',
81
81
  });
82
82
 
83
- const result = getStellarDefaultServiceConfig(networkConfig, 'indexer');
83
+ const result = getStellarDefaultServiceConfig(networkConfig, 'access-control-indexer');
84
84
 
85
85
  expect(result).toBeNull();
86
86
  });
@@ -88,7 +88,7 @@ describe('getStellarDefaultServiceConfig', () => {
88
88
  it('should return null when neither indexer URL is present', () => {
89
89
  const networkConfig = createMockNetworkConfig();
90
90
 
91
- const result = getStellarDefaultServiceConfig(networkConfig, 'indexer');
91
+ const result = getStellarDefaultServiceConfig(networkConfig, 'access-control-indexer');
92
92
 
93
93
  expect(result).toBeNull();
94
94
  });
@@ -33,7 +33,7 @@ const LOG_SYSTEM = 'StellarIndexerClient';
33
33
  * @returns The indexer endpoint config if configured and valid, undefined otherwise
34
34
  */
35
35
  function getUserIndexerEndpoints(networkId: string): IndexerEndpointConfig | undefined {
36
- const svcCfg = userNetworkServiceConfigService.get(networkId, 'indexer');
36
+ const svcCfg = userNetworkServiceConfigService.get(networkId, 'access-control-indexer');
37
37
  if (!svcCfg || typeof svcCfg !== 'object') {
38
38
  return undefined;
39
39
  }
@@ -230,7 +230,7 @@ export class StellarIndexerClient {
230
230
  // Subscribe to indexer config changes to reset cache when user updates settings
231
231
  this.unsubscribeFromConfigChanges = userNetworkServiceConfigService.subscribe(
232
232
  networkConfig.id,
233
- 'indexer',
233
+ 'access-control-indexer',
234
234
  () => {
235
235
  logger.info(
236
236
  LOG_SYSTEM,
@@ -12,7 +12,7 @@ import { testStellarRpcConnection, validateStellarRpcEndpoint } from './rpc';
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', 'indexer')
15
+ * @param serviceId The service identifier (e.g., 'rpc', 'access-control-indexer')
16
16
  * @returns The default configuration values, or null if not available
17
17
  */
18
18
  export function getStellarDefaultServiceConfig(
@@ -25,8 +25,8 @@ export function getStellarDefaultServiceConfig(
25
25
  return { sorobanRpcUrl: networkConfig.sorobanRpcUrl };
26
26
  }
27
27
  break;
28
- case 'indexer':
29
- // Indexer is optional for Stellar - only return if both URLs are configured
28
+ case 'access-control-indexer':
29
+ // Access control indexer is optional for Stellar - only return if both URLs are configured
30
30
  if (networkConfig.indexerUri && networkConfig.indexerWsUri) {
31
31
  return {
32
32
  indexerUri: networkConfig.indexerUri,
@@ -40,7 +40,7 @@ export function getStellarDefaultServiceConfig(
40
40
 
41
41
  /**
42
42
  * Returns the network service forms for Stellar networks.
43
- * Defines the UI configuration for the RPC and Indexer services.
43
+ * Defines the UI configuration for the RPC and Access Control Indexer services.
44
44
  *
45
45
  * @param exclude Optional array of service IDs to exclude from the returned forms
46
46
  * @returns Array of network service forms
@@ -63,26 +63,29 @@ export function getStellarNetworkServiceForms(exclude: string[] = []): NetworkSe
63
63
  ],
64
64
  },
65
65
  {
66
- id: 'indexer',
67
- label: 'Indexer',
68
- description: 'Optional GraphQL indexer endpoint for historical access control data',
66
+ id: 'access-control-indexer',
67
+ label: 'Access Control Indexer',
68
+ description:
69
+ 'Optional GraphQL indexer endpoint for historical access control data. Overrides the default indexer URL for this network.',
69
70
  supportsConnectionTest: true,
71
+ requiredFeature: 'access_control_indexer',
70
72
  fields: [
71
73
  {
72
- id: 'stellar-indexer-uri',
74
+ id: 'stellar-access-control-indexer-uri',
73
75
  name: 'indexerUri',
74
76
  type: 'text',
75
- label: 'Indexer GraphQL HTTP Endpoint',
77
+ label: 'Access Control Indexer GraphQL Endpoint',
76
78
  placeholder: 'https://indexer.example.com/graphql',
77
79
  validation: { required: false, pattern: '^https?://.+' },
78
80
  width: 'full',
79
- helperText: 'Optional. Used for querying historical access control events.',
81
+ helperText:
82
+ 'Optional. Used for querying historical access control events and role discovery.',
80
83
  },
81
84
  {
82
- id: 'stellar-indexer-ws-uri',
85
+ id: 'stellar-access-control-indexer-ws-uri',
83
86
  name: 'indexerWsUri',
84
87
  type: 'text',
85
- label: 'Indexer GraphQL WebSocket Endpoint',
88
+ label: 'Access Control Indexer GraphQL WebSocket Endpoint',
86
89
  placeholder: 'wss://indexer.example.com/graphql',
87
90
  validation: { required: false, pattern: '^wss?://.+' },
88
91
  width: 'full',
@@ -110,7 +113,7 @@ export async function validateStellarNetworkServiceConfig(
110
113
  return validateStellarRpcEndpoint(cfg);
111
114
  }
112
115
 
113
- if (serviceId === 'indexer') {
116
+ if (serviceId === 'access-control-indexer') {
114
117
  // Validate indexerUri if provided
115
118
  if (values.indexerUri !== undefined && values.indexerUri !== null && values.indexerUri !== '') {
116
119
  if (!isValidUrl(String(values.indexerUri))) {
@@ -150,7 +153,7 @@ export async function testStellarNetworkServiceConnection(
150
153
  return testStellarRpcConnection(cfg);
151
154
  }
152
155
 
153
- if (serviceId === 'indexer') {
156
+ if (serviceId === 'access-control-indexer') {
154
157
  const indexerUri = values.indexerUri;
155
158
 
156
159
  // If no indexer URI is provided, indexer is optional - return success (nothing to test)
@@ -16,5 +16,5 @@ export const stellarPublic: StellarNetworkConfig = {
16
16
  networkPassphrase: 'Public Global Stellar Network ; September 2015',
17
17
  explorerUrl: 'https://stellar.expert/explorer/public',
18
18
  iconComponent: NetworkStellar,
19
- accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network/',
19
+ accessControlIndexerUrl: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network',
20
20
  };
@@ -16,5 +16,5 @@ export const stellarTestnet: StellarNetworkConfig = {
16
16
  networkPassphrase: 'Test SDF Network ; September 2015',
17
17
  explorerUrl: 'https://stellar.expert/explorer/testnet',
18
18
  iconComponent: NetworkStellar,
19
- accessControlIndexerUrl: 'https://openzepplin-stellar-testnet.graphql.subquery.network',
19
+ accessControlIndexerUrl: 'https://openzeppelin-stellar-testnet.graphql.subquery.network',
20
20
  };
@@ -6,6 +6,7 @@ import {
6
6
  nativeToScVal,
7
7
  rpc as StellarRpc,
8
8
  TransactionBuilder,
9
+ xdr,
9
10
  } from '@stellar/stellar-sdk';
10
11
 
11
12
  import type {
@@ -205,21 +206,45 @@ export async function checkStellarFunctionStateMutability(
205
206
  return true;
206
207
  }
207
208
 
208
- // --- Check State Changes (following Laboratory approach) --- //
209
- const hasStateChanges =
210
- simulationResult.stateChanges && simulationResult.stateChanges.length > 0;
209
+ // --- Check State Changes --- //
210
+ // Filter out infrastructure state changes that occur for every invocation:
211
+ // 1. CONTRACT_CODE entries (WASM code TTL bumps)
212
+ // 2. CONTRACT_DATA entries with scvLedgerKeyContractInstance key (instance TTL bumps)
213
+ // Only remaining entries represent actual contract storage modifications.
214
+ const storageChanges = (simulationResult.stateChanges ?? []).filter((change) => {
215
+ try {
216
+ const keyType = change.key.switch();
217
+
218
+ if (keyType === xdr.LedgerEntryType.contractCode()) {
219
+ return false;
220
+ }
221
+
222
+ if (keyType === xdr.LedgerEntryType.contractData()) {
223
+ const dataKey = change.key.contractData().key();
224
+ if (dataKey.switch() === xdr.ScValType.scvLedgerKeyContractInstance()) {
225
+ return false;
226
+ }
227
+ }
228
+
229
+ return true;
230
+ } catch {
231
+ return true;
232
+ }
233
+ });
234
+
235
+ const hasStorageChanges = storageChanges.length > 0;
211
236
 
212
237
  logger.info(
213
238
  'checkStellarFunctionStateMutability',
214
239
  `[Check ${functionName}] State mutability check complete:`,
215
240
  {
216
- hasStateChanges,
217
- stateChangesCount: simulationResult.stateChanges?.length || 0,
218
- modifiesState: Boolean(hasStateChanges),
241
+ totalStateChanges: simulationResult.stateChanges?.length || 0,
242
+ storageChangesCount: storageChanges.length,
243
+ modifiesState: hasStorageChanges,
219
244
  }
220
245
  );
221
246
 
222
- return Boolean(hasStateChanges);
247
+ return hasStorageChanges;
223
248
  } catch (error) {
224
249
  logger.warn(
225
250
  'checkStellarFunctionStateMutability',