@subql/node-starknet 6.0.1 → 6.0.3-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.
Files changed (41) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/blockchain.service.js.map +1 -1
  4. package/dist/indexer/types.js +1 -1
  5. package/dist/indexer/types.js.map +1 -1
  6. package/dist/starknet/api.starknet.d.ts +1 -1
  7. package/dist/starknet/api.starknet.js +1 -6
  8. package/dist/starknet/api.starknet.js.map +1 -1
  9. package/dist/starknet/decodeCalldata.d.ts +1 -1
  10. package/dist/starknet/decodeCalldata.js.map +1 -1
  11. package/dist/starknet/finalized.block.starknet.d.ts +1 -1
  12. package/dist/starknet/finalized.block.starknet.js.map +1 -1
  13. package/dist/starknet/safe-api.d.ts +4 -5
  14. package/dist/starknet/safe-api.js.map +1 -1
  15. package/dist/starknet/utils.starknet.d.ts +3 -2
  16. package/dist/starknet/utils.starknet.js +7 -2
  17. package/dist/starknet/utils.starknet.js.map +1 -1
  18. package/package.json +19 -8
  19. package/test/projectFixture/template-v1.0.0/package.json +30 -0
  20. package/test/projectFixture/v1.0.0/package.json +30 -0
  21. package/dist/blockchain.service.spec.d.ts +0 -1
  22. package/dist/blockchain.service.spec.js +0 -27
  23. package/dist/blockchain.service.spec.js.map +0 -1
  24. package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.d.ts +0 -1
  25. package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js +0 -189
  26. package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js.map +0 -1
  27. package/dist/starknet/api.service.starknet.spec.d.ts +0 -1
  28. package/dist/starknet/api.service.starknet.spec.js +0 -79
  29. package/dist/starknet/api.service.starknet.spec.js.map +0 -1
  30. package/dist/starknet/api.starknet.test.d.ts +0 -1
  31. package/dist/starknet/api.starknet.test.js +0 -183
  32. package/dist/starknet/api.starknet.test.js.map +0 -1
  33. package/dist/starknet/block.starknet.spec.d.ts +0 -1
  34. package/dist/starknet/block.starknet.spec.js +0 -158
  35. package/dist/starknet/block.starknet.spec.js.map +0 -1
  36. package/dist/starknet/decodeCalldata.spec.d.ts +0 -1
  37. package/dist/starknet/decodeCalldata.spec.js +0 -112
  38. package/dist/starknet/decodeCalldata.spec.js.map +0 -1
  39. package/dist/starknet/finalized.block.starknet.spec.d.ts +0 -1
  40. package/dist/starknet/finalized.block.starknet.spec.js +0 -112
  41. package/dist/starknet/finalized.block.starknet.spec.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"blockchain.service.spec.js","sourceRoot":"","sources":["../src/blockchain.service.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,yDAAsD;AACtD,6DAAyD;AACzD,yCAA6D;AAE7D,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEzE,MAAM,cAAc,GAAG,KAAK,IAAiC,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,sBAAW,CAAC,aAAa,EAAE,IAAI,6BAAa,EAAE,CAAC,CAAC;IAEpE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,OAAO;QACL,SAAS,EAAE,OAAO;KACZ,CAAC;AACX,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAC;IAEzC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAE1C,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { BlockchainService } from './blockchain.service';\nimport { StarknetApi, StarknetApiService } from './starknet';\n\nconst HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';\n\nconst mockApiService = async (): Promise<StarknetApiService> => {\n const strkApi = new StarknetApi(HTTP_ENDPOINT, new EventEmitter2());\n\n await strkApi.init();\n\n return {\n unsafeApi: strkApi,\n } as any;\n};\n\ndescribe('BlockchainService', () => {\n let blockchainService: BlockchainService;\n\n beforeEach(async () => {\n const apiService = await mockApiService();\n\n blockchainService = new BlockchainService(apiService);\n });\n\n it('can get a block timestamps', async () => {\n const timestamp = await blockchainService.getBlockTimestamp(500_000);\n\n expect(timestamp).toEqual(new Date('2024-01-09T03:54:22.000Z'));\n });\n});\n"]}
@@ -1,189 +0,0 @@
1
- "use strict";
2
- // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
- // SPDX-License-Identifier: GPL-3.0
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- const types_starknet_1 = require("@subql/types-starknet");
6
- const starknetDictionaryV1_1 = require("./starknetDictionaryV1");
7
- const mockTempDs = [
8
- {
9
- name: 'ZkLend',
10
- kind: types_starknet_1.StarknetDatasourceKind.Runtime,
11
- assets: new Map(),
12
- options: {
13
- // Must be a key of assets
14
- abi: 'zkLend',
15
- // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05
16
- address: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
17
- },
18
- mapping: {
19
- file: '',
20
- handlers: [
21
- {
22
- kind: types_starknet_1.StarknetHandlerKind.Call,
23
- handler: 'handleTransaction',
24
- filter: {
25
- to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
26
- type: 'INVOKE',
27
- /**
28
- * The function can either be the function fragment or signature
29
- * function: 'withdraw'
30
- * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'
31
- */
32
- function: 'withdraw',
33
- },
34
- },
35
- {
36
- kind: types_starknet_1.StarknetHandlerKind.Event,
37
- handler: 'handleLog',
38
- filter: {
39
- /**
40
- * Follows standard log filters for Starknet
41
- * zkLend address: "0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05"
42
- */
43
- topics: [
44
- 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2
45
- ],
46
- },
47
- },
48
- ],
49
- },
50
- },
51
- ];
52
- describe('buildDictionaryV1QueryEntries', () => {
53
- describe('Log filters', () => {
54
- it('Build filter for logs', () => {
55
- const ds = {
56
- kind: types_starknet_1.StarknetDatasourceKind.Runtime,
57
- assets: new Map(),
58
- options: {
59
- // Must be a key of assets
60
- abi: 'zkLend',
61
- // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05
62
- address: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
63
- },
64
- mapping: {
65
- file: '',
66
- handlers: [
67
- {
68
- kind: types_starknet_1.StarknetHandlerKind.Event,
69
- handler: 'handleLog',
70
- filter: {
71
- /**
72
- * Follows standard log filters for Starknet
73
- * zkLend address: "0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05"
74
- */
75
- topics: [
76
- 'Deposit', //0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2
77
- ],
78
- },
79
- },
80
- ],
81
- },
82
- };
83
- const result = (0, starknetDictionaryV1_1.buildDictionaryV1QueryEntries)([ds]);
84
- expect(result).toEqual([
85
- {
86
- conditions: [
87
- {
88
- field: 'address',
89
- matcher: 'equalTo',
90
- value: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
91
- },
92
- {
93
- field: 'topics',
94
- matcher: 'contains',
95
- value: [
96
- '0x9149d2123147c5f43d258257fef0b7b969db78269369ebcf5ebb9eef8592f2',
97
- ],
98
- },
99
- ],
100
- entity: 'logs',
101
- },
102
- ]);
103
- });
104
- });
105
- describe('Transaction filters', () => {
106
- it('Build a filter for contract type', () => {
107
- const ds = {
108
- kind: types_starknet_1.StarknetDatasourceKind.Runtime,
109
- assets: new Map(),
110
- startBlock: 1,
111
- mapping: {
112
- file: '',
113
- handlers: [
114
- {
115
- handler: 'handleTransaction',
116
- kind: types_starknet_1.StarknetHandlerKind.Call,
117
- filter: {
118
- type: 'L1_HANDLER',
119
- },
120
- },
121
- ],
122
- },
123
- };
124
- const result = (0, starknetDictionaryV1_1.buildDictionaryV1QueryEntries)([ds]);
125
- expect(result).toEqual([
126
- {
127
- conditions: [
128
- {
129
- field: 'type',
130
- matcher: 'equalTo',
131
- value: 'L1_HANDLER',
132
- },
133
- ],
134
- entity: 'calls',
135
- },
136
- ]);
137
- });
138
- it('Build a filter with include ds option and contract address', () => {
139
- const ds = {
140
- kind: types_starknet_1.StarknetDatasourceKind.Runtime,
141
- assets: new Map(),
142
- options: {
143
- // Must be a key of assets
144
- abi: 'zkLend',
145
- // # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05
146
- address: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
147
- },
148
- mapping: {
149
- file: '',
150
- handlers: [
151
- {
152
- kind: types_starknet_1.StarknetHandlerKind.Call,
153
- handler: 'handleTransaction',
154
- filter: {
155
- to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
156
- // type: "INVOKE",
157
- /**
158
- * The function can either be the function fragment or signature
159
- * function: 'withdraw'
160
- * function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'
161
- */
162
- function: 'withdraw',
163
- },
164
- },
165
- ],
166
- },
167
- };
168
- const result = (0, starknetDictionaryV1_1.buildDictionaryV1QueryEntries)([ds]);
169
- expect(result).toEqual([
170
- {
171
- conditions: [
172
- {
173
- field: 'to',
174
- matcher: 'equalTo',
175
- value: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
176
- },
177
- {
178
- field: 'func',
179
- matcher: 'equalTo',
180
- value: '0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77',
181
- },
182
- ],
183
- entity: 'calls',
184
- },
185
- ]);
186
- });
187
- });
188
- });
189
- //# sourceMappingURL=starknetDictionaryV1.spec.js.map
@@ -1 +0,0 @@
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-2025 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"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,79 +0,0 @@
1
- "use strict";
2
- // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
- // SPDX-License-Identifier: GPL-3.0
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- const event_emitter_1 = require("@nestjs/event-emitter");
6
- const testing_1 = require("@nestjs/testing");
7
- const node_core_1 = require("@subql/node-core");
8
- const graphql_1 = require("graphql");
9
- const lodash_1 = require("lodash");
10
- const api_service_starknet_1 = require("./api.service.starknet");
11
- // Add api key to work
12
- const HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';
13
- function testSubqueryProject(endpoint) {
14
- return {
15
- network: {
16
- endpoint: [endpoint],
17
- chainId: '0x534e5f4d41494e',
18
- },
19
- dataSources: [],
20
- id: 'test',
21
- root: './',
22
- schema: new graphql_1.GraphQLSchema({}),
23
- templates: [],
24
- };
25
- }
26
- const prepareApiService = async (endpoint = HTTP_ENDPOINT) => {
27
- const module = await testing_1.Test.createTestingModule({
28
- providers: [
29
- node_core_1.ConnectionPoolService,
30
- node_core_1.ConnectionPoolStateManager,
31
- {
32
- provide: node_core_1.NodeConfig,
33
- useFactory: () => ({}),
34
- },
35
- {
36
- provide: 'ISubqueryProject',
37
- useFactory: () => testSubqueryProject(endpoint),
38
- },
39
- {
40
- provide: api_service_starknet_1.StarknetApiService,
41
- useFactory: api_service_starknet_1.StarknetApiService.create,
42
- inject: [
43
- 'ISubqueryProject',
44
- node_core_1.ConnectionPoolService,
45
- event_emitter_1.EventEmitter2,
46
- node_core_1.NodeConfig,
47
- ],
48
- },
49
- ],
50
- imports: [event_emitter_1.EventEmitterModule.forRoot()],
51
- }).compile();
52
- const app = module.createNestApplication();
53
- await app.init();
54
- const apiService = app.get(api_service_starknet_1.StarknetApiService);
55
- return [apiService, app];
56
- };
57
- jest.setTimeout(90000);
58
- describe('ApiService', () => {
59
- let apiService;
60
- let app;
61
- beforeEach(async () => {
62
- [apiService, app] = await prepareApiService();
63
- });
64
- afterEach(async () => {
65
- return app?.close();
66
- });
67
- it('can instantiate api', () => {
68
- expect(apiService.api.getChainId()).toEqual('0x534e5f4d41494e');
69
- });
70
- it('can fetch blocks', async () => {
71
- await expect(apiService.api.fetchBlocks((0, lodash_1.range)(50000, 50004))).resolves.toHaveLength(4);
72
- });
73
- it('can get the finalized height', async () => {
74
- const height = (await apiService.api.getFinalizedBlock()).block_number;
75
- console.log('Finalized height', height);
76
- expect(height).toBeGreaterThan(975_650);
77
- });
78
- });
79
- //# sourceMappingURL=api.service.starknet.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.service.starknet.spec.js","sourceRoot":"","sources":["../../src/starknet/api.service.starknet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { 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 {\n provide: StarknetApiService,\n useFactory: StarknetApiService.create,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(StarknetApiService);\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 +0,0 @@
1
- export {};
@@ -1,183 +0,0 @@
1
- "use strict";
2
- // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
- // SPDX-License-Identifier: GPL-3.0
4
- var __importDefault = (this && this.__importDefault) || function (mod) {
5
- return (mod && mod.__esModule) ? mod : { "default": mod };
6
- };
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- const path_1 = __importDefault(require("path"));
9
- const event_emitter_1 = require("@nestjs/event-emitter");
10
- const types_starknet_1 = require("@subql/types-starknet");
11
- const api_starknet_1 = require("./api.starknet");
12
- const block_starknet_1 = require("./block.starknet");
13
- // Add api key to work
14
- const HTTP_ENDPOINT = 'https://starknet-mainnet.public.blastapi.io/rpc/v0_7';
15
- const ds = {
16
- mapping: {
17
- file: '',
18
- handlers: [
19
- {
20
- handler: 'test',
21
- kind: types_starknet_1.StarknetHandlerKind.Call,
22
- filter: { function: 'deposit' },
23
- },
24
- ],
25
- },
26
- kind: types_starknet_1.StarknetDatasourceKind.Runtime,
27
- startBlock: 979358,
28
- options: {
29
- abi: 'zkLend',
30
- address: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
31
- },
32
- assets: new Map([
33
- ['zkLend', { file: path_1.default.join(__dirname, '../../test/zkLend.abi.json') }],
34
- ]),
35
- };
36
- jest.setTimeout(90000);
37
- describe('Api.starknet', () => {
38
- let strkApi;
39
- const eventEmitter = new event_emitter_1.EventEmitter2();
40
- let blockData;
41
- const fetchBlock = async (height) => {
42
- const block = await strkApi.fetchBlock(height);
43
- return block.block;
44
- };
45
- beforeEach(async () => {
46
- strkApi = new api_starknet_1.StarknetApi(HTTP_ENDPOINT, eventEmitter);
47
- await strkApi.init();
48
- blockData = await fetchBlock(979358);
49
- });
50
- it('should get finalized block and best block', async () => {
51
- const finalized = await strkApi.getFinalizedBlock();
52
- const best = await strkApi.getBestBlockHeight();
53
- expect(finalized).toBeDefined();
54
- expect(best).toBeDefined();
55
- expect(best).toBeGreaterThan(finalized.block_number);
56
- });
57
- it('should get finalized block', async () => {
58
- const finalized = await strkApi.getFinalizedBlock();
59
- expect(finalized).toBeDefined();
60
- expect(finalized.block_number).toBeGreaterThan(979358);
61
- });
62
- it('Should format transaction in logs', () => {
63
- expect(typeof blockData.logs[0].transaction.blockNumber).toBe('number');
64
- expect(typeof blockData.logs[0].transaction.transactionIndex).toBe('number');
65
- expect(blockData.logs[0].transaction.calldata.length).toBeGreaterThan(1);
66
- });
67
- it('should have the ability to get receipts via transactions from all types', () => {
68
- expect(blockData.transactions[0].receipt).toBeDefined();
69
- expect(typeof blockData.transactions[0].receipt).toEqual('object');
70
- expect(typeof blockData.logs[0].transaction.receipt).toEqual('object');
71
- expect(typeof blockData.logs[0].transaction.from).toEqual('string');
72
- expect(typeof blockData.transactions[1].logs[0].transaction.from).toEqual('string');
73
- expect(typeof blockData.transactions[1].logs[0].transaction.receipt).toEqual('object');
74
- });
75
- // Validate some of the variations from different transaction types
76
- it('should correctly format a transaction', async () => {
77
- const tx_invoke_v3 = blockData.transactions[0];
78
- expect(tx_invoke_v3.hash).toBeDefined();
79
- expect(tx_invoke_v3.nonce).toBeDefined();
80
- expect(typeof tx_invoke_v3.nonce).toBe('string');
81
- expect(tx_invoke_v3.maxFee).toBeUndefined();
82
- const tx_invoke_v1 = blockData.transactions[5];
83
- expect(tx_invoke_v1.hash).toBeDefined();
84
- expect(tx_invoke_v1.maxFee).toBeDefined();
85
- expect(typeof tx_invoke_v1.maxFee).toBe('string');
86
- const block = await fetchBlock(1407);
87
- // TX HASH 0x65e9ac447be4bbd256c407703c8baf9c4e862195d924a5fe3c42d138f3a0d38
88
- const declare_tx = block.transactions[11];
89
- expect(declare_tx).toBeDefined();
90
- expect(declare_tx.maxFee).not.toBeDefined();
91
- expect(declare_tx.nonce).not.toBeDefined();
92
- });
93
- //https://starkscan.co/tx/0x0153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24
94
- it('Decode logs', async () => {
95
- const tx = blockData.transactions.find((t) => t.hash ===
96
- '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24');
97
- // const parsedTx = await strkApi.parseTransaction(tx!, ds);
98
- const parsedLog = await strkApi.parseLog(tx.logs[5], ds);
99
- expect(parsedLog.args).toStrictEqual({
100
- 'zklend::market::Market::Deposit': {
101
- user: 888570324763985402246768015919558310269514530881625296825528005560714345717n,
102
- token: 2009894490435840142178314390393166646092438090257831307886760648929397478285n,
103
- face_amount: 2100000000000000000000n,
104
- },
105
- block_hash: '0x20dda386e8cb1da79a94716bca62e704b8664a13674d9bf4805d05125755a4a',
106
- block_number: 979358,
107
- transaction_hash: '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24',
108
- });
109
- });
110
- //https://starkscan.co/tx/0x0153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24
111
- it('Decode invoke v3 function type transaction calldata with contract abi (local and remote)', async () => {
112
- const tx = blockData.transactions.find((t) => t.hash ===
113
- '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24');
114
- // Expect before parse (or been passed a filter), decodedCalls is undefined
115
- expect(tx.decodedCalls).toBeUndefined();
116
- const parsedTransaction = await strkApi.parseTransaction(tx, ds);
117
- expect(parsedTransaction.decodedCalls).toStrictEqual([
118
- {
119
- calldata: [
120
- '0x4c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
121
- '0x71d75ab9b920500000',
122
- '0x0',
123
- ],
124
- decodedArgs: {
125
- amount: 2100000000000000000000n,
126
- spender: 2149625499377050772775701191274921578103398273298955620360611655307104287237n,
127
- },
128
- selector: '0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c',
129
- to: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
130
- },
131
- {
132
- calldata: [
133
- '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
134
- '0x71d75ab9b920500000',
135
- ],
136
- decodedArgs: {
137
- amount: 2100000000000000000000n,
138
- token: 2009894490435840142178314390393166646092438090257831307886760648929397478285n,
139
- },
140
- selector: '0xc73f681176fc7b3f9693986fd7b14581e8d540519e27400e88b8713932be01',
141
- to: '0x4c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
142
- },
143
- ]);
144
- });
145
- //https://starkscan.co/tx/0x043ce8e6e2ad703a81701f85ce26a8fb32ad54cc2fac7685ed0b1367a4813ade
146
- it('Decode L1 transaction calldata, and decode with remote abi', async () => {
147
- const blockData = await fetchBlock(981920);
148
- const tx = blockData.transactions.find((t) => t.hash ===
149
- '0x43ce8e6e2ad703a81701f85ce26a8fb32ad54cc2fac7685ed0b1367a4813ade');
150
- const parsedTransaction = await strkApi.parseTransaction(tx, ds);
151
- expect(parsedTransaction.decodedCalls).toStrictEqual([
152
- {
153
- calldata: [
154
- '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419',
155
- '0x455448',
156
- '0x1c7edb66155e3c72b27e6165d7a1912ec97a1286',
157
- '0x296a93b1c3672a6093de21df2f7b665e0907abc97868e9bf52d6fea07921591',
158
- '0x13883834c2e180b5',
159
- '0x0',
160
- ],
161
- decodedArgs: {
162
- amount: 1407436682812293301n,
163
- depositor: 162680747805905936472113782182998614066721329798n,
164
- from_address: 993696174272377493693496825928908586134624850969n,
165
- l1_token: 4543560n,
166
- l2_recipient: 1170820745623894104757945010321258484362311313101582454359316155358757655953n,
167
- },
168
- selector: '0x1b64b1b3b690b43b9b514fb81377518f4039cd3e4f4914d8a6bdf01d679fb19',
169
- to: '0x73314940630fd6dcda0d772d4c972c4e0a9946bef9dabf4ef84eda8ef542b82',
170
- },
171
- ]);
172
- });
173
- it('Should not include decodedArgs if decode failed', async () => {
174
- // TODO, not sure how to test this yet when remote abi always available
175
- });
176
- it('Should able to check is fullBlock', async () => {
177
- // block with transactions
178
- const lightBlock = (await strkApi.fetchLightBlock(500000)).block;
179
- expect((0, block_starknet_1.isFullBlock)(blockData)).toBeTruthy();
180
- expect((0, block_starknet_1.isFullBlock)(lightBlock)).toBeFalsy();
181
- });
182
- });
183
- //# sourceMappingURL=api.starknet.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.starknet.test.js","sourceRoot":"","sources":["../../src/starknet/api.starknet.test.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 path from 'path';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n StarknetBlock,\n StarknetContractCall,\n StarknetDatasourceKind,\n StarknetHandlerKind,\n StarknetRuntimeDatasource,\n} from '@subql/types-starknet';\nimport { StarknetApi } from './api.starknet';\nimport { isFullBlock } from './block.starknet';\n\n// Add api key to work\nconst HTTP_ENDPOINT = 'https://starknet-mainnet.public.blastapi.io/rpc/v0_7';\n\nconst ds: StarknetRuntimeDatasource = {\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'test',\n kind: StarknetHandlerKind.Call,\n filter: { function: 'deposit' },\n },\n ],\n },\n kind: StarknetDatasourceKind.Runtime,\n startBlock: 979358,\n options: {\n abi: 'zkLend',\n address:\n '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n assets: new Map([\n ['zkLend', { file: path.join(__dirname, '../../test/zkLend.abi.json') }],\n ]),\n};\n\njest.setTimeout(90000);\ndescribe('Api.starknet', () => {\n let strkApi: StarknetApi;\n const eventEmitter = new EventEmitter2();\n let blockData: StarknetBlock;\n\n const fetchBlock = async (height: number) => {\n const block = await strkApi.fetchBlock(height);\n\n return block.block as StarknetBlock;\n };\n\n beforeEach(async () => {\n strkApi = new StarknetApi(HTTP_ENDPOINT, eventEmitter);\n await strkApi.init();\n blockData = await fetchBlock(979358);\n });\n\n it('should get finalized block and best block', async () => {\n const finalized = await strkApi.getFinalizedBlock();\n const best = await strkApi.getBestBlockHeight();\n\n expect(finalized).toBeDefined();\n expect(best).toBeDefined();\n\n expect(best).toBeGreaterThan(finalized.block_number);\n });\n\n it('should get finalized block', async () => {\n const finalized = await strkApi.getFinalizedBlock();\n expect(finalized).toBeDefined();\n expect(finalized.block_number).toBeGreaterThan(979358);\n });\n\n it('Should format transaction in logs', () => {\n expect(typeof blockData.logs[0].transaction.blockNumber).toBe('number');\n expect(typeof blockData.logs[0].transaction.transactionIndex).toBe(\n 'number',\n );\n expect(blockData.logs[0].transaction.calldata.length).toBeGreaterThan(1);\n });\n\n it('should have the ability to get receipts via transactions from all types', () => {\n expect(blockData.transactions[0].receipt).toBeDefined();\n\n expect(typeof blockData.transactions[0].receipt).toEqual('object');\n expect(typeof blockData.logs[0].transaction.receipt).toEqual('object');\n expect(typeof blockData.logs[0].transaction.from).toEqual('string');\n expect(typeof blockData.transactions[1].logs![0].transaction.from).toEqual(\n 'string',\n );\n expect(\n typeof blockData.transactions[1].logs![0].transaction.receipt,\n ).toEqual('object');\n });\n\n // Validate some of the variations from different transaction types\n it('should correctly format a transaction', async () => {\n const tx_invoke_v3 = blockData.transactions[0];\n\n expect(tx_invoke_v3.hash).toBeDefined();\n expect(tx_invoke_v3.nonce).toBeDefined();\n expect(typeof tx_invoke_v3.nonce).toBe('string');\n expect(tx_invoke_v3.maxFee).toBeUndefined();\n\n const tx_invoke_v1 = blockData.transactions[5];\n\n expect(tx_invoke_v1.hash).toBeDefined();\n expect(tx_invoke_v1.maxFee).toBeDefined();\n expect(typeof tx_invoke_v1.maxFee).toBe('string');\n\n const block = await fetchBlock(1407);\n // TX HASH 0x65e9ac447be4bbd256c407703c8baf9c4e862195d924a5fe3c42d138f3a0d38\n const declare_tx = block.transactions[11];\n\n expect(declare_tx).toBeDefined();\n expect(declare_tx.maxFee).not.toBeDefined();\n expect(declare_tx.nonce).not.toBeDefined();\n });\n\n //https://starkscan.co/tx/0x0153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24\n it('Decode logs', async () => {\n const tx = blockData.transactions.find(\n (t) =>\n t.hash ===\n '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24',\n );\n // const parsedTx = await strkApi.parseTransaction(tx!, ds);\n const parsedLog = await strkApi.parseLog(tx!.logs![5], ds);\n expect(parsedLog.args).toStrictEqual({\n 'zklend::market::Market::Deposit': {\n user: 888570324763985402246768015919558310269514530881625296825528005560714345717n,\n token:\n 2009894490435840142178314390393166646092438090257831307886760648929397478285n,\n face_amount: 2100000000000000000000n,\n },\n block_hash:\n '0x20dda386e8cb1da79a94716bca62e704b8664a13674d9bf4805d05125755a4a',\n block_number: 979358,\n transaction_hash:\n '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24',\n });\n });\n\n //https://starkscan.co/tx/0x0153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24\n it('Decode invoke v3 function type transaction calldata with contract abi (local and remote)', async () => {\n const tx = blockData.transactions.find(\n (t) =>\n t.hash ===\n '0x153a20567e66728f3c4ba60913a6011b9c73db9ea4d960e959923ed5afd8a24',\n );\n // Expect before parse (or been passed a filter), decodedCalls is undefined\n expect(tx!.decodedCalls).toBeUndefined();\n const parsedTransaction = await strkApi.parseTransaction(tx!, ds);\n expect(\n parsedTransaction.decodedCalls as StarknetContractCall<{\n amount: bigint;\n spender: bigint;\n }>[],\n ).toStrictEqual([\n {\n calldata: [\n '0x4c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n '0x71d75ab9b920500000',\n '0x0',\n ],\n decodedArgs: {\n amount: 2100000000000000000000n,\n spender:\n 2149625499377050772775701191274921578103398273298955620360611655307104287237n,\n },\n selector:\n '0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c',\n to: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',\n },\n {\n calldata: [\n '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',\n '0x71d75ab9b920500000',\n ],\n decodedArgs: {\n amount: 2100000000000000000000n,\n token:\n 2009894490435840142178314390393166646092438090257831307886760648929397478285n,\n },\n selector:\n '0xc73f681176fc7b3f9693986fd7b14581e8d540519e27400e88b8713932be01',\n to: '0x4c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',\n },\n ]);\n });\n\n //https://starkscan.co/tx/0x043ce8e6e2ad703a81701f85ce26a8fb32ad54cc2fac7685ed0b1367a4813ade\n it('Decode L1 transaction calldata, and decode with remote abi', async () => {\n const blockData = await fetchBlock(981920);\n const tx = blockData.transactions.find(\n (t) =>\n t.hash ===\n '0x43ce8e6e2ad703a81701f85ce26a8fb32ad54cc2fac7685ed0b1367a4813ade',\n );\n const parsedTransaction = await strkApi.parseTransaction(tx!, ds);\n expect(parsedTransaction.decodedCalls).toStrictEqual([\n {\n calldata: [\n '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419',\n '0x455448',\n '0x1c7edb66155e3c72b27e6165d7a1912ec97a1286',\n '0x296a93b1c3672a6093de21df2f7b665e0907abc97868e9bf52d6fea07921591',\n '0x13883834c2e180b5',\n '0x0',\n ],\n decodedArgs: {\n amount: 1407436682812293301n,\n depositor: 162680747805905936472113782182998614066721329798n,\n from_address: 993696174272377493693496825928908586134624850969n,\n l1_token: 4543560n,\n l2_recipient:\n 1170820745623894104757945010321258484362311313101582454359316155358757655953n,\n },\n selector:\n '0x1b64b1b3b690b43b9b514fb81377518f4039cd3e4f4914d8a6bdf01d679fb19',\n to: '0x73314940630fd6dcda0d772d4c972c4e0a9946bef9dabf4ef84eda8ef542b82',\n },\n ]);\n });\n\n it('Should not include decodedArgs if decode failed', async () => {\n // TODO, not sure how to test this yet when remote abi always available\n });\n\n it('Should able to check is fullBlock', async () => {\n // block with transactions\n const lightBlock = (await (strkApi as any).fetchLightBlock(500000)).block;\n expect(isFullBlock(blockData)).toBeTruthy();\n expect(isFullBlock(lightBlock)).toBeFalsy();\n });\n});\n"]}
@@ -1 +0,0 @@
1
- export {};