@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/index.cjs +42 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +58 -39
- package/dist/index.js.map +1 -1
- package/dist/networks.cjs +2 -2
- package/dist/networks.cjs.map +1 -1
- package/dist/networks.js +2 -2
- package/dist/networks.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/getDefaultServiceConfig.test.ts +5 -5
- package/src/access-control/indexer-client.ts +2 -2
- package/src/configuration/network-services.ts +17 -14
- package/src/networks/mainnet.ts +1 -1
- package/src/networks/testnet.ts +1 -1
- package/src/query/handler.ts +32 -7
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://
|
|
65
|
+
accessControlIndexerUrl: "https://openzeppelin-stellar-testnet.graphql.subquery.network"
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
// src/networks/index.ts
|
package/dist/networks.cjs.map
CHANGED
|
@@ -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
|
|
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://
|
|
34
|
+
accessControlIndexerUrl: "https://openzeppelin-stellar-testnet.graphql.subquery.network"
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
// src/networks/index.ts
|
package/dist/networks.js.map
CHANGED
|
@@ -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
|
|
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
|
@@ -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
|
-
//
|
|
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:
|
|
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
|
|
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:
|
|
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)
|
package/src/networks/mainnet.ts
CHANGED
|
@@ -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
|
};
|
package/src/networks/testnet.ts
CHANGED
|
@@ -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://
|
|
19
|
+
accessControlIndexerUrl: 'https://openzeppelin-stellar-testnet.graphql.subquery.network',
|
|
20
20
|
};
|
package/src/query/handler.ts
CHANGED
|
@@ -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
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
modifiesState:
|
|
241
|
+
totalStateChanges: simulationResult.stateChanges?.length || 0,
|
|
242
|
+
storageChangesCount: storageChanges.length,
|
|
243
|
+
modifiesState: hasStorageChanges,
|
|
219
244
|
}
|
|
220
245
|
);
|
|
221
246
|
|
|
222
|
-
return
|
|
247
|
+
return hasStorageChanges;
|
|
223
248
|
} catch (error) {
|
|
224
249
|
logger.warn(
|
|
225
250
|
'checkStellarFunctionStateMutability',
|