@subql/node-starknet 5.8.1-0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/blockchain.service.js +2 -2
- package/dist/blockchain.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +2 -0
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/starknet/utils.starknet.d.ts +2 -3
- package/dist/starknet/utils.starknet.js +6 -0
- package/dist/starknet/utils.starknet.js.map +1 -1
- package/dist/subcommands/reindex.module.js +1 -0
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/package.json +6 -7
|
@@ -99,8 +99,8 @@ let BlockchainService = class BlockchainService {
|
|
|
99
99
|
this.apiService.updateBlockFetching();
|
|
100
100
|
}
|
|
101
101
|
async getBlockTimestamp(height) {
|
|
102
|
-
const block = await this.apiService.unsafeApi.api.getBlock(height);
|
|
103
|
-
return
|
|
102
|
+
const block = (await this.apiService.unsafeApi.api.getBlock(height));
|
|
103
|
+
return (0, utils_starknet_1.getBlockTimestamp)(block);
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
106
|
exports.BlockchainService = BlockchainService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAwC;
|
|
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 { SPEC } from '@starknet-io/types-js';\nimport {\n isCustomDs,\n isRuntimeDs,\n StarknetRuntimeDataSourceImpl,\n} from '@subql/common-starknet';\nimport {\n DatasourceParams,\n Header,\n IBlock,\n IBlockchainService,\n} from '@subql/node-core';\nimport {\n LightStarknetBlock,\n StarknetBlock,\n StarknetCustomDatasource,\n StarknetHandlerKind,\n SubqlDatasource,\n} from '@subql/types-starknet';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { SubqueryProject } from './configure/SubqueryProject';\nimport { BlockContent, getBlockSize } from './indexer/types';\nimport { IIndexerWorker } from './indexer/worker/worker';\nimport { StarknetApiService } from './starknet';\nimport SafeStarknetProvider from './starknet/safe-api';\nimport {\n calcInterval,\n getBlockTimestamp,\n starknetBlockHeaderToHeader,\n} from './starknet/utils.starknet';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\nexport class BlockchainService\n implements\n IBlockchainService<\n SubqlDatasource,\n StarknetCustomDatasource,\n SubqueryProject,\n SafeStarknetProvider,\n LightStarknetBlock,\n StarknetBlock,\n IIndexerWorker\n >\n{\n blockHandlerKind = StarknetHandlerKind.Block;\n isCustomDs = isCustomDs;\n isRuntimeDs = isRuntimeDs;\n packageVersion = packageVersion;\n\n constructor(@Inject('APIService') private apiService: StarknetApiService) {}\n\n async fetchBlocks(\n blockNums: number[],\n ): Promise<IBlock<LightStarknetBlock>[] | IBlock<StarknetBlock>[]> {\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 blockHeader = await this.apiService.api.getFinalizedBlock();\n return starknetBlockHeaderToHeader(blockHeader);\n }\n\n async getBestHeight(): Promise<number> {\n return this.apiService.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.apiService.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(hash);\n return block.getHeader();\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(height);\n return block.getHeader();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async updateDynamicDs(\n params: DatasourceParams,\n dsObj: SubqlDatasource | StarknetCustomDatasource,\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.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(StarknetRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getSafeApi(block: BlockContent): Promise<SafeStarknetProvider> {\n return this.apiService.safeApi(block.blockNumber);\n }\n\n onProjectChange(project: SubqueryProject): Promise<void> | void {\n this.apiService.updateBlockFetching();\n }\n\n async getBlockTimestamp(height: number): Promise<Date> {\n const block = (await this.apiService.unsafeApi.api.getBlock(\n height,\n )) as SPEC.BLOCK_WITH_TX_HASHES;\n\n return getBlockTimestamp(block);\n }\n}\n"]}
|
|
@@ -52,6 +52,7 @@ exports.FetchModule = FetchModule = __decorate([
|
|
|
52
52
|
provide: 'IProjectService',
|
|
53
53
|
},
|
|
54
54
|
indexer_manager_1.IndexerManager,
|
|
55
|
+
node_core_1.MultiChainRewindService,
|
|
55
56
|
{
|
|
56
57
|
provide: 'IBlockDispatcher',
|
|
57
58
|
useFactory: (0, node_core_1.blockDispatcherFactory)(node_path_1.default.resolve(__dirname, '../../dist/indexer/worker/worker.js'), []),
|
|
@@ -70,6 +71,7 @@ exports.FetchModule = FetchModule = __decorate([
|
|
|
70
71
|
node_core_1.ConnectionPoolStateManager,
|
|
71
72
|
'IBlockchainService',
|
|
72
73
|
indexer_manager_1.IndexerManager,
|
|
74
|
+
node_core_1.MultiChainRewindService,
|
|
73
75
|
node_core_1.MonitorService,
|
|
74
76
|
],
|
|
75
77
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;AAEnC,0DAA6B;AAC7B,2CAAwC;AACxC,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;AAEnC,0DAA6B;AAC7B,2CAAwC;AACxC,yDAAsD;AACtD,gDAiB0B;AAC1B,8DAA0D;AAC1D,2EAAsE;AACtE,wFAAoF;AACpF,uDAAmD;AA+D5C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IA7DvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAU,CAAC;QACrB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,yCAAkB,CAAC,MAAM;gBACrC,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,8BAAkB;YAClB,4BAAgB;YAChB;gBACE,OAAO,EAAE,2BAA2B;gBACpC,QAAQ,EAAE,oCAAwB;aACnC;YACD;gBACE,QAAQ,EAAE,0BAAc;gBACxB,OAAO,EAAE,iBAAiB;aAC3B;YACD,gCAAc;YACd,mCAAuB;YACvB;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,IAAA,kCAAsB,EAChC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qCAAqC,CAAC,EAC9D,EAAE,CACH;gBACD,MAAM,EAAE;oBACN,sBAAU;oBACV,6BAAa;oBACb,iBAAiB;oBACjB,wBAAwB;oBACxB,gCAAoB;oBACpB,wBAAY;oBACZ,qBAAqB;oBACrB,0BAAc;oBACd,kBAAkB;oBAClB,4BAAgB;oBAChB,2BAA2B;oBAC3B,sCAA0B;oBAC1B,oBAAoB;oBACpB,gCAAc;oBACd,mCAAuB;oBACvB,0BAAc;iBACf;aACF;YACD;gBACE,OAAO,EAAE,6BAAiB;gBAC1B,QAAQ,EAAE,sDAAyB;aACpC;YACD,wBAAY;SACb;KACF,CAAC;GACW,WAAW,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport path from 'node:path';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n StoreService,\n NodeConfig,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n PoiSyncService,\n InMemoryCacheService,\n MonitorService,\n CoreModule,\n blockDispatcherFactory,\n ProjectService,\n UnfinalizedBlocksService,\n DynamicDsService,\n DsProcessorService,\n FetchService,\n DictionaryService,\n MultiChainRewindService,\n} from '@subql/node-core';\nimport { BlockchainService } from '../blockchain.service';\nimport { StarknetApiService } from '../starknet/api.service.starknet';\nimport { StarknetDictionaryService } from './dictionary/starknetDictionary.service';\nimport { IndexerManager } from './indexer.manager';\n\n@Module({\n imports: [CoreModule],\n providers: [\n {\n provide: 'APIService',\n useFactory: StarknetApiService.create,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n DsProcessorService,\n DynamicDsService,\n {\n provide: 'IUnfinalizedBlocksService',\n useClass: UnfinalizedBlocksService,\n },\n {\n useClass: ProjectService,\n provide: 'IProjectService',\n },\n IndexerManager,\n MultiChainRewindService,\n {\n provide: 'IBlockDispatcher',\n useFactory: blockDispatcherFactory(\n path.resolve(__dirname, '../../dist/indexer/worker/worker.js'),\n [],\n ),\n inject: [\n NodeConfig,\n EventEmitter2,\n 'IProjectService',\n 'IProjectUpgradeService',\n InMemoryCacheService,\n StoreService,\n 'IStoreModelProvider',\n PoiSyncService,\n 'ISubqueryProject',\n DynamicDsService,\n 'IUnfinalizedBlocksService',\n ConnectionPoolStateManager,\n 'IBlockchainService',\n IndexerManager,\n MultiChainRewindService,\n MonitorService,\n ],\n },\n {\n provide: DictionaryService,\n useClass: StarknetDictionaryService,\n },\n FetchService,\n ],\n})\nexport class FetchModule {}\n"]}
|
|
@@ -3,6 +3,7 @@ import { Header, IBlock } from '@subql/node-core';
|
|
|
3
3
|
import { ApiWrapper, LightStarknetBlock, StarknetBlock, StarknetLog, StarknetLogRaw, StarknetTransaction, StarknetTransactionRaw } from '@subql/types-starknet';
|
|
4
4
|
import { Abi, RpcProvider, TransactionReceipt } from 'starknet';
|
|
5
5
|
import { BlockContent } from '../indexer/types';
|
|
6
|
+
export declare function getBlockTimestamp(block: BlockContent | SPEC.BLOCK_HEADER): Date;
|
|
6
7
|
export declare function calcInterval(api: ApiWrapper): number;
|
|
7
8
|
export declare function formatBlock(block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.BLOCK_WITH_TX_HASHES): Omit<StarknetBlock, 'transactions'> & {
|
|
8
9
|
transactions: StarknetTransactionRaw[];
|
|
@@ -43,9 +44,7 @@ export declare function formatTransaction(tx: {
|
|
|
43
44
|
}), txIndex: number): StarknetTransaction;
|
|
44
45
|
export declare function getTxContractAddress(tx: SPEC.TXN): string;
|
|
45
46
|
export declare function formatReceipt(receipt: SPEC.TXN_RECEIPT): TransactionReceipt;
|
|
46
|
-
export declare function starknetBlockToHeader(block: BlockContent
|
|
47
|
-
transactions: StarknetTransactionRaw[];
|
|
48
|
-
})): Header;
|
|
47
|
+
export declare function starknetBlockToHeader(block: BlockContent): Header;
|
|
49
48
|
export declare function starknetBlockHeaderToHeader(block: SPEC.BLOCK_HEADER): Header;
|
|
50
49
|
export declare function reverseToRawLog(log: StarknetLog): SPEC.EMITTED_EVENT;
|
|
51
50
|
export declare function fetchAbiFromContractAddress(provider: RpcProvider, contractAddress: string): Promise<Abi>;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
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
|
+
exports.getBlockTimestamp = getBlockTimestamp;
|
|
5
6
|
exports.calcInterval = calcInterval;
|
|
6
7
|
exports.formatBlock = formatBlock;
|
|
7
8
|
exports.formatBlockUtil = formatBlockUtil;
|
|
@@ -20,6 +21,9 @@ exports.isFinalizedBlock = isFinalizedBlock;
|
|
|
20
21
|
const lodash_1 = require("lodash");
|
|
21
22
|
const starknet_1 = require("starknet");
|
|
22
23
|
const decodeCalldata_1 = require("./decodeCalldata");
|
|
24
|
+
function getBlockTimestamp(block) {
|
|
25
|
+
return new Date(block.timestamp * 1000);
|
|
26
|
+
}
|
|
23
27
|
function calcInterval(api) {
|
|
24
28
|
// TODO find a way to get this from the blockchain
|
|
25
29
|
return 6000;
|
|
@@ -153,6 +157,7 @@ function starknetBlockToHeader(block) {
|
|
|
153
157
|
blockHeight: block.blockNumber,
|
|
154
158
|
blockHash: block.blockHash,
|
|
155
159
|
parentHash: block.parentHash,
|
|
160
|
+
timestamp: getBlockTimestamp(block),
|
|
156
161
|
};
|
|
157
162
|
}
|
|
158
163
|
function starknetBlockHeaderToHeader(block) {
|
|
@@ -160,6 +165,7 @@ function starknetBlockHeaderToHeader(block) {
|
|
|
160
165
|
blockHeight: block.block_number,
|
|
161
166
|
blockHash: block.block_hash,
|
|
162
167
|
parentHash: block.parent_hash,
|
|
168
|
+
timestamp: getBlockTimestamp(block),
|
|
163
169
|
};
|
|
164
170
|
}
|
|
165
171
|
//TODO, only used to phrase abi event
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AA0BnC,oCAGC;AAED,kCAkBC;AAED,0CAOC;AAED,8BAwBC;AA0BD,8CA+EC;AAED,oDAsBC;AAED,sCAOC;AAED,sDAYC;AAED,kEAMC;AAGD,0CASC;AAGD,kEASC;AAED,kDAEC;AAED,wCAEC;AAGD,sBAMC;AAGD,4CAQC;AA1RD,mCAA8B;AAC9B,uCAOkB;AAElB,qDAA+E;AAE/E,SAAgB,YAAY,CAAC,GAAe;IAC1C,kDAAkD;IAClD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CACzB,KAA2D;IAI3D,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,OAAO,EAAE,KAAK,CAAC,QAAQ;QACvB,gBAAgB,EAAE,KAAK,CAAC,iBAAiB;QACzC,UAAU,EAAE,KAAK,CAAC,YAAY;QAC9B,eAAe,EAAE,KAAK,CAAC,gBAAgB;QACvC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,EAAE,EAAE,gDAAgD;QAC1D,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,wDAAwD;KAC3F,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAE7B,KAAQ;IACR,OAAO;QACL,KAAK;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CACvB,GAAmB,EACnB,QAAgB,EAChB,EAAuB,EACvB,KAEC;IAED,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,GAAG,CAAC,YAAY;QACzB,MAAM,EAAE,GAAG,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,eAAe,EAAE,EAAE,CAAC,IAAI;QACxB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;QACrC,MAAM;YACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAA,aAAI,EAAC,IAAI,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;KACF,CAAC;IACF,OAAO,YAAsC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,iBAAiB,CAC/B,EAGC,EACD,KAIM,EACN,OAAe;IAEf,yGAAyG;IACzG,MAAM,WAAW,GAAG;QAClB,GAAG,EAAE,CAAC,WAAW;QACjB,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB;QACjC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI;QACzB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO;QAC/B,KAAK,EACH,EAAE,CAAC,WAIJ,CAAC,KAAK;QACP,MAAM,EACJ,EAAE,CAAC,WASJ,CAAC,OAAO;QACT,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,WAAW,CAAC;QAC1C,QAAQ,EAAG,EAAE,CAAC,WAA+B,CAAC,QAAQ,IAAI,EAAE;QAC5D,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,SAAS;QAC/B,gBAAgB,EAAE,OAAO;QACzB,kBAAkB,EAAG,EAAE,CAAC,WAAkC;aACvD,oBAAoB;QACvB,eAAe,EAAG,EAAE,CAAC,WAAkC,CAAC,gBAAgB;QACxE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC;QAClC,aAAa;YACX,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,YAAY,CAAC;YAC3B,CAAC;YAED,4BAA4B;YAC5B,IACE,WAAW,CAAC,IAAI,KAAK,QAAQ;gBAC7B,WAAW,CAAC,OAAO,KAAK,KAAK;gBAC7B,WAAW,CAAC,OAAO,KAAK,qCAAqC,EAC7D,CAAC;gBACD,OAAO,IAAA,qCAAoB,EAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;YACD,sCAAsC;iBACjC,IACH,WAAW,CAAC,eAAe;gBAC3B,WAAW,CAAC,kBAAkB;gBAC9B,WAAW,CAAC,QAAQ,EACpB,CAAC;gBACD,OAAO;oBACL,IAAA,sCAAqB,EACnB,WAAW,CAAC,eAAe,EAC3B,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,QAAQ,CACrB;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM;YACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAA,aAAI,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;KACuD,CAAC;IAC3D,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,oBAAoB,CAAC,EAAY;IAC/C,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,eAAI,CAAC,gCAAgC,CAClD,EAAE,CAAC,qBAAqB,EACxB,EAAE,CAAC,UAAU,EACb,EAAE,CAAC,oBAAoB,EACvB,CAAC,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,CACJ,EAA+C,CAAC,gBAAgB;QAE/D,EAOD,CAAC,cAAc,CACjB,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,OAAyB;IACrD,OAAO;QACL,GAAG,OAAO;QACV,MAAM;YACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAA,aAAI,EAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;KAC+B,CAAC;AACrC,CAAC;AAED,SAAgB,qBAAqB,CACnC,KAIM;IAEN,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,2BAA2B,CAAC,KAAwB;IAClE,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,UAAU,EAAE,KAAK,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,SAAgB,eAAe,CAAC,GAAgB;IAC9C,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,YAAY,EAAE,GAAG,CAAC,OAAO;QACzB,gBAAgB,EAAE,GAAG,CAAC,eAAe;QACrC,YAAY,EAAE,GAAG,CAAC,WAAW;QAC7B,GAAG,GAAG;KACP,CAAC;AACJ,CAAC;AAED,gEAAgE;AACzD,KAAK,UAAU,2BAA2B,CAC/C,QAAqB,EACrB,eAAuB;IAEvB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACtE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,OAAO,eAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,cAAc,CAAC,SAAiB;IAC9C,OAAO,cAAG,CAAC,KAAK,CAAC,eAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,iDAAiD;AACjD,SAAgB,KAAK,CAAC,CAAS,EAAE,CAAS;IACxC,IAAI,CAAC;QACH,OAAO,IAAA,kCAAuB,EAAC,CAAC,CAAC,KAAK,IAAA,kCAAuB,EAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,SAAgB,gBAAgB,CAC9B,KAAkE;IAElE,OAAO,CACL,QAAQ,IAAI,KAAK;QACjB,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,MAAM,KAAK,UAAU,CAC5B,CAAC;AACJ,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { SPEC } from '@starknet-io/types-js';\nimport { Header, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n LightStarknetBlock,\n StarknetBlock,\n StarknetContractCall,\n StarknetLog,\n StarknetLogRaw,\n StarknetTransaction,\n StarknetTransactionRaw,\n} from '@subql/types-starknet';\nimport { omit } from 'lodash';\nimport {\n Abi,\n hash,\n num,\n RpcProvider,\n TransactionReceipt,\n validateAndParseAddress,\n} from 'starknet';\nimport { BlockContent } from '../indexer/types';\nimport { decodeGenericCalldata, decodeInvokeCalldata } from './decodeCalldata';\n\nexport function calcInterval(api: ApiWrapper): number {\n // TODO find a way to get this from the blockchain\n return 6000;\n}\n\nexport function formatBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.BLOCK_WITH_TX_HASHES,\n): Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n} {\n return {\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n blockNumber: block.block_number,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n timestamp: block.timestamp,\n status: block.status,\n logs: [], // Filled in at starknetBlockWrapped constructor\n transactions: block.transactions, // Transaction still raw here, will format in fetchBlock\n };\n}\n\nexport function formatBlockUtil<\n B extends StarknetBlock | LightStarknetBlock = StarknetBlock,\n>(block: B): IBlock<B> {\n return {\n block,\n getHeader: () => starknetBlockToHeader(block),\n };\n}\n\nexport function formatLog(\n log: StarknetLogRaw,\n logIndex: number,\n tx: StarknetTransaction,\n block: Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n },\n): StarknetLog {\n const formattedLog = {\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: tx.hash,\n data: log.data,\n logIndex: logIndex,\n block: block,\n transaction: tx,\n transactionIndex: tx.transactionIndex,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n return formattedLog as unknown as StarknetLog;\n}\n\n/***\n * @param tx\n * @param block\n * @param txIndex\n * Explanation for from, to, selector, calldata with different tx type\n * When apply filter please refer to the following:\n *\n * 1. L1_HANDLER\n * from is the Contract Address (contract been called)\n * entryPointSelector (method)\n * within decodedCalls, to is same as from, selector is the entryPointSelector\n * 2. DEPLOY_ACCOUNT\n * from is the contract_address, also is the new account address\n * 3. DECLARE\n * from is the sender_address\n * 4. DEPLOY\n * from is the sender_address\n * 5. INVOKE V1 and V3\n * from is the sender_address\n * within decodedCalls, to is the contract been called, selector is the method\n * 6. INVOKE V0\n * from is the Contract Address (contract been called)\n * entryPointSelector is the method been called\n */\nexport function formatTransaction(\n tx: {\n transaction: SPEC.TXN;\n receipt: SPEC.TXN_RECEIPT;\n },\n block:\n | StarknetBlock\n | (Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n }),\n txIndex: number,\n): StarknetTransaction {\n // Any type specific properties are cast here, this should hopefully find any types issues int he future.\n const transaction = {\n ...tx.transaction,\n hash: tx.receipt.transaction_hash,\n type: tx.transaction.type,\n version: tx.transaction.version,\n nonce: (\n tx.transaction as Exclude<\n SPEC.TXN,\n SPEC.DECLARE_TXN_V0 | SPEC.INVOKE_TXN_V0 | SPEC.DEPLOY_TXN\n >\n ).nonce,\n maxFee: (\n tx.transaction as Exclude<\n SPEC.TXN,\n | SPEC.DECLARE_TXN_V3\n | SPEC.INVOKE_TXN_V3\n | SPEC.BROADCASTED_DECLARE_TXN_V3\n | SPEC.DEPLOY_ACCOUNT_TXN_V3\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n >\n ).max_fee,\n from: getTxContractAddress(tx.transaction),\n calldata: (tx.transaction as SPEC.INVOKE_TXN).calldata ?? [],\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: (tx.transaction as SPEC.INVOKE_TXN_V0)\n .entry_point_selector,\n contractAddress: (tx.transaction as SPEC.INVOKE_TXN_V0).contract_address,\n receipt: formatReceipt(tx.receipt),\n parseCallData(): StarknetContractCall[] | undefined {\n if (this.decodedCalls) {\n return this.decodedCalls;\n }\n\n // Handle \"INVOKE V1 and V3\"\n if (\n transaction.type === 'INVOKE' &&\n transaction.version !== '0x0' &&\n transaction.version !== '0x100000000000000000000000000000000'\n ) {\n return decodeInvokeCalldata(transaction.calldata);\n }\n // Handle \"L1_HANDLER\" and \"INVOKE V0\"\n else if (\n transaction.contractAddress &&\n transaction.entryPointSelector &&\n transaction.calldata\n ) {\n return [\n decodeGenericCalldata(\n transaction.contractAddress,\n transaction.entryPointSelector,\n transaction.calldata,\n ),\n ];\n }\n return;\n },\n toJSON(): string {\n return JSON.stringify(omit(this, ['receipt', 'toJSON']));\n },\n } satisfies StarknetTransaction & { toJSON: () => string };\n return transaction;\n}\n\nexport function getTxContractAddress(tx: SPEC.TXN): string {\n if (tx.type === 'DEPLOY' || tx.type === 'DEPLOY_ACCOUNT') {\n const result = hash.calculateContractAddressFromHash(\n tx.contract_address_salt,\n tx.class_hash,\n tx.constructor_calldata,\n 0,\n );\n return result;\n }\n return (\n (tx as SPEC.INVOKE_TXN_V0 | SPEC.L1_HANDLER_TXN).contract_address ??\n (\n tx as Exclude<\n SPEC.TXN,\n | SPEC.INVOKE_TXN_V0\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n | SPEC.DEPLOY_ACCOUNT_TXN\n >\n ).sender_address\n );\n}\n\nexport function formatReceipt(receipt: SPEC.TXN_RECEIPT): TransactionReceipt {\n return {\n ...receipt,\n toJSON(): string {\n return JSON.stringify(omit(this, ['toJSON']));\n },\n } as unknown as TransactionReceipt;\n}\n\nexport function starknetBlockToHeader(\n block:\n | BlockContent\n | (Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n }),\n): Header {\n return {\n blockHeight: block.blockNumber,\n blockHash: block.blockHash,\n parentHash: block.parentHash,\n };\n}\n\nexport function starknetBlockHeaderToHeader(block: SPEC.BLOCK_HEADER): Header {\n return {\n blockHeight: block.block_number,\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n };\n}\n\n//TODO, only used to phrase abi event\nexport function reverseToRawLog(log: StarknetLog): SPEC.EMITTED_EVENT {\n return {\n block_hash: log.blockHash,\n keys: [...log.topics],\n from_address: log.address,\n transaction_hash: log.transactionHash,\n block_number: log.blockNumber,\n ...log,\n };\n}\n\n// This is used when user abi not provided, or decode call in tx\nexport async function fetchAbiFromContractAddress(\n provider: RpcProvider,\n contractAddress: string,\n): Promise<Abi> {\n const { abi: remoteAbi } = await provider.getClassAt(contractAddress);\n if (remoteAbi === undefined) {\n throw new Error('no abi.');\n }\n return remoteAbi;\n}\n\nexport function encodeSelectorToHex(eventName: string): string {\n return hash.getSelector(eventName);\n}\n\nexport function encodeEventKey(eventName: string): string {\n return num.toHex(hash.starknetKeccak(eventName));\n}\n\n// Check address or selector hex string are equal\nexport function hexEq(a: string, b: string): boolean {\n try {\n return validateAndParseAddress(a) === validateAndParseAddress(b);\n } catch (e) {\n return false;\n }\n}\n\n// check if block is finalized\nexport function isFinalizedBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.PENDING_BLOCK_WITH_RECEIPTS,\n): block is SPEC.BLOCK_WITH_RECEIPTS {\n return (\n 'status' in block &&\n block.status !== 'PENDING' &&\n block.status !== 'REJECTED'\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.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 { SPEC } from '@starknet-io/types-js';\nimport { Header, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n LightStarknetBlock,\n StarknetBlock,\n StarknetContractCall,\n StarknetLog,\n StarknetLogRaw,\n StarknetTransaction,\n StarknetTransactionRaw,\n} from '@subql/types-starknet';\nimport { omit } from 'lodash';\nimport {\n Abi,\n hash,\n num,\n RpcProvider,\n TransactionReceipt,\n validateAndParseAddress,\n} from 'starknet';\nimport { BlockContent } from '../indexer/types';\nimport { decodeGenericCalldata, decodeInvokeCalldata } from './decodeCalldata';\n\nexport function getBlockTimestamp(\n block: BlockContent | SPEC.BLOCK_HEADER,\n): Date {\n return new Date(block.timestamp * 1000);\n}\n\nexport function calcInterval(api: ApiWrapper): number {\n // TODO find a way to get this from the blockchain\n return 6000;\n}\n\nexport function formatBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.BLOCK_WITH_TX_HASHES,\n): Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n} {\n return {\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n blockNumber: block.block_number,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n timestamp: block.timestamp,\n status: block.status,\n logs: [], // Filled in at starknetBlockWrapped constructor\n transactions: block.transactions, // Transaction still raw here, will format in fetchBlock\n };\n}\n\nexport function formatBlockUtil<\n B extends StarknetBlock | LightStarknetBlock = StarknetBlock,\n>(block: B): IBlock<B> {\n return {\n block,\n getHeader: () => starknetBlockToHeader(block),\n };\n}\n\nexport function formatLog(\n log: StarknetLogRaw,\n logIndex: number,\n tx: StarknetTransaction,\n block: Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n },\n): StarknetLog {\n const formattedLog = {\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: tx.hash,\n data: log.data,\n logIndex: logIndex,\n block: block,\n transaction: tx,\n transactionIndex: tx.transactionIndex,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n return formattedLog as unknown as StarknetLog;\n}\n\n/***\n * @param tx\n * @param block\n * @param txIndex\n * Explanation for from, to, selector, calldata with different tx type\n * When apply filter please refer to the following:\n *\n * 1. L1_HANDLER\n * from is the Contract Address (contract been called)\n * entryPointSelector (method)\n * within decodedCalls, to is same as from, selector is the entryPointSelector\n * 2. DEPLOY_ACCOUNT\n * from is the contract_address, also is the new account address\n * 3. DECLARE\n * from is the sender_address\n * 4. DEPLOY\n * from is the sender_address\n * 5. INVOKE V1 and V3\n * from is the sender_address\n * within decodedCalls, to is the contract been called, selector is the method\n * 6. INVOKE V0\n * from is the Contract Address (contract been called)\n * entryPointSelector is the method been called\n */\nexport function formatTransaction(\n tx: {\n transaction: SPEC.TXN;\n receipt: SPEC.TXN_RECEIPT;\n },\n block:\n | StarknetBlock\n | (Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n }),\n txIndex: number,\n): StarknetTransaction {\n // Any type specific properties are cast here, this should hopefully find any types issues int he future.\n const transaction = {\n ...tx.transaction,\n hash: tx.receipt.transaction_hash,\n type: tx.transaction.type,\n version: tx.transaction.version,\n nonce: (\n tx.transaction as Exclude<\n SPEC.TXN,\n SPEC.DECLARE_TXN_V0 | SPEC.INVOKE_TXN_V0 | SPEC.DEPLOY_TXN\n >\n ).nonce,\n maxFee: (\n tx.transaction as Exclude<\n SPEC.TXN,\n | SPEC.DECLARE_TXN_V3\n | SPEC.INVOKE_TXN_V3\n | SPEC.BROADCASTED_DECLARE_TXN_V3\n | SPEC.DEPLOY_ACCOUNT_TXN_V3\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n >\n ).max_fee,\n from: getTxContractAddress(tx.transaction),\n calldata: (tx.transaction as SPEC.INVOKE_TXN).calldata ?? [],\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: (tx.transaction as SPEC.INVOKE_TXN_V0)\n .entry_point_selector,\n contractAddress: (tx.transaction as SPEC.INVOKE_TXN_V0).contract_address,\n receipt: formatReceipt(tx.receipt),\n parseCallData(): StarknetContractCall[] | undefined {\n if (this.decodedCalls) {\n return this.decodedCalls;\n }\n\n // Handle \"INVOKE V1 and V3\"\n if (\n transaction.type === 'INVOKE' &&\n transaction.version !== '0x0' &&\n transaction.version !== '0x100000000000000000000000000000000'\n ) {\n return decodeInvokeCalldata(transaction.calldata);\n }\n // Handle \"L1_HANDLER\" and \"INVOKE V0\"\n else if (\n transaction.contractAddress &&\n transaction.entryPointSelector &&\n transaction.calldata\n ) {\n return [\n decodeGenericCalldata(\n transaction.contractAddress,\n transaction.entryPointSelector,\n transaction.calldata,\n ),\n ];\n }\n return;\n },\n toJSON(): string {\n return JSON.stringify(omit(this, ['receipt', 'toJSON']));\n },\n } satisfies StarknetTransaction & { toJSON: () => string };\n return transaction;\n}\n\nexport function getTxContractAddress(tx: SPEC.TXN): string {\n if (tx.type === 'DEPLOY' || tx.type === 'DEPLOY_ACCOUNT') {\n const result = hash.calculateContractAddressFromHash(\n tx.contract_address_salt,\n tx.class_hash,\n tx.constructor_calldata,\n 0,\n );\n return result;\n }\n return (\n (tx as SPEC.INVOKE_TXN_V0 | SPEC.L1_HANDLER_TXN).contract_address ??\n (\n tx as Exclude<\n SPEC.TXN,\n | SPEC.INVOKE_TXN_V0\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n | SPEC.DEPLOY_ACCOUNT_TXN\n >\n ).sender_address\n );\n}\n\nexport function formatReceipt(receipt: SPEC.TXN_RECEIPT): TransactionReceipt {\n return {\n ...receipt,\n toJSON(): string {\n return JSON.stringify(omit(this, ['toJSON']));\n },\n } as unknown as TransactionReceipt;\n}\n\nexport function starknetBlockToHeader(block: BlockContent): Header {\n return {\n blockHeight: block.blockNumber,\n blockHash: block.blockHash,\n parentHash: block.parentHash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\nexport function starknetBlockHeaderToHeader(block: SPEC.BLOCK_HEADER): Header {\n return {\n blockHeight: block.block_number,\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\n//TODO, only used to phrase abi event\nexport function reverseToRawLog(log: StarknetLog): SPEC.EMITTED_EVENT {\n return {\n block_hash: log.blockHash,\n keys: [...log.topics],\n from_address: log.address,\n transaction_hash: log.transactionHash,\n block_number: log.blockNumber,\n ...log,\n };\n}\n\n// This is used when user abi not provided, or decode call in tx\nexport async function fetchAbiFromContractAddress(\n provider: RpcProvider,\n contractAddress: string,\n): Promise<Abi> {\n const { abi: remoteAbi } = await provider.getClassAt(contractAddress);\n if (remoteAbi === undefined) {\n throw new Error('no abi.');\n }\n return remoteAbi;\n}\n\nexport function encodeSelectorToHex(eventName: string): string {\n return hash.getSelector(eventName);\n}\n\nexport function encodeEventKey(eventName: string): string {\n return num.toHex(hash.starknetKeccak(eventName));\n}\n\n// Check address or selector hex string are equal\nexport function hexEq(a: string, b: string): boolean {\n try {\n return validateAndParseAddress(a) === validateAndParseAddress(b);\n } catch (e) {\n return false;\n }\n}\n\n// check if block is finalized\nexport function isFinalizedBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.PENDING_BLOCK_WITH_RECEIPTS,\n): block is SPEC.BLOCK_WITH_RECEIPTS {\n return (\n 'status' in block &&\n block.status !== 'PENDING' &&\n block.status !== 'REJECTED'\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA0E;AAC1E,+CAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA0E;AAC1E,+CAAqD;AACrD,gDAc0B;AAC1B,oDAA+C;AAC/C,8DAA0D;AAC1D,oEAAgE;AAChE,0CAAiD;AA4C1C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IA1ChC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,6BAAiB;gBAC7B,MAAM,EAAE,CAAC,sBAAU,EAAE,6BAAa,EAAE,4BAAiB,EAAE,uBAAS,CAAC;aAClE;YACD,wBAAY;YACZ,0BAAc;YACd,sBAAU;YACV,6BAAiB;YACjB;gBACE,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,oCAAwB;aACnC;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,4BAAgB;aAC3B;YACD,8BAAkB;YAClB,sCAA0B;YAC1B,iCAAqB;YACrB;gBACE,8EAA8E;gBAC9E,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,6BAAkB,CAAC,MAAM;gBACrC,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,mCAAuB;YACvB,4BAAiB;SAClB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG;AAW7B,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IATzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,oBAAoB;YACpB,kCAAkB,CAAC,OAAO,EAAE;SAC7B;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { SchedulerRegistry } from '@nestjs/schedule';\nimport {\n DbModule,\n ForceCleanService,\n StoreService,\n ReindexService,\n PoiService,\n storeModelFactory,\n NodeConfig,\n UnfinalizedBlocksService,\n DynamicDsService,\n DsProcessorService,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n MultiChainRewindService,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport { BlockchainService } from '../blockchain.service';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { StarknetApiService } from '../starknet';\n\n@Module({\n providers: [\n {\n provide: 'IStoreModelProvider',\n useFactory: storeModelFactory,\n inject: [NodeConfig, EventEmitter2, SchedulerRegistry, Sequelize],\n },\n StoreService,\n ReindexService,\n PoiService,\n ForceCleanService,\n {\n provide: 'UnfinalizedBlocksService',\n useClass: UnfinalizedBlocksService,\n },\n {\n provide: 'DynamicDsService',\n useClass: DynamicDsService,\n },\n DsProcessorService,\n ConnectionPoolStateManager,\n ConnectionPoolService,\n {\n // Used to work with DI for unfinalizedBlocksService but not used with reindex\n provide: 'APIService',\n useFactory: StarknetApiService.create,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n MultiChainRewindService,\n SchedulerRegistry,\n ],\n controllers: [],\n})\nexport class ReindexFeatureModule {}\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ReindexFeatureModule,\n EventEmitterModule.forRoot(),\n ],\n controllers: [],\n})\nexport class ReindexModule {}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subql/node-starknet",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Jay Ji",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -19,16 +19,16 @@
|
|
|
19
19
|
"subql-node-starknet": "./bin/run"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nestjs/common": "^11.0.
|
|
22
|
+
"@nestjs/common": "^11.0.16",
|
|
23
23
|
"@nestjs/core": "^11.0.10",
|
|
24
24
|
"@nestjs/event-emitter": "^3.0.1",
|
|
25
25
|
"@nestjs/platform-express": "^11.0.10",
|
|
26
26
|
"@nestjs/schedule": "^5.0.1",
|
|
27
27
|
"@subql/common": "^5.4.0",
|
|
28
|
-
"@subql/common-starknet": "1.
|
|
29
|
-
"@subql/node-core": "^
|
|
28
|
+
"@subql/common-starknet": "1.2.0",
|
|
29
|
+
"@subql/node-core": "^18.0.3",
|
|
30
30
|
"@subql/testing": "^2.2.2",
|
|
31
|
-
"@subql/types-starknet": "1.
|
|
31
|
+
"@subql/types-starknet": "1.2.0",
|
|
32
32
|
"cacheable-lookup": "6",
|
|
33
33
|
"eventemitter2": "^6.4.5",
|
|
34
34
|
"json5": "^2.2.3",
|
|
@@ -59,6 +59,5 @@
|
|
|
59
59
|
"files": [
|
|
60
60
|
"/dist",
|
|
61
61
|
"/bin"
|
|
62
|
-
]
|
|
63
|
-
"stableVersion": "5.8.0"
|
|
62
|
+
]
|
|
64
63
|
}
|