@subql/node-starknet 0.0.2-7 → 0.0.2-8
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/dist/.tsbuildinfo +1 -1
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.d.ts +0 -1
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.js +26 -47
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.js.map +1 -1
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.d.ts +1 -0
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js +191 -0
- package/dist/indexer/dictionary/v1/starknetDictionaryV1.spec.js.map +1 -0
- package/dist/starknet/utils.starknet.d.ts +24 -0
- package/dist/starknet/utils.starknet.js +24 -0
- package/dist/starknet/utils.starknet.js.map +1 -1
- package/package.json +2 -2
|
@@ -6,6 +6,5 @@ export declare function buildDictionaryV1QueryEntries(dataSources: SubqlDatasour
|
|
|
6
6
|
export declare class StarknetDictionaryV1 extends DictionaryV1<SubqlDatasource> {
|
|
7
7
|
private constructor();
|
|
8
8
|
static create(project: SubqueryProject, nodeConfig: NodeConfig, dictionaryUrl: string): Promise<StarknetDictionaryV1>;
|
|
9
|
-
private static getEvmChainId;
|
|
10
9
|
buildDictionaryQueryEntries(dataSources: (StarknetProjectDs | StarknetProjectDsTemplate)[]): DictionaryV1QueryEntry[];
|
|
11
10
|
}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors
|
|
3
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
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
5
|
exports.StarknetDictionaryV1 = void 0;
|
|
9
6
|
exports.buildDictionaryV1QueryEntries = buildDictionaryV1QueryEntries;
|
|
10
|
-
const common_starknet_1 = require("@subql/common-starknet");
|
|
11
7
|
const node_core_1 = require("@subql/node-core");
|
|
12
8
|
const types_starknet_1 = require("@subql/types-starknet");
|
|
13
|
-
const json5_1 = __importDefault(require("json5"));
|
|
14
9
|
const lodash_1 = require("lodash");
|
|
15
|
-
const
|
|
10
|
+
const starknet_1 = require("starknet");
|
|
16
11
|
const utils_starknet_1 = require("../../../starknet/utils.starknet");
|
|
17
12
|
const yargs_1 = require("../../../yargs");
|
|
18
13
|
const utils_1 = require("../utils");
|
|
19
|
-
const CHAIN_ALIASES_URL = 'https://raw.githubusercontent.com/subquery/templates/main/chainAliases.json5';
|
|
20
14
|
const logger = (0, node_core_1.getLogger)('dictionary-v1');
|
|
21
15
|
// Adds the addresses to the query conditions if valid
|
|
22
16
|
function applyAddresses(conditions, addresses) {
|
|
@@ -48,31 +42,19 @@ function applyAddresses(conditions, addresses) {
|
|
|
48
42
|
function eventFilterToQueryEntry(filter, addresses) {
|
|
49
43
|
const conditions = [];
|
|
50
44
|
applyAddresses(conditions, addresses);
|
|
45
|
+
// No null not needed, can use [] instead
|
|
51
46
|
if (filter?.topics) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
field,
|
|
61
|
-
value: false,
|
|
62
|
-
matcher: 'isNull',
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
conditions.push({
|
|
67
|
-
field,
|
|
68
|
-
value: (0, utils_starknet_1.encodeSelectorToHex)(topic),
|
|
69
|
-
matcher: 'equalTo',
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
47
|
+
const hexTopics = filter.topics
|
|
48
|
+
.filter((topic) => topic !== null && topic !== undefined)
|
|
49
|
+
.map((topic) => (starknet_1.num.isHex(topic) ? topic : (0, utils_starknet_1.encodeSelectorToHex)(topic)));
|
|
50
|
+
conditions.push({
|
|
51
|
+
field: 'topics',
|
|
52
|
+
value: hexTopics,
|
|
53
|
+
matcher: 'contains',
|
|
54
|
+
});
|
|
73
55
|
}
|
|
74
56
|
return {
|
|
75
|
-
entity: '
|
|
57
|
+
entity: 'logs',
|
|
76
58
|
conditions,
|
|
77
59
|
};
|
|
78
60
|
}
|
|
@@ -86,7 +68,7 @@ function callFilterToQueryEntry(filter, addresses) {
|
|
|
86
68
|
}
|
|
87
69
|
if (!filter) {
|
|
88
70
|
return {
|
|
89
|
-
entity: '
|
|
71
|
+
entity: 'calls',
|
|
90
72
|
conditions,
|
|
91
73
|
};
|
|
92
74
|
}
|
|
@@ -97,6 +79,13 @@ function callFilterToQueryEntry(filter, addresses) {
|
|
|
97
79
|
matcher: 'equalTo',
|
|
98
80
|
});
|
|
99
81
|
}
|
|
82
|
+
if (filter.type) {
|
|
83
|
+
conditions.push({
|
|
84
|
+
field: 'type',
|
|
85
|
+
value: filter.type,
|
|
86
|
+
matcher: 'equalTo',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
100
89
|
const optionsAddresses = conditions.find((c) => c.field === 'to');
|
|
101
90
|
if (!optionsAddresses) {
|
|
102
91
|
if (filter.to) {
|
|
@@ -127,12 +116,14 @@ function callFilterToQueryEntry(filter, addresses) {
|
|
|
127
116
|
else if (filter.function) {
|
|
128
117
|
conditions.push({
|
|
129
118
|
field: 'func',
|
|
130
|
-
value: filter.function
|
|
119
|
+
value: starknet_1.num.isHex(filter.function)
|
|
120
|
+
? filter.function
|
|
121
|
+
: (0, utils_starknet_1.encodeSelectorToHex)(filter.function),
|
|
131
122
|
matcher: 'equalTo',
|
|
132
123
|
});
|
|
133
124
|
}
|
|
134
125
|
return {
|
|
135
|
-
entity: '
|
|
126
|
+
entity: 'calls',
|
|
136
127
|
conditions,
|
|
137
128
|
};
|
|
138
129
|
}
|
|
@@ -173,26 +164,14 @@ function buildDictionaryV1QueryEntries(dataSources) {
|
|
|
173
164
|
return (0, lodash_1.uniqBy)(queryEntries, (item) => `${item.entity}|${JSON.stringify((0, lodash_1.sortBy)(item.conditions, (c) => c.field))}`);
|
|
174
165
|
}
|
|
175
166
|
class StarknetDictionaryV1 extends node_core_1.DictionaryV1 {
|
|
176
|
-
constructor(project, nodeConfig, dictionaryUrl
|
|
177
|
-
super(dictionaryUrl,
|
|
167
|
+
constructor(project, nodeConfig, dictionaryUrl) {
|
|
168
|
+
super(dictionaryUrl, project.network.chainId, nodeConfig);
|
|
178
169
|
}
|
|
179
170
|
static async create(project, nodeConfig, dictionaryUrl) {
|
|
180
|
-
|
|
181
|
-
* we maintain a list of aliases so we can map the evmChainId to the genesis hash of the other SDKs
|
|
182
|
-
* e.g moonbeam is built with Substrate SDK but can be used as an EVM dictionary
|
|
183
|
-
*/
|
|
184
|
-
const chainAliases = await this.getEvmChainId();
|
|
185
|
-
const chainAlias = chainAliases[project.network.chainId];
|
|
186
|
-
const dictionary = new StarknetDictionaryV1(project, nodeConfig, dictionaryUrl, chainAlias);
|
|
171
|
+
const dictionary = new StarknetDictionaryV1(project, nodeConfig, dictionaryUrl);
|
|
187
172
|
await dictionary.init();
|
|
188
173
|
return dictionary;
|
|
189
174
|
}
|
|
190
|
-
static async getEvmChainId() {
|
|
191
|
-
const response = await (0, node_fetch_1.default)(CHAIN_ALIASES_URL);
|
|
192
|
-
const raw = await response.text();
|
|
193
|
-
// We use JSON5 here because the file has comments in it
|
|
194
|
-
return json5_1.default.parse(raw);
|
|
195
|
-
}
|
|
196
175
|
buildDictionaryQueryEntries(
|
|
197
176
|
// Add name to datasource as templates have this set
|
|
198
177
|
dataSources) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"starknetDictionaryV1.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/starknetDictionaryV1.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 { NOT_NULL_FILTER } from '@subql/common-starknet';\nimport { NodeConfig, DictionaryV1, getLogger } from '@subql/node-core';\nimport {\n DictionaryQueryCondition,\n DictionaryQueryEntry as DictionaryV1QueryEntry,\n} from '@subql/types-core';\nimport {\n StarknetHandlerKind,\n StarknetLogFilter,\n StarknetTransactionFilter,\n SubqlDatasource,\n} from '@subql/types-starknet';\nimport JSON5 from 'json5';\nimport { sortBy, uniqBy } from 'lodash';\nimport fetch from 'node-fetch';\nimport {\n StarknetProjectDs,\n StarknetProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { encodeSelectorToHex } from '../../../starknet/utils.starknet';\nimport { yargsOptions } from '../../../yargs';\nimport { groupedDataSources, validAddresses } from '../utils';\n\nconst CHAIN_ALIASES_URL =\n 'https://raw.githubusercontent.com/subquery/templates/main/chainAliases.json5';\n\nconst logger = getLogger('dictionary-v1');\n\n// Adds the addresses to the query conditions if valid\nfunction applyAddresses(\n conditions: DictionaryQueryCondition[],\n addresses?: (string | undefined | null)[],\n): void {\n // Don't do anything if theres something that requires no filters\n const queryAddressLimit = yargsOptions.argv['query-address-limit'];\n if (\n !addresses ||\n !addresses.length ||\n addresses.length > queryAddressLimit ||\n addresses.filter((v) => !v).length // DONT use find because 'undefined' and 'null' as falsey\n ) {\n return;\n }\n\n const filterAddresses = validAddresses(addresses).map((a) => a.toLowerCase());\n\n if (addresses.length === 1) {\n conditions.push({\n field: 'address',\n value: filterAddresses[0],\n matcher: 'equalTo',\n });\n } else {\n conditions.push({\n field: 'address',\n value: filterAddresses,\n matcher: 'in',\n });\n }\n}\n\nfunction eventFilterToQueryEntry(\n filter?: StarknetLogFilter,\n addresses?: (string | undefined | null)[],\n): DictionaryV1QueryEntry {\n const conditions: DictionaryQueryCondition[] = [];\n applyAddresses(conditions, addresses);\n if (filter?.topics) {\n for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {\n const topic = filter.topics[i];\n if (!topic) {\n continue;\n }\n const field = `topics${i}`;\n\n if (topic === NOT_NULL_FILTER) {\n conditions.push({\n field,\n value: false,\n matcher: 'isNull',\n });\n } else {\n conditions.push({\n field,\n value: encodeSelectorToHex(topic),\n matcher: 'equalTo',\n });\n }\n }\n }\n return {\n entity: 'evmLogs',\n conditions,\n };\n}\n\nfunction callFilterToQueryEntry(\n filter?: StarknetTransactionFilter,\n addresses?: (string | undefined | null)[],\n): DictionaryV1QueryEntry {\n const conditions: DictionaryQueryCondition[] = [];\n applyAddresses(conditions, addresses);\n\n for (const condition of conditions) {\n if (condition.field === 'address') {\n condition.field = 'to';\n }\n }\n\n if (!filter) {\n return {\n entity: 'evmTransactions',\n conditions,\n };\n }\n\n if (filter.from) {\n conditions.push({\n field: 'from',\n value: filter.from.toLowerCase(),\n matcher: 'equalTo',\n });\n }\n const optionsAddresses = conditions.find((c) => c.field === 'to');\n if (!optionsAddresses) {\n if (filter.to) {\n conditions.push({\n field: 'to',\n value: filter.to.toLowerCase(),\n matcher: 'equalTo',\n });\n } else if (filter.to === null) {\n conditions.push({\n field: 'to',\n value: true as any, // TODO update types to allow boolean\n matcher: 'isNull',\n });\n }\n } else if (optionsAddresses && (filter.to || filter.to === null)) {\n logger.warn(\n `TransactionFilter 'to' conflict with 'address' in data source options`,\n );\n }\n\n if (filter.function === null || filter.function === '0x') {\n conditions.push({\n field: 'func',\n value: true,\n matcher: 'isNull',\n });\n } else if (filter.function) {\n conditions.push({\n field: 'func',\n value: filter.function,\n matcher: 'equalTo',\n });\n }\n return {\n entity: 'evmTransactions',\n conditions,\n };\n}\n\n// eslint-disable-next-line complexity\nexport function buildDictionaryV1QueryEntries(\n dataSources: SubqlDatasource[],\n): DictionaryV1QueryEntry[] {\n const queryEntries: DictionaryV1QueryEntry[] = [];\n\n const groupedHandlers = groupedDataSources(dataSources);\n for (const [handler, addresses] of groupedHandlers) {\n // No filters, cant use dictionary\n if (!handler.filter && !addresses?.length) return [];\n\n switch (handler.kind) {\n case StarknetHandlerKind.Block:\n if (handler.filter?.modulo === undefined) {\n return [];\n }\n break;\n case StarknetHandlerKind.Call: {\n if (\n (!handler.filter ||\n !Object.values(handler.filter).filter((v) => v !== undefined)\n .length) &&\n !validAddresses(addresses).length\n ) {\n return [];\n }\n queryEntries.push(callFilterToQueryEntry(handler.filter, addresses));\n break;\n }\n case StarknetHandlerKind.Event:\n if (\n !handler.filter?.topics?.length &&\n !validAddresses(addresses).length\n ) {\n return [];\n }\n queryEntries.push(eventFilterToQueryEntry(handler.filter, addresses));\n break;\n default:\n }\n }\n\n return uniqBy(\n queryEntries,\n (item) =>\n `${item.entity}|${JSON.stringify(\n sortBy(item.conditions, (c) => c.field),\n )}`,\n );\n}\n\nexport class StarknetDictionaryV1 extends DictionaryV1<SubqlDatasource> {\n private constructor(\n project: SubqueryProject,\n nodeConfig: NodeConfig,\n dictionaryUrl: string,\n chainId?: string,\n ) {\n super(dictionaryUrl, chainId ?? project.network.chainId, nodeConfig);\n }\n\n static async create(\n project: SubqueryProject,\n nodeConfig: NodeConfig,\n dictionaryUrl: string,\n ): Promise<StarknetDictionaryV1> {\n /*Some dictionarys for EVM are built with other SDKs as they are chains with an EVM runtime\n * we maintain a list of aliases so we can map the evmChainId to the genesis hash of the other SDKs\n * e.g moonbeam is built with Substrate SDK but can be used as an EVM dictionary\n */\n const chainAliases = await this.getEvmChainId();\n const chainAlias = chainAliases[project.network.chainId];\n\n const dictionary = new StarknetDictionaryV1(\n project,\n nodeConfig,\n dictionaryUrl,\n chainAlias,\n );\n await dictionary.init();\n return dictionary;\n }\n\n private static async getEvmChainId(): Promise<Record<string, string>> {\n const response = await fetch(CHAIN_ALIASES_URL);\n\n const raw = await response.text();\n // We use JSON5 here because the file has comments in it\n return JSON5.parse(raw);\n }\n\n buildDictionaryQueryEntries(\n // Add name to datasource as templates have this set\n dataSources: (StarknetProjectDs | StarknetProjectDsTemplate)[],\n ): DictionaryV1QueryEntry[] {\n return buildDictionaryV1QueryEntries(dataSources);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"starknetDictionaryV1.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v1/starknetDictionaryV1.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 { NodeConfig, DictionaryV1, getLogger } from '@subql/node-core';\nimport {\n DictionaryQueryCondition,\n DictionaryQueryEntry as DictionaryV1QueryEntry,\n} from '@subql/types-core';\nimport {\n StarknetHandlerKind,\n StarknetLogFilter,\n StarknetTransactionFilter,\n SubqlDatasource,\n} from '@subql/types-starknet';\nimport { sortBy, uniqBy } from 'lodash';\nimport { num } from 'starknet';\nimport {\n StarknetProjectDs,\n StarknetProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { encodeSelectorToHex, hexEq } from '../../../starknet/utils.starknet';\nimport { yargsOptions } from '../../../yargs';\nimport { groupedDataSources, validAddresses } from '../utils';\nconst logger = getLogger('dictionary-v1');\n\n// Adds the addresses to the query conditions if valid\nfunction applyAddresses(\n conditions: DictionaryQueryCondition[],\n addresses?: (string | undefined | null)[],\n): void {\n // Don't do anything if theres something that requires no filters\n const queryAddressLimit = yargsOptions.argv['query-address-limit'];\n if (\n !addresses ||\n !addresses.length ||\n addresses.length > queryAddressLimit ||\n addresses.filter((v) => !v).length // DONT use find because 'undefined' and 'null' as falsey\n ) {\n return;\n }\n\n const filterAddresses = validAddresses(addresses).map((a) => a.toLowerCase());\n\n if (addresses.length === 1) {\n conditions.push({\n field: 'address',\n value: filterAddresses[0],\n matcher: 'equalTo',\n });\n } else {\n conditions.push({\n field: 'address',\n value: filterAddresses,\n matcher: 'in',\n });\n }\n}\n\nfunction eventFilterToQueryEntry(\n filter?: StarknetLogFilter,\n addresses?: (string | undefined | null)[],\n): DictionaryV1QueryEntry {\n const conditions: DictionaryQueryCondition[] = [];\n applyAddresses(conditions, addresses);\n // No null not needed, can use [] instead\n if (filter?.topics) {\n const hexTopics: string[] = filter.topics\n .filter((topic) => topic !== null && topic !== undefined)\n .map((topic) => (num.isHex(topic) ? topic : encodeSelectorToHex(topic)));\n conditions.push({\n field: 'topics',\n value: hexTopics,\n matcher: 'contains',\n });\n }\n return {\n entity: 'logs',\n conditions,\n };\n}\n\nfunction callFilterToQueryEntry(\n filter?: StarknetTransactionFilter,\n addresses?: (string | undefined | null)[],\n): DictionaryV1QueryEntry {\n const conditions: DictionaryQueryCondition[] = [];\n applyAddresses(conditions, addresses);\n\n for (const condition of conditions) {\n if (condition.field === 'address') {\n condition.field = 'to';\n }\n }\n if (!filter) {\n return {\n entity: 'calls',\n conditions,\n };\n }\n if (filter.from) {\n conditions.push({\n field: 'from',\n value: filter.from.toLowerCase(),\n matcher: 'equalTo',\n });\n }\n if (filter.type) {\n conditions.push({\n field: 'type',\n value: filter.type,\n matcher: 'equalTo',\n });\n }\n\n const optionsAddresses = conditions.find((c) => c.field === 'to');\n if (!optionsAddresses) {\n if (filter.to) {\n conditions.push({\n field: 'to',\n value: filter.to.toLowerCase(),\n matcher: 'equalTo',\n });\n } else if (filter.to === null) {\n conditions.push({\n field: 'to',\n value: true as any, // TODO update types to allow boolean\n matcher: 'isNull',\n });\n }\n } else if (optionsAddresses && (filter.to || filter.to === null)) {\n logger.warn(\n `TransactionFilter 'to' conflict with 'address' in data source options`,\n );\n }\n if (filter.function === null || filter.function === '0x') {\n conditions.push({\n field: 'func',\n value: true,\n matcher: 'isNull',\n });\n } else if (filter.function) {\n conditions.push({\n field: 'func',\n value: num.isHex(filter.function)\n ? filter.function\n : encodeSelectorToHex(filter.function),\n matcher: 'equalTo',\n });\n }\n return {\n entity: 'calls',\n conditions,\n };\n}\n\n// eslint-disable-next-line complexity\nexport function buildDictionaryV1QueryEntries(\n dataSources: SubqlDatasource[],\n): DictionaryV1QueryEntry[] {\n const queryEntries: DictionaryV1QueryEntry[] = [];\n\n const groupedHandlers = groupedDataSources(dataSources);\n for (const [handler, addresses] of groupedHandlers) {\n // No filters, cant use dictionary\n if (!handler.filter && !addresses?.length) return [];\n\n switch (handler.kind) {\n case StarknetHandlerKind.Block:\n if (handler.filter?.modulo === undefined) {\n return [];\n }\n break;\n case StarknetHandlerKind.Call: {\n if (\n (!handler.filter ||\n !Object.values(handler.filter).filter((v) => v !== undefined)\n .length) &&\n !validAddresses(addresses).length\n ) {\n return [];\n }\n queryEntries.push(callFilterToQueryEntry(handler.filter, addresses));\n break;\n }\n case StarknetHandlerKind.Event:\n if (\n !handler.filter?.topics?.length &&\n !validAddresses(addresses).length\n ) {\n return [];\n }\n queryEntries.push(eventFilterToQueryEntry(handler.filter, addresses));\n break;\n default:\n }\n }\n\n return uniqBy(\n queryEntries,\n (item) =>\n `${item.entity}|${JSON.stringify(\n sortBy(item.conditions, (c) => c.field),\n )}`,\n );\n}\n\nexport class StarknetDictionaryV1 extends DictionaryV1<SubqlDatasource> {\n private constructor(\n project: SubqueryProject,\n nodeConfig: NodeConfig,\n dictionaryUrl: string,\n ) {\n super(dictionaryUrl, project.network.chainId, nodeConfig);\n }\n\n static async create(\n project: SubqueryProject,\n nodeConfig: NodeConfig,\n dictionaryUrl: string,\n ): Promise<StarknetDictionaryV1> {\n const dictionary = new StarknetDictionaryV1(\n project,\n nodeConfig,\n dictionaryUrl,\n );\n await dictionary.init();\n return dictionary;\n }\n\n buildDictionaryQueryEntries(\n // Add name to datasource as templates have this set\n dataSources: (StarknetProjectDs | StarknetProjectDsTemplate)[],\n ): DictionaryV1QueryEntry[] {\n return buildDictionaryV1QueryEntries(dataSources);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2024 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
|
+
{
|
|
128
|
+
conditions: [
|
|
129
|
+
{
|
|
130
|
+
field: 'type',
|
|
131
|
+
matcher: 'equalTo',
|
|
132
|
+
value: 'L1_HANDLER',
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
entity: 'calls',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
]);
|
|
139
|
+
});
|
|
140
|
+
it('Build a filter with include ds option and contract address', () => {
|
|
141
|
+
const ds = {
|
|
142
|
+
kind: types_starknet_1.StarknetDatasourceKind.Runtime,
|
|
143
|
+
assets: new Map(),
|
|
144
|
+
options: {
|
|
145
|
+
// Must be a key of assets
|
|
146
|
+
abi: 'zkLend',
|
|
147
|
+
// # this is the contract address for zkLend market https://starkscan.co/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05
|
|
148
|
+
address: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
|
|
149
|
+
},
|
|
150
|
+
mapping: {
|
|
151
|
+
file: '',
|
|
152
|
+
handlers: [
|
|
153
|
+
{
|
|
154
|
+
kind: types_starknet_1.StarknetHandlerKind.Call,
|
|
155
|
+
handler: 'handleTransaction',
|
|
156
|
+
filter: {
|
|
157
|
+
to: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
|
|
158
|
+
// type: "INVOKE",
|
|
159
|
+
/**
|
|
160
|
+
* The function can either be the function fragment or signature
|
|
161
|
+
* function: 'withdraw'
|
|
162
|
+
* function: '0x015511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77'
|
|
163
|
+
*/
|
|
164
|
+
function: 'withdraw',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
const result = (0, starknetDictionaryV1_1.buildDictionaryV1QueryEntries)([ds]);
|
|
171
|
+
expect(result).toEqual([
|
|
172
|
+
{
|
|
173
|
+
conditions: [
|
|
174
|
+
{
|
|
175
|
+
field: 'to',
|
|
176
|
+
matcher: 'equalTo',
|
|
177
|
+
value: '0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
field: 'func',
|
|
181
|
+
matcher: 'equalTo',
|
|
182
|
+
value: '0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77',
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
entity: 'calls',
|
|
186
|
+
},
|
|
187
|
+
]);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=starknetDictionaryV1.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 {\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"]}
|
|
@@ -7,6 +7,30 @@ export declare function calcInterval(api: ApiWrapper): number;
|
|
|
7
7
|
export declare function formatBlock(block: any): StarknetBlock;
|
|
8
8
|
export declare function formatBlockUtil<B extends StarknetBlock | LightStarknetBlock = StarknetBlock>(block: B): IBlock<B>;
|
|
9
9
|
export declare function formatLog(log: StarknetLogRaw, block: StarknetBlock): StarknetLog;
|
|
10
|
+
/***
|
|
11
|
+
* @param tx
|
|
12
|
+
* @param block
|
|
13
|
+
* @param txIndex
|
|
14
|
+
* Explanation for from, to, selector, calldata with different tx type
|
|
15
|
+
* When apply filter please refer to the following:
|
|
16
|
+
*
|
|
17
|
+
* 1. L1_HANDLER
|
|
18
|
+
* from is the Contract Address (contract been called)
|
|
19
|
+
* entryPointSelector (method)
|
|
20
|
+
* within decodedCalls, to is same as from, selector is the entryPointSelector
|
|
21
|
+
* 2. DEPLOY_ACCOUNT
|
|
22
|
+
* from is the contract_address, also is the new account address
|
|
23
|
+
* 3. DECLARE
|
|
24
|
+
* from is the sender_address
|
|
25
|
+
* 4. DEPLOY
|
|
26
|
+
* from is the sender_address
|
|
27
|
+
* 5. INVOKE V1 and V3
|
|
28
|
+
* from is the sender_address
|
|
29
|
+
* within decodedCalls, to is the contract been called, selector is the method
|
|
30
|
+
* 6. INVOKE V0
|
|
31
|
+
* from is the Contract Address (contract been called)
|
|
32
|
+
* entryPointSelector is the method been called
|
|
33
|
+
*/
|
|
10
34
|
export declare function formatTransaction(tx: Record<string, any>, block: StarknetBlock, txIndex: number): Omit<StarknetTransaction, 'receipt'>;
|
|
11
35
|
export declare function getTxContractAddress(tx: Record<string, any>): string;
|
|
12
36
|
export declare function formatReceipt(receipt: Record<string, any>): TransactionReceipt;
|
|
@@ -66,6 +66,30 @@ function formatLog(log, block) {
|
|
|
66
66
|
});
|
|
67
67
|
return formattedLog;
|
|
68
68
|
}
|
|
69
|
+
/***
|
|
70
|
+
* @param tx
|
|
71
|
+
* @param block
|
|
72
|
+
* @param txIndex
|
|
73
|
+
* Explanation for from, to, selector, calldata with different tx type
|
|
74
|
+
* When apply filter please refer to the following:
|
|
75
|
+
*
|
|
76
|
+
* 1. L1_HANDLER
|
|
77
|
+
* from is the Contract Address (contract been called)
|
|
78
|
+
* entryPointSelector (method)
|
|
79
|
+
* within decodedCalls, to is same as from, selector is the entryPointSelector
|
|
80
|
+
* 2. DEPLOY_ACCOUNT
|
|
81
|
+
* from is the contract_address, also is the new account address
|
|
82
|
+
* 3. DECLARE
|
|
83
|
+
* from is the sender_address
|
|
84
|
+
* 4. DEPLOY
|
|
85
|
+
* from is the sender_address
|
|
86
|
+
* 5. INVOKE V1 and V3
|
|
87
|
+
* from is the sender_address
|
|
88
|
+
* within decodedCalls, to is the contract been called, selector is the method
|
|
89
|
+
* 6. INVOKE V0
|
|
90
|
+
* from is the Contract Address (contract been called)
|
|
91
|
+
* entryPointSelector is the method been called
|
|
92
|
+
*/
|
|
69
93
|
function formatTransaction(tx, block, txIndex) {
|
|
70
94
|
const transaction = {
|
|
71
95
|
...tx,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.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 { 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 StarknetResult,\n StarknetTransaction,\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(block: any): StarknetBlock {\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 } as StarknetBlock;\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 block: StarknetBlock,\n): StarknetLog {\n const formattedLog = {\n block,\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: log.transaction_hash,\n data: log.data,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n\n // Define this afterwards as the spread on `...log` breaks defining a getter\n Object.defineProperty(formattedLog, 'transaction', {\n get: () => {\n const rawTransaction = block.transactions?.find(\n (tx) => tx.hash === log.transaction_hash,\n );\n\n return rawTransaction;\n },\n });\n return formattedLog as unknown as StarknetLog;\n}\n\nexport function formatTransaction(\n tx: Record<string, any>,\n block: StarknetBlock,\n txIndex: number,\n): Omit<StarknetTransaction, 'receipt'> {\n const transaction = {\n ...tx,\n hash: tx.transaction_hash,\n type: tx.type,\n version: tx.version,\n nonce: tx.nonce,\n maxFee: tx.max_fee,\n from: getTxContractAddress(tx),\n calldata: tx.calldata,\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: tx.entry_point_selector,\n contractAddress: tx.contract_address,\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' || '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 } as Omit<StarknetTransaction, 'receipt'>;\n return transaction;\n}\n\nexport function getTxContractAddress(tx: Record<string, any>): 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 tx.contract_address ?? tx.sender_address;\n}\n\nexport function formatReceipt(\n receipt: Record<string, any>,\n): 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 };\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): StarknetLogRaw {\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"]}
|
|
1
|
+
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.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 { 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} 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(block: any): StarknetBlock {\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 } as StarknetBlock;\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 block: StarknetBlock,\n): StarknetLog {\n const formattedLog = {\n block,\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: log.transaction_hash,\n data: log.data,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n\n // Define this afterwards as the spread on `...log` breaks defining a getter\n Object.defineProperty(formattedLog, 'transaction', {\n get: () => {\n const rawTransaction = block.transactions?.find(\n (tx) => tx.hash === log.transaction_hash,\n );\n\n return rawTransaction;\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: Record<string, any>,\n block: StarknetBlock,\n txIndex: number,\n): Omit<StarknetTransaction, 'receipt'> {\n const transaction = {\n ...tx,\n hash: tx.transaction_hash,\n type: tx.type,\n version: tx.version,\n nonce: tx.nonce,\n maxFee: tx.max_fee,\n from: getTxContractAddress(tx),\n calldata: tx.calldata,\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: tx.entry_point_selector,\n contractAddress: tx.contract_address,\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' || '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 } as Omit<StarknetTransaction, 'receipt'>;\n return transaction;\n}\n\nexport function getTxContractAddress(tx: Record<string, any>): 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 tx.contract_address ?? tx.sender_address;\n}\n\nexport function formatReceipt(\n receipt: Record<string, any>,\n): 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 };\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): StarknetLogRaw {\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subql/node-starknet",
|
|
3
|
-
"version": "0.0.2-
|
|
3
|
+
"version": "0.0.2-8",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Jay Ji",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"/dist",
|
|
61
61
|
"/bin"
|
|
62
62
|
],
|
|
63
|
-
"stableVersion": "0.0.2-
|
|
63
|
+
"stableVersion": "0.0.2-7"
|
|
64
64
|
}
|