@subsquid/evm-objects 0.0.2-portal-api.a8e10e

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import { FieldSelection } from '@subsquid/evm-stream';
2
+ import * as base from '@subsquid/evm-stream';
3
+ export type BlockHeader<F extends FieldSelection = {}> = base.BlockHeader<F> & {
4
+ id: string;
5
+ };
6
+ export type Transaction<F extends FieldSelection = {}> = base.Transaction<F> & {
7
+ id: string;
8
+ block: BlockHeader<F>;
9
+ logs: Log<F>[];
10
+ traces: Trace<F>[];
11
+ stateDiffs: StateDiff<F>[];
12
+ };
13
+ export type Log<F extends FieldSelection = {}> = base.Log<F> & {
14
+ id: string;
15
+ block: BlockHeader<F>;
16
+ transaction?: Transaction<F>;
17
+ getTransaction(): Transaction<F>;
18
+ };
19
+ export type TraceCreate<F extends FieldSelection = {}> = base.TraceCreate<F> & {
20
+ id: string;
21
+ block: BlockHeader<F>;
22
+ transaction?: Transaction<F>;
23
+ getTransaction(): Transaction<F>;
24
+ parent?: Trace<F>;
25
+ getParent(): Trace<F>;
26
+ children: Trace<F>[];
27
+ };
28
+ export type TraceCall<F extends FieldSelection = {}> = base.TraceCall<F> & {
29
+ id: string;
30
+ block: BlockHeader<F>;
31
+ transaction?: Transaction<F>;
32
+ getTransaction(): Transaction<F>;
33
+ parent?: Trace<F>;
34
+ getParent(): Trace<F>;
35
+ children: Trace<F>[];
36
+ };
37
+ export type TraceSuicide<F extends FieldSelection = {}> = base.TraceSuicide<F> & {
38
+ id: string;
39
+ block: BlockHeader<F>;
40
+ transaction?: Transaction<F>;
41
+ getTransaction(): Transaction<F>;
42
+ parent?: Trace<F>;
43
+ getParent(): Trace<F>;
44
+ children: Trace<F>[];
45
+ };
46
+ export type TraceReward<F extends FieldSelection = {}> = base.TraceReward<F> & {
47
+ id: string;
48
+ block: BlockHeader<F>;
49
+ transaction?: Transaction<F>;
50
+ getTransaction(): Transaction<F>;
51
+ parent?: Trace<F>;
52
+ getParent(): Trace<F>;
53
+ children: Trace<F>[];
54
+ };
55
+ export type Trace<F extends FieldSelection = {}> = TraceCreate<F> | TraceCall<F> | TraceSuicide<F> | TraceReward<F>;
56
+ export type StateDiff<F extends FieldSelection = {}> = base.StateDiff<F> & {
57
+ block: BlockHeader<F>;
58
+ transaction?: Transaction<F>;
59
+ getTransaction(): Transaction<F>;
60
+ };
61
+ export interface Block<F extends FieldSelection = {}> {
62
+ header: BlockHeader<F>;
63
+ transactions: Transaction<F>[];
64
+ logs: Log<F>[];
65
+ traces: Trace<F>[];
66
+ stateDiffs: StateDiff<F>[];
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/lib/util.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Bytes32 } from '@subsquid/evm-stream';
2
+ export interface HashAndNumber {
3
+ hash: Bytes32;
4
+ number: number;
5
+ }
6
+ export declare function shortHash(hash: string): string;
7
+ export declare function formatId(block: HashAndNumber, ...address: number[]): string;
8
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAA;AAG5C,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ3E"}
package/lib/util.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shortHash = shortHash;
4
+ exports.formatId = formatId;
5
+ function shortHash(hash) {
6
+ if (hash.startsWith('0x')) {
7
+ return hash.slice(2, 7);
8
+ }
9
+ else {
10
+ return hash.slice(0, 5);
11
+ }
12
+ }
13
+ function formatId(block, ...address) {
14
+ let no = block.number.toString().padStart(10, '0');
15
+ let hash = shortHash(block.hash);
16
+ let id = `${no}-${hash}`;
17
+ for (let index of address) {
18
+ id += '-' + index.toString().padStart(6, '0');
19
+ }
20
+ return id;
21
+ }
22
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AASA,8BAMC;AAGD,4BAQC;AAjBD,SAAgB,SAAS,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;SAAM,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;AACL,CAAC;AAGD,SAAgB,QAAQ,CAAC,KAAoB,EAAE,GAAG,OAAiB;IAC/D,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAClD,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAA;IACxB,KAAK,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QACxB,EAAE,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,EAAE,CAAA;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@subsquid/evm-objects",
3
+ "version": "0.0.2-portal-api.a8e10e",
4
+ "description": "Augmented EVM data model",
5
+ "license": "GPL-3.0-or-later",
6
+ "repository": "git@github.com:subsquid/squid.git",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "main": "lib/index.js",
11
+ "files": [
12
+ "lib",
13
+ "src"
14
+ ],
15
+ "dependencies": {
16
+ "@subsquid/util-internal": "^3.2.0"
17
+ },
18
+ "peerDependencies": {
19
+ "@subsquid/evm-stream": "0.0.1-portal-api.a8e10e"
20
+ },
21
+ "devDependencies": {
22
+ "@subsquid/evm-stream": "0.0.1-portal-api.a8e10e",
23
+ "@types/node": "^18.18.14",
24
+ "typescript": "~5.5.4"
25
+ },
26
+ "scripts": {
27
+ "build": "rm -rf lib && tsc"
28
+ }
29
+ }
package/src/augment.ts ADDED
@@ -0,0 +1,11 @@
1
+ import * as base from '@subsquid/evm-stream'
2
+ import {setUpRelations} from './relations'
3
+ import * as types from './types'
4
+ import {Block} from './items'
5
+
6
+
7
+ export function augmentBlock<F extends base.FieldSelection>(src: base.Block<F>): types.Block<F> {
8
+ let block = Block.fromPartial(src)
9
+ setUpRelations(block)
10
+ return block as unknown as types.Block<F>
11
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './types'
2
+ export * from './augment'
3
+ export {formatId, shortHash} from './util'
package/src/items.ts ADDED
@@ -0,0 +1,400 @@
1
+ import {Bytes, Bytes20, Bytes32, Bytes8} from '@subsquid/evm-stream'
2
+ import {
3
+ PartialBlock,
4
+ PartialBlockHeader,
5
+ PartialLog,
6
+ PartialStateDiff,
7
+ PartialTrace,
8
+ PartialTransaction
9
+ } from '@subsquid/evm-stream/lib/data/partial'
10
+ import {
11
+ EIP7702Authorization,
12
+ EvmTraceCallAction,
13
+ EvmTraceCallResult,
14
+ EvmTraceCreateAction,
15
+ EvmTraceCreateResult,
16
+ EvmTraceRewardAction,
17
+ EvmTraceSuicideAction
18
+ } from '@subsquid/evm-stream/lib/data/evm'
19
+ import {formatId} from './util'
20
+
21
+
22
+ export class Block {
23
+ constructor(
24
+ public header: BlockHeader,
25
+ public transactions: Transaction[],
26
+ public logs: Log[],
27
+ public traces: Trace[],
28
+ public stateDiffs: StateDiff[]
29
+ ) {}
30
+
31
+ static fromPartial(src: PartialBlock): Block {
32
+ let header = new BlockHeader(src.header)
33
+
34
+ return new Block(
35
+ header,
36
+ src.transactions.map(i => new Transaction(header, i)),
37
+ src.logs.map(i => new Log(header, i)),
38
+ src.traces.map(i => createTrace(header, i)),
39
+ src.stateDiffs.map(i => createStateDiff(header, i))
40
+ )
41
+ }
42
+ }
43
+
44
+
45
+ export class BlockHeader implements PartialBlockHeader {
46
+ id: string
47
+ number: number
48
+ height: number
49
+ hash: Bytes32
50
+ parentHash: Bytes32
51
+
52
+ constructor(header: PartialBlockHeader) {
53
+ this.id = formatId(header)
54
+ this.number = header.number
55
+ this.height = header.height
56
+ this.hash = header.hash
57
+ this.parentHash = header.parentHash
58
+ Object.assign(this, header)
59
+ }
60
+ }
61
+
62
+
63
+ export class Transaction implements PartialTransaction {
64
+ id: string
65
+ transactionIndex: number
66
+ #block: BlockHeader
67
+ #logs?: Log[]
68
+ #traces?: Trace[]
69
+ #stateDiffs?: StateDiff[]
70
+
71
+ constructor(block: BlockHeader, tx: PartialTransaction) {
72
+ this.id = formatId(block, tx.transactionIndex)
73
+ this.transactionIndex = tx.transactionIndex
74
+ this.#block = block
75
+ Object.assign(this, tx)
76
+ }
77
+
78
+ get block(): BlockHeader {
79
+ return this.#block
80
+ }
81
+
82
+ set block(value: BlockHeader) {
83
+ this.#block = value
84
+ }
85
+
86
+ get logs(): Log[] {
87
+ if (this.#logs == null) {
88
+ this.#logs = []
89
+ }
90
+ return this.#logs
91
+ }
92
+
93
+ set logs(value: Log[]) {
94
+ this.#logs = value
95
+ }
96
+
97
+ get traces(): Trace[] {
98
+ if (this.#traces == null) {
99
+ this.#traces = []
100
+ }
101
+ return this.#traces
102
+ }
103
+
104
+ set traces(value: Trace[]) {
105
+ this.#traces = value
106
+ }
107
+
108
+ get stateDiffs(): StateDiff[] {
109
+ if (this.#stateDiffs == null) {
110
+ this.#stateDiffs = []
111
+ }
112
+ return this.#stateDiffs
113
+ }
114
+
115
+ set stateDiffs(value: StateDiff[]) {
116
+ this.#stateDiffs = value
117
+ }
118
+ }
119
+
120
+
121
+ export class Log implements PartialLog {
122
+ id: string
123
+ logIndex: number
124
+ transactionIndex: number
125
+ #block: BlockHeader
126
+ #transaction?: Transaction
127
+
128
+ constructor(block: BlockHeader, log: PartialLog) {
129
+ this.id = formatId(block, log.logIndex)
130
+ this.logIndex = log.logIndex
131
+ this.transactionIndex = log.transactionIndex
132
+ this.#block = block
133
+ Object.assign(this, log)
134
+ }
135
+
136
+ get block(): BlockHeader {
137
+ return this.#block
138
+ }
139
+
140
+ set block(value: BlockHeader) {
141
+ this.#block = value
142
+ }
143
+
144
+ get transaction(): Transaction | undefined {
145
+ return this.#transaction
146
+ }
147
+
148
+ set transaction(value: Transaction | undefined) {
149
+ this.#transaction = value
150
+ }
151
+
152
+ getTransaction(): Transaction {
153
+ if (this.#transaction == null) {
154
+ throw new Error(`Transaction is not set on log ${this.id}`)
155
+ } else {
156
+ return this.#transaction
157
+ }
158
+ }
159
+ }
160
+
161
+
162
+ class TraceBase {
163
+ id: string
164
+ transactionIndex: number
165
+ traceAddress: number[]
166
+ #block: BlockHeader
167
+ #transaction?: Transaction
168
+ #parent?: Trace
169
+ #children?: Trace[]
170
+
171
+ constructor(block: BlockHeader, trace: PartialTrace) {
172
+ this.id = formatId(block, trace.transactionIndex, ...trace.traceAddress)
173
+ this.transactionIndex = trace.transactionIndex
174
+ this.traceAddress = trace.traceAddress
175
+ this.#block = block
176
+ }
177
+
178
+ get block(): BlockHeader {
179
+ return this.#block
180
+ }
181
+
182
+ set block(value: BlockHeader) {
183
+ this.#block = value
184
+ }
185
+
186
+ get transaction(): Transaction | undefined {
187
+ return this.#transaction
188
+ }
189
+
190
+ set transaction(value: Transaction | undefined) {
191
+ this.#transaction = value
192
+ }
193
+
194
+ getTransaction(): Transaction {
195
+ if (this.#transaction == null) {
196
+ throw new Error(`Transaction is not set on trace ${this.id}`)
197
+ } else {
198
+ return this.#transaction
199
+ }
200
+ }
201
+
202
+ get parent(): Trace | undefined {
203
+ return this.#parent
204
+ }
205
+
206
+ set parent(value: Trace | undefined) {
207
+ this.#parent = value
208
+ }
209
+
210
+ getParent(): Trace {
211
+ if (this.#parent == null) {
212
+ throw new Error(`Parent is not set on trace ${this.id}`)
213
+ } else {
214
+ return this.#parent
215
+ }
216
+ }
217
+
218
+ get children(): Trace[] {
219
+ if (this.#children == null) {
220
+ this.#children = []
221
+ }
222
+ return this.#children
223
+ }
224
+
225
+ set children(value: Trace[]) {
226
+ this.#children = value
227
+ }
228
+ }
229
+
230
+
231
+ export class TraceCreate extends TraceBase {
232
+ type: 'create' = 'create'
233
+ action?: Partial<EvmTraceCreateAction>
234
+ result?: Partial<EvmTraceCreateResult>
235
+
236
+ constructor(block: BlockHeader, trace: PartialTrace) {
237
+ super(block, trace)
238
+ Object.assign(this, trace)
239
+ }
240
+ }
241
+
242
+
243
+ export class TraceCall extends TraceBase {
244
+ type: 'call' = 'call'
245
+ action?: Partial<EvmTraceCallAction>
246
+ result?: Partial<EvmTraceCallResult>
247
+
248
+ constructor(block: BlockHeader, trace: PartialTrace) {
249
+ super(block, trace)
250
+ Object.assign(this, trace)
251
+ }
252
+ }
253
+
254
+
255
+ export class TraceSuicide extends TraceBase {
256
+ type: 'suicide' = 'suicide'
257
+ action?: Partial<EvmTraceSuicideAction>
258
+
259
+ constructor(block: BlockHeader, trace: PartialTrace) {
260
+ super(block, trace)
261
+ Object.assign(this, trace)
262
+ }
263
+ }
264
+
265
+
266
+ export class TraceReward extends TraceBase {
267
+ type: 'reward' = 'reward'
268
+ action?: Partial<EvmTraceRewardAction>
269
+
270
+ constructor(block: BlockHeader, trace: PartialTrace) {
271
+ super(block, trace)
272
+ Object.assign(this, trace)
273
+ }
274
+ }
275
+
276
+
277
+ export type Trace = TraceCreate | TraceCall | TraceSuicide | TraceReward
278
+
279
+
280
+ function createTrace(block: BlockHeader, trace: PartialTrace): Trace {
281
+ switch (trace.type) {
282
+ case 'create':
283
+ return new TraceCreate(block, trace)
284
+ case 'call':
285
+ return new TraceCall(block, trace)
286
+ case 'suicide':
287
+ return new TraceSuicide(block, trace)
288
+ case 'reward':
289
+ return new TraceReward(block, trace)
290
+ default:
291
+ throw new Error(`Unknown trace type`)
292
+ }
293
+ }
294
+
295
+
296
+ class StateDiffBase {
297
+ transactionIndex: number
298
+ address: Bytes20
299
+ key: 'balance' | 'code' | 'nonce' | Bytes32
300
+ #block: BlockHeader
301
+ #transaction?: Transaction
302
+
303
+ constructor(block: BlockHeader, stateDiff: PartialStateDiff) {
304
+ this.transactionIndex = stateDiff.transactionIndex
305
+ this.address = stateDiff.address
306
+ this.key = stateDiff.key
307
+ this.#block = block
308
+ }
309
+
310
+ get block(): BlockHeader {
311
+ return this.#block
312
+ }
313
+
314
+ set block(value: BlockHeader) {
315
+ this.#block = value
316
+ }
317
+
318
+ get transaction(): Transaction | undefined {
319
+ return this.#transaction
320
+ }
321
+
322
+ set transaction(value: Transaction | undefined) {
323
+ this.#transaction = value
324
+ }
325
+
326
+ getTransaction(): Transaction {
327
+ if (this.#transaction == null) {
328
+ throw new Error(`Transaction is not set on state diff at ${this.block.id}-${this.transactionIndex}-${this.address}-${this.key}`)
329
+ } else {
330
+ return this.#transaction
331
+ }
332
+ }
333
+ }
334
+
335
+
336
+ export class StateDiffNoChange extends StateDiffBase {
337
+ kind: '=' = '='
338
+ prev?: null
339
+ next?: null
340
+
341
+ constructor(block: BlockHeader, stateDiff: PartialStateDiff) {
342
+ super(block, stateDiff)
343
+ Object.assign(this, stateDiff)
344
+ }
345
+ }
346
+
347
+
348
+ export class StateDiffAdd extends StateDiffBase {
349
+ kind: '+' = '+'
350
+ prev?: null
351
+ next?: Bytes
352
+
353
+ constructor(block: BlockHeader, stateDiff: PartialStateDiff) {
354
+ super(block, stateDiff)
355
+ Object.assign(this, stateDiff)
356
+ }
357
+ }
358
+
359
+
360
+ export class StateDiffChange extends StateDiffBase {
361
+ kind: '*' = '*'
362
+ prev?: Bytes
363
+ next?: Bytes
364
+
365
+ constructor(block: BlockHeader, stateDiff: PartialStateDiff) {
366
+ super(block, stateDiff)
367
+ Object.assign(this, stateDiff)
368
+ }
369
+ }
370
+
371
+
372
+ export class StateDiffDelete extends StateDiffBase {
373
+ kind: '-' = '-'
374
+ prev?: Bytes
375
+ next?: null
376
+
377
+ constructor(block: BlockHeader, stateDiff: PartialStateDiff) {
378
+ super(block, stateDiff)
379
+ Object.assign(this, stateDiff)
380
+ }
381
+ }
382
+
383
+
384
+ export type StateDiff = StateDiffNoChange | StateDiffAdd | StateDiffChange | StateDiffDelete
385
+
386
+
387
+ function createStateDiff(block: BlockHeader, stateDiff: PartialStateDiff): StateDiff {
388
+ switch (stateDiff.kind) {
389
+ case '=':
390
+ return new StateDiffNoChange(block, stateDiff)
391
+ case '+':
392
+ return new StateDiffAdd(block, stateDiff)
393
+ case '*':
394
+ return new StateDiffChange(block, stateDiff)
395
+ case '-':
396
+ return new StateDiffDelete(block, stateDiff)
397
+ default:
398
+ throw new Error(`Unknown state diff kind`)
399
+ }
400
+ }
@@ -0,0 +1,74 @@
1
+ import {maybeLast} from '@subsquid/util-internal'
2
+ import {Block, Trace, Transaction} from './items'
3
+
4
+
5
+ export function setUpRelations(block: Block): void {
6
+ block.transactions.sort((a, b) => a.transactionIndex - b.transactionIndex)
7
+ block.logs.sort((a, b) => a.logIndex - b.logIndex)
8
+ block.traces.sort(traceCompare)
9
+
10
+ let txs: (Transaction | undefined)[] = new Array((maybeLast(block.transactions)?.transactionIndex ?? -1) + 1)
11
+ for (let tx of block.transactions) {
12
+ txs[tx.transactionIndex] = tx
13
+ }
14
+
15
+ for (let log of block.logs) {
16
+ let tx = txs[log.transactionIndex]
17
+ if (tx) {
18
+ log.transaction = tx
19
+ tx.logs.push(log)
20
+ }
21
+ }
22
+
23
+ for (let i = 0; i < block.traces.length; i++) {
24
+ let trace = block.traces[i]
25
+ let tx = txs[trace.transactionIndex]
26
+ if (tx) {
27
+ trace.transaction = tx
28
+ tx.traces.push(trace)
29
+ }
30
+ for (let j = i + 1; j < block.traces.length; j++) {
31
+ let next = block.traces[j]
32
+ if (isDescendent(trace, next)) {
33
+ trace.children.push(next)
34
+ if (next.traceAddress.length == trace.traceAddress.length + 1) {
35
+ next.parent = trace
36
+ }
37
+ } else {
38
+ break
39
+ }
40
+ }
41
+ }
42
+
43
+ for (let stateDiff of block.stateDiffs) {
44
+ let tx = txs[stateDiff.transactionIndex]
45
+ if (tx) {
46
+ stateDiff.transaction = tx
47
+ tx.stateDiffs.push(stateDiff)
48
+ }
49
+ }
50
+ }
51
+
52
+
53
+ function traceCompare(a: Trace, b: Trace): number {
54
+ return a.transactionIndex - b.transactionIndex || addressCompare(a.traceAddress, b.traceAddress)
55
+ }
56
+
57
+
58
+ function addressCompare(a: number[], b: number[]): number {
59
+ for (let i = 0; i < Math.min(a.length, b.length); i++) {
60
+ let order = a[i] - b[i]
61
+ if (order) return order
62
+ }
63
+ return a.length - b.length
64
+ }
65
+
66
+
67
+ function isDescendent(parent: Trace, child: Trace): boolean {
68
+ if (parent.transactionIndex != child.transactionIndex) return false
69
+ if (parent.traceAddress.length >= child.traceAddress.length) return false
70
+ for (let i = 0; i < parent.traceAddress.length; i++) {
71
+ if (parent.traceAddress[i] != child.traceAddress[i]) return false
72
+ }
73
+ return true
74
+ }