@subql/node-algorand 3.17.0 → 4.0.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/CHANGELOG.md +19 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/algorand/algorand.spec.js +1 -1
- package/dist/algorand/algorand.spec.js.map +1 -1
- package/dist/algorand/api.algorand.js +1 -1
- package/dist/algorand/api.algorand.js.map +1 -1
- package/dist/algorand/api.connection.js +1 -1
- package/dist/algorand/api.connection.js.map +1 -1
- package/dist/algorand/api.service.algorand.js +1 -1
- package/dist/algorand/api.service.algorand.js.map +1 -1
- package/dist/algorand/index.js +1 -1
- package/dist/algorand/index.js.map +1 -1
- package/dist/algorand/utils.algorand.js +2 -1
- package/dist/algorand/utils.algorand.js.map +1 -1
- package/dist/algorand/utils.algorand.spec.js +1 -1
- package/dist/algorand/utils.algorand.spec.js.map +1 -1
- package/dist/app.module.js +1 -1
- package/dist/app.module.js.map +1 -1
- package/dist/blockchain.service.d.ts +30 -0
- package/dist/blockchain.service.js +96 -0
- package/dist/blockchain.service.js.map +1 -0
- package/dist/configure/SubqueryProject.js +1 -1
- package/dist/configure/SubqueryProject.js.map +1 -1
- package/dist/configure/configure.module.js +1 -1
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/indexer/api.service.spec.js +1 -1
- package/dist/indexer/api.service.spec.js.map +1 -1
- package/dist/indexer/dictionary/algorandDictionary.service.d.ts +1 -2
- package/dist/indexer/dictionary/algorandDictionary.service.js +2 -3
- package/dist/indexer/dictionary/algorandDictionary.service.js.map +1 -1
- package/dist/indexer/dictionary/index.js +1 -1
- package/dist/indexer/dictionary/index.js.map +1 -1
- package/dist/indexer/dictionary/v1/algorandDictionaryV1.d.ts +1 -2
- package/dist/indexer/dictionary/v1/algorandDictionaryV1.js +1 -1
- package/dist/indexer/dictionary/v1/algorandDictionaryV1.js.map +1 -1
- package/dist/indexer/dictionary/v1/algorandDictionaryV1.spec.js +1 -1
- package/dist/indexer/dictionary/v1/algorandDictionaryV1.spec.js.map +1 -1
- package/dist/indexer/dictionary/v1/index.js +1 -1
- package/dist/indexer/dictionary/v1/index.js.map +1 -1
- package/dist/indexer/fetch.module.js +31 -23
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/indexer.manager.d.ts +3 -5
- package/dist/indexer/indexer.manager.js +14 -9
- package/dist/indexer/indexer.manager.js.map +1 -1
- package/dist/indexer/types.js +1 -1
- package/dist/indexer/types.js.map +1 -1
- package/dist/indexer/worker/worker-fetch.module.js +7 -14
- package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
- package/dist/indexer/worker/worker.js +1 -1
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/indexer/worker/worker.module.js +1 -2
- package/dist/indexer/worker/worker.module.js.map +1 -1
- package/dist/indexer/worker/worker.service.js +2 -1
- package/dist/indexer/worker/worker.service.js.map +1 -1
- package/dist/init.js +2 -3
- package/dist/init.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/subcommands/forceClean.init.js +1 -1
- package/dist/subcommands/forceClean.init.js.map +1 -1
- package/dist/subcommands/forceClean.module.js +1 -1
- package/dist/subcommands/forceClean.module.js.map +1 -1
- package/dist/subcommands/forceClean.service.js +1 -1
- package/dist/subcommands/forceClean.service.js.map +1 -1
- package/dist/subcommands/reindex.init.js +1 -1
- package/dist/subcommands/reindex.init.js.map +1 -1
- package/dist/subcommands/reindex.module.js +20 -8
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/dist/subcommands/testing.init.js +1 -1
- package/dist/subcommands/testing.init.js.map +1 -1
- package/dist/subcommands/testing.module.js +14 -28
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.js +1 -3
- package/dist/subcommands/testing.service.js.map +1 -1
- package/dist/utils/project.js +1 -1
- package/dist/utils/project.js.map +1 -1
- package/dist/yargs.js +1 -1
- package/dist/yargs.js.map +1 -1
- package/package.json +9 -9
- package/dist/indexer/blockDispatcher/algorand-block-dispatcher.d.ts +0 -5
- package/dist/indexer/blockDispatcher/algorand-block-dispatcher.js +0 -5
- package/dist/indexer/blockDispatcher/algorand-block-dispatcher.js.map +0 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +0 -17
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +0 -55
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +0 -1
- package/dist/indexer/blockDispatcher/index.d.ts +0 -4
- package/dist/indexer/blockDispatcher/index.js +0 -10
- package/dist/indexer/blockDispatcher/index.js.map +0 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +0 -18
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +0 -48
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +0 -1
- package/dist/indexer/ds-processor.service.d.ts +0 -11
- package/dist/indexer/ds-processor.service.js +0 -22
- package/dist/indexer/ds-processor.service.js.map +0 -1
- package/dist/indexer/dynamic-ds.service.d.ts +0 -9
- package/dist/indexer/dynamic-ds.service.js +0 -57
- package/dist/indexer/dynamic-ds.service.js.map +0 -1
- package/dist/indexer/fetch.service.d.ts +0 -22
- package/dist/indexer/fetch.service.js +0 -78
- package/dist/indexer/fetch.service.js.map +0 -1
- package/dist/indexer/project.service.d.ts +0 -16
- package/dist/indexer/project.service.js +0 -71
- package/dist/indexer/project.service.js.map +0 -1
- package/dist/indexer/unfinalizedBlocks.service.d.ts +0 -10
- package/dist/indexer/unfinalizedBlocks.service.js +0 -64
- package/dist/indexer/unfinalizedBlocks.service.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.prepareApiService = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/algorand.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAGnC,yDAA0E;AAC1E,6CAAuC;AACvC,gDAK0B;AAC1B,qCAAwC;AACxC,0CAAoE;AAGpE,MAAM,eAAe,GAAG,qCAAqC,CAAC;AAC9D,MAAM,eAAe,GAAG,oCAAoC,CAAC;AAE7D,MAAM,cAAc,GAAG,8CAA8C,CAAC;AACtE,MAAM,cAAc,GAAG,8CAA8C,CAAC;AAEtE,SAAS,mBAAmB,CAAC,QAAgB,EAAE,OAAO;IACpD,OAAO;QACL,OAAO,EAAE;YACP,OAAO;YACP,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,UAAU,EAAE,8DAA8D;SAC3E;QACD,WAAW,EAAE,EAAE;QACf,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI,uBAAa,CAAC,EAAE,CAAC;QAC7B,SAAS,EAAE,EAAE;KACP,CAAC;AACX,CAAC;AAED,0CAA0C;AACnC,MAAM,iBAAiB,GAAG,KAAK,EACpC,WAAmB,eAAe,EAClC,UAAkB,cAAc,EACiB,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;QAC5C,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC;aACzD;YACD,sBAAU;YACV,sCAA0B;YAC1B,iCAAqB;YACrB;gBACE,OAAO,EAAE,6BAAkB;gBAC3B,UAAU,EAAE,6BAAkB,CAAC,IAAI;gBACnC,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;SACF;QACD,OAAO,EAAE,CAAC,kCAAkB,CAAC,OAAO,EAAE,CAAC;KACxC,CAAC,CAAC,OAAO,EAAE,CAAC;IAEb,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC3C,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,6BAAkB,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAC3B,CAAC,CAAC;AA3BW,QAAA,iBAAiB,qBA2B5B;AAEF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACvB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,GAAqB,CAAC;IAC1B,IAAI,UAAsB,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,GAAG;YACT,sBAAsB,EAAE;gBACtB,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE;oBACN,QAAQ,EACN,4DAA4D;oBAC9D,OAAO,EAAE,4DAA4D;oBACrE,QAAQ,EAAE,CAAC;oBACX,aAAa,EAAE,KAAK;oBACpB,MAAM,EAAE,4DAA4D;oBACpE,OAAO,EAAE,4DAA4D;oBACrE,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,4DAA4D;oBACrE,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,MAAM;oBAChB,WAAW,EAAE,UAAU;oBACvB,GAAG,EAAE,kBAAkB;oBACvB,MAAM,EAAE,0BAA0B;iBACnC;aACF;YACD,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,QAAQ;YACxB,iBAAiB,EAAE,SAAS;YAC5B,GAAG,EAAE,IAAI;YACT,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,8CAA8C;YAC3D,SAAS,EAAE,cAAc;YACzB,EAAE,EAAE,sDAAsD;YAC1D,gBAAgB,EAAE,EAAE;YACpB,SAAS,EAAE,QAAQ;YACnB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,4DAA4D;YACpE,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE;gBACT,GAAG,EAAE,0FAA0F;aAChG;YACD,MAAM,EAAE,MAAM;SACf,CAAC;QAEF,MAAM,CACJ,IAAA,4BAAiB,EAAC,EAAS,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,4DAA4D;SACrE,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,oGAAoG;IACpG,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,MAAM,IAAA,yBAAiB,EACzC,eAAe,EACf,cAAc,CACf,CAAC;QACF,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,UAAU;QACzC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;QAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAE9C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE9D,mBAAmB;QACnB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAEnD,+BAA+B;QAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAEnE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAE9C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAE3E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/algorand.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 { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ApiService,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { AlgorandApiService, filterTransaction } from '../algorand';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst mainnetEndpoint = 'https://mainnet-idx.algonode.cloud/';\nconst testnetEndpoint = 'https://testnet-idx.algonode.cloud';\n\nconst mainnetChainId = 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=';\nconst testnetChainId = 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=';\n\nfunction testSubqueryProject(endpoint: string, chainId): SubqueryProject {\n return {\n network: {\n chainId,\n endpoint: [endpoint],\n dictionary: `https://api.subquery.network/sq/subquery/Algorand-Dictionary`,\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\n// eslint-disable-next-line jest/no-export\nexport const prepareApiService = async (\n endpoint: string = mainnetEndpoint,\n chainId: string = mainnetChainId,\n): Promise<[INestApplication, AlgorandApiService]> => {\n const module = await Test.createTestingModule({\n providers: [\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint, chainId),\n },\n NodeConfig,\n ConnectionPoolStateManager,\n ConnectionPoolService,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(AlgorandApiService);\n\n return [app, apiService];\n};\n\njest.setTimeout(90000);\ndescribe('Algorand RPC', () => {\n let app: INestApplication;\n let apiService: ApiService;\n\n afterEach(() => {\n return app?.close();\n });\n\n it('Can filter acfg with sender', () => {\n const tx = {\n assetConfigTransaction: {\n assetId: 0,\n params: {\n clawback:\n '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n creator: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n decimals: 0,\n defaultFrozen: false,\n freeze: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n manager: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n name: 'flowTest.algo',\n nameB64: 'Zmxvd1Rlc3QuYWxnbw==',\n reserve: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n total: 1,\n unitName: 'xAns',\n unitNameB64: 'eEFucw==',\n url: 'https://xgov.app',\n urlB64: 'aHR0cHM6Ly94Z292LmFwcA==',\n },\n },\n closeRewards: 0,\n closingAmount: 0,\n confirmedRound: 27081666,\n createdAssetIndex: 154583116,\n fee: 1000,\n firstValid: 27081664,\n genesisHash: 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=',\n genesisId: 'testnet-v1.0',\n id: '5CUFVHAA7XZFZDRXO5J2Q26O6O4KB6DHSOB54P5LO3S57S2JF5NA',\n intraRoundOffset: 12,\n lastValid: 27082664,\n receiverRewards: 0,\n roundTime: 1674020229,\n sender: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n senderRewards: 0,\n signature: {\n sig: 'rawhKc26WQe98vKweozDOJmH32c60fI83ddi5kwXg2BYu8EJCh0V3dlzRkOcY/4C3Gh7Bkzi12Yte9EejE1QBw==',\n },\n txType: 'acfg',\n };\n\n expect(\n filterTransaction(tx as any, {\n txType: 'acfg',\n sender: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n }),\n ).toBe(true);\n });\n\n // This is failing since switching from algo explorer api. This is due to a node configuration limit\n it('paginate large blocks', async () => {\n [app, apiService] = await prepareApiService(\n testnetEndpoint,\n testnetChainId,\n );\n const failingBlock = 27739202; // testnet\n const api = apiService.api;\n\n const paginateSpy = jest.spyOn(api, 'paginatedTransactions');\n const result = await api.getBlockByHeight(failingBlock);\n expect(paginateSpy).toHaveBeenCalledTimes(3);\n expect(result.transactions.length).toEqual(13916);\n });\n\n it('can stringify blocks and transactions with circular references', async () => {\n [app, apiService] = await prepareApiService();\n\n const block = await apiService.api.getBlockByHeight(30478896);\n\n // The circular ref\n expect(block.transactions[13].block).toBeDefined();\n\n // We can stringify the objects\n expect(() => JSON.stringify(block)).not.toThrow();\n expect(() => JSON.stringify(block.transactions[13])).not.toThrow();\n\n expect(JSON.parse(JSON.stringify(block)).round).toEqual(block.round);\n });\n\n it('can get the grouped transactions within a block', async () => {\n [app, apiService] = await prepareApiService();\n\n const block = await apiService.api.getBlockByHeight(30478896);\n\n const groupTx = block.getTransactionsByGroup(block.transactions[13].group);\n\n expect(groupTx.length).toEqual(3);\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.algorand.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { delay, getLogger, IBlock } from '@subql/node-core';\nimport {\n AlgorandBlock,\n AlgorandTransaction,\n SafeAPI,\n} from '@subql/types-algorand';\nimport { IEndpointConfig } from '@subql/types-core';\nimport algosdk, { Indexer } from 'algosdk';\nimport { omit } from 'lodash';\nimport { camelCaseObjectKey, formatBlockUtil } from './utils.algorand';\n\nconst logger = getLogger('api.algorand');\n\nexport class AlgorandApi {\n private _genesisHash?: string;\n private _chain?: string;\n readonly api: Indexer;\n private blockCache: AlgorandBlock[] = [];\n private paginationLimit = 10000;\n\n private constructor(endpoint: string, config: IEndpointConfig) {\n this.api = new algosdk.Indexer(\n config.headers?.['X-Indexer-API-Token'] ?? '',\n endpoint,\n new URL(endpoint).port, // Specify the port, by default it will be an empty string, we don't want undefined because it then defaults to 8080\n config.headers,\n );\n }\n\n static async create(\n endpoint: string,\n config: IEndpointConfig,\n ): Promise<AlgorandApi> {\n const api = new AlgorandApi(endpoint, config);\n\n // get genesisHash in block\n const block = await api.api.lookupBlock(1).do();\n\n api._genesisHash = block['genesis-hash'] ?? '';\n api._chain = block['genesis-id'] ?? '';\n\n return api;\n }\n\n private get genesisHash(): string {\n assert(this._genesisHash, 'genesisHash not initialized');\n return this._genesisHash;\n }\n\n private get chain(): string {\n assert(this._chain, 'chain not initialized');\n return this._chain;\n }\n\n async getLatestBlockHeader(): Promise<AlgorandBlock> {\n const checkHealth = await this.api.makeHealthCheck().do();\n const block = await this.getHeaderOnly(checkHealth.round);\n\n return block;\n }\n\n async getBlockByHeight(height: number): Promise<AlgorandBlock> {\n try {\n const blockInfo = await this.api.lookupBlock(height).do();\n return this.constructBlock(camelCaseObjectKey(blockInfo));\n } catch (error: any) {\n if (error.message.includes('Max transactions limit exceeded')) {\n logger.warn('Max transactions limit exceeded, paginating transactions');\n\n return this.combinePaginateBlock(height);\n } else {\n logger.error(error, `failed to fetch Block at round ${height}`);\n throw error;\n }\n }\n }\n\n async getHeaderOnly(block: number): Promise<AlgorandBlock> {\n try {\n const result = await this.api.lookupBlock(block).headerOnly(true).do();\n return this.constructBlock(result as AlgorandBlock);\n } catch (e) {\n logger.error('Failed to fetch round header', e);\n throw e;\n }\n }\n\n async paginatedTransactions(\n blockHeight: number,\n nextToken?: string,\n ): Promise<AlgorandTransaction[]> {\n try {\n let req = this.api\n .searchForTransactions()\n .round(blockHeight)\n .limit(this.paginationLimit);\n\n if (nextToken) {\n req = req.nextToken(nextToken);\n }\n\n const result = await req.do();\n /*\n Maximum number of results to return. There could be additional pages even if the limit is not reached.\n https://developer.algorand.org/docs/rest-apis/indexer/#get-v2transactions\n\n Hence, the condition below\n */\n\n if (result.transactions.length > 0) {\n const nextPage = await this.paginatedTransactions(\n blockHeight,\n result['next-token'],\n );\n return result.transactions.concat(nextPage);\n }\n return result.transactions;\n } catch (e: any) {\n logger.error(e, 'Failed to paginated transactions');\n throw e;\n }\n }\n\n async combinePaginateBlock(blockHeight: number): Promise<AlgorandBlock> {\n try {\n const [blockHeader, paginatedTransactionsResults] = await Promise.all([\n this.getHeaderOnly(blockHeight),\n this.paginatedTransactions(blockHeight),\n ]);\n\n return this.constructBlock({\n ...camelCaseObjectKey(blockHeader),\n transactions: camelCaseObjectKey(paginatedTransactionsResults),\n });\n } catch (e) {\n logger.error(`Failed to paginate round ${blockHeight}`);\n throw e;\n }\n }\n\n private constructBlock(block: AlgorandBlock): AlgorandBlock {\n const newBlock = {\n ...block,\n getTransactionsByGroup: (groupId: string) =>\n transactions?.filter((tx) => tx.group === groupId) ?? [],\n toJSON() {\n return omit(this, ['getTransactionsByGroup', 'toJSON']);\n },\n };\n const transactions = newBlock.transactions?.map((tx) => ({\n ...tx,\n block: newBlock,\n toJSON() {\n return omit(this, ['block', 'toJSON']);\n },\n }));\n\n // Update transactions\n newBlock.transactions = transactions;\n\n return newBlock;\n }\n\n async fetchBlocksArray(blockArray: number[]): Promise<any[]> {\n return Promise.all(\n blockArray.map(async (height) => this.getBlockByHeight(height)),\n );\n }\n async fetchBlocksBatches(blockArray: number[]): Promise<AlgorandBlock[]> {\n return this.fetchBlocksArray(blockArray);\n }\n\n getGenesisHash(): string {\n return this.genesisHash;\n }\n\n getChainId(): string {\n return this.chain;\n }\n\n getSafeApi(height: number): SafeAPIService {\n return new SafeAPIService(this, height);\n }\n async fetchBlocks(blockNums: number[]): Promise<IBlock<AlgorandBlock>[]> {\n let blocks: AlgorandBlock[] = [];\n\n for (let i = 0; i < blockNums.length; i++) {\n const cached = this.blockInCache(blockNums[i]);\n if (cached) {\n blocks.push(cached);\n blockNums.splice(i, 1);\n }\n }\n\n const fetchedBlocks = await this.fetchBlocksBatches(blockNums);\n\n blocks = [...blocks, ...fetchedBlocks];\n\n const formattedBlocks = await Promise.all(\n blocks.map(async (block) => {\n block.hash = await this.getBlockHash(block.round, blocks);\n return formatBlockUtil(block);\n }),\n );\n\n return formattedBlocks;\n }\n\n private blockInCache(number: number): AlgorandBlock | undefined {\n for (let i = 0; i < this.blockCache.length; i++) {\n if (this.blockCache[i].round === number) {\n const block = this.blockCache[i];\n //remove block cache once used\n this.blockCache.splice(i, 1);\n return block;\n }\n }\n return undefined;\n }\n\n private async getBlockHash(\n round: number,\n blocks: AlgorandBlock[],\n ): Promise<string> {\n for (const block of blocks) {\n if (block.round === round + 1) {\n return block.previousBlockHash;\n }\n }\n\n try {\n const fetchedBlock = await this.getBlockByHeight(round + 1);\n this.blockCache.push(fetchedBlock);\n\n return fetchedBlock.previousBlockHash;\n } catch (e) {\n let checkHealth = await this.api.makeHealthCheck().do();\n let currentRound = checkHealth.round;\n if (currentRound >= round + 1) {\n throw e;\n }\n while (currentRound < round + 1) {\n await delay(1); // eslint-disable-line @typescript-eslint/await-thenable\n checkHealth = await this.api.makeHealthCheck().do(); // eslint-disable-line @typescript-eslint/await-thenable\n currentRound = checkHealth.round;\n }\n }\n throw new Error(`Unable to get block hash for round ${round}`);\n }\n}\n\nexport class SafeAPIService implements SafeAPI {\n readonly indexer: Indexer;\n constructor(private api: AlgorandApi, private readonly height: number) {\n this.indexer = api.api;\n }\n async getBlock(): Promise<AlgorandBlock> {\n try {\n const block = await this.api.getBlockByHeight(this.height);\n if (!block.round) throw new Error();\n return block;\n } catch (error) {\n throw new Error('ERROR: failed to get block from safe api service.');\n }\n }\n async getTxns(): Promise<AlgorandTransaction[]> {\n try {\n const block = await this.api.getBlockByHeight(this.height);\n if (!block.transactions) throw new Error();\n return block.transactions;\n } catch (error) {\n throw new Error(\n 'ERROR: failed to get transactions from safe api service.',\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.algorand.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 assert from 'assert';\nimport { delay, getLogger, IBlock } from '@subql/node-core';\nimport {\n AlgorandBlock,\n AlgorandTransaction,\n SafeAPI,\n} from '@subql/types-algorand';\nimport { IEndpointConfig } from '@subql/types-core';\nimport algosdk, { Indexer } from 'algosdk';\nimport { omit } from 'lodash';\nimport { camelCaseObjectKey, formatBlockUtil } from './utils.algorand';\n\nconst logger = getLogger('api.algorand');\n\nexport class AlgorandApi {\n private _genesisHash?: string;\n private _chain?: string;\n readonly api: Indexer;\n private blockCache: AlgorandBlock[] = [];\n private paginationLimit = 10000;\n\n private constructor(endpoint: string, config: IEndpointConfig) {\n this.api = new algosdk.Indexer(\n config.headers?.['X-Indexer-API-Token'] ?? '',\n endpoint,\n new URL(endpoint).port, // Specify the port, by default it will be an empty string, we don't want undefined because it then defaults to 8080\n config.headers,\n );\n }\n\n static async create(\n endpoint: string,\n config: IEndpointConfig,\n ): Promise<AlgorandApi> {\n const api = new AlgorandApi(endpoint, config);\n\n // get genesisHash in block\n const block = await api.api.lookupBlock(1).do();\n\n api._genesisHash = block['genesis-hash'] ?? '';\n api._chain = block['genesis-id'] ?? '';\n\n return api;\n }\n\n private get genesisHash(): string {\n assert(this._genesisHash, 'genesisHash not initialized');\n return this._genesisHash;\n }\n\n private get chain(): string {\n assert(this._chain, 'chain not initialized');\n return this._chain;\n }\n\n async getLatestBlockHeader(): Promise<AlgorandBlock> {\n const checkHealth = await this.api.makeHealthCheck().do();\n const block = await this.getHeaderOnly(checkHealth.round);\n\n return block;\n }\n\n async getBlockByHeight(height: number): Promise<AlgorandBlock> {\n try {\n const blockInfo = await this.api.lookupBlock(height).do();\n return this.constructBlock(camelCaseObjectKey(blockInfo));\n } catch (error: any) {\n if (error.message.includes('Max transactions limit exceeded')) {\n logger.warn('Max transactions limit exceeded, paginating transactions');\n\n return this.combinePaginateBlock(height);\n } else {\n logger.error(error, `failed to fetch Block at round ${height}`);\n throw error;\n }\n }\n }\n\n async getHeaderOnly(block: number): Promise<AlgorandBlock> {\n try {\n const result = await this.api.lookupBlock(block).headerOnly(true).do();\n return this.constructBlock(result as AlgorandBlock);\n } catch (e) {\n logger.error('Failed to fetch round header', e);\n throw e;\n }\n }\n\n async paginatedTransactions(\n blockHeight: number,\n nextToken?: string,\n ): Promise<AlgorandTransaction[]> {\n try {\n let req = this.api\n .searchForTransactions()\n .round(blockHeight)\n .limit(this.paginationLimit);\n\n if (nextToken) {\n req = req.nextToken(nextToken);\n }\n\n const result = await req.do();\n /*\n Maximum number of results to return. There could be additional pages even if the limit is not reached.\n https://developer.algorand.org/docs/rest-apis/indexer/#get-v2transactions\n\n Hence, the condition below\n */\n\n if (result.transactions.length > 0) {\n const nextPage = await this.paginatedTransactions(\n blockHeight,\n result['next-token'],\n );\n return result.transactions.concat(nextPage);\n }\n return result.transactions;\n } catch (e: any) {\n logger.error(e, 'Failed to paginated transactions');\n throw e;\n }\n }\n\n async combinePaginateBlock(blockHeight: number): Promise<AlgorandBlock> {\n try {\n const [blockHeader, paginatedTransactionsResults] = await Promise.all([\n this.getHeaderOnly(blockHeight),\n this.paginatedTransactions(blockHeight),\n ]);\n\n return this.constructBlock({\n ...camelCaseObjectKey(blockHeader),\n transactions: camelCaseObjectKey(paginatedTransactionsResults),\n });\n } catch (e) {\n logger.error(`Failed to paginate round ${blockHeight}`);\n throw e;\n }\n }\n\n private constructBlock(block: AlgorandBlock): AlgorandBlock {\n const newBlock = {\n ...block,\n getTransactionsByGroup: (groupId: string) =>\n transactions?.filter((tx) => tx.group === groupId) ?? [],\n toJSON() {\n return omit(this, ['getTransactionsByGroup', 'toJSON']);\n },\n };\n const transactions = newBlock.transactions?.map((tx) => ({\n ...tx,\n block: newBlock,\n toJSON() {\n return omit(this, ['block', 'toJSON']);\n },\n }));\n\n // Update transactions\n newBlock.transactions = transactions;\n\n return newBlock;\n }\n\n async fetchBlocksArray(blockArray: number[]): Promise<any[]> {\n return Promise.all(\n blockArray.map(async (height) => this.getBlockByHeight(height)),\n );\n }\n async fetchBlocksBatches(blockArray: number[]): Promise<AlgorandBlock[]> {\n return this.fetchBlocksArray(blockArray);\n }\n\n getGenesisHash(): string {\n return this.genesisHash;\n }\n\n getChainId(): string {\n return this.chain;\n }\n\n getSafeApi(height: number): SafeAPIService {\n return new SafeAPIService(this, height);\n }\n async fetchBlocks(blockNums: number[]): Promise<IBlock<AlgorandBlock>[]> {\n let blocks: AlgorandBlock[] = [];\n\n for (let i = 0; i < blockNums.length; i++) {\n const cached = this.blockInCache(blockNums[i]);\n if (cached) {\n blocks.push(cached);\n blockNums.splice(i, 1);\n }\n }\n\n const fetchedBlocks = await this.fetchBlocksBatches(blockNums);\n\n blocks = [...blocks, ...fetchedBlocks];\n\n const formattedBlocks = await Promise.all(\n blocks.map(async (block) => {\n block.hash = await this.getBlockHash(block.round, blocks);\n return formatBlockUtil(block);\n }),\n );\n\n return formattedBlocks;\n }\n\n private blockInCache(number: number): AlgorandBlock | undefined {\n for (let i = 0; i < this.blockCache.length; i++) {\n if (this.blockCache[i].round === number) {\n const block = this.blockCache[i];\n //remove block cache once used\n this.blockCache.splice(i, 1);\n return block;\n }\n }\n return undefined;\n }\n\n private async getBlockHash(\n round: number,\n blocks: AlgorandBlock[],\n ): Promise<string> {\n for (const block of blocks) {\n if (block.round === round + 1) {\n return block.previousBlockHash;\n }\n }\n\n try {\n const fetchedBlock = await this.getBlockByHeight(round + 1);\n this.blockCache.push(fetchedBlock);\n\n return fetchedBlock.previousBlockHash;\n } catch (e) {\n let checkHealth = await this.api.makeHealthCheck().do();\n let currentRound = checkHealth.round;\n if (currentRound >= round + 1) {\n throw e;\n }\n while (currentRound < round + 1) {\n await delay(1); // eslint-disable-line @typescript-eslint/await-thenable\n checkHealth = await this.api.makeHealthCheck().do(); // eslint-disable-line @typescript-eslint/await-thenable\n currentRound = checkHealth.round;\n }\n }\n throw new Error(`Unable to get block hash for round ${round}`);\n }\n}\n\nexport class SafeAPIService implements SafeAPI {\n readonly indexer: Indexer;\n constructor(private api: AlgorandApi, private readonly height: number) {\n this.indexer = api.api;\n }\n async getBlock(): Promise<AlgorandBlock> {\n try {\n const block = await this.api.getBlockByHeight(this.height);\n if (!block.round) throw new Error();\n return block;\n } catch (error) {\n throw new Error('ERROR: failed to get block from safe api service.');\n }\n }\n async getTxns(): Promise<AlgorandTransaction[]> {\n try {\n const block = await this.api.getBlockByHeight(this.height);\n if (!block.transactions) throw new Error();\n return block.transactions;\n } catch (error) {\n throw new Error(\n 'ERROR: failed to get transactions from safe api service.',\n );\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.AlgorandApiConnection = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/algorand/api.connection.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/algorand/api.connection.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 {\n ApiConnectionError,\n ApiErrorType,\n IApiConnectionSpecific,\n NetworkMetadataPayload,\n getLogger,\n IBlock,\n} from '@subql/node-core';\nimport { IEndpointConfig } from '@subql/types-core';\nimport { BlockContent } from '../indexer/types';\nimport { AlgorandApi, SafeAPIService } from './api.algorand';\n\nconst logger = getLogger('AlgorandApiConnection');\n\ntype FetchFunc = (\n api: AlgorandApi,\n batch: number[],\n) => Promise<IBlock<BlockContent>[]>;\n\nexport class AlgorandApiConnection\n implements\n IApiConnectionSpecific<AlgorandApi, SafeAPIService, IBlock<BlockContent>[]>\n{\n readonly networkMeta: NetworkMetadataPayload;\n\n private constructor(\n public unsafeApi: AlgorandApi,\n private fetchBlocksBatches: FetchFunc,\n ) {\n this.networkMeta = {\n chain: unsafeApi.getChainId(),\n genesisHash: unsafeApi.getGenesisHash(),\n specName: 'algorand',\n };\n }\n\n static async create(\n endpoint: string,\n config: IEndpointConfig,\n fetchBlocksBatches: FetchFunc,\n ): Promise<AlgorandApiConnection> {\n const api = await AlgorandApi.create(endpoint, config);\n\n return new AlgorandApiConnection(api, fetchBlocksBatches);\n }\n\n safeApi(height: number): SafeAPIService {\n return this.unsafeApi.getSafeApi(height);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async apiConnect(): Promise<void> {\n logger.debug('apiConnect is not implemented');\n }\n // eslint-disable-next-line @typescript-eslint/require-await\n async apiDisconnect(): Promise<void> {\n logger.debug('apiDisconnect is not implemented');\n }\n\n async fetchBlocks(heights: number[]): Promise<IBlock<BlockContent>[]> {\n const blocks = await this.fetchBlocksBatches(this.unsafeApi, heights);\n return blocks;\n }\n\n handleError = AlgorandApiConnection.handleError;\n\n static handleError(e: Error): ApiConnectionError {\n let formatted_error: ApiConnectionError;\n if (e.message.includes(`Socket connection timeout`)) {\n formatted_error = AlgorandApiConnection.handleTimeoutError(e);\n } else if (e.message.startsWith(`disconnected from `)) {\n formatted_error = AlgorandApiConnection.handleDisconnectionError(e);\n } else if (\n e.message.startsWith(`Rate Limited at endpoint`) ||\n (e as any).statusCode === 429\n ) {\n formatted_error = AlgorandApiConnection.handleRateLimitError(e);\n } else if (e.message.includes(`Exceeded max limit of`)) {\n formatted_error = AlgorandApiConnection.handleLargeResponseError(e);\n } else {\n formatted_error = new ApiConnectionError(\n e.name,\n e.message,\n ApiErrorType.Default,\n );\n }\n return formatted_error;\n }\n\n static handleRateLimitError(e: Error): ApiConnectionError {\n return new ApiConnectionError(\n 'RateLimit',\n e.message,\n ApiErrorType.RateLimit,\n );\n }\n\n static handleTimeoutError(e: Error): ApiConnectionError {\n return new ApiConnectionError(\n 'TimeoutError',\n e.message,\n ApiErrorType.Timeout,\n );\n }\n\n static handleDisconnectionError(e: Error): ApiConnectionError {\n return new ApiConnectionError(\n 'ConnectionError',\n e.message,\n ApiErrorType.Connection,\n );\n }\n\n static handleLargeResponseError(e: Error): ApiConnectionError {\n const newMessage = `Oversized RPC node response. This issue is related to the network's RPC nodes configuration, not your application. You may report it to the network's maintainers or try a different RPC node.\\n\\n${e.message}`;\n\n return new ApiConnectionError(\n 'RpcInternalError',\n newMessage,\n ApiErrorType.Default,\n );\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
5
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.service.algorand.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,gDAO0B;AAK1B,qDAAyD;AAEzD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,KAAK,CAAC,CAAC;AAGzB,IAAM,kBAAkB,0BAAxB,MAAM,kBAAmB,SAAQ,sBAIvC;IAEuC;IADtC,YACsC,OAAwB,EAC5D,qBAAmE,EACnE,YAA2B;QAE3B,KAAK,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAJP,YAAO,GAAP,OAAO,CAAiB;IAK9D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B;QAE3B,MAAM,UAAU,GAAG,IAAI,oBAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;QACF,IAAI;YACF,MAAM,UAAU,CAAC,iBAAiB,CAChC,UAAU,CAAC,OAAO,CAAC,OAAO,EAC1B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACnB,sCAAqB,CAAC,MAAM,CAC1B,QAAQ,EACR,MAAM,EACN,UAAU,CAAC,iBAAiB,CAC7B,CACJ,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;SACtE;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAgB,EAChB,MAAgB;QAEhB,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAES,aAAa,CACrB,OAAmD,EACnD,UAAiC;QAEjC,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,CAAC,WAAW,EAAE;YAC1D,MAAM,IAAI,iCAAqB,CAC7B,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,CAAC,WAAW,CAAC,WAAW,CACnC,CAAC;SACH;IACH,CAAC;CACF,CAAA;AA/DY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;6CACJ,iCAAqB;QAC9B,6BAAa;GARlB,kBAAkB,CA+D9B;AA/DY,gDAAkB","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"api.service.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.service.algorand.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,gDAO0B;AAK1B,qDAAyD;AAEzD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,KAAK,CAAC,CAAC;AAGzB,IAAM,kBAAkB,0BAAxB,MAAM,kBAAmB,SAAQ,sBAIvC;IAEuC;IADtC,YACsC,OAAwB,EAC5D,qBAAmE,EACnE,YAA2B;QAE3B,KAAK,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAJP,YAAO,GAAP,OAAO,CAAiB;IAK9D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B;QAE3B,MAAM,UAAU,GAAG,IAAI,oBAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;QACF,IAAI;YACF,MAAM,UAAU,CAAC,iBAAiB,CAChC,UAAU,CAAC,OAAO,CAAC,OAAO,EAC1B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACnB,sCAAqB,CAAC,MAAM,CAC1B,QAAQ,EACR,MAAM,EACN,UAAU,CAAC,iBAAiB,CAC7B,CACJ,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;SACtE;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAgB,EAChB,MAAgB;QAEhB,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAES,aAAa,CACrB,OAAmD,EACnD,UAAiC;QAEjC,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,CAAC,WAAW,EAAE;YAC1D,MAAM,IAAI,iCAAqB,CAC7B,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,CAAC,WAAW,CAAC,WAAW,CACnC,CAAC;SACH;IACH,CAAC;CACF,CAAA;AA/DY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;6CACJ,iCAAqB;QAC9B,6BAAa;GARlB,kBAAkB,CA+D9B;AA/DY,gDAAkB","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n IBlock,\n MetadataMismatchError,\n exitWithError,\n} from '@subql/node-core';\nimport { ProjectNetworkConfig } from '@subql/types-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { BlockContent } from '../indexer/types';\nimport { AlgorandApi, SafeAPIService } from './api.algorand';\nimport { AlgorandApiConnection } from './api.connection';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class AlgorandApiService extends ApiService<\n AlgorandApi,\n SafeAPIService,\n IBlock<BlockContent>[]\n> {\n private constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<AlgorandApiConnection>,\n eventEmitter: EventEmitter2,\n ) {\n super(connectionPoolService, eventEmitter);\n }\n\n static async init(\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<AlgorandApiConnection>,\n eventEmitter: EventEmitter2,\n ): Promise<AlgorandApiService> {\n const apiService = new AlgorandApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n try {\n await apiService.createConnections(\n apiService.project.network,\n (endpoint, config) =>\n AlgorandApiConnection.create(\n endpoint,\n config,\n apiService.fetchBlockBatches,\n ),\n );\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n return apiService;\n }\n\n get api(): AlgorandApi {\n return this.unsafeApi;\n }\n\n async fetchBlockBatches(\n api: AlgorandApi,\n blocks: number[],\n ): Promise<IBlock<BlockContent>[]> {\n return api.fetchBlocks(blocks);\n }\n\n protected assertChainId(\n network: ProjectNetworkConfig & { chainId: string },\n connection: AlgorandApiConnection,\n ): void {\n if (network.chainId !== connection.networkMeta.genesisHash) {\n throw new MetadataMismatchError(\n 'ChainId',\n network.chainId,\n connection.networkMeta.genesisHash,\n );\n }\n }\n}\n"]}
|
package/dist/algorand/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
5
|
if (k2 === undefined) k2 = k;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorand/index.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,iDAA+B;AAC/B,yDAAuC;AACvC,mDAAiC;AACjC,mDAAiC","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorand/index.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,iDAA+B;AAC/B,yDAAuC;AACvC,mDAAiC;AACjC,mDAAiC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nexport * from './api.algorand';\nexport * from './api.service.algorand';\nexport * from './utils.algorand';\nexport * from './api.connection';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.filterTransaction = exports.filterBlockModulo = exports.filterBlock = exports.mappingFilterTransaction = exports.calcInterval = exports.camelCaseObjectKey = exports.formatBlockUtil = exports.algorandBlockToHeader = void 0;
|
|
@@ -11,6 +11,7 @@ function algorandBlockToHeader(block) {
|
|
|
11
11
|
blockHeight: block.round,
|
|
12
12
|
blockHash: block.hash,
|
|
13
13
|
parentHash: block.previousBlockHash,
|
|
14
|
+
timestamp: new Date(block.timestamp),
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
exports.algorandBlockToHeader = algorandBlockToHeader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.algorand.js","sourceRoot":"","sources":["../../src/algorand/utils.algorand.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,gDAAwE;AAOxE,qCAAmD;AACnD,mCAAwC;AAIxC,SAAgB,qBAAqB,CAAC,KAAmB;IACvD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,KAAK;QACxB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,UAAU,EAAE,KAAK,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"utils.algorand.js","sourceRoot":"","sources":["../../src/algorand/utils.algorand.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 { filterBlockTimestamp, Header, IBlock } from '@subql/node-core';\nimport {\n AlgorandBlock,\n AlgorandBlockFilter,\n AlgorandTransaction,\n AlgorandTransactionFilter,\n} from '@subql/types-algorand';\nimport { Indexer, TransactionType } from 'algosdk';\nimport { camelCase, get } from 'lodash';\nimport { SubqlProjectBlockFilter } from '../configure/SubqueryProject';\nimport { BlockContent } from '../indexer/types';\n\nexport function algorandBlockToHeader(block: BlockContent): Header {\n return {\n blockHeight: block.round,\n blockHash: block.hash,\n parentHash: block.previousBlockHash,\n timestamp: new Date(block.timestamp),\n };\n}\n\nexport function formatBlockUtil<B extends AlgorandBlock = AlgorandBlock>(\n block: B,\n): IBlock<B> {\n return {\n block,\n getHeader: () => algorandBlockToHeader(block),\n };\n}\n\nexport function camelCaseObjectKey(object: object) {\n if (Array.isArray(object)) {\n return object.map((v) => camelCaseObjectKey(v));\n } else if (object !== null && object.constructor === Object) {\n return Object.keys(object).reduce(\n (result, key) => ({\n ...result,\n [camelCase(key)]: camelCaseObjectKey(object[key]),\n }),\n {},\n );\n }\n\n return object;\n}\n\nexport function calcInterval(api: Indexer): number {\n // Pulled from https://metrics.algorand.org/#/protocol/#blocks\n return 3300;\n}\n\nexport const mappingFilterTransaction = {\n [TransactionType.pay]: {\n sender: 'sender',\n receiver: 'paymentTransaction.receiver',\n },\n [TransactionType.keyreg]: {\n nonParticipant: 'keyregTransaction.nonParticipation',\n sender: 'sender',\n },\n [TransactionType.acfg]: {\n assetId: 'assetConfigTransaction.assetId',\n sender: 'sender',\n },\n [TransactionType.axfer]: {\n assetId: 'assetTransferTransaction.assetId',\n sender: 'sender',\n receiver: 'assetTransferTransaction.receiver',\n },\n [TransactionType.afrz]: {\n assetId: 'assetFreezeTransaction.assetId',\n newFreezeStatus: 'assetFreezeTransaction.newFreezeStatus',\n address: 'sender',\n },\n [TransactionType.appl]: {\n applicationId: 'applicationTransaction.applicationId',\n applicationArgs: 'applicationTransaction.applicationArgs',\n sender: 'sender',\n },\n};\n\nexport function filterBlock(\n block: AlgorandBlock,\n filter?: AlgorandBlockFilter,\n): boolean {\n if (!filter) return true;\n if (!filterBlockModulo(block, filter)) return false;\n if (\n !filterBlockTimestamp(block.timestamp, filter as SubqlProjectBlockFilter)\n ) {\n return false;\n }\n // no filters for block.\n return true;\n}\n\nexport function filterBlockModulo(\n block: AlgorandBlock,\n filter: AlgorandBlockFilter,\n): boolean {\n const { modulo } = filter;\n if (!modulo) return true;\n return block.round % modulo === 0;\n}\n\nfunction txComparator(filter: any, data: any): boolean {\n if (Array.isArray(filter)) {\n for (let i = 0; i < filter.length; i++) {\n const valFilter = filter[i];\n const valData = data[i];\n\n if (valFilter === null) {\n continue;\n }\n\n if (valFilter !== valData) {\n return false;\n }\n }\n return true;\n }\n\n return filter === data;\n}\n\nexport function filterTransaction(\n txn: AlgorandTransaction,\n filter?: AlgorandTransactionFilter,\n): boolean {\n if (!filter) return true;\n const { txType, ...filterByKey } = filter;\n\n if (txType && txn.txType !== txType) return false;\n\n for (const key in filterByKey) {\n if (\n mappingFilterTransaction[txn.txType] &&\n filterByKey[key] !== undefined &&\n !txComparator(\n filterByKey[key],\n get(txn, mappingFilterTransaction[txn.txType][key]),\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const algorand_spec_1 = require("./algorand.spec");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/utils.algorand.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"utils.algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/utils.algorand.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 { INestApplication } from '@nestjs/common';\nimport { AlgorandBlock } from '@subql/types-algorand';\nimport { prepareApiService } from './algorand.spec';\nimport { AlgorandApiService } from './api.service.algorand';\nimport { filterTransaction } from './utils.algorand';\n\ndescribe('Algorand Filters', () => {\n describe('Transaction Filters', () => {\n let app: INestApplication;\n let api: AlgorandApiService;\n let block: AlgorandBlock;\n\n beforeAll(async () => {\n [app, api] = await prepareApiService();\n\n block = await api.api.getBlockByHeight(30478896);\n });\n\n afterAll(async () => {\n await app?.close();\n });\n\n it('returns true with no filter', () => {\n expect(filterTransaction(block.transactions![13])).toBeTruthy();\n });\n\n it('can fillter by sender', () => {\n expect(\n filterTransaction(block.transactions![13], {\n sender: '5GMADASEGJ324HR4GI2XZ2BNSN77ND45LLF4F4XDTAYX3YM6TX5YEU4FEA',\n }),\n ).toBeTruthy();\n expect(\n filterTransaction(block.transactions![13], {\n sender: 'WRONG_ADDRESSS',\n }),\n ).toBeFalsy();\n });\n\n it('can fillter by receiver', () => {\n expect(\n filterTransaction(block.transactions![18], {\n receiver:\n 'V6CK3HRC4JBRBDIBB4JWOBMYNUYIP7SYHRPVHH5ZMJQME337C57IBIZVFI',\n }),\n ).toBeTruthy();\n expect(\n filterTransaction(block.transactions![18], {\n receiver: 'WRONG_ADDRESSS',\n }),\n ).toBeFalsy();\n });\n\n it('can fillter by application id', () => {\n expect(\n filterTransaction(block.transactions![13], {\n applicationId: 971368268,\n }),\n ).toBeTruthy();\n expect(\n filterTransaction(block.transactions![13], { applicationId: 0 }),\n ).toBeFalsy();\n });\n\n it('can fillter by application args', () => {\n // Filter single argument (function signature)\n expect(\n filterTransaction(block.transactions![13], {\n applicationArgs: ['udVC+w=='],\n }),\n ).toBeTruthy();\n // Filter all arguments\n expect(\n filterTransaction(block.transactions![13], {\n applicationArgs: ['udVC+w==', 'AQ==', 'AA==', 'AQ==', 'AQ=='],\n }),\n ).toBeTruthy();\n // Filter specific argument\n expect(\n filterTransaction(block.transactions![13], {\n applicationArgs: ['udVC+w==', null, null, null, 'AQ=='] as any,\n }),\n ).toBeTruthy();\n });\n\n it('should not filter undefined options', () => {\n expect(\n filterTransaction(block.transactions![4], {\n sender: 'ZW3ISEHZUHPO7OZGMKLKIIMKVICOUDRCERI454I3DB2BH52HGLSO67W754',\n receiver: undefined,\n }),\n ).toBeTruthy();\n });\n });\n});\n"]}
|
package/dist/app.module.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
5
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
package/dist/app.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAAoE;AACpE,mEAA+D;AAC/D,yDAAqD;AAErD,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACxE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAiBxD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAfrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,sBAAU;YACV,0BAAW;YACX,sBAAU,CAAC,OAAO,CAAC;gBACjB,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE;aAC7D,CAAC;SACH;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,SAAS,CAAG;AAAZ,8BAAS","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAAoE;AACpE,mEAA+D;AAC/D,yDAAqD;AAErD,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACxE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAiBxD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAfrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,sBAAU;YACV,0BAAW;YACX,sBAAU,CAAC,OAAO,CAAC;gBACjB,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE;aAC7D,CAAC;SACH;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,SAAS,CAAG;AAAZ,8BAAS","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { CoreModule, DbModule, MetaModule } from '@subql/node-core';\nimport { ConfigureModule } from './configure/configure.module';\nimport { FetchModule } from './indexer/fetch.module';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: algorandSdkVersion } = require('algosdk/package.json');\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n CoreModule,\n FetchModule,\n MetaModule.forRoot({\n version: packageVersion,\n sdkVersion: { name: 'algosdk', version: algorandSdkVersion },\n }),\n ],\n controllers: [],\n})\nexport class AppModule {}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AlgorandCustomDataSource, AlgorandDataSource, AlgorandHandlerKind, isCustomDs, isRuntimeDs } from '@subql/common-algorand';
|
|
2
|
+
import { IBlockchainService, DatasourceParams, Header, IBlock } from '@subql/node-core';
|
|
3
|
+
import { SafeAPI } from '@subql/types-algorand';
|
|
4
|
+
import { AlgorandApiService, SafeAPIService } from './algorand';
|
|
5
|
+
import { SubqueryProject } from './configure/SubqueryProject';
|
|
6
|
+
import { BlockContent } from './indexer/types';
|
|
7
|
+
import { IIndexerWorker } from './indexer/worker/worker';
|
|
8
|
+
export declare class BlockchainService implements IBlockchainService<AlgorandDataSource, AlgorandCustomDataSource, SubqueryProject, SafeAPI, BlockContent, // Light block
|
|
9
|
+
BlockContent, IIndexerWorker> {
|
|
10
|
+
private apiService;
|
|
11
|
+
constructor(apiService: AlgorandApiService);
|
|
12
|
+
isCustomDs: typeof isCustomDs;
|
|
13
|
+
isRuntimeDs: typeof isRuntimeDs;
|
|
14
|
+
blockHandlerKind: AlgorandHandlerKind;
|
|
15
|
+
packageVersion: any;
|
|
16
|
+
fetchBlocks(blockNums: number[]): Promise<IBlock<BlockContent>[]>;
|
|
17
|
+
fetchBlockWorker(worker: IIndexerWorker, blockNum: number, context: {
|
|
18
|
+
workers: IIndexerWorker[];
|
|
19
|
+
}): Promise<Header>;
|
|
20
|
+
getBlockSize(block: IBlock<BlockContent>): number;
|
|
21
|
+
getFinalizedHeader(): Promise<Header>;
|
|
22
|
+
getBestHeight(): Promise<number>;
|
|
23
|
+
getChainInterval(): Promise<number>;
|
|
24
|
+
getHeaderForHash(hash: string): Promise<Header>;
|
|
25
|
+
getHeaderForHeight(height: number): Promise<Header>;
|
|
26
|
+
updateDynamicDs(params: DatasourceParams, dsObj: AlgorandDataSource | AlgorandCustomDataSource): Promise<void>;
|
|
27
|
+
getSafeApi(block: BlockContent): Promise<SafeAPIService>;
|
|
28
|
+
onProjectChange(project: SubqueryProject): Promise<void> | void;
|
|
29
|
+
getBlockTimestamp(height: number): Promise<Date>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
|
+
};
|
|
13
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.BlockchainService = void 0;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const common_algorand_1 = require("@subql/common-algorand");
|
|
20
|
+
const algosdk_1 = require("algosdk");
|
|
21
|
+
const algorand_1 = require("./algorand");
|
|
22
|
+
const types_1 = require("./indexer/types");
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
24
|
+
const { version: packageVersion } = require('../package.json');
|
|
25
|
+
const BLOCK_TIME_VARIANCE = 5000; //ms
|
|
26
|
+
const INTERVAL_PERCENT = 0.9;
|
|
27
|
+
let BlockchainService = class BlockchainService {
|
|
28
|
+
apiService;
|
|
29
|
+
constructor(apiService) {
|
|
30
|
+
this.apiService = apiService;
|
|
31
|
+
}
|
|
32
|
+
isCustomDs = common_algorand_1.isCustomDs;
|
|
33
|
+
isRuntimeDs = common_algorand_1.isRuntimeDs;
|
|
34
|
+
blockHandlerKind = common_algorand_1.AlgorandHandlerKind.Block;
|
|
35
|
+
packageVersion = packageVersion;
|
|
36
|
+
async fetchBlocks(blockNums) {
|
|
37
|
+
return this.apiService.fetchBlocks(blockNums);
|
|
38
|
+
}
|
|
39
|
+
async fetchBlockWorker(worker, blockNum, context) {
|
|
40
|
+
return worker.fetchBlock(blockNum, 0);
|
|
41
|
+
}
|
|
42
|
+
getBlockSize(block) {
|
|
43
|
+
return (0, types_1.getBlockSize)(block.block);
|
|
44
|
+
}
|
|
45
|
+
async getFinalizedHeader() {
|
|
46
|
+
const block = await this.apiService.api.getLatestBlockHeader();
|
|
47
|
+
return (0, algorand_1.algorandBlockToHeader)(block);
|
|
48
|
+
}
|
|
49
|
+
async getBestHeight() {
|
|
50
|
+
const checkHealth = await this.apiService.api.api.makeHealthCheck().do();
|
|
51
|
+
return checkHealth.round;
|
|
52
|
+
}
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
54
|
+
async getChainInterval() {
|
|
55
|
+
const CHAIN_INTERVAL = (0, algorand_1.calcInterval)(this.apiService.api.api) * INTERVAL_PERCENT;
|
|
56
|
+
return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);
|
|
57
|
+
}
|
|
58
|
+
async getHeaderForHash(hash) {
|
|
59
|
+
return this.getHeaderForHeight(parseInt(hash, 10));
|
|
60
|
+
}
|
|
61
|
+
async getHeaderForHeight(height) {
|
|
62
|
+
return (0, algorand_1.algorandBlockToHeader)(await this.apiService.api.getHeaderOnly(height));
|
|
63
|
+
}
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
65
|
+
async updateDynamicDs(params, dsObj) {
|
|
66
|
+
if ((0, common_algorand_1.isCustomDs)(dsObj)) {
|
|
67
|
+
dsObj.processor.options = {
|
|
68
|
+
...dsObj.processor.options,
|
|
69
|
+
...params.args,
|
|
70
|
+
};
|
|
71
|
+
// await this.dsProcessorService.validateCustomDs([dsObj]);
|
|
72
|
+
}
|
|
73
|
+
else if ((0, common_algorand_1.isRuntimeDs)(dsObj)) {
|
|
74
|
+
dsObj.mapping.handlers.forEach((handler) => {
|
|
75
|
+
handler.filter = { ...handler.filter, txType: algosdk_1.TransactionType.appl };
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
80
|
+
async getSafeApi(block) {
|
|
81
|
+
return this.apiService.safeApi(block.round);
|
|
82
|
+
}
|
|
83
|
+
onProjectChange(project) {
|
|
84
|
+
// this.apiService.updateBlockFetching();
|
|
85
|
+
}
|
|
86
|
+
async getBlockTimestamp(height) {
|
|
87
|
+
const { timestamp } = await this.getHeaderForHeight(height);
|
|
88
|
+
return timestamp;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
BlockchainService = __decorate([
|
|
92
|
+
__param(0, (0, common_1.Inject)('APIService')),
|
|
93
|
+
__metadata("design:paramtypes", [algorand_1.AlgorandApiService])
|
|
94
|
+
], BlockchainService);
|
|
95
|
+
exports.BlockchainService = BlockchainService;
|
|
96
|
+
//# sourceMappingURL=blockchain.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.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 { Inject } from '@nestjs/common';\nimport {\n AlgorandCustomDataSource,\n AlgorandDataSource,\n AlgorandHandlerKind,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-algorand';\nimport {\n IBlockchainService,\n DatasourceParams,\n Header,\n IBlock,\n} from '@subql/node-core';\nimport { SafeAPI } from '@subql/types-algorand';\nimport { TransactionType } from 'algosdk';\nimport {\n AlgorandApiService,\n algorandBlockToHeader,\n calcInterval,\n SafeAPIService,\n} from './algorand';\nimport { SubqueryProject } from './configure/SubqueryProject';\nimport { BlockContent, getBlockSize } from './indexer/types';\nimport { IIndexerWorker } from './indexer/worker/worker';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\nconst BLOCK_TIME_VARIANCE = 5000; //ms\n\nconst INTERVAL_PERCENT = 0.9;\n\nexport class BlockchainService\n implements\n IBlockchainService<\n AlgorandDataSource,\n AlgorandCustomDataSource,\n SubqueryProject,\n SafeAPI,\n BlockContent, // Light block\n BlockContent,\n IIndexerWorker\n >\n{\n constructor(@Inject('APIService') private apiService: AlgorandApiService) {}\n\n isCustomDs = isCustomDs;\n isRuntimeDs = isRuntimeDs;\n blockHandlerKind = AlgorandHandlerKind.Block;\n packageVersion = packageVersion;\n\n async fetchBlocks(blockNums: number[]): Promise<IBlock<BlockContent>[]> {\n return this.apiService.fetchBlocks(blockNums);\n }\n\n async fetchBlockWorker(\n worker: IIndexerWorker,\n blockNum: number,\n context: { workers: IIndexerWorker[] },\n ): Promise<Header> {\n return worker.fetchBlock(blockNum, 0);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n\n async getFinalizedHeader(): Promise<Header> {\n const block = await this.apiService.api.getLatestBlockHeader();\n return algorandBlockToHeader(block);\n }\n\n async getBestHeight(): Promise<number> {\n const checkHealth = await this.apiService.api.api.makeHealthCheck().do();\n return checkHealth.round;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL =\n calcInterval(this.apiService.api.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n async getHeaderForHash(hash: string): Promise<Header> {\n return this.getHeaderForHeight(parseInt(hash, 10));\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n return algorandBlockToHeader(\n await this.apiService.api.getHeaderOnly(height),\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async updateDynamicDs(\n params: DatasourceParams,\n dsObj: AlgorandDataSource | AlgorandCustomDataSource,\n ): Promise<void> {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n // await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.mapping.handlers.forEach((handler) => {\n handler.filter = { ...handler.filter, txType: TransactionType.appl };\n });\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getSafeApi(block: BlockContent): Promise<SafeAPIService> {\n return this.apiService.safeApi(block.round);\n }\n\n onProjectChange(project: SubqueryProject): Promise<void> | void {\n // this.apiService.updateBlockFetching();\n }\n\n async getBlockTimestamp(height: number): Promise<Date> {\n const { timestamp } = await this.getHeaderForHeight(height);\n return timestamp;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.createSubQueryProject = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubqueryProject.js","sourceRoot":"","sources":["../../src/configure/SubqueryProject.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,4DAMgC;AAChC,gDAAmE;AAQnE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAiB3D,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,WAAoB,EACpB,MAAc,EACd,IAAY,EAAE,2DAA2D;AACzE,gBAAyC;IAEzC,MAAM,OAAO,GAAG,MAAM,+BAAmB,CAAC,MAAM,CAAkB;QAChE,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,8CAA4B,EAAC,GAAG,CAAC,CAAC,QAAQ;QAClE,IAAI;QACJ,WAAW;QACX,MAAM;QACN,IAAI;QACJ,UAAU,EAAE,cAAc;QAC1B,gBAAgB,EAAE,qCAAmB,CAAC,KAAK;QAC3C,gBAAgB;QAChB,WAAW,EAAX,6BAAW;QACX,UAAU,EAAV,4BAAU;KACX,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AArBD,sDAqBC","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"SubqueryProject.js","sourceRoot":"","sources":["../../src/configure/SubqueryProject.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,4DAMgC;AAChC,gDAAmE;AAQnE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAiB3D,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,WAAoB,EACpB,MAAc,EACd,IAAY,EAAE,2DAA2D;AACzE,gBAAyC;IAEzC,MAAM,OAAO,GAAG,MAAM,+BAAmB,CAAC,MAAM,CAAkB;QAChE,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,8CAA4B,EAAC,GAAG,CAAC,CAAC,QAAQ;QAClE,IAAI;QACJ,WAAW;QACX,MAAM;QACN,IAAI;QACJ,UAAU,EAAE,cAAc;QAC1B,gBAAgB,EAAE,qCAAmB,CAAC,KAAK;QAC3C,gBAAgB;QAChB,WAAW,EAAX,6BAAW;QACX,UAAU,EAAV,4BAAU;KACX,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AArBD,sDAqBC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport {\n parseAlgorandProjectManifest,\n BlockFilter,\n isRuntimeDs,\n AlgorandHandlerKind,\n isCustomDs,\n} from '@subql/common-algorand';\nimport { BaseSubqueryProject, CronFilter } from '@subql/node-core';\nimport {\n AlgorandDataSource,\n CustomDatasourceTemplate,\n RuntimeDatasourceTemplate,\n} from '@subql/types-algorand';\nimport { IProjectNetworkConfig, Reader } from '@subql/types-core';\n\nconst { version: packageVersion } = require('../../package.json');\n\nexport type AlgorandProjectDsTemplate =\n | RuntimeDatasourceTemplate\n | CustomDatasourceTemplate;\n\nexport type SubqlProjectBlockFilter = BlockFilter & CronFilter;\n\n// This is the runtime type after we have mapped genesisHash to chainId and endpoint/dict have been provided when dealing with deployments\ntype NetworkConfig = IProjectNetworkConfig & { chainId: string };\n\nexport type SubqueryProject = BaseSubqueryProject<\n AlgorandDataSource,\n AlgorandProjectDsTemplate,\n NetworkConfig\n>;\n\nexport async function createSubQueryProject(\n path: string,\n rawManifest: unknown,\n reader: Reader,\n root: string, // If project local then directory otherwise temp directory\n networkOverrides?: Partial<NetworkConfig>,\n): Promise<SubqueryProject> {\n const project = await BaseSubqueryProject.create<SubqueryProject>({\n parseManifest: (raw) => parseAlgorandProjectManifest(raw).asV1_0_0,\n path,\n rawManifest,\n reader,\n root,\n nodeSemver: packageVersion,\n blockHandlerKind: AlgorandHandlerKind.Block,\n networkOverrides,\n isRuntimeDs,\n isCustomDs,\n });\n\n return project;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
5
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;AAEnC,2CAA+D;AAC/D,gDAA2D;AAC3D,oCAAwC;AACxC,uDAA2E;AAE3E,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAIrC,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,KAAK,CAAC,WAAW;QAItB,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;QAC9B,OAAO,IAAA,uBAAW,EAChB,IAAI,EACJ,uCAAqB,EACrB,oBAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAY,CAAC,EACxC,KAAK,CACN,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAe,CAAC,WAAW,EAAE,CAAC;QAEpE,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,sBAAU;oBACnB,QAAQ,EAAE,UAAU;iBACrB;gBACD;oBACE,OAAO,EAAE,kBAAkB;oBAC3B,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,wBAAwB;oBACjC,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,OAAO,EAAE;gBACP,sBAAU;gBACV,kBAAkB;gBAClB,wBAAwB;gBACxB,MAAM;aACP;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA5CY,eAAe;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CA4C3B;AA5CY,0CAAe","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;AAEnC,2CAA+D;AAC/D,gDAA2D;AAC3D,oCAAwC;AACxC,uDAA2E;AAE3E,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAIrC,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,KAAK,CAAC,WAAW;QAItB,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;QAC9B,OAAO,IAAA,uBAAW,EAChB,IAAI,EACJ,uCAAqB,EACrB,oBAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAY,CAAC,EACxC,KAAK,CACN,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAe,CAAC,WAAW,EAAE,CAAC;QAEpE,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,sBAAU;oBACnB,QAAQ,EAAE,UAAU;iBACrB;gBACD;oBACE,OAAO,EAAE,kBAAkB;oBAC3B,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,wBAAwB;oBACjC,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,OAAO,EAAE;gBACP,sBAAU;gBACV,kBAAkB;gBAClB,wBAAwB;gBACxB,MAAM;aACP;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA5CY,eAAe;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CA4C3B;AA5CY,0CAAe","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { DynamicModule, Global, Module } from '@nestjs/common';\nimport { NodeConfig, registerApp } from '@subql/node-core';\nimport { yargsOptions } from '../yargs';\nimport { createSubQueryProject, SubqueryProject } from './SubqueryProject';\n\nconst pjson = require('../../package.json');\n\n@Global()\n@Module({})\nexport class ConfigureModule {\n static async getInstance(): Promise<{\n nodeConfig: NodeConfig;\n project: SubqueryProject;\n }> {\n const { argv } = yargsOptions;\n return registerApp<SubqueryProject>(\n argv,\n createSubQueryProject,\n yargsOptions.showHelp.bind(yargsOptions),\n pjson,\n );\n }\n static async register(): Promise<DynamicModule> {\n const { nodeConfig, project } = await ConfigureModule.getInstance();\n\n return {\n module: ConfigureModule,\n providers: [\n {\n provide: NodeConfig,\n useValue: nodeConfig,\n },\n {\n provide: 'ISubqueryProject',\n useValue: project,\n },\n {\n provide: 'IProjectUpgradeService',\n useValue: project,\n },\n {\n provide: 'Null',\n useValue: null,\n },\n ],\n exports: [\n NodeConfig,\n 'ISubqueryProject',\n 'IProjectUpgradeService',\n 'Null',\n ],\n };\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Copyright 2020-
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.spec.js","sourceRoot":"","sources":["../../src/indexer/api.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-
|
|
1
|
+
{"version":3,"file":"api.service.spec.js","sourceRoot":"","sources":["../../src/indexer/api.service.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 { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { AlgorandApiService } from '../algorand';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst ENDPOINT = 'https://mainnet-idx.algonode.cloud/';\n\nfunction testSubqueryProject(endpoint: string): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n dictionary: `https://api.subquery.network/sq/subquery/Algorand-Dictionary`,\n chainId: 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\njest.setTimeout(90000);\ndescribe('ApiService', () => {\n let app: INestApplication;\n\n afterEach(() => {\n return app?.close();\n });\n\n const prepareApiService = async (\n endpoint: string = ENDPOINT,\n ): Promise<AlgorandApiService> => {\n const module = await Test.createTestingModule({\n providers: [\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint),\n },\n ConnectionPoolStateManager,\n ConnectionPoolService,\n NodeConfig,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n app = module.createNestApplication();\n await app.init();\n const apiService = app.get(AlgorandApiService);\n\n return apiService;\n };\n\n it('can fetch block with hash', async () => {\n const apiService = await prepareApiService();\n\n const block = (await apiService.api.fetchBlocks([50000]))[0];\n\n expect(block.block.hash).toEqual(\n 'Gss169f22yVUBJzbNT9qXtQukjh0tgecvapaQY5NIRg=',\n );\n });\n\n it('waits on pending block to fetch hash', async () => {\n const apiService = await prepareApiService();\n const api = apiService.api;\n\n const checkHealth = await api.api.makeHealthCheck().do();\n const currentRound = checkHealth.round;\n\n const fetchLatestBlock = async () =>\n (await apiService.api.fetchBlocks([currentRound]))[0];\n\n expect(fetchLatestBlock).not.toThrow();\n\n const block = await fetchLatestBlock();\n expect(block.block.hash).toBeDefined();\n });\n});\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
|
-
import { NodeConfig, DictionaryService } from '@subql/node-core';
|
|
2
|
+
import { NodeConfig, DictionaryService, DsProcessorService } from '@subql/node-core';
|
|
3
3
|
import { AlgorandBlock, AlgorandDataSource } from '@subql/types-algorand';
|
|
4
4
|
import { SubqueryProject } from '../../configure/SubqueryProject';
|
|
5
|
-
import { DsProcessorService } from '../ds-processor.service';
|
|
6
5
|
export declare class AlgorandDictionaryService extends DictionaryService<AlgorandDataSource, AlgorandBlock> {
|
|
7
6
|
protected project: SubqueryProject;
|
|
8
7
|
protected dsProcessorService: DsProcessorService;
|