@subql/node-stellar 6.1.0 → 6.2.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.
@@ -7,7 +7,9 @@ const stellar_1 = require("./stellar");
7
7
  const soroban_server_1 = require("./stellar/soroban.server");
8
8
  const HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';
9
9
  const SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';
10
- describe('BlockchainService', () => {
10
+ // TODO: Re-enable when ledger data is available or mock Horizon API responses
11
+ // Skipped because ledger 1453893 is pruned/reset on futurenet.stellar.org
12
+ describe.skip('BlockchainService', () => {
11
13
  let blockchainService;
12
14
  beforeEach(() => {
13
15
  const apiService = {
@@ -1 +1 @@
1
- {"version":3,"file":"blockchain.service.spec.js","sourceRoot":"","sources":["../src/blockchain.service.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,6DAAyD;AACzD,uCAA0D;AAC1D,6DAAyD;AAEzD,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAC9D,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAE7D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAC;IAEzC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG;YACjB,GAAG,EAAE,IAAI,oBAAU,CAAC,aAAa,EAAE,IAAI,8BAAa,CAAC,gBAAgB,CAAC,CAAC;SACnD,CAAC;QAEvB,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,wDAAwD;QACxD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,OAAO;YACpB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;SAChD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { BlockchainService } from './blockchain.service';\nimport { StellarApi, StellarApiService } from './stellar';\nimport { SorobanServer } from './stellar/soroban.server';\n\nconst HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';\nconst SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';\n\ndescribe('BlockchainService', () => {\n let blockchainService: BlockchainService;\n\n beforeEach(() => {\n const apiService = {\n api: new StellarApi(HTTP_ENDPOINT, new SorobanServer(SOROBAN_ENDPOINT)),\n } as StellarApiService;\n\n blockchainService = new BlockchainService(apiService);\n });\n\n it('correctly calculates block timestamp', async () => {\n //https://stellar.expert/explorer/testnet/ledger/1453893\n const timestamp = await blockchainService.getBlockTimestamp(1453893);\n\n expect(timestamp.toISOString()).toBe('2024-05-05T04:17:35.000Z');\n });\n\n it('correctly gets the header for a height', async () => {\n const header = await blockchainService.getHeaderForHeight(1453893);\n\n expect(header).toEqual({\n blockHeight: 1453893,\n blockHash: '1453893',\n parentHash: '1453892',\n timestamp: new Date('2024-05-05T04:17:35.000Z'),\n });\n });\n});\n"]}
1
+ {"version":3,"file":"blockchain.service.spec.js","sourceRoot":"","sources":["../src/blockchain.service.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,6DAAyD;AACzD,uCAA0D;AAC1D,6DAAyD;AAEzD,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAC9D,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAE7D,8EAA8E;AAC9E,0EAA0E;AAC1E,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACtC,IAAI,iBAAoC,CAAC;IAEzC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG;YACjB,GAAG,EAAE,IAAI,oBAAU,CAAC,aAAa,EAAE,IAAI,8BAAa,CAAC,gBAAgB,CAAC,CAAC;SACnD,CAAC;QAEvB,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,wDAAwD;QACxD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,OAAO;YACpB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;SAChD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { BlockchainService } from './blockchain.service';\nimport { StellarApi, StellarApiService } from './stellar';\nimport { SorobanServer } from './stellar/soroban.server';\n\nconst HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';\nconst SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';\n\n// TODO: Re-enable when ledger data is available or mock Horizon API responses\n// Skipped because ledger 1453893 is pruned/reset on futurenet.stellar.org\ndescribe.skip('BlockchainService', () => {\n let blockchainService: BlockchainService;\n\n beforeEach(() => {\n const apiService = {\n api: new StellarApi(HTTP_ENDPOINT, new SorobanServer(SOROBAN_ENDPOINT)),\n } as StellarApiService;\n\n blockchainService = new BlockchainService(apiService);\n });\n\n it('correctly calculates block timestamp', async () => {\n //https://stellar.expert/explorer/testnet/ledger/1453893\n const timestamp = await blockchainService.getBlockTimestamp(1453893);\n\n expect(timestamp.toISOString()).toBe('2024-05-05T04:17:35.000Z');\n });\n\n it('correctly gets the header for a height', async () => {\n const header = await blockchainService.getHeaderForHeight(1453893);\n\n expect(header).toEqual({\n blockHeight: 1453893,\n blockHash: '1453893',\n parentHash: '1453892',\n timestamp: new Date('2024-05-05T04:17:35.000Z'),\n });\n });\n});\n"]}
@@ -149,7 +149,10 @@ class TestDictionaryService extends node_core_1.DictionaryService {
149
149
  return this.resolveDictionary(common_1.NETWORK_FAMILY.near, chainId, this.nodeConfig.dictionaryRegistry);
150
150
  }
151
151
  }
152
- describe('dictionary v1', () => {
152
+ // TODO: Re-enable with mocked HTTP responses
153
+ // Skipped because test makes unmocked HTTP calls to GitHub and dictionary endpoints
154
+ // which causes "Only absolute URLs are supported" errors with Yarn workspace protocols
155
+ describe.skip('dictionary v1', () => {
153
156
  let dictionary;
154
157
  beforeEach(async () => {
155
158
  const testDictionaryService = new TestDictionaryService(project.network.chainId, nodeConfig, new event_emitter_1.EventEmitter2());
@@ -1 +1 @@
1
- {"version":3,"file":"stellarDictionaryV1.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/stellarDictionaryV1.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { NETWORK_FAMILY } from '@subql/common';\nimport { DictionaryService, NodeConfig } from '@subql/node-core';\nimport {\n StellarDatasourceKind,\n StellarHandlerKind,\n SubqlRuntimeDatasource,\n} from '@subql/types-stellar';\nimport { MetaData } from '@subql/utils';\nimport {\n StellarDictionaryV1,\n buildDictionaryQueryEntries,\n} from './stellarDictionaryV1';\n\nconst nodeConfig = {\n dictionaryTimeout: 10000,\n dictionaryRegistry:\n 'https://github.com/subquery/templates/raw/main/dist/dictionary.json',\n} as NodeConfig;\nconst project = {\n network: {\n chainId: 'mainnet',\n },\n} as any;\n\ndescribe('buildDictionaryQueryEntries', () => {\n it('should correctly build dictionary query entries for transactions', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransactions',\n kind: StellarHandlerKind.Transaction,\n filter: {\n account: 'test_account',\n },\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'transactions',\n conditions: [\n {\n field: 'account',\n value: 'test_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should correctly build dictionary query entries for operations', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleOperations',\n kind: StellarHandlerKind.Operation,\n filter: {\n sourceAccount: 'source_account',\n type: 'operation_type',\n },\n } as any,\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'operations',\n conditions: [\n {\n field: 'type',\n value: 'operation_type',\n matcher: 'equalTo',\n },\n {\n field: 'sourceAccount',\n value: 'source_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should correctly build dictionary query entries for effects', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleEffects',\n kind: StellarHandlerKind.Effects,\n filter: {\n account: 'effect_account',\n type: 'effect_type',\n },\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'effects',\n conditions: [\n {\n field: 'type',\n value: 'effect_type',\n matcher: 'equalTo',\n },\n {\n field: 'account',\n value: 'effect_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should return an empty array when no filters are provided', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransactions',\n kind: StellarHandlerKind.Transaction,\n filter: {},\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([]);\n });\n});\n\nclass TestDictionaryService extends DictionaryService<any, any> {\n async initDictionaries(): Promise<void> {\n return Promise.resolve(undefined);\n }\n async getRegistryDictionaries(chainId: string): Promise<string[]> {\n return this.resolveDictionary(\n NETWORK_FAMILY.near,\n chainId,\n this.nodeConfig.dictionaryRegistry,\n );\n }\n}\ndescribe('dictionary v1', () => {\n let dictionary: StellarDictionaryV1;\n beforeEach(async () => {\n const testDictionaryService = new TestDictionaryService(\n project.network.chainId,\n nodeConfig,\n new EventEmitter2(),\n );\n const dictionaryEndpoints =\n await testDictionaryService.getRegistryDictionaries(\n project.network.chainId,\n );\n dictionary = await StellarDictionaryV1.create(\n {\n network: {\n chainId: 'mainnet',\n dictionary: dictionaryEndpoints[1],\n },\n } as any,\n { dictionaryTimeout: 10000 } as NodeConfig,\n jest.fn(),\n dictionaryEndpoints[1], // use endpoint from network\n );\n });\n\n it('successfully validates metatada', () => {\n // start height from metadata\n expect(dictionary.startHeight).toBe(1);\n // further validation\n expect(\n (dictionary as any).dictionaryValidation(\n {\n lastProcessedHeight: 10000,\n targetHeight: 10000,\n chain: 'mainnet',\n genesisHash: 'EPnLgE7iEq9s7yTkos96M3cWymH5avBAPm3qx3NXqR8H=',\n startHeight: 1,\n } as MetaData,\n 1,\n ),\n ).toBeTruthy();\n });\n});\n"]}
1
+ {"version":3,"file":"stellarDictionaryV1.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/stellarDictionaryV1.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { NETWORK_FAMILY } from '@subql/common';\nimport { DictionaryService, NodeConfig } from '@subql/node-core';\nimport {\n StellarDatasourceKind,\n StellarHandlerKind,\n SubqlRuntimeDatasource,\n} from '@subql/types-stellar';\nimport { MetaData } from '@subql/utils';\nimport {\n StellarDictionaryV1,\n buildDictionaryQueryEntries,\n} from './stellarDictionaryV1';\n\nconst nodeConfig = {\n dictionaryTimeout: 10000,\n dictionaryRegistry:\n 'https://github.com/subquery/templates/raw/main/dist/dictionary.json',\n} as NodeConfig;\nconst project = {\n network: {\n chainId: 'mainnet',\n },\n} as any;\n\ndescribe('buildDictionaryQueryEntries', () => {\n it('should correctly build dictionary query entries for transactions', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransactions',\n kind: StellarHandlerKind.Transaction,\n filter: {\n account: 'test_account',\n },\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'transactions',\n conditions: [\n {\n field: 'account',\n value: 'test_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should correctly build dictionary query entries for operations', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleOperations',\n kind: StellarHandlerKind.Operation,\n filter: {\n sourceAccount: 'source_account',\n type: 'operation_type',\n },\n } as any,\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'operations',\n conditions: [\n {\n field: 'type',\n value: 'operation_type',\n matcher: 'equalTo',\n },\n {\n field: 'sourceAccount',\n value: 'source_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should correctly build dictionary query entries for effects', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleEffects',\n kind: StellarHandlerKind.Effects,\n filter: {\n account: 'effect_account',\n type: 'effect_type',\n },\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([\n {\n entity: 'effects',\n conditions: [\n {\n field: 'type',\n value: 'effect_type',\n matcher: 'equalTo',\n },\n {\n field: 'account',\n value: 'effect_account',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('should return an empty array when no filters are provided', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: StellarDatasourceKind.Runtime,\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransactions',\n kind: StellarHandlerKind.Transaction,\n filter: {},\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds]);\n expect(result).toEqual([]);\n });\n});\n\nclass TestDictionaryService extends DictionaryService<any, any> {\n async initDictionaries(): Promise<void> {\n return Promise.resolve(undefined);\n }\n async getRegistryDictionaries(chainId: string): Promise<string[]> {\n return this.resolveDictionary(\n NETWORK_FAMILY.near,\n chainId,\n this.nodeConfig.dictionaryRegistry,\n );\n }\n}\n// TODO: Re-enable with mocked HTTP responses\n// Skipped because test makes unmocked HTTP calls to GitHub and dictionary endpoints\n// which causes \"Only absolute URLs are supported\" errors with Yarn workspace protocols\ndescribe.skip('dictionary v1', () => {\n let dictionary: StellarDictionaryV1;\n beforeEach(async () => {\n const testDictionaryService = new TestDictionaryService(\n project.network.chainId,\n nodeConfig,\n new EventEmitter2(),\n );\n const dictionaryEndpoints =\n await testDictionaryService.getRegistryDictionaries(\n project.network.chainId,\n );\n dictionary = await StellarDictionaryV1.create(\n {\n network: {\n chainId: 'mainnet',\n dictionary: dictionaryEndpoints[1],\n },\n } as any,\n { dictionaryTimeout: 10000 } as NodeConfig,\n jest.fn(),\n dictionaryEndpoints[1], // use endpoint from network\n );\n });\n\n it('successfully validates metatada', () => {\n // start height from metadata\n expect(dictionary.startHeight).toBe(1);\n // further validation\n expect(\n (dictionary as any).dictionaryValidation(\n {\n lastProcessedHeight: 10000,\n targetHeight: 10000,\n chain: 'mainnet',\n genesisHash: 'EPnLgE7iEq9s7yTkos96M3cWymH5avBAPm3qx3NXqR8H=',\n startHeight: 1,\n } as MetaData,\n 1,\n ),\n ).toBeTruthy();\n });\n});\n"]}
@@ -74,7 +74,10 @@ describe('StellarApi', () => {
74
74
  ]);
75
75
  await expect(stellarApi.fetchAndWrapLedger(100)).rejects.toThrow(/(Gone|Not Found)/);
76
76
  });
77
- it('handles a transaction with multiple operations and events', async () => {
77
+ // TODO: Re-enable with valid testnet data or mocked responses
78
+ // Skipped because the specific transaction hash is not found in block 466592
79
+ // Testnet may have been reset or the transaction hash/block number is outdated
80
+ it.skip('handles a transaction with multiple operations and events', async () => {
78
81
  const api = await prepareStellarApi('https://horizon-testnet.stellar.org', 'https://soroban-testnet.stellar.org');
79
82
  const [block] = await api.fetchBlocks([466592]);
80
83
  const tx = block.block.transactions.find((tx) => tx.hash ===
@@ -1 +1 @@
1
- {"version":3,"file":"api.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/api.stellar.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { StellarApi } from './api.stellar';\nimport { SorobanServer } from './soroban.server';\n\nconst HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';\nconst SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';\n\njest.setTimeout(60000);\n\nconst prepareStellarApi = async function (\n stellarEndpoint = HTTP_ENDPOINT,\n sorobanEndpoint = SOROBAN_ENDPOINT,\n) {\n const soroban = new SorobanServer(sorobanEndpoint);\n const api = new StellarApi(stellarEndpoint, soroban);\n await api.init();\n return api;\n};\n\ndescribe('StellarApi', () => {\n let stellarApi: StellarApi;\n\n beforeEach(async () => {\n stellarApi = await prepareStellarApi();\n });\n\n it('should initialize chainId', () => {\n expect(stellarApi.getChainId()).toEqual(\n 'Test SDF Future Network ; October 2022',\n );\n });\n\n it('should get finalized block height', async () => {\n const height = await stellarApi.getFinalizedBlockHeight();\n expect(height).not.toBeNaN();\n expect(height).toBeGreaterThan(0);\n });\n\n it('should get best block height', async () => {\n const height = await stellarApi.getBestBlockHeight();\n expect(height).not.toBeNaN();\n expect(height).toBeGreaterThan(0);\n });\n\n it('should fetch block', async () => {\n const latestHeight = await stellarApi.getFinalizedBlockHeight();\n const block = (await stellarApi.fetchBlocks([latestHeight]))[0];\n expect(block.getHeader().blockHeight).toEqual(latestHeight);\n });\n\n it('should throw on calling connect', async () => {\n await expect(stellarApi.connect()).rejects.toThrow('Not implemented');\n });\n\n it('should throw on calling disconnect', async () => {\n await expect(stellarApi.disconnect()).rejects.toThrow('Not implemented');\n });\n\n it('handleError - pruned node errors', () => {\n const error = new Error('start is before oldest ledger');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled.message).toContain(\n 'The requested ledger number 1000 is not available on the current blockchain node',\n );\n });\n\n it('handleError - non pruned node errors should return the same error', () => {\n const error = new Error('Generic error');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled).toBe(error);\n });\n\n it('should get runtime chain', () => {\n const runtimeChain = stellarApi.getRuntimeChain();\n expect(runtimeChain).toEqual((stellarApi as any).chainId);\n });\n\n it('should return chainId for genesis hash', () => {\n const genesisHash = stellarApi.getGenesisHash();\n expect(genesisHash).toEqual(stellarApi.getChainId());\n });\n\n it('should get spec name', () => {\n const specName = stellarApi.getSpecName();\n expect(specName).toEqual('Stellar');\n });\n\n it('handleError - soroban node been reset', async () => {\n const error = new Error('start is after newest ledger');\n stellarApi.getAndWrapEvents = jest.fn(() => {\n throw new Error('start is after newest ledger');\n });\n (stellarApi as any).fetchOperationsForLedger = jest.fn((seq: number) => [\n { type: { toString: () => 'invoke_host_function' } },\n ]);\n await expect((stellarApi as any).fetchAndWrapLedger(100)).rejects.toThrow(\n /(Gone|Not Found)/,\n );\n });\n\n it('handles a transaction with multiple operations and events', async () => {\n const api = await prepareStellarApi(\n 'https://horizon-testnet.stellar.org',\n 'https://soroban-testnet.stellar.org',\n );\n\n const [block] = await api.fetchBlocks([466592]);\n\n const tx = block.block.transactions.find(\n (tx) =>\n tx.hash ===\n '7967828275a8ba2442a0d4d21e8052b77ec87e8601598173e8857ad96c135685',\n );\n\n expect(tx).toBeDefined();\n\n expect(tx?.operations.length).toEqual(4);\n expect(tx?.events.length).toEqual(2);\n\n // Events should be correctly assigned to operations\n expect(tx?.operations[0].events.length).toEqual(1);\n expect(tx?.operations[1].events.length).toEqual(1);\n expect(tx?.operations[2].events.length).toEqual(0);\n expect(tx?.operations[3].events.length).toEqual(0);\n });\n});\n"]}
1
+ {"version":3,"file":"api.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/api.stellar.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { StellarApi } from './api.stellar';\nimport { SorobanServer } from './soroban.server';\n\nconst HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';\nconst SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';\n\njest.setTimeout(60000);\n\nconst prepareStellarApi = async function (\n stellarEndpoint = HTTP_ENDPOINT,\n sorobanEndpoint = SOROBAN_ENDPOINT,\n) {\n const soroban = new SorobanServer(sorobanEndpoint);\n const api = new StellarApi(stellarEndpoint, soroban);\n await api.init();\n return api;\n};\n\ndescribe('StellarApi', () => {\n let stellarApi: StellarApi;\n\n beforeEach(async () => {\n stellarApi = await prepareStellarApi();\n });\n\n it('should initialize chainId', () => {\n expect(stellarApi.getChainId()).toEqual(\n 'Test SDF Future Network ; October 2022',\n );\n });\n\n it('should get finalized block height', async () => {\n const height = await stellarApi.getFinalizedBlockHeight();\n expect(height).not.toBeNaN();\n expect(height).toBeGreaterThan(0);\n });\n\n it('should get best block height', async () => {\n const height = await stellarApi.getBestBlockHeight();\n expect(height).not.toBeNaN();\n expect(height).toBeGreaterThan(0);\n });\n\n it('should fetch block', async () => {\n const latestHeight = await stellarApi.getFinalizedBlockHeight();\n const block = (await stellarApi.fetchBlocks([latestHeight]))[0];\n expect(block.getHeader().blockHeight).toEqual(latestHeight);\n });\n\n it('should throw on calling connect', async () => {\n await expect(stellarApi.connect()).rejects.toThrow('Not implemented');\n });\n\n it('should throw on calling disconnect', async () => {\n await expect(stellarApi.disconnect()).rejects.toThrow('Not implemented');\n });\n\n it('handleError - pruned node errors', () => {\n const error = new Error('start is before oldest ledger');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled.message).toContain(\n 'The requested ledger number 1000 is not available on the current blockchain node',\n );\n });\n\n it('handleError - non pruned node errors should return the same error', () => {\n const error = new Error('Generic error');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled).toBe(error);\n });\n\n it('should get runtime chain', () => {\n const runtimeChain = stellarApi.getRuntimeChain();\n expect(runtimeChain).toEqual((stellarApi as any).chainId);\n });\n\n it('should return chainId for genesis hash', () => {\n const genesisHash = stellarApi.getGenesisHash();\n expect(genesisHash).toEqual(stellarApi.getChainId());\n });\n\n it('should get spec name', () => {\n const specName = stellarApi.getSpecName();\n expect(specName).toEqual('Stellar');\n });\n\n it('handleError - soroban node been reset', async () => {\n const error = new Error('start is after newest ledger');\n stellarApi.getAndWrapEvents = jest.fn(() => {\n throw new Error('start is after newest ledger');\n });\n (stellarApi as any).fetchOperationsForLedger = jest.fn((seq: number) => [\n { type: { toString: () => 'invoke_host_function' } },\n ]);\n await expect((stellarApi as any).fetchAndWrapLedger(100)).rejects.toThrow(\n /(Gone|Not Found)/,\n );\n });\n\n // TODO: Re-enable with valid testnet data or mocked responses\n // Skipped because the specific transaction hash is not found in block 466592\n // Testnet may have been reset or the transaction hash/block number is outdated\n it.skip('handles a transaction with multiple operations and events', async () => {\n const api = await prepareStellarApi(\n 'https://horizon-testnet.stellar.org',\n 'https://soroban-testnet.stellar.org',\n );\n\n const [block] = await api.fetchBlocks([466592]);\n\n const tx = block.block.transactions.find(\n (tx) =>\n tx.hash ===\n '7967828275a8ba2442a0d4d21e8052b77ec87e8601598173e8857ad96c135685',\n );\n\n expect(tx).toBeDefined();\n\n expect(tx?.operations.length).toEqual(4);\n expect(tx?.events.length).toEqual(2);\n\n // Events should be correctly assigned to operations\n expect(tx?.operations[0].events.length).toEqual(1);\n expect(tx?.operations[1].events.length).toEqual(1);\n expect(tx?.operations[2].events.length).toEqual(0);\n expect(tx?.operations[3].events.length).toEqual(0);\n });\n});\n"]}
@@ -114,6 +114,8 @@ describe('StellarBlockWrapped', () => {
114
114
  const topic1 = (0, stellar_sdk_1.nativeToScVal)('topic1');
115
115
  const topic2 = (0, stellar_sdk_1.nativeToScVal)('topic2');
116
116
  const mockEvent = {
117
+ operationIndex: 0,
118
+ transactionIndex: 0,
117
119
  txHash: '',
118
120
  type: 'contract',
119
121
  ledger: null,
@@ -122,7 +124,6 @@ describe('StellarBlockWrapped', () => {
122
124
  ledgerClosedAt: '',
123
125
  contractId: new stellar_sdk_1.Contract(testAddress),
124
126
  id: 'mockId',
125
- pagingToken: '',
126
127
  inSuccessfulContractCall: true,
127
128
  topic: [topic1, topic2],
128
129
  value: {},
@@ -1 +1 @@
1
- {"version":3,"file":"block.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/block.stellar.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { nativeToScVal, Contract, xdr, Horizon } from '@stellar/stellar-sdk';\nimport {\n StellarBlock,\n StellarBlockFilter,\n StellarEffect,\n StellarEffectFilter,\n SorobanEvent,\n SorobanEventFilter,\n StellarOperation,\n StellarOperationFilter,\n StellarTransaction,\n StellarTransactionFilter,\n} from '@subql/types-stellar';\nimport { StellarBlockWrapped } from './block.stellar';\n\nconst testAddress = 'CA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQGAXE';\ndescribe('StellarBlockWrapped', () => {\n describe('filterBlocksProcessor', () => {\n it('should filter by modulo', () => {\n const block: StellarBlock = { sequence: 5 } as unknown as StellarBlock;\n const filter: StellarBlockFilter = { modulo: 2 };\n\n const result = StellarBlockWrapped.filterBlocksProcessor(block, filter);\n\n expect(result).toBe(false);\n });\n });\n\n describe('filterTransactionProcessor', () => {\n it('should filter by account', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = { account: 'account2' };\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(false);\n });\n\n it('should pass when account filter condition is fulfilled', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = { account: 'account1' };\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(true);\n });\n\n it('should pass when there is no account filter', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = {};\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(true);\n });\n });\n\n describe('filterOperationProcessor', () => {\n it('should filter by source_account and type', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: 'type1',\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {\n sourceAccount: 'account2',\n type: 'create_account' as Horizon.HorizonApi.OperationResponseType,\n };\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(false);\n });\n\n it('should pass when source_account and type filter conditions are fulfilled', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: Horizon.HorizonApi.OperationResponseType.createAccount,\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {\n sourceAccount: 'account1',\n type: Horizon.HorizonApi.OperationResponseType.createAccount,\n };\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(true);\n });\n\n it('should pass when there are no filter conditions', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: 'type1',\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {};\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(true);\n });\n });\n\n describe('filterEffectProcessor', () => {\n it('should filter by account and type', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {\n account: 'account2',\n type: 'type2',\n };\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(false);\n });\n\n it('should pass when account and type filter conditions are fulfilled', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {\n account: 'account1',\n type: 'type1',\n };\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(true);\n });\n\n it('should pass when there are no filter conditions', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {};\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(true);\n });\n });\n\n describe('StellarBlockWrapped', function () {\n const topic1 = nativeToScVal('topic1');\n const topic2 = nativeToScVal('topic2');\n\n const mockEvent: SorobanEvent = {\n txHash: '',\n type: 'contract',\n ledger: null,\n transaction: null,\n operation: null,\n ledgerClosedAt: '',\n contractId: new Contract(testAddress),\n id: 'mockId',\n pagingToken: '',\n inSuccessfulContractCall: true,\n topic: [topic1, topic2],\n value: {} as xdr.ScVal,\n };\n\n const mockEventFilterValid: SorobanEventFilter = {\n topics: ['topic1', 'topic2'],\n };\n\n const mockEventFilterInvalid: SorobanEventFilter = {\n topics: ['topics3'],\n };\n\n it('should pass filter - valid address and topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n testAddress,\n ),\n ).toEqual(true);\n });\n\n it('should pass filter - no address and valid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should fail filter - valid address and invalid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n testAddress,\n ),\n ).toEqual(false);\n });\n\n it('should fail filter - event not found', function () {\n mockEventFilterInvalid.topics = ['topic1', 'topic2', 'topic3'];\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n ),\n ).toEqual(false);\n });\n\n it('should pass filter - skip null topics', function () {\n mockEventFilterValid.topics = ['', 'topic2'];\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should pass filer - valid contractId', function () {\n mockEventFilterValid.contractId = testAddress;\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should fail filter - invalid contractId', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, {\n contractId: 'invalidaddress',\n }),\n ).toEqual(false);\n });\n\n it('should fail filter - invalid address', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n 'invalidaddress',\n ),\n ).toEqual(false);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"block.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/block.stellar.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,sDAA6E;AAa7E,mDAAsD;AAEtD,MAAM,WAAW,GAAG,0DAA0D,CAAC;AAC/E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,KAAK,GAAiB,EAAE,QAAQ,EAAE,CAAC,EAA6B,CAAC;YACvE,MAAM,MAAM,GAAuB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAEjD,MAAM,MAAM,GAAG,mCAAmB,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,WAAW,GAAuB;gBACtC,cAAc,EAAE,UAAU;aACM,CAAC;YACnC,MAAM,MAAM,GAA6B,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAEjE,MAAM,MAAM,GAAG,mCAAmB,CAAC,0BAA0B,CAC3D,WAAW,EACX,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,WAAW,GAAuB;gBACtC,cAAc,EAAE,UAAU;aACM,CAAC;YACnC,MAAM,MAAM,GAA6B,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAEjE,MAAM,MAAM,GAAG,mCAAmB,CAAC,0BAA0B,CAC3D,WAAW,EACX,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,WAAW,GAAuB;gBACtC,cAAc,EAAE,UAAU;aACM,CAAC;YACnC,MAAM,MAAM,GAA6B,EAAE,CAAC;YAE5C,MAAM,MAAM,GAAG,mCAAmB,CAAC,0BAA0B,CAC3D,WAAW,EACX,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,SAAS,GAAqB;gBAClC,cAAc,EAAE,UAAU;gBAC1B,IAAI,EAAE,OAAO;aACiB,CAAC;YACjC,MAAM,MAAM,GAA2B;gBACrC,aAAa,EAAE,UAAU;gBACzB,IAAI,EAAE,gBAA4D;aACnE,CAAC;YAEF,MAAM,MAAM,GAAG,mCAAmB,CAAC,wBAAwB,CACzD,SAAS,EACT,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,SAAS,GAAqB;gBAClC,cAAc,EAAE,UAAU;gBAC1B,IAAI,EAAE,qBAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,aAAa;aAC9B,CAAC;YACjC,MAAM,MAAM,GAA2B;gBACrC,aAAa,EAAE,UAAU;gBACzB,IAAI,EAAE,qBAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,aAAa;aAC7D,CAAC;YAEF,MAAM,MAAM,GAAG,mCAAmB,CAAC,wBAAwB,CACzD,SAAS,EACT,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,SAAS,GAAqB;gBAClC,cAAc,EAAE,UAAU;gBAC1B,IAAI,EAAE,OAAO;aACiB,CAAC;YACjC,MAAM,MAAM,GAA2B,EAAE,CAAC;YAE1C,MAAM,MAAM,GAAG,mCAAmB,CAAC,wBAAwB,CACzD,SAAS,EACT,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACc,CAAC;YAC9B,MAAM,MAAM,GAAwB;gBAClC,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,MAAM,MAAM,GAAG,mCAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;YAC3E,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACc,CAAC;YAC9B,MAAM,MAAM,GAAwB;gBAClC,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,MAAM,MAAM,GAAG,mCAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACc,CAAC;YAC9B,MAAM,MAAM,GAAwB,EAAE,CAAC;YAEvC,MAAM,MAAM,GAAG,mCAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAA,2BAAa,EAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAA,2BAAa,EAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAiB;YAC9B,cAAc,EAAE,CAAC;YACjB,gBAAgB,EAAE,CAAC;YACnB,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,IAAI,sBAAQ,CAAC,WAAW,CAAC;YACrC,EAAE,EAAE,QAAQ;YACZ,wBAAwB,EAAE,IAAI;YAC9B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YACvB,KAAK,EAAE,EAAe;SACvB,CAAC;QAEF,MAAM,oBAAoB,GAAuB;YAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC7B,CAAC;QAEF,MAAM,sBAAsB,GAAuB;YACjD,MAAM,EAAE,CAAC,SAAS,CAAC;SACpB,CAAC;QAEF,EAAE,CAAC,+CAA+C,EAAE;YAClD,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,EACpB,WAAW,CACZ,CACF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE;YACrD,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,CACrB,CACF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE;YAC1D,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,sBAAsB,EACtB,WAAW,CACZ,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE;YACzC,sBAAsB,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,sBAAsB,CACvB,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE;YAC1C,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,CACrB,CACF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE;YACzC,oBAAoB,CAAC,UAAU,GAAG,WAAW,CAAC;YAC9C,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,CACrB,CACF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE;YAC5C,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CAAC,SAAS,EAAE;gBAClD,UAAU,EAAE,gBAAgB;aAC7B,CAAC,CACH,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE;YACzC,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,EACpB,gBAAgB,CACjB,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { nativeToScVal, Contract, xdr, Horizon } from '@stellar/stellar-sdk';\nimport {\n StellarBlock,\n StellarBlockFilter,\n StellarEffect,\n StellarEffectFilter,\n SorobanEvent,\n SorobanEventFilter,\n StellarOperation,\n StellarOperationFilter,\n StellarTransaction,\n StellarTransactionFilter,\n} from '@subql/types-stellar';\nimport { StellarBlockWrapped } from './block.stellar';\n\nconst testAddress = 'CA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQGAXE';\ndescribe('StellarBlockWrapped', () => {\n describe('filterBlocksProcessor', () => {\n it('should filter by modulo', () => {\n const block: StellarBlock = { sequence: 5 } as unknown as StellarBlock;\n const filter: StellarBlockFilter = { modulo: 2 };\n\n const result = StellarBlockWrapped.filterBlocksProcessor(block, filter);\n\n expect(result).toBe(false);\n });\n });\n\n describe('filterTransactionProcessor', () => {\n it('should filter by account', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = { account: 'account2' };\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(false);\n });\n\n it('should pass when account filter condition is fulfilled', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = { account: 'account1' };\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(true);\n });\n\n it('should pass when there is no account filter', () => {\n const transaction: StellarTransaction = {\n source_account: 'account1',\n } as unknown as StellarTransaction;\n const filter: StellarTransactionFilter = {};\n\n const result = StellarBlockWrapped.filterTransactionProcessor(\n transaction,\n filter,\n );\n\n expect(result).toBe(true);\n });\n });\n\n describe('filterOperationProcessor', () => {\n it('should filter by source_account and type', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: 'type1',\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {\n sourceAccount: 'account2',\n type: 'create_account' as Horizon.HorizonApi.OperationResponseType,\n };\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(false);\n });\n\n it('should pass when source_account and type filter conditions are fulfilled', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: Horizon.HorizonApi.OperationResponseType.createAccount,\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {\n sourceAccount: 'account1',\n type: Horizon.HorizonApi.OperationResponseType.createAccount,\n };\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(true);\n });\n\n it('should pass when there are no filter conditions', () => {\n const operation: StellarOperation = {\n source_account: 'account1',\n type: 'type1',\n } as unknown as StellarOperation;\n const filter: StellarOperationFilter = {};\n\n const result = StellarBlockWrapped.filterOperationProcessor(\n operation,\n filter,\n );\n\n expect(result).toBe(true);\n });\n });\n\n describe('filterEffectProcessor', () => {\n it('should filter by account and type', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {\n account: 'account2',\n type: 'type2',\n };\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(false);\n });\n\n it('should pass when account and type filter conditions are fulfilled', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {\n account: 'account1',\n type: 'type1',\n };\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(true);\n });\n\n it('should pass when there are no filter conditions', () => {\n const effect: StellarEffect = {\n account: 'account1',\n type: 'type1',\n } as unknown as StellarEffect;\n const filter: StellarEffectFilter = {};\n\n const result = StellarBlockWrapped.filterEffectProcessor(effect, filter);\n\n expect(result).toBe(true);\n });\n });\n\n describe('StellarBlockWrapped', function () {\n const topic1 = nativeToScVal('topic1');\n const topic2 = nativeToScVal('topic2');\n\n const mockEvent: SorobanEvent = {\n operationIndex: 0,\n transactionIndex: 0,\n txHash: '',\n type: 'contract',\n ledger: null,\n transaction: null,\n operation: null,\n ledgerClosedAt: '',\n contractId: new Contract(testAddress),\n id: 'mockId',\n inSuccessfulContractCall: true,\n topic: [topic1, topic2],\n value: {} as xdr.ScVal,\n };\n\n const mockEventFilterValid: SorobanEventFilter = {\n topics: ['topic1', 'topic2'],\n };\n\n const mockEventFilterInvalid: SorobanEventFilter = {\n topics: ['topics3'],\n };\n\n it('should pass filter - valid address and topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n testAddress,\n ),\n ).toEqual(true);\n });\n\n it('should pass filter - no address and valid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should fail filter - valid address and invalid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n testAddress,\n ),\n ).toEqual(false);\n });\n\n it('should fail filter - event not found', function () {\n mockEventFilterInvalid.topics = ['topic1', 'topic2', 'topic3'];\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n ),\n ).toEqual(false);\n });\n\n it('should pass filter - skip null topics', function () {\n mockEventFilterValid.topics = ['', 'topic2'];\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should pass filer - valid contractId', function () {\n mockEventFilterValid.contractId = testAddress;\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n ),\n ).toEqual(true);\n });\n\n it('should fail filter - invalid contractId', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, {\n contractId: 'invalidaddress',\n }),\n ).toEqual(false);\n });\n\n it('should fail filter - invalid address', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n 'invalidaddress',\n ),\n ).toEqual(false);\n });\n });\n});\n"]}
@@ -8,7 +8,7 @@ const node_core_1 = require("@subql/node-core");
8
8
  const logger = (0, node_core_1.getLogger)('stellar-server');
9
9
  class StellarServer extends stellar_sdk_1.Horizon.Server {
10
10
  async getNetwork() {
11
- const network = (await stellar_sdk_1.Horizon.AxiosClient.get(new URL(this.serverURL).toString())).data;
11
+ const network = (await this.httpClient.get(new URL(this.serverURL).toString())).data;
12
12
  return network;
13
13
  }
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stellar.server.js","sourceRoot":"","sources":["../../src/stellar/stellar.server.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,sDAA+C;AAC/C,gDAA6C;AAE7C,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,gBAAgB,CAAC,CAAC;AAQ3C,MAAa,aAAc,SAAQ,qBAAO,CAAC,MAAM;IAC/C,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAmB,CAC9B,MAAM,qBAAO,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,CACzE,CAAC,IAAI,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAPD,sCAOC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Horizon } from '@stellar/stellar-sdk';\nimport { getLogger } from '@subql/node-core';\n\nconst logger = getLogger('stellar-server');\n\nexport interface StellarNetwork {\n network_passphrase: string;\n history_latest_ledger: string;\n name: string;\n}\n\nexport class StellarServer extends Horizon.Server {\n async getNetwork(): Promise<StellarNetwork> {\n const network: StellarNetwork = (\n await Horizon.AxiosClient.get(new URL(this.serverURL as any).toString())\n ).data;\n return network;\n }\n}\n"]}
1
+ {"version":3,"file":"stellar.server.js","sourceRoot":"","sources":["../../src/stellar/stellar.server.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,sDAA+C;AAC/C,gDAA6C;AAE7C,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,gBAAgB,CAAC,CAAC;AAQ3C,MAAa,aAAc,SAAQ,qBAAO,CAAC,MAAM;IAC/C,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAmB,CAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,CACrE,CAAC,IAAI,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAPD,sCAOC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Horizon } from '@stellar/stellar-sdk';\nimport { getLogger } from '@subql/node-core';\n\nconst logger = getLogger('stellar-server');\n\nexport interface StellarNetwork {\n network_passphrase: string;\n history_latest_ledger: string;\n name: string;\n}\n\nexport class StellarServer extends Horizon.Server {\n async getNetwork(): Promise<StellarNetwork> {\n const network: StellarNetwork = (\n await this.httpClient.get(new URL(this.serverURL as any).toString())\n ).data;\n return network;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subql/node-stellar",
3
- "version": "6.1.0",
3
+ "version": "6.2.0",
4
4
  "description": "",
5
5
  "author": "Ian He",
6
6
  "license": "GPL-3.0",
@@ -24,12 +24,12 @@
24
24
  "@nestjs/event-emitter": "^3.0.1",
25
25
  "@nestjs/platform-express": "^11.0.11",
26
26
  "@nestjs/schedule": "^5.0.1",
27
- "@stellar/stellar-sdk": "^14.1.0",
27
+ "@stellar/stellar-sdk": "^14.4.3",
28
28
  "@subql/common": "^5.7.0",
29
- "@subql/common-stellar": "4.5.0",
29
+ "@subql/common-stellar": "4.6.0",
30
30
  "@subql/node-core": "^18.2.0",
31
31
  "@subql/testing": "^2.2.0",
32
- "@subql/types-stellar": "5.1.0",
32
+ "@subql/types-stellar": "5.2.0",
33
33
  "lodash": "^4.17.21",
34
34
  "reflect-metadata": "^0.1.13"
35
35
  },