@subql/node-starknet 0.0.2-8 → 0.0.2-9

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.
Files changed (35) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
  3. package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js +10 -12
  4. package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js.map +1 -1
  5. package/dist/indexer/fetch.service.js +1 -1
  6. package/dist/indexer/fetch.service.js.map +1 -1
  7. package/dist/indexer/project.service.js +1 -1
  8. package/dist/indexer/project.service.js.map +1 -1
  9. package/dist/indexer/types.js +5 -2
  10. package/dist/indexer/types.js.map +1 -1
  11. package/dist/indexer/unfinalizedBlocks.service.d.ts +0 -2
  12. package/dist/indexer/unfinalizedBlocks.service.js +0 -2
  13. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  14. package/dist/starknet/api.service.starknet.test.js +0 -4
  15. package/dist/starknet/api.service.starknet.test.js.map +1 -1
  16. package/dist/starknet/api.starknet.d.ts +7 -9
  17. package/dist/starknet/api.starknet.js +52 -90
  18. package/dist/starknet/api.starknet.js.map +1 -1
  19. package/dist/starknet/api.starknet.test.js +12 -5
  20. package/dist/starknet/api.starknet.test.js.map +1 -1
  21. package/dist/starknet/block.starknet.js +20 -12
  22. package/dist/starknet/block.starknet.js.map +1 -1
  23. package/dist/starknet/block.starknet.test.js +36 -1
  24. package/dist/starknet/block.starknet.test.js.map +1 -1
  25. package/dist/starknet/finalized.block.starknet.d.ts +21 -0
  26. package/dist/starknet/finalized.block.starknet.js +93 -0
  27. package/dist/starknet/finalized.block.starknet.js.map +1 -0
  28. package/dist/starknet/finalized.block.starknet.spec.d.ts +1 -0
  29. package/dist/starknet/finalized.block.starknet.spec.js +94 -0
  30. package/dist/starknet/finalized.block.starknet.spec.js.map +1 -0
  31. package/dist/starknet/utils.starknet.d.ts +16 -7
  32. package/dist/starknet/utils.starknet.js +26 -21
  33. package/dist/starknet/utils.starknet.js.map +1 -1
  34. package/dist/utils/project.js.map +1 -1
  35. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAW0B;AAO1B,wDAAoD;AACpD,oCAAsD;AAEtD;;GAEG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBACX,SAAQ,2BAAgD;IAM9C;IAHV,YACE,UAAsB,EACtB,UAAsB,EACd,cAA8B,EACtC,YAA2B,EAE3B,cAAkD,EAElD,qBAA6C,EAC7C,YAA0B,EACK,kBAAuC,EACtE,cAA8B,EACF,OAAwB;QAEpD,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;QArBM,mBAAc,GAAd,cAAc,CAAgB;IAsBxC,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,KAA2B;QAE3B,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CACnC,KAAK,EACL,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CACxE,CAAC;IACJ,CAAC;IAES,YAAY,CAAC,KAA2B;QAChD,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AA3CY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAGhC,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;IAE7B,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAXf,sBAAU;QACV,sBAAU;QACE,gCAAc;QACxB,6BAAa,kBAKb,wBAAY,UAEV,0BAAc;GAfrB,sBAAsB,CA2ClC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n NodeConfig,\n StoreService,\n IProjectService,\n BlockDispatcher,\n ProcessBlockResponse,\n ApiService,\n IProjectUpgradeService,\n PoiSyncService,\n IBlock,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { StarknetBlock } from '@subql/types-starknet';\nimport {\n StarknetProjectDs,\n SubqueryProject,\n} from '../../configure/SubqueryProject';\nimport { isFullBlock } from '../../starknet/block.starknet';\nimport { IndexerManager } from '../indexer.manager';\nimport { BlockContent, getBlockSize } from '../types';\n\n/**\n * @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing\n */\n@Injectable()\nexport class BlockDispatcherService\n extends BlockDispatcher<BlockContent, StarknetProjectDs>\n implements OnApplicationShutdown\n{\n constructor(\n apiService: ApiService,\n nodeConfig: NodeConfig,\n private indexerManager: IndexerManager,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<StarknetProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n storeService: StoreService,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n apiService.fetchBlocks.bind(apiService),\n );\n }\n\n protected async indexBlock(\n block: IBlock<BlockContent>,\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(\n block,\n await this.projectService.getDataSources(block.getHeader().blockHeight),\n );\n }\n\n protected getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n}\n"]}
1
+ {"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAW0B;AAK1B,wDAAoD;AACpD,oCAAsD;AAEtD;;GAEG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBACX,SAAQ,2BAAgD;IAM9C;IAHV,YACE,UAAsB,EACtB,UAAsB,EACd,cAA8B,EACtC,YAA2B,EAE3B,cAAkD,EAElD,qBAA6C,EAC7C,YAA0B,EACK,kBAAuC,EACtE,cAA8B,EACF,OAAwB;QAEpD,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;QArBM,mBAAc,GAAd,cAAc,CAAgB;IAsBxC,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,KAA2B;QAE3B,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CACnC,KAAK,EACL,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CACxE,CAAC;IACJ,CAAC;IAES,YAAY,CAAC,KAA2B;QAChD,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AA3CY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAGhC,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;IAE7B,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAXf,sBAAU;QACV,sBAAU;QACE,gCAAc;QACxB,6BAAa,kBAKb,wBAAY,UAEV,0BAAc;GAfrB,sBAAsB,CA2ClC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n NodeConfig,\n StoreService,\n IProjectService,\n BlockDispatcher,\n ProcessBlockResponse,\n ApiService,\n IProjectUpgradeService,\n PoiSyncService,\n IBlock,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport {\n StarknetProjectDs,\n SubqueryProject,\n} from '../../configure/SubqueryProject';\nimport { IndexerManager } from '../indexer.manager';\nimport { BlockContent, getBlockSize } from '../types';\n\n/**\n * @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing\n */\n@Injectable()\nexport class BlockDispatcherService\n extends BlockDispatcher<BlockContent, StarknetProjectDs>\n implements OnApplicationShutdown\n{\n constructor(\n apiService: ApiService,\n nodeConfig: NodeConfig,\n private indexerManager: IndexerManager,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<StarknetProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n storeService: StoreService,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n apiService.fetchBlocks.bind(apiService),\n );\n }\n\n protected async indexBlock(\n block: IBlock<BlockContent>,\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(\n block,\n await this.projectService.getDataSources(block.getHeader().blockHeight),\n );\n }\n\n protected getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n}\n"]}
@@ -123,18 +123,16 @@ describe('buildDictionaryV1QueryEntries', () => {
123
123
  };
124
124
  const result = (0, starknetDictionaryV1_1.buildDictionaryV1QueryEntries)([ds]);
125
125
  expect(result).toEqual([
126
- [
127
- {
128
- conditions: [
129
- {
130
- field: 'type',
131
- matcher: 'equalTo',
132
- value: 'L1_HANDLER',
133
- },
134
- ],
135
- entity: 'calls',
136
- },
137
- ],
126
+ {
127
+ conditions: [
128
+ {
129
+ field: 'type',
130
+ matcher: 'equalTo',
131
+ value: 'L1_HANDLER',
132
+ },
133
+ ],
134
+ entity: 'calls',
135
+ },
138
136
  ]);
139
137
  });
140
138
  it('Build a filter with include ds option and contract address', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"starknetDictionaryV1.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/starknetDictionaryV1.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,0DAI+B;AAE/B,iEAAuE;AAEvE,MAAM,UAAU,GAAgC;IAC9C;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,uCAAsB,CAAC,OAAO;QACpC,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,OAAO,EAAE;YACP,0BAA0B;YAC1B,GAAG,EAAE,QAAQ;YACb,oJAAoJ;YACpJ,OAAO,EACL,oEAAoE;SACvE;QACD,OAAO,EAAE;YACP,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,oCAAmB,CAAC,IAAI;oBAC9B,OAAO,EAAE,mBAAmB;oBAC5B,MAAM,EAAE;wBACN,EAAE,EAAE,oEAAoE;wBACxE,IAAI,EAAE,QAAQ;wBACd;;;;2BAIG;wBACH,QAAQ,EAAE,UAAU;qBACrB;iBACF;gBACD;oBACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;oBAC/B,OAAO,EAAE,WAAW;oBACpB,MAAM,EAAE;wBACN;;;2BAGG;wBACH,MAAM,EAAE;4BACN,SAAS,EAAE,kEAAkE;yBAC9E;qBACF;iBACF;aACF;SACF;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,EAAE,GAA8B;gBACpC,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,OAAO,EAAE;oBACP,0BAA0B;oBAC1B,GAAG,EAAE,QAAQ;oBACb,oJAAoJ;oBACpJ,OAAO,EACL,oEAAoE;iBACvE;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,WAAW;4BACpB,MAAM,EAAE;gCACN;;;mCAGG;gCACH,MAAM,EAAE;oCACN,SAAS,EAAE,kEAAkE;iCAC9E;6BACF;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,oDAA6B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB;oBACE,UAAU,EAAE;wBACV;4BACE,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,SAAS;4BAClB,KAAK,EACH,oEAAoE;yBACvE;wBACD;4BACE,KAAK,EAAE,QAAQ;4BACf,OAAO,EAAE,UAAU;4BACnB,KAAK,EAAE;gCACL,kEAAkE;6BACnE;yBACF;qBACF;oBACD,MAAM,EAAE,MAAM;iBACf;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,EAAE,GAA8B;gBACpC,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE;wBACR;4BACE,OAAO,EAAE,mBAAmB;4BAC5B,IAAI,EAAE,oCAAmB,CAAC,IAAI;4BAC9B,MAAM,EAAE;gCACN,IAAI,EAAE,YAAY;6BACnB;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,oDAA6B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB;oBACE;wBACE,UAAU,EAAE;4BACV;gCACE,KAAK,EAAE,MAAM;gCACb,OAAO,EAAE,SAAS;gCAClB,KAAK,EAAE,YAAY;6BACpB;yBACF;wBACD,MAAM,EAAE,OAAO;qBAChB;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,EAAE,GAA8B;gBACpC,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,OAAO,EAAE;oBACP,0BAA0B;oBAC1B,GAAG,EAAE,QAAQ;oBACb,oJAAoJ;oBACpJ,OAAO,EACL,oEAAoE;iBACvE;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,oCAAmB,CAAC,IAAI;4BAC9B,OAAO,EAAE,mBAAmB;4BAC5B,MAAM,EAAE;gCACN,EAAE,EAAE,oEAAoE;gCACxE,kBAAkB;gCAClB;;;;mCAIG;gCACH,QAAQ,EAAE,UAAU;6BACrB;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,oDAA6B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB;oBACE,UAAU,EAAE;wBACV;4BACE,KAAK,EAAE,IAAI;4BACX,OAAO,EAAE,SAAS;4BAClB,KAAK,EACH,oEAAoE;yBACvE;wBACD;4BACE,KAAK,EAAE,MAAM;4BACb,OAAO,EAAE,SAAS;4BAClB,KAAK,EACH,mEAAmE;yBACtE;qBACF;oBACD,MAAM,EAAE,OAAO;iBAChB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport {\n StarknetDatasourceKind,\n StarknetHandlerKind,\n StarknetRuntimeDatasource,\n} from '@subql/types-starknet';\nimport { StarknetProjectDsTemplate } from '../../../configure/SubqueryProject';\nimport { buildDictionaryV1QueryEntries } from './starknetDictionaryV1';\n\nconst mockTempDs: StarknetProjectDsTemplate[] = [\n {\n name: 'ZkLend',\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Call,\n handler: 'handleTransaction',\n filter: {\n to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n type: 'INVOKE',\n /**\n * The function can either be the function fragment or signature\n * function: 'withdraw'\n * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'\n */\n function: 'withdraw',\n },\n },\n {\n kind: StarknetHandlerKind.Event,\n handler: 'handleLog',\n filter: {\n /**\n * Follows standard log filters for Starknet\n * zkLend address: \"0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\"\n */\n topics: [\n 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2\n ],\n },\n },\n ],\n },\n },\n];\n\ndescribe('buildDictionaryV1QueryEntries', () => {\n describe('Log filters', () => {\n it('Build filter for logs', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Event,\n handler: 'handleLog',\n filter: {\n /**\n * Follows standard log filters for Starknet\n * zkLend address: \"0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\"\n */\n topics: [\n 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2\n ],\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n\n expect(result).toEqual([\n {\n conditions: [\n {\n field: 'address',\n matcher: 'equalTo',\n value:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n {\n field: 'topics',\n matcher: 'contains',\n value: [\n '0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2',\n ],\n },\n ],\n entity: 'logs',\n },\n ]);\n });\n });\n describe('Transaction filters', () => {\n it('Build a filter for contract type', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: StarknetHandlerKind.Call,\n filter: {\n type: 'L1_HANDLER',\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n\n expect(result).toEqual([\n [\n {\n conditions: [\n {\n field: 'type',\n matcher: 'equalTo',\n value: 'L1_HANDLER',\n },\n ],\n entity: 'calls',\n },\n ],\n ]);\n });\n\n it('Build a filter with include ds option and contract address', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Call,\n handler: 'handleTransaction',\n filter: {\n to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n // type: \"INVOKE\",\n /**\n * The function can either be the function fragment or signature\n * function: 'withdraw'\n * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'\n */\n function: 'withdraw',\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n expect(result).toEqual([\n {\n conditions: [\n {\n field: 'to',\n matcher: 'equalTo',\n value:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n {\n field: 'func',\n matcher: 'equalTo',\n value:\n '0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77',\n },\n ],\n entity: 'calls',\n },\n ]);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"starknetDictionaryV1.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/starknetDictionaryV1.spec.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 {\n StarknetDatasourceKind,\n StarknetHandlerKind,\n StarknetRuntimeDatasource,\n} from '@subql/types-starknet';\nimport { StarknetProjectDsTemplate } from '../../../configure/SubqueryProject';\nimport { buildDictionaryV1QueryEntries } from './starknetDictionaryV1';\n\nconst mockTempDs: StarknetProjectDsTemplate[] = [\n {\n name: 'ZkLend',\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Call,\n handler: 'handleTransaction',\n filter: {\n to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n type: 'INVOKE',\n /**\n * The function can either be the function fragment or signature\n * function: 'withdraw'\n * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'\n */\n function: 'withdraw',\n },\n },\n {\n kind: StarknetHandlerKind.Event,\n handler: 'handleLog',\n filter: {\n /**\n * Follows standard log filters for Starknet\n * zkLend address: \"0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\"\n */\n topics: [\n 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2\n ],\n },\n },\n ],\n },\n },\n];\n\ndescribe('buildDictionaryV1QueryEntries', () => {\n describe('Log filters', () => {\n it('Build filter for logs', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Event,\n handler: 'handleLog',\n filter: {\n /**\n * Follows standard log filters for Starknet\n * zkLend address: \"0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\"\n */\n topics: [\n 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2\n ],\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n\n expect(result).toEqual([\n {\n conditions: [\n {\n field: 'address',\n matcher: 'equalTo',\n value:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n {\n field: 'topics',\n matcher: 'contains',\n value: [\n '0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2',\n ],\n },\n ],\n entity: 'logs',\n },\n ]);\n });\n });\n describe('Transaction filters', () => {\n it('Build a filter for contract type', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: StarknetHandlerKind.Call,\n filter: {\n type: 'L1_HANDLER',\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n\n expect(result).toEqual([\n {\n conditions: [\n {\n field: 'type',\n matcher: 'equalTo',\n value: 'L1_HANDLER',\n },\n ],\n entity: 'calls',\n },\n ]);\n });\n\n it('Build a filter with include ds option and contract address', () => {\n const ds: StarknetRuntimeDatasource = {\n kind: StarknetDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n // Must be a key of assets\n abi: 'zkLend',\n // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n mapping: {\n file: '',\n handlers: [\n {\n kind: StarknetHandlerKind.Call,\n handler: 'handleTransaction',\n filter: {\n to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n // type: \"INVOKE\",\n /**\n * The function can either be the function fragment or signature\n * function: 'withdraw'\n * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'\n */\n function: 'withdraw',\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryV1QueryEntries([ds]);\n expect(result).toEqual([\n {\n conditions: [\n {\n field: 'to',\n matcher: 'equalTo',\n value:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n {\n field: 'func',\n matcher: 'equalTo',\n value:\n '0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77',\n },\n ],\n entity: 'calls',\n },\n ]);\n });\n });\n});\n"]}
@@ -40,7 +40,7 @@ let FetchService = class FetchService extends node_core_1.BaseFetchService {
40
40
  return (0, utils_starknet_1.starknetBlockHeaderToHeader)(blockHeader);
41
41
  }
42
42
  async getBestHeight() {
43
- return (await this.getFinalizedHeader()).blockHeight;
43
+ return this.api.getBestBlockHeight();
44
44
  }
45
45
  // eslint-disable-next-line @typescript-eslint/require-await
46
46
  async getChainInterval() {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AAErD,4DAAyE;AACzE,gDAO0B;AAI1B,+DAGoC;AAEpC,wFAAoF;AACpF,uDAAmD;AACnD,2EAAuE;AAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAGtB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAIjC;IAEW;IADV,YACU,UAAsB,EAC9B,UAAsB,EACK,cAA8B,EAEzD,eAAyC,EACzC,iBAA4C,EAC5C,wBAAkD,EAClD,YAA2B,EAC3B,iBAAoC,EACL,kBAAuC;QAEtE,KAAK,CACH,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,CACnB,CAAC;QApBM,eAAU,GAAV,UAAU,CAAY;IAqBhC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAES,KAAK,CAAC,kBAAkB;QAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACvD,OAAO,IAAA,4CAA2B,EAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,OAAO,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,WAAW,CAAC;IACvD,CAAC;IAED,4DAA4D;IAClD,KAAK,CAAC,gBAAgB;QAC9B,MAAM,cAAc,GAAG,IAAA,6BAAY,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QAEjE,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAES,UAAU,CAAC,WAA8B;QACjD,OAAO,IAAA,sBAAU,EAAC,WAAW,EAAE,4BAAU,EAAE,qCAAmB,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,mBAAmB;QACjC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACzC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAC5C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,4CAA4C;QAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AA/DY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IACzB,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAM1B,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCATV,sBAAU;QAClB,sBAAU;QACqB,gCAAc,UAGtC,sDAAyB;QAClB,oDAAwB;QACpC,6BAAa;QACR,4BAAiB;GAd3B,YAAY,CA+DxB","sourcesContent":["// Copyright 2020-2024 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 { SchedulerRegistry } from '@nestjs/schedule';\n\nimport { isCustomDs, StarknetHandlerKind } from '@subql/common-starknet';\nimport {\n NodeConfig,\n BaseFetchService,\n ApiService,\n getModulos,\n Header,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { StarknetBlock, SubqlDatasource } from '@subql/types-starknet';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { StarknetApi } from '../starknet';\nimport {\n calcInterval,\n starknetBlockHeaderToHeader,\n} from '../starknet/utils.starknet';\nimport { IStarknetBlockDispatcher } from './blockDispatcher';\nimport { StarknetDictionaryService } from './dictionary/starknetDictionary.service';\nimport { ProjectService } from './project.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\n@Injectable()\nexport class FetchService extends BaseFetchService<\n SubqlDatasource,\n IStarknetBlockDispatcher,\n StarknetBlock\n> {\n constructor(\n private apiService: ApiService,\n nodeConfig: NodeConfig,\n @Inject('IProjectService') projectService: ProjectService,\n @Inject('IBlockDispatcher')\n blockDispatcher: IStarknetBlockDispatcher,\n dictionaryService: StarknetDictionaryService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n eventEmitter: EventEmitter2,\n schedulerRegistry: SchedulerRegistry,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(\n nodeConfig,\n projectService,\n blockDispatcher,\n dictionaryService,\n eventEmitter,\n schedulerRegistry,\n unfinalizedBlocksService,\n storeModelProvider,\n );\n }\n\n get api(): StarknetApi {\n return this.apiService.unsafeApi;\n }\n\n protected async getFinalizedHeader(): Promise<Header> {\n const blockHeader = await this.api.getFinalizedBlock();\n return starknetBlockHeaderToHeader(blockHeader);\n }\n\n protected async getBestHeight(): Promise<number> {\n return (await this.getFinalizedHeader()).blockHeight;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n protected getModulos(dataSources: SubqlDatasource[]): number[] {\n return getModulos(dataSources, isCustomDs, StarknetHandlerKind.Block);\n }\n\n protected async initBlockDispatcher(): Promise<void> {\n await this.blockDispatcher.init((height) =>\n Promise.resolve(this.resetForNewDs(height)),\n );\n }\n\n protected async preLoopHook(): Promise<void> {\n // Starknet doesn't need to do anything here\n return Promise.resolve();\n }\n}\n"]}
1
+ {"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AAErD,4DAAyE;AACzE,gDAO0B;AAG1B,+DAGoC;AAEpC,wFAAoF;AACpF,uDAAmD;AACnD,2EAAuE;AAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAGtB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAIjC;IAEW;IADV,YACU,UAAsB,EAC9B,UAAsB,EACK,cAA8B,EAEzD,eAAyC,EACzC,iBAA4C,EAC5C,wBAAkD,EAClD,YAA2B,EAC3B,iBAAoC,EACL,kBAAuC;QAEtE,KAAK,CACH,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,CACnB,CAAC;QApBM,eAAU,GAAV,UAAU,CAAY;IAqBhC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAES,KAAK,CAAC,kBAAkB;QAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACvD,OAAO,IAAA,4CAA2B,EAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,4DAA4D;IAClD,KAAK,CAAC,gBAAgB;QAC9B,MAAM,cAAc,GAAG,IAAA,6BAAY,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QAEjE,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAES,UAAU,CAAC,WAA8B;QACjD,OAAO,IAAA,sBAAU,EAAC,WAAW,EAAE,4BAAU,EAAE,qCAAmB,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,mBAAmB;QACjC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACzC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAC5C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,4CAA4C;QAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AA/DY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IACzB,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAM1B,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCATV,sBAAU;QAClB,sBAAU;QACqB,gCAAc,UAGtC,sDAAyB;QAClB,oDAAwB;QACpC,6BAAa;QACR,4BAAiB;GAd3B,YAAY,CA+DxB","sourcesContent":["// Copyright 2020-2024 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 { SchedulerRegistry } from '@nestjs/schedule';\n\nimport { isCustomDs, StarknetHandlerKind } from '@subql/common-starknet';\nimport {\n NodeConfig,\n BaseFetchService,\n ApiService,\n getModulos,\n Header,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { StarknetBlock, SubqlDatasource } from '@subql/types-starknet';\nimport { StarknetApi } from '../starknet';\nimport {\n calcInterval,\n starknetBlockHeaderToHeader,\n} from '../starknet/utils.starknet';\nimport { IStarknetBlockDispatcher } from './blockDispatcher';\nimport { StarknetDictionaryService } from './dictionary/starknetDictionary.service';\nimport { ProjectService } from './project.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\n@Injectable()\nexport class FetchService extends BaseFetchService<\n SubqlDatasource,\n IStarknetBlockDispatcher,\n StarknetBlock\n> {\n constructor(\n private apiService: ApiService,\n nodeConfig: NodeConfig,\n @Inject('IProjectService') projectService: ProjectService,\n @Inject('IBlockDispatcher')\n blockDispatcher: IStarknetBlockDispatcher,\n dictionaryService: StarknetDictionaryService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n eventEmitter: EventEmitter2,\n schedulerRegistry: SchedulerRegistry,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(\n nodeConfig,\n projectService,\n blockDispatcher,\n dictionaryService,\n eventEmitter,\n schedulerRegistry,\n unfinalizedBlocksService,\n storeModelProvider,\n );\n }\n\n get api(): StarknetApi {\n return this.apiService.unsafeApi;\n }\n\n protected async getFinalizedHeader(): Promise<Header> {\n const blockHeader = await this.api.getFinalizedBlock();\n return starknetBlockHeaderToHeader(blockHeader);\n }\n\n protected async getBestHeight(): Promise<number> {\n return this.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n protected getModulos(dataSources: SubqlDatasource[]): number[] {\n return getModulos(dataSources, isCustomDs, StarknetHandlerKind.Block);\n }\n\n protected async initBlockDispatcher(): Promise<void> {\n await this.blockDispatcher.init((height) =>\n Promise.resolve(this.resetForNewDs(height)),\n );\n }\n\n protected async preLoopHook(): Promise<void> {\n // Starknet doesn't need to do anything here\n return Promise.resolve();\n }\n}\n"]}
@@ -36,7 +36,7 @@ let ProjectService = class ProjectService extends node_core_1.BaseProjectService
36
36
  }
37
37
  async getBlockTimestamp(height) {
38
38
  const block = await this.apiService.unsafeApi.api.getBlock(height);
39
- return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S
39
+ return new Date(block.timestamp * 1000);
40
40
  }
41
41
  onProjectChange(project) {
42
42
  // TODO update this when implementing skipBlock feature
@@ -1 +1 @@
1
- {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,yDAAsD;AACtD,gDAS0B;AAC1B,oDAA+C;AAK/C,0CAAiD;AACjD,iEAA4D;AAC5D,6DAAwD;AACxD,2EAAuE;AAEvE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAG3D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAInC;IACW,cAAc,GAAG,cAAc,CAAC;IAE1C,YACE,kBAAsC,EAClB,UAA8B,EACN,UAAsB,EAElE,cAA8B,EACa,SAAoB,EACnC,OAAwB,EAEpD,qBAA8D,EAChB,YAA0B,EACxE,UAAsB,EACtB,gBAAkC,EAClC,YAA2B,EAC3B,uBAAiD;QAEjD,KAAK,CACH,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAC,WAAoB;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEnE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,0CAA0C;IACrF,CAAC;IAES,eAAe,CAAC,OAAwB;QAChD,uDAAuD;IACzD,CAAC;CACF,CAAA;AArDY,wCAAc;AAwCnB;IADL,IAAA,oBAAQ,GAAE;;;;0CAGV;yBA1CU,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;IAClB,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,sBAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,0BAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE9C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,uBAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACzC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAEhC,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;qCATzB,yCAAkB;QACN,6BAAkB;QACM,sBAAU;QAElD,0BAAc;QACwB,uBAAS,kBAIH,wBAAY;QAC5D,sBAAU;QACJ,qCAAgB;QACpB,6BAAa;QACF,oDAAwB;GArBxC,cAAc,CAqD1B","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiService,\n PoiSyncService,\n BaseProjectService,\n StoreService,\n NodeConfig,\n IProjectUpgradeService,\n ApiService,\n profiler,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport {\n StarknetProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { StarknetApiService } from '../starknet';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class ProjectService extends BaseProjectService<\n StarknetApiService,\n StarknetProjectDs,\n UnfinalizedBlocksService\n> {\n protected packageVersion = packageVersion;\n\n constructor(\n dsProcessorService: DsProcessorService,\n @Inject(ApiService) apiService: StarknetApiService,\n @Inject(isMainThread ? PoiService : 'Null') poiService: PoiService,\n @Inject(isMainThread ? PoiSyncService : 'Null')\n poiSyncService: PoiSyncService,\n @Inject(isMainThread ? Sequelize : 'Null') sequelize: Sequelize,\n @Inject('ISubqueryProject') project: SubqueryProject,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService<SubqueryProject>,\n @Inject(isMainThread ? StoreService : 'Null') storeService: StoreService,\n nodeConfig: NodeConfig,\n dynamicDsService: DynamicDsService,\n eventEmitter: EventEmitter2,\n unfinalizedBlockService: UnfinalizedBlocksService,\n ) {\n super(\n dsProcessorService,\n apiService,\n poiService,\n poiSyncService,\n sequelize,\n project,\n projectUpgradeService,\n storeService,\n nodeConfig,\n dynamicDsService,\n eventEmitter,\n unfinalizedBlockService,\n );\n }\n\n @profiler()\n async init(startHeight?: number): Promise<void> {\n return super.init(startHeight);\n }\n\n protected async getBlockTimestamp(height: number): Promise<Date> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S\n }\n\n protected onProjectChange(project: SubqueryProject): void | Promise<void> {\n // TODO update this when implementing skipBlock feature\n }\n}\n"]}
1
+ {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,yDAAsD;AACtD,gDAS0B;AAC1B,oDAA+C;AAK/C,0CAAiD;AACjD,iEAA4D;AAC5D,6DAAwD;AACxD,2EAAuE;AAEvE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAG3D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAInC;IACW,cAAc,GAAG,cAAc,CAAC;IAE1C,YACE,kBAAsC,EAClB,UAA8B,EACN,UAAsB,EAElE,cAA8B,EACa,SAAoB,EACnC,OAAwB,EAEpD,qBAA8D,EAChB,YAA0B,EACxE,UAAsB,EACtB,gBAAkC,EAClC,YAA2B,EAC3B,uBAAiD;QAEjD,KAAK,CACH,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAC,WAAoB;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEnE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC;IAES,eAAe,CAAC,OAAwB;QAChD,uDAAuD;IACzD,CAAC;CACF,CAAA;AArDY,wCAAc;AAwCnB;IADL,IAAA,oBAAQ,GAAE;;;;0CAGV;yBA1CU,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;IAClB,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,sBAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,0BAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE9C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,uBAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACzC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAEhC,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;qCATzB,yCAAkB;QACN,6BAAkB;QACM,sBAAU;QAElD,0BAAc;QACwB,uBAAS,kBAIH,wBAAY;QAC5D,sBAAU;QACJ,qCAAgB;QACpB,6BAAa;QACF,oDAAwB;GArBxC,cAAc,CAqD1B","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiService,\n PoiSyncService,\n BaseProjectService,\n StoreService,\n NodeConfig,\n IProjectUpgradeService,\n ApiService,\n profiler,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport {\n StarknetProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { StarknetApiService } from '../starknet';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class ProjectService extends BaseProjectService<\n StarknetApiService,\n StarknetProjectDs,\n UnfinalizedBlocksService\n> {\n protected packageVersion = packageVersion;\n\n constructor(\n dsProcessorService: DsProcessorService,\n @Inject(ApiService) apiService: StarknetApiService,\n @Inject(isMainThread ? PoiService : 'Null') poiService: PoiService,\n @Inject(isMainThread ? PoiSyncService : 'Null')\n poiSyncService: PoiSyncService,\n @Inject(isMainThread ? Sequelize : 'Null') sequelize: Sequelize,\n @Inject('ISubqueryProject') project: SubqueryProject,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService<SubqueryProject>,\n @Inject(isMainThread ? StoreService : 'Null') storeService: StoreService,\n nodeConfig: NodeConfig,\n dynamicDsService: DynamicDsService,\n eventEmitter: EventEmitter2,\n unfinalizedBlockService: UnfinalizedBlocksService,\n ) {\n super(\n dsProcessorService,\n apiService,\n poiService,\n poiSyncService,\n sequelize,\n project,\n projectUpgradeService,\n storeService,\n nodeConfig,\n dynamicDsService,\n eventEmitter,\n unfinalizedBlockService,\n );\n }\n\n @profiler()\n async init(startHeight?: number): Promise<void> {\n return super.init(startHeight);\n }\n\n protected async getBlockTimestamp(height: number): Promise<Date> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000);\n }\n\n protected onProjectChange(project: SubqueryProject): void | Promise<void> {\n // TODO update this when implementing skipBlock feature\n }\n}\n"]}
@@ -5,7 +5,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.getBlockSize = getBlockSize;
6
6
  const block_starknet_1 = require("../starknet/block.starknet");
7
7
  function getBlockSize(block) {
8
- // TODO. not sure if this is the right way to determine the block size
9
- return (0, block_starknet_1.isFullBlock)(block) ? block.transactions.length : 0;
8
+ return (0, block_starknet_1.isFullBlock)(block)
9
+ ? block.transactions
10
+ .map((tx) => tx.receipt.execution_resources.steps)
11
+ .reduce((sum, steps) => sum + steps, 0)
12
+ : block.transactions.length;
10
13
  }
11
14
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAOnC,oCAGC;AAPD,+DAAyD;AAIzD,SAAgB,YAAY,CAAC,KAAmB;IAC9C,sEAAsE;IACtE,OAAO,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAuB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { StarknetBlock, LightStarknetBlock } from '@subql/types-starknet';\nimport { isFullBlock } from '../starknet/block.starknet';\n\nexport type BlockContent = StarknetBlock | LightStarknetBlock;\n\nexport function getBlockSize(block: BlockContent): number {\n // TODO. not sure if this is the right way to determine the block size\n return isFullBlock(block) ? (block as StarknetBlock).transactions.length : 0;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAOnC,oCAMC;AAVD,+DAAyD;AAIzD,SAAgB,YAAY,CAAC,KAAmB;IAC9C,OAAO,IAAA,4BAAW,EAAC,KAAK,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,YAAY;aACf,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC;aACjD,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;AAChC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { StarknetBlock, LightStarknetBlock } from '@subql/types-starknet';\nimport { isFullBlock } from '../starknet/block.starknet';\n\nexport type BlockContent = StarknetBlock | LightStarknetBlock;\n\nexport function getBlockSize(block: BlockContent): number {\n return isFullBlock(block)\n ? block.transactions\n .map((tx) => tx.receipt.execution_resources.steps)\n .reduce((sum, steps) => sum + steps, 0)\n : block.transactions.length;\n}\n"]}
@@ -3,8 +3,6 @@ import { StarknetApiService as ApiService } from '../starknet/api.service.starkn
3
3
  import { BlockContent } from './types';
4
4
  export declare class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {
5
5
  private readonly apiService;
6
- private supportsFinalization?;
7
- private startupCheck;
8
6
  constructor(apiService: ApiService, nodeConfig: NodeConfig, storeModelProvider: IStoreModelProvider);
9
7
  protected getFinalizedHead(): Promise<Header>;
10
8
  protected getHeaderForHash(hash: string): Promise<Header>;
@@ -22,8 +22,6 @@ const api_service_starknet_1 = require("../starknet/api.service.starknet");
22
22
  const utils_starknet_1 = require("../starknet/utils.starknet");
23
23
  let UnfinalizedBlocksService = class UnfinalizedBlocksService extends node_core_1.BaseUnfinalizedBlocksService {
24
24
  apiService;
25
- supportsFinalization;
26
- startupCheck = true;
27
25
  constructor(apiService, nodeConfig, storeModelProvider) {
28
26
  super(new NodeConfig_1.StarknetNodeConfig(nodeConfig), storeModelProvider);
29
27
  this.apiService = apiService;
@@ -1 +1 @@
1
- {"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,gDAK0B;AAC1B,wDAA6D;AAC7D,2EAAoF;AACpF,+DAIoC;AAI7B,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,wCAA0C;IAKnE;IAJX,oBAAoB,CAAW;IAC/B,YAAY,GAAG,IAAI,CAAC;IAE5B,YACmB,UAAsB,EACvC,UAAsB,EACS,kBAAuC;QAEtE,KAAK,CAAC,IAAI,+BAAkB,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAJ7C,eAAU,GAAV,UAAU,CAAY;IAKzC,CAAC;IAES,KAAK,CAAC,gBAAgB;QAC9B,OAAO,IAAA,4CAA2B,EAChC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAC9C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,IAAA,sCAAqB,EAAC,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,IAAA,sCAAqB,EAAC,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AA3BY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCAFD,yCAAU;QAC3B,sBAAU;GANb,wBAAwB,CA2BpC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n BaseUnfinalizedBlocksService,\n Header,\n NodeConfig,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { StarknetNodeConfig } from '../configure/NodeConfig';\nimport { StarknetApiService as ApiService } from '../starknet/api.service.starknet';\nimport {\n formatBlock,\n starknetBlockHeaderToHeader,\n starknetBlockToHeader,\n} from '../starknet/utils.starknet';\nimport { BlockContent } from './types';\n\n@Injectable()\nexport class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {\n private supportsFinalization?: boolean;\n private startupCheck = true;\n\n constructor(\n private readonly apiService: ApiService,\n nodeConfig: NodeConfig,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(new StarknetNodeConfig(nodeConfig), storeModelProvider);\n }\n\n protected async getFinalizedHead(): Promise<Header> {\n return starknetBlockHeaderToHeader(\n await this.apiService.api.getFinalizedBlock(),\n );\n }\n\n protected async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(hash);\n return starknetBlockToHeader(formatBlock(block));\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(height);\n return starknetBlockToHeader(formatBlock(block));\n }\n}\n"]}
1
+ {"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,gDAK0B;AAC1B,wDAA6D;AAC7D,2EAAoF;AACpF,+DAIoC;AAI7B,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,wCAA0C;IAEnE;IADnB,YACmB,UAAsB,EACvC,UAAsB,EACS,kBAAuC;QAEtE,KAAK,CAAC,IAAI,+BAAkB,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAJ7C,eAAU,GAAV,UAAU,CAAY;IAKzC,CAAC;IAES,KAAK,CAAC,gBAAgB;QAC9B,OAAO,IAAA,4CAA2B,EAChC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAC9C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAErE,OAAO,IAAA,sCAAqB,EAAC,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,IAAA,sCAAqB,EAAC,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AAzBY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCAFD,yCAAU;QAC3B,sBAAU;GAHb,wBAAwB,CAyBpC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n BaseUnfinalizedBlocksService,\n Header,\n NodeConfig,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { StarknetNodeConfig } from '../configure/NodeConfig';\nimport { StarknetApiService as ApiService } from '../starknet/api.service.starknet';\nimport {\n formatBlock,\n starknetBlockHeaderToHeader,\n starknetBlockToHeader,\n} from '../starknet/utils.starknet';\nimport { BlockContent } from './types';\n\n@Injectable()\nexport class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {\n constructor(\n private readonly apiService: ApiService,\n nodeConfig: NodeConfig,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(new StarknetNodeConfig(nodeConfig), storeModelProvider);\n }\n\n protected async getFinalizedHead(): Promise<Header> {\n return starknetBlockHeaderToHeader(\n await this.apiService.api.getFinalizedBlock(),\n );\n }\n\n protected async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(hash);\n\n return starknetBlockToHeader(formatBlock(block));\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(height);\n return starknetBlockToHeader(formatBlock(block));\n }\n}\n"]}
@@ -62,10 +62,6 @@ describe('ApiService', () => {
62
62
  it('can fetch blocks', async () => {
63
63
  await expect(apiService.api.fetchBlocks((0, lodash_1.range)(50000, 50004))).resolves.toHaveLength(4);
64
64
  });
65
- it('can fetch block events with height', async () => {
66
- //https://starkscan.co/block/500000#events
67
- await expect(apiService.api.fetchBlockLogs(500000)).resolves.toHaveLength(637);
68
- });
69
65
  it('can get the finalized height', async () => {
70
66
  const height = (await apiService.api.getFinalizedBlock()).block_number;
71
67
  console.log('Finalized height', height);
@@ -1 +1 @@
1
- {"version":3,"file":"api.service.starknet.test.js","sourceRoot":"","sources":["../../src/starknet/api.service.starknet.test.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 { INestApplication } from '@nestjs/common';\nimport { 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 { range } from 'lodash';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { StarknetApiService } from './api.service.starknet';\n\n// Add api key to work\nconst HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';\n\nfunction testSubqueryProject(endpoint: string): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n chainId: '0x534e5f4d41494e',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\nconst prepareApiService = async (\n endpoint: string = HTTP_ENDPOINT,\n): Promise<[StarknetApiService, INestApplication]> => {\n const module = await Test.createTestingModule({\n providers: [\n ConnectionPoolService,\n ConnectionPoolStateManager,\n {\n provide: NodeConfig,\n useFactory: () => ({}),\n },\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint),\n },\n StarknetApiService,\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(StarknetApiService);\n await apiService.init();\n return [apiService, app];\n};\n\njest.setTimeout(90000);\ndescribe('ApiService', () => {\n let apiService: StarknetApiService;\n let app: INestApplication;\n\n beforeEach(async () => {\n [apiService, app] = await prepareApiService();\n });\n\n afterEach(async () => {\n return app?.close();\n });\n\n it('can instantiate api', () => {\n expect(apiService.api.getChainId()).toEqual('0x534e5f4d41494e');\n });\n\n it('can fetch blocks', async () => {\n await expect(\n apiService.api.fetchBlocks(range(50000, 50004)),\n ).resolves.toHaveLength(4);\n });\n\n it('can fetch block events with height', async () => {\n //https://starkscan.co/block/500000#events\n await expect(apiService.api.fetchBlockLogs(500000)).resolves.toHaveLength(\n 637,\n );\n });\n\n it('can get the finalized height', async () => {\n const height = (await apiService.api.getFinalizedBlock()).block_number;\n\n console.log('Finalized height', height);\n expect(height).toBeGreaterThan(975_650);\n });\n});\n"]}
1
+ {"version":3,"file":"api.service.starknet.test.js","sourceRoot":"","sources":["../../src/starknet/api.service.starknet.test.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,yDAA2D;AAC3D,6CAAuC;AACvC,gDAI0B;AAC1B,qCAAwC;AACxC,mCAA+B;AAE/B,iEAA4D;AAE5D,sBAAsB;AACtB,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEzE,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,OAAO,EAAE,kBAAkB;SAC5B;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,MAAM,iBAAiB,GAAG,KAAK,EAC7B,WAAmB,aAAa,EACiB,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;QAC5C,SAAS,EAAE;YACT,iCAAqB;YACrB,sCAA0B;YAC1B;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;aACvB;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC;aAChD;YACD,yCAAkB;SACnB;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,yCAAkB,CAAC,CAAC;IAC/C,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;IACxB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACvB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,UAA8B,CAAC;IACnC,IAAI,GAAqB,CAAC;IAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,MAAM,CACV,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAA,cAAK,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAChD,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,YAAY,CAAC;QAEvE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { INestApplication } from '@nestjs/common';\nimport { 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 { range } from 'lodash';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { StarknetApiService } from './api.service.starknet';\n\n// Add api key to work\nconst HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';\n\nfunction testSubqueryProject(endpoint: string): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n chainId: '0x534e5f4d41494e',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\nconst prepareApiService = async (\n endpoint: string = HTTP_ENDPOINT,\n): Promise<[StarknetApiService, INestApplication]> => {\n const module = await Test.createTestingModule({\n providers: [\n ConnectionPoolService,\n ConnectionPoolStateManager,\n {\n provide: NodeConfig,\n useFactory: () => ({}),\n },\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint),\n },\n StarknetApiService,\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(StarknetApiService);\n await apiService.init();\n return [apiService, app];\n};\n\njest.setTimeout(90000);\ndescribe('ApiService', () => {\n let apiService: StarknetApiService;\n let app: INestApplication;\n\n beforeEach(async () => {\n [apiService, app] = await prepareApiService();\n });\n\n afterEach(async () => {\n return app?.close();\n });\n\n it('can instantiate api', () => {\n expect(apiService.api.getChainId()).toEqual('0x534e5f4d41494e');\n });\n\n it('can fetch blocks', async () => {\n await expect(\n apiService.api.fetchBlocks(range(50000, 50004)),\n ).resolves.toHaveLength(4);\n });\n\n it('can get the finalized height', async () => {\n const height = (await apiService.api.getFinalizedBlock()).block_number;\n\n console.log('Finalized height', height);\n expect(height).toBeGreaterThan(975_650);\n });\n});\n"]}
@@ -1,8 +1,8 @@
1
1
  import { EventEmitter2 } from '@nestjs/event-emitter';
2
- import { BlockWithTxs, SPEC } from '@starknet-io/types-js';
3
2
  import { IBlock } from '@subql/node-core';
4
- import { ApiWrapper, StarknetBlock, StarknetRuntimeDatasource, IStarknetEndpointConfig, LightStarknetBlock, StarknetLogRaw, StarknetResult, StarknetTransaction, StarknetLog, StarknetContractCall } from '@subql/types-starknet';
5
- import { RpcProvider, TransactionReceipt, Abi } from 'starknet';
3
+ import { ApiWrapper, StarknetBlock, StarknetRuntimeDatasource, IStarknetEndpointConfig, LightStarknetBlock, StarknetResult, StarknetTransaction, StarknetLog, StarknetContractCall } from '@subql/types-starknet';
4
+ import { RpcProvider, Abi } from 'starknet';
5
+ import { SPEC } from 'starknet-types-07';
6
6
  import SafeStarknetProvider from './safe-api';
7
7
  export declare class StarknetApi implements ApiWrapper {
8
8
  private endpoint;
@@ -14,6 +14,7 @@ export declare class StarknetApi implements ApiWrapper {
14
14
  private contractInterfaces;
15
15
  private chainId?;
16
16
  private specVersion?;
17
+ private finalizedBlockService;
17
18
  private _supportsFinalization;
18
19
  get supportsFinalization(): boolean;
19
20
  /**
@@ -26,19 +27,16 @@ export declare class StarknetApi implements ApiWrapper {
26
27
  private getGenesisBlock;
27
28
  /***
28
29
  * Get the latest block (with its header)
29
- * we will try to get the latest block, if it is rejected, we will get the latest accepted block
30
30
  * @returns {Promise<BLOCK_HEADER>}
31
31
  */
32
- getFinalizedBlock(): Promise<SPEC.BLOCK_HEADER>;
32
+ getFinalizedBlock(): Promise<SPEC.BLOCK_WITH_RECEIPTS>;
33
33
  getFinalizedBlockHeight(): Promise<number>;
34
+ getBestBlockHeight(): Promise<number>;
34
35
  getChainId(): string;
35
36
  getGenesisHash(): string;
36
37
  getSpecVersion(): string;
37
- getBlockByHeightOrHash(heightOrHash: number | string): Promise<BlockWithTxs>;
38
- private getBlockPromise;
39
- getTransactionReceipt(transactionHash: string): Promise<TransactionReceipt>;
38
+ getBlockByHeightOrHash(heightOrHash: number | string): Promise<SPEC.BLOCK_WITH_RECEIPTS>;
40
39
  fetchBlock(blockNumber: number): Promise<IBlock<StarknetBlock>>;
41
- fetchBlockLogs(blockNumber: number): Promise<StarknetLogRaw[]>;
42
40
  private fetchLightBlock;
43
41
  fetchBlocks(bufferBlocks: number[]): Promise<IBlock<StarknetBlock>[]>;
44
42
  fetchBlocksLight(bufferBlocks: number[]): Promise<IBlock<LightStarknetBlock>[]>;
@@ -10,12 +10,12 @@ const assert_1 = __importDefault(require("assert"));
10
10
  const fs_1 = __importDefault(require("fs"));
11
11
  const node_core_1 = require("@subql/node-core");
12
12
  const starknet_1 = require("starknet");
13
+ const finalized_block_starknet_1 = require("./finalized.block.starknet");
13
14
  const safe_api_1 = __importDefault(require("./safe-api"));
14
15
  const utils_starknet_1 = require("./utils.starknet");
15
16
  // eslint-disable-next-line @typescript-eslint/no-var-requires
16
17
  const { version: packageVersion } = require('../../package.json');
17
18
  const logger = (0, node_core_1.getLogger)('api.starknet');
18
- const DEFAULT_EVENT_CHUNK_SIZE = 1000;
19
19
  async function loadAssets(ds) {
20
20
  if (!ds.assets) {
21
21
  return {};
@@ -42,6 +42,7 @@ class StarknetApi {
42
42
  contractInterfaces = {};
43
43
  chainId;
44
44
  specVersion;
45
+ finalizedBlockService;
45
46
  // Starknet POS
46
47
  _supportsFinalization = true;
47
48
  get supportsFinalization() {
@@ -58,23 +59,22 @@ class StarknetApi {
58
59
  const { hostname, protocol, searchParams } = new URL(endpoint);
59
60
  const protocolStr = protocol.replace(':', '');
60
61
  logger.info(`Api host: ${hostname}, method: ${protocolStr}`);
61
- if (protocolStr === 'https' || protocolStr === 'http') {
62
- const connection = {
63
- nodeUrl: this.endpoint,
64
- headers: {
65
- 'User-Agent': `Subquery-Node ${packageVersion}`,
66
- ...config?.headers,
67
- },
68
- batch: this.config?.batchSize ?? false,
69
- };
70
- searchParams.forEach((value, name, searchParams) => {
71
- connection.headers[name] = value;
72
- });
73
- this.client = new starknet_1.RpcProvider(connection);
74
- }
75
- else {
62
+ if (protocolStr !== 'https' && protocolStr !== 'http') {
76
63
  throw new Error(`Unsupported protocol: ${protocol}`);
77
64
  }
65
+ const connection = {
66
+ nodeUrl: this.endpoint,
67
+ headers: {
68
+ 'User-Agent': `Subquery-Node ${packageVersion}`,
69
+ ...config?.headers,
70
+ },
71
+ batch: this.config?.batchSize ?? false,
72
+ };
73
+ searchParams.forEach((value, name) => {
74
+ connection.headers[name] = value;
75
+ });
76
+ this.client = new starknet_1.RpcProvider(connection);
77
+ this.finalizedBlockService = new finalized_block_starknet_1.FinalizedBlockService(this.getBlockByHeightOrHash.bind(this), logger);
78
78
  }
79
79
  get genesisBlock() {
80
80
  if (!this._genesisBlock) {
@@ -111,22 +111,16 @@ class StarknetApi {
111
111
  }
112
112
  /***
113
113
  * Get the latest block (with its header)
114
- * we will try to get the latest block, if it is rejected, we will get the latest accepted block
115
114
  * @returns {Promise<BLOCK_HEADER>}
116
115
  */
117
116
  async getFinalizedBlock() {
118
- const [latestBlock, latestAccepted] = await Promise.all([
119
- this.client.getBlock('latest'),
120
- await this.getFinalizedBlockHeight(),
121
- ]);
122
- // @ts-ignore
123
- let b = latestBlock;
124
- if (latestBlock.status === 'REJECTED') {
125
- b = (await this.getBlockByHeightOrHash(latestAccepted));
126
- }
127
- return b;
117
+ const block = await this.finalizedBlockService.getFinalizedBlock();
118
+ return block;
128
119
  }
129
120
  async getFinalizedBlockHeight() {
121
+ return (await this.getFinalizedBlock()).block_number;
122
+ }
123
+ async getBestBlockHeight() {
130
124
  return (await this.client.getBlockLatestAccepted()).block_number;
131
125
  }
132
126
  getChainId() {
@@ -141,35 +135,32 @@ class StarknetApi {
141
135
  return this.specVersion;
142
136
  }
143
137
  async getBlockByHeightOrHash(heightOrHash) {
144
- // @ts-ignore
145
- return this.client.getBlockWithTxs(heightOrHash);
146
- }
147
- async getBlockPromise(num, includeTx = true) {
148
- const rawBlock = includeTx
149
- ? await this.client.getBlockWithTxs(num)
150
- : await this.client.getBlockWithTxHashes(num);
151
- if (!rawBlock) {
152
- throw new Error(`Failed to fetch block ${num}`);
138
+ const block = await this.client.getBlockWithReceipts(heightOrHash);
139
+ if (!(0, utils_starknet_1.isFinalizedBlock)(block)) {
140
+ throw `Block ${block} is not a fulfilled block, its parent is ${block.parent_hash}`;
153
141
  }
154
- const block = (0, utils_starknet_1.formatBlock)(rawBlock);
155
142
  return block;
156
143
  }
157
- async getTransactionReceipt(transactionHash) {
158
- const receipt = await this.client.getTransactionReceipt(transactionHash);
159
- return (0, utils_starknet_1.formatReceipt)(receipt);
160
- }
161
144
  async fetchBlock(blockNumber) {
162
145
  try {
163
- const block = await this.getBlockPromise(blockNumber, true);
164
- const logsRaw = await this.fetchBlockLogs(blockNumber);
165
- block.logs = logsRaw.map((l) => (0, utils_starknet_1.formatLog)(l, block));
166
- // Cast as Tx still raw here
167
- block.transactions = block.transactions.map((tx, index) => ({
168
- // Format done
169
- ...(0, utils_starknet_1.formatTransaction)(tx, block, index),
170
- receipt: () => this.getTransactionReceipt(tx.transaction_hash).then((r) => (0, utils_starknet_1.formatReceipt)(r)),
171
- logs: block.logs.filter((l) => l.transactionHash === tx.transaction_hash),
172
- }));
146
+ const rawBlock = await this.getBlockByHeightOrHash(blockNumber);
147
+ const formattedBlock = (0, utils_starknet_1.formatBlock)(rawBlock);
148
+ const formattedTransactions = rawBlock.transactions.map((tx, index) => {
149
+ const formattedTransaction = (0, utils_starknet_1.formatTransaction)(tx, formattedBlock, index);
150
+ return {
151
+ ...formattedTransaction,
152
+ logs: tx.receipt.events.map((l, logIndex) => (0, utils_starknet_1.formatLog)(l, logIndex, formattedTransaction, formattedBlock)),
153
+ };
154
+ });
155
+ const logs = formattedTransactions.flatMap((tx) => tx.logs.map((l) => ({
156
+ ...l,
157
+ transaction: tx,
158
+ })));
159
+ const block = {
160
+ ...formattedBlock,
161
+ transactions: formattedTransactions,
162
+ logs,
163
+ };
173
164
  this.eventEmitter.emit('fetchBlock');
174
165
  return (0, utils_starknet_1.formatBlockUtil)(block);
175
166
  }
@@ -177,47 +168,18 @@ class StarknetApi {
177
168
  throw this.handleError(e);
178
169
  }
179
170
  }
180
- // This follow method from official document https://starknetjs.com/docs/guides/events
181
- async fetchBlockLogs(blockNumber) {
182
- let continuationToken = '0';
183
- let chunkNum = 1;
184
- const allEvents = [];
185
- while (continuationToken) {
186
- let eventsRes;
187
- try {
188
- eventsRes = await this.client.getEvents({
189
- from_block: {
190
- block_number: blockNumber,
191
- },
192
- to_block: {
193
- block_number: blockNumber,
194
- },
195
- chunk_size: DEFAULT_EVENT_CHUNK_SIZE,
196
- continuation_token: continuationToken === '0' ? undefined : continuationToken,
197
- });
198
- }
199
- catch (e) {
200
- if (!eventsRes) {
201
- throw new Error(`Fetch block ${blockNumber} events failed, ${e.message}`);
202
- }
203
- else {
204
- throw e;
205
- }
206
- }
207
- const nbEvents = eventsRes.events.length;
208
- continuationToken = eventsRes.continuation_token;
209
- for (let i = 0; i < nbEvents; i++) {
210
- const event = eventsRes.events[i];
211
- allEvents.push(event);
212
- }
213
- chunkNum++;
214
- }
215
- return allEvents;
216
- }
217
171
  async fetchLightBlock(blockNumber) {
218
- const block = await this.getBlockPromise(blockNumber, false);
172
+ const block = (await this.client.getBlockWithTxHashes(blockNumber));
219
173
  const lightBlock = {
220
174
  ...block,
175
+ blockHash: block.block_hash,
176
+ blockNumber: block.block_number,
177
+ parentHash: block.parent_hash,
178
+ newRoot: block.new_root,
179
+ sequencerAddress: block.sequencer_address,
180
+ l1GasPrice: block.l1_gas_price,
181
+ starknetVersion: block.starknet_version,
182
+ logs: [],
221
183
  };
222
184
  return (0, utils_starknet_1.formatBlockUtil)(lightBlock);
223
185
  }
@@ -225,7 +187,7 @@ class StarknetApi {
225
187
  return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));
226
188
  }
227
189
  async fetchBlocksLight(bufferBlocks) {
228
- return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));
190
+ return Promise.all(bufferBlocks.map(async (num) => this.fetchLightBlock(num)));
229
191
  }
230
192
  get api() {
231
193
  return this.client;