@apibara/indexer 0.4.1 → 2.0.0-beta.3

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 (112) hide show
  1. package/README.md +2 -9
  2. package/package.json +66 -45
  3. package/src/context.ts +19 -0
  4. package/src/hooks/index.ts +2 -0
  5. package/src/hooks/useKVStore.ts +12 -0
  6. package/src/hooks/useSink.ts +13 -0
  7. package/src/index.ts +7 -1
  8. package/src/indexer.test.ts +491 -0
  9. package/src/indexer.ts +322 -0
  10. package/src/otel.ts +3 -0
  11. package/src/plugins/config.ts +11 -0
  12. package/src/plugins/kv.test.ts +120 -0
  13. package/src/plugins/kv.ts +132 -0
  14. package/src/plugins/persistence.test.ts +151 -0
  15. package/src/plugins/persistence.ts +202 -0
  16. package/src/sink.ts +36 -0
  17. package/src/sinks/csv.test.ts +65 -0
  18. package/src/sinks/csv.ts +159 -0
  19. package/src/sinks/drizzle/Int8Range.ts +52 -0
  20. package/src/sinks/drizzle/delete.ts +42 -0
  21. package/src/sinks/drizzle/drizzle.test.ts +239 -0
  22. package/src/sinks/drizzle/drizzle.ts +115 -0
  23. package/src/sinks/drizzle/index.ts +6 -0
  24. package/src/sinks/drizzle/insert.ts +39 -0
  25. package/src/sinks/drizzle/select.ts +44 -0
  26. package/src/sinks/drizzle/transaction.ts +49 -0
  27. package/src/sinks/drizzle/update.ts +47 -0
  28. package/src/sinks/drizzle/utils.ts +36 -0
  29. package/src/sinks/sqlite.test.ts +99 -0
  30. package/src/sinks/sqlite.ts +170 -0
  31. package/src/testing/helper.ts +13 -0
  32. package/src/testing/index.ts +3 -0
  33. package/src/testing/indexer.ts +35 -0
  34. package/src/testing/setup.ts +59 -0
  35. package/src/testing/vcr.ts +54 -0
  36. package/src/vcr/config.ts +11 -0
  37. package/src/vcr/helper.ts +27 -0
  38. package/src/vcr/index.ts +4 -0
  39. package/src/vcr/record.ts +45 -0
  40. package/src/vcr/replay.ts +51 -0
  41. package/LICENSE.txt +0 -202
  42. package/dist/config.d.ts +0 -35
  43. package/dist/config.js +0 -2
  44. package/dist/config.js.map +0 -1
  45. package/dist/config.test-d.d.ts +0 -1
  46. package/dist/config.test-d.js +0 -38
  47. package/dist/config.test-d.js.map +0 -1
  48. package/dist/index.js +0 -2
  49. package/dist/index.js.map +0 -1
  50. package/dist/sink/console.d.ts +0 -10
  51. package/dist/sink/console.js +0 -2
  52. package/dist/sink/console.js.map +0 -1
  53. package/dist/sink/console.test-d.d.ts +0 -1
  54. package/dist/sink/console.test-d.js +0 -12
  55. package/dist/sink/console.test-d.js.map +0 -1
  56. package/dist/sink/mongo.d.ts +0 -14
  57. package/dist/sink/mongo.js +0 -2
  58. package/dist/sink/mongo.js.map +0 -1
  59. package/dist/sink/parquet.d.ts +0 -9
  60. package/dist/sink/parquet.js +0 -2
  61. package/dist/sink/parquet.js.map +0 -1
  62. package/dist/sink/postgres.d.ts +0 -10
  63. package/dist/sink/postgres.js +0 -2
  64. package/dist/sink/postgres.js.map +0 -1
  65. package/dist/sink/webhook.d.ts +0 -12
  66. package/dist/sink/webhook.js +0 -2
  67. package/dist/sink/webhook.js.map +0 -1
  68. package/dist/starknet/block.d.ts +0 -409
  69. package/dist/starknet/block.js +0 -2
  70. package/dist/starknet/block.js.map +0 -1
  71. package/dist/starknet/block.test-d.d.ts +0 -1
  72. package/dist/starknet/block.test-d.js +0 -95
  73. package/dist/starknet/block.test-d.js.map +0 -1
  74. package/dist/starknet/felt.d.ts +0 -11
  75. package/dist/starknet/felt.js +0 -25
  76. package/dist/starknet/felt.js.map +0 -1
  77. package/dist/starknet/felt.test.d.ts +0 -1
  78. package/dist/starknet/felt.test.js +0 -16
  79. package/dist/starknet/felt.test.js.map +0 -1
  80. package/dist/starknet/filter.d.ts +0 -175
  81. package/dist/starknet/filter.js +0 -2
  82. package/dist/starknet/filter.js.map +0 -1
  83. package/dist/starknet/filter.test-d.d.ts +0 -1
  84. package/dist/starknet/filter.test-d.js +0 -166
  85. package/dist/starknet/filter.test-d.js.map +0 -1
  86. package/dist/starknet/index.d.ts +0 -10
  87. package/dist/starknet/index.js +0 -5
  88. package/dist/starknet/index.js.map +0 -1
  89. package/dist/starknet/parser.d.ts +0 -16
  90. package/dist/starknet/parser.js +0 -49
  91. package/dist/starknet/parser.js.map +0 -1
  92. package/dist/starknet/parser.test.d.ts +0 -1
  93. package/dist/starknet/parser.test.js +0 -50
  94. package/dist/starknet/parser.test.js.map +0 -1
  95. package/src/config.test-d.ts +0 -55
  96. package/src/config.ts +0 -47
  97. package/src/sink/console.test-d.ts +0 -14
  98. package/src/sink/console.ts +0 -11
  99. package/src/sink/mongo.ts +0 -14
  100. package/src/sink/parquet.ts +0 -9
  101. package/src/sink/postgres.ts +0 -10
  102. package/src/sink/webhook.ts +0 -12
  103. package/src/starknet/block.test-d.ts +0 -112
  104. package/src/starknet/block.ts +0 -469
  105. package/src/starknet/felt.test.ts +0 -25
  106. package/src/starknet/felt.ts +0 -30
  107. package/src/starknet/filter.test-d.ts +0 -197
  108. package/src/starknet/filter.ts +0 -205
  109. package/src/starknet/index.ts +0 -12
  110. package/src/starknet/parser.test.ts +0 -67
  111. package/src/starknet/parser.ts +0 -69
  112. /package/{dist/index.d.ts → src/plugins/index.ts} +0 -0
@@ -1,205 +0,0 @@
1
- import type { FieldElement } from "./felt";
2
-
3
- export type Filter = {
4
- /** Header information. */
5
- header?: HeaderFilter;
6
- /** Include transactions. */
7
- transactions?: TransactionFilter[];
8
- /** Include events. */
9
- events?: EventFilter[];
10
- /** Include messages from L2 to L1. */
11
- messages?: L2ToL1MessageFilter[];
12
- /** Include state updates. */
13
- stateUpdate?: StateUpdateFilter;
14
- };
15
-
16
- export type HeaderFilter = {
17
- /* If true, only include headers if any other filter matches. */
18
- weak?: boolean;
19
- };
20
-
21
- export type TransactionFilterCommon = {
22
- /*** Include reverted transactions. */
23
- includeReverted?: boolean;
24
- };
25
-
26
- // TODO: add a `OneOf<T1, T2, T3, ..>` to enforce this pattern.
27
-
28
- export type InvokeTransactionV0Filter = {
29
- invokeV0?: {
30
- /** Filter by contract address. */
31
- contractAddress?: FieldElement;
32
- /** Filter by function selector. */
33
- entryPointSelector?: FieldElement;
34
- /** Filter by function arguments. */
35
- calldata?: FieldElement[];
36
- };
37
- invokeV1?: never;
38
- deploy?: never;
39
- declare?: never;
40
- l1Handler?: never;
41
- deployAccount?: never;
42
- };
43
-
44
- export type InvokeTransactionV1Filter = {
45
- invokeV1?: {
46
- /** Filter by sender address. */
47
- senderAddress?: FieldElement;
48
- /** Filter by function arguments. */
49
- calldata?: FieldElement[];
50
- };
51
- invokeV0?: never;
52
- deploy?: never;
53
- declare?: never;
54
- l1Handler?: never;
55
- deployAccount?: never;
56
- };
57
-
58
- export type DeployTransactionFilter = {
59
- deploy?: {
60
- /** Filter by contract address salt. */
61
- contractAddressSalt?: FieldElement;
62
- /** Filter by class hash. */
63
- classHash?: FieldElement;
64
- /** Filter by constructor arguments. */
65
- constructorCalldata?: FieldElement[];
66
- };
67
- invokeV0?: never;
68
- invokeV1?: never;
69
- declare?: never;
70
- l1Handler?: never;
71
- deployAccount?: never;
72
- };
73
-
74
- export type DeclareTransactionFilter = {
75
- declare?: {
76
- /** Filter by class hash. */
77
- classHash?: FieldElement;
78
- /** Filter by sender address. */
79
- senderAddress?: FieldElement;
80
- };
81
- invokeV0?: never;
82
- invokeV1?: never;
83
- deploy?: never;
84
- l1Handler?: never;
85
- deployAccount?: never;
86
- };
87
-
88
- export type L1HandlerTransactionFilter = {
89
- l1Handler?: {
90
- /** Filter by contract address. */
91
- contractAddress?: FieldElement;
92
- /** Filter by function selector. */
93
- entryPointSelector?: FieldElement;
94
- /** Filter by function arguments. */
95
- calldata?: FieldElement[];
96
- };
97
- invokeV0?: never;
98
- invokeV1?: never;
99
- deploy?: never;
100
- declare?: never;
101
- deployAccount?: never;
102
- };
103
-
104
- export type DeployAccountTransactionFilter = {
105
- deployAccount?: {
106
- /** Filter by contract address salt. */
107
- contractAddressSalt?: FieldElement;
108
- /** Filter by class hash. */
109
- classHash?: FieldElement;
110
- /** Filter by constructor arguments. */
111
- constructorCalldata?: FieldElement[];
112
- };
113
- invokeV0?: never;
114
- invokeV1?: never;
115
- deploy?: never;
116
- declare?: never;
117
- l1Handler?: never;
118
- };
119
-
120
- export type TransactionFilter = TransactionFilterCommon &
121
- (
122
- | InvokeTransactionV0Filter
123
- | InvokeTransactionV1Filter
124
- | DeployTransactionFilter
125
- | DeclareTransactionFilter
126
- | L1HandlerTransactionFilter
127
- | DeployAccountTransactionFilter
128
- );
129
-
130
- export type EventFilter = {
131
- /** Filter by contract address. */
132
- fromAddress?: FieldElement;
133
- /** Filter by event keys (selector). */
134
- keys?: FieldElement[];
135
- /** Filter by event data. */
136
- data?: FieldElement[];
137
- /** Include events from reverted transactions. */
138
- includeReverted?: boolean;
139
- /** Include the transaction that emitted the event. Defaults to true. */
140
- includeTransaction?: boolean;
141
- /** Include the receipt of the transaction that emitted the event. Defaults to true. */
142
- includeReceipt?: boolean;
143
- };
144
-
145
- export type L2ToL1MessageFilter = {
146
- /** Filter by destination address. */
147
- toAddress?: FieldElement;
148
- /** Filter by payload. */
149
- payload?: FieldElement[];
150
- /** Include messages from reverted transactions. */
151
- includeReverted?: boolean;
152
- };
153
-
154
- export type StateUpdateFilter = {
155
- /** Filter storage diffs. */
156
- storageDiffs?: StorageDiffFilter[];
157
- /** Filter declared contracts. */
158
- declaredContracts?: DeclaredContractFilter[];
159
- /** Filter deployed contracts. */
160
- deployedContracts?: DeployedContractFilter[];
161
- /** Filter nonce updates. */
162
- nonces?: NonceUpdateFilter[];
163
- /** Filter declared classes. */
164
- declaredClasses?: DeclaredClassFilter[];
165
- /** Filter replaced classes. */
166
- replacedClasses?: ReplacedClassFilter[];
167
- };
168
-
169
- export type StorageDiffFilter = {
170
- /** Filter by contract address. */
171
- contractAddress?: FieldElement;
172
- };
173
-
174
- export type DeclaredContractFilter = {
175
- /** Filter by class hash. */
176
- classHash?: FieldElement;
177
- };
178
-
179
- export type DeployedContractFilter = {
180
- /** Filter by contract address. */
181
- contractAddress?: FieldElement;
182
- /** Filter by class hash. */
183
- classHash?: FieldElement;
184
- };
185
-
186
- export type NonceUpdateFilter = {
187
- /** Filter by contract address. */
188
- contractAddress?: FieldElement;
189
- /** Filter by nonce value. */
190
- nonce?: FieldElement;
191
- };
192
-
193
- export type DeclaredClassFilter = {
194
- /** Filter by class hash. */
195
- classHash?: FieldElement;
196
- /** Filter by compiled class hash. */
197
- compiledClassHash?: FieldElement;
198
- };
199
-
200
- export type ReplacedClassFilter = {
201
- /** Filter by contract address. */
202
- contractAddress?: FieldElement;
203
- /** Filter by class hash. */
204
- classHash?: FieldElement;
205
- };
@@ -1,12 +0,0 @@
1
- export * from "./filter";
2
- export * from "./block";
3
- export { FieldElement, getSelector } from "./felt";
4
- export { Contract } from "./parser";
5
-
6
- import type { Filter } from "./filter";
7
-
8
- /** Starknet network type and data filter. */
9
- export type Starknet = {
10
- network: "starknet";
11
- filter: Filter;
12
- };
@@ -1,67 +0,0 @@
1
- import { Contract } from "./parser";
2
- import { describe, expect, it } from "vitest";
3
- import type { FieldElement } from "./felt";
4
- import { EventAbi } from "starknet";
5
-
6
- describe("Contract", () => {
7
- const mockContractAddress: FieldElement = "0x0";
8
-
9
- const mockContractAbi = [
10
- {
11
- type: "event",
12
- name: "MockEvent",
13
- kind: "struct",
14
- members: [{ name: "param1", type: "felt", kind: "key" }],
15
- },
16
- {
17
- type: "event",
18
- name: "AnotherEvent",
19
- kind: "struct",
20
- members: [{ name: "param1", type: "felt", kind: "key" }],
21
- },
22
- ];
23
-
24
- it("should create an EventFilter for a valid event name", () => {
25
- const contract = new Contract(mockContractAddress, mockContractAbi);
26
- const filter = contract.eventFilter("MockEvent");
27
-
28
- expect(filter).toBeDefined();
29
- expect(filter.fromAddress).toBe(mockContractAddress);
30
- expect(filter.includeReceipt).toBeFalsy();
31
- });
32
-
33
- it("overrides some arguments", () => {
34
- const contract = new Contract(mockContractAddress, mockContractAbi);
35
- const filter = contract.eventFilter("MockEvent", { includeReceipt: true });
36
-
37
- expect(filter).toBeDefined();
38
- expect(filter.includeReceipt).toBeTruthy();
39
- });
40
-
41
- it("can lookup an event name by its selector", () => {
42
- const contract = new Contract(mockContractAddress, mockContractAbi);
43
- const filter = contract.eventFilter("AnotherEvent");
44
- const eventName = contract.lookupEventFromSelector(
45
- filter.keys?.[0] ?? "0x00",
46
- );
47
-
48
- expect(eventName).toEqual("AnotherEvent");
49
- });
50
-
51
- it("returns undefined if no event matches", () => {
52
- const contract = new Contract(mockContractAddress, mockContractAbi);
53
- const eventName = contract.lookupEventFromSelector(
54
- "0x1234567890123456789012345678901234567890123456789012345678901234",
55
- );
56
-
57
- expect(eventName).toBeUndefined();
58
- });
59
-
60
- it("should throw an error for an invalid event name", () => {
61
- const contract = new Contract(mockContractAddress, mockContractAbi);
62
-
63
- expect(() => {
64
- contract.eventFilter("InvalidEvent");
65
- }).toThrow("Event InvalidEvent not found in contract ABI");
66
- });
67
- });
@@ -1,69 +0,0 @@
1
- import type { Abi, EventAbi } from "starknet";
2
-
3
- import { type FieldElement, getSelector } from "./felt";
4
- import type { EventFilter } from "./filter";
5
-
6
- /** Build a stream filter from a contract ABI. */
7
- export class Contract {
8
- // Read-only properties for the contract's address and its ABI.
9
- readonly address: FieldElement;
10
- readonly abi: Abi;
11
-
12
- private selectorToEvent: Record<FieldElement, string>;
13
-
14
- constructor(contractAddress: FieldElement, contractAbi: Abi) {
15
- this.address = contractAddress;
16
- this.abi = contractAbi;
17
- this.selectorToEvent = {};
18
- this._populateSelectorToEvent();
19
- }
20
-
21
- private _findEvent(name: string): EventAbi | undefined {
22
- // Find the event in the ABI matching the provided name.
23
- const event: EventAbi | undefined = this.abi.find(
24
- (item) => item.type === "event" && item.name === name,
25
- );
26
-
27
- return event;
28
- }
29
-
30
- private _populateSelectorToEvent(): void {
31
- this.selectorToEvent = {};
32
- for (const event of this.abi) {
33
- if (event.type !== "event") {
34
- continue;
35
- }
36
- this.selectorToEvent[getSelector(event.name)] = event.name;
37
- }
38
- }
39
-
40
- /** Filter events based on their name from the contract's ABI. */
41
- eventFilter(
42
- name: string,
43
- opts: Pick<
44
- EventFilter,
45
- "includeReceipt" | "includeTransaction" | "includeReverted"
46
- > = {},
47
- ): EventFilter {
48
- const event = this._findEvent(name);
49
-
50
- // Throw an error if the event is not found in the ABI
51
- if (!event) {
52
- throw new Error(`Event ${name} not found in contract ABI`);
53
- }
54
-
55
- // Return the found event.
56
- return {
57
- fromAddress: this.address,
58
- keys: [getSelector(event.name)],
59
- includeTransaction: opts.includeTransaction ?? false,
60
- includeReceipt: opts.includeReceipt ?? false,
61
- includeReverted: opts.includeReverted ?? false,
62
- };
63
- }
64
-
65
- /** Returns the event name based on its selector. */
66
- lookupEventFromSelector(selector: FieldElement): string | undefined {
67
- return this.selectorToEvent[selector];
68
- }
69
- }
File without changes