@sentio/runtime 2.40.0-rc.4 → 2.40.0-rc.9
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/{chunk-FGIYODHE.js → chunk-FFU5RYDX.js} +99 -53
- package/lib/index.d.ts +5 -3
- package/lib/index.js +3 -1
- package/lib/processor-runner.js +1 -1
- package/package.json +1 -1
- package/src/gen/processor/protos/processor.ts +121 -76
- package/src/service.ts +19 -17
- package/src/utils.ts +11 -3
@@ -48583,9 +48583,75 @@ var ProcessResult = {
|
|
48583
48583
|
}
|
48584
48584
|
};
|
48585
48585
|
function createBaseEthCallParam() {
|
48586
|
-
return {
|
48586
|
+
return { context: void 0, calldata: "" };
|
48587
48587
|
}
|
48588
48588
|
var EthCallParam = {
|
48589
|
+
encode(message, writer = import_minimal5.default.Writer.create()) {
|
48590
|
+
if (message.context !== void 0) {
|
48591
|
+
EthCallContext.encode(message.context, writer.uint32(10).fork()).ldelim();
|
48592
|
+
}
|
48593
|
+
if (message.calldata !== "") {
|
48594
|
+
writer.uint32(18).string(message.calldata);
|
48595
|
+
}
|
48596
|
+
return writer;
|
48597
|
+
},
|
48598
|
+
decode(input, length) {
|
48599
|
+
const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input);
|
48600
|
+
let end = length === void 0 ? reader.len : reader.pos + length;
|
48601
|
+
const message = createBaseEthCallParam();
|
48602
|
+
while (reader.pos < end) {
|
48603
|
+
const tag = reader.uint32();
|
48604
|
+
switch (tag >>> 3) {
|
48605
|
+
case 1:
|
48606
|
+
if (tag !== 10) {
|
48607
|
+
break;
|
48608
|
+
}
|
48609
|
+
message.context = EthCallContext.decode(reader, reader.uint32());
|
48610
|
+
continue;
|
48611
|
+
case 2:
|
48612
|
+
if (tag !== 18) {
|
48613
|
+
break;
|
48614
|
+
}
|
48615
|
+
message.calldata = reader.string();
|
48616
|
+
continue;
|
48617
|
+
}
|
48618
|
+
if ((tag & 7) === 4 || tag === 0) {
|
48619
|
+
break;
|
48620
|
+
}
|
48621
|
+
reader.skipType(tag & 7);
|
48622
|
+
}
|
48623
|
+
return message;
|
48624
|
+
},
|
48625
|
+
fromJSON(object2) {
|
48626
|
+
return {
|
48627
|
+
context: isSet3(object2.context) ? EthCallContext.fromJSON(object2.context) : void 0,
|
48628
|
+
calldata: isSet3(object2.calldata) ? globalThis.String(object2.calldata) : ""
|
48629
|
+
};
|
48630
|
+
},
|
48631
|
+
toJSON(message) {
|
48632
|
+
const obj = {};
|
48633
|
+
if (message.context !== void 0) {
|
48634
|
+
obj.context = EthCallContext.toJSON(message.context);
|
48635
|
+
}
|
48636
|
+
if (message.calldata !== "") {
|
48637
|
+
obj.calldata = message.calldata;
|
48638
|
+
}
|
48639
|
+
return obj;
|
48640
|
+
},
|
48641
|
+
create(base) {
|
48642
|
+
return EthCallParam.fromPartial(base ?? {});
|
48643
|
+
},
|
48644
|
+
fromPartial(object2) {
|
48645
|
+
const message = createBaseEthCallParam();
|
48646
|
+
message.context = object2.context !== void 0 && object2.context !== null ? EthCallContext.fromPartial(object2.context) : void 0;
|
48647
|
+
message.calldata = object2.calldata ?? "";
|
48648
|
+
return message;
|
48649
|
+
}
|
48650
|
+
};
|
48651
|
+
function createBaseEthCallContext() {
|
48652
|
+
return { chainId: "", address: "", blockTag: "" };
|
48653
|
+
}
|
48654
|
+
var EthCallContext = {
|
48589
48655
|
encode(message, writer = import_minimal5.default.Writer.create()) {
|
48590
48656
|
if (message.chainId !== "") {
|
48591
48657
|
writer.uint32(10).string(message.chainId);
|
@@ -48593,21 +48659,15 @@ var EthCallParam = {
|
|
48593
48659
|
if (message.address !== "") {
|
48594
48660
|
writer.uint32(18).string(message.address);
|
48595
48661
|
}
|
48596
|
-
if (message.
|
48597
|
-
writer.uint32(26).string(message.
|
48598
|
-
}
|
48599
|
-
if (message.signature !== "") {
|
48600
|
-
writer.uint32(34).string(message.signature);
|
48601
|
-
}
|
48602
|
-
for (const v of message.args) {
|
48603
|
-
Value.encode(Value.wrap(v), writer.uint32(42).fork()).ldelim();
|
48662
|
+
if (message.blockTag !== "") {
|
48663
|
+
writer.uint32(26).string(message.blockTag);
|
48604
48664
|
}
|
48605
48665
|
return writer;
|
48606
48666
|
},
|
48607
48667
|
decode(input, length) {
|
48608
48668
|
const reader = input instanceof import_minimal5.default.Reader ? input : import_minimal5.default.Reader.create(input);
|
48609
48669
|
let end = length === void 0 ? reader.len : reader.pos + length;
|
48610
|
-
const message =
|
48670
|
+
const message = createBaseEthCallContext();
|
48611
48671
|
while (reader.pos < end) {
|
48612
48672
|
const tag = reader.uint32();
|
48613
48673
|
switch (tag >>> 3) {
|
@@ -48627,19 +48687,7 @@ var EthCallParam = {
|
|
48627
48687
|
if (tag !== 26) {
|
48628
48688
|
break;
|
48629
48689
|
}
|
48630
|
-
message.
|
48631
|
-
continue;
|
48632
|
-
case 4:
|
48633
|
-
if (tag !== 34) {
|
48634
|
-
break;
|
48635
|
-
}
|
48636
|
-
message.signature = reader.string();
|
48637
|
-
continue;
|
48638
|
-
case 5:
|
48639
|
-
if (tag !== 42) {
|
48640
|
-
break;
|
48641
|
-
}
|
48642
|
-
message.args.push(Value.unwrap(Value.decode(reader, reader.uint32())));
|
48690
|
+
message.blockTag = reader.string();
|
48643
48691
|
continue;
|
48644
48692
|
}
|
48645
48693
|
if ((tag & 7) === 4 || tag === 0) {
|
@@ -48653,9 +48701,7 @@ var EthCallParam = {
|
|
48653
48701
|
return {
|
48654
48702
|
chainId: isSet3(object2.chainId) ? globalThis.String(object2.chainId) : "",
|
48655
48703
|
address: isSet3(object2.address) ? globalThis.String(object2.address) : "",
|
48656
|
-
|
48657
|
-
signature: isSet3(object2.signature) ? globalThis.String(object2.signature) : "",
|
48658
|
-
args: globalThis.Array.isArray(object2?.args) ? [...object2.args] : []
|
48704
|
+
blockTag: isSet3(object2.blockTag) ? globalThis.String(object2.blockTag) : ""
|
48659
48705
|
};
|
48660
48706
|
},
|
48661
48707
|
toJSON(message) {
|
@@ -48666,27 +48712,19 @@ var EthCallParam = {
|
|
48666
48712
|
if (message.address !== "") {
|
48667
48713
|
obj.address = message.address;
|
48668
48714
|
}
|
48669
|
-
if (message.
|
48670
|
-
obj.
|
48671
|
-
}
|
48672
|
-
if (message.signature !== "") {
|
48673
|
-
obj.signature = message.signature;
|
48674
|
-
}
|
48675
|
-
if (message.args?.length) {
|
48676
|
-
obj.args = message.args;
|
48715
|
+
if (message.blockTag !== "") {
|
48716
|
+
obj.blockTag = message.blockTag;
|
48677
48717
|
}
|
48678
48718
|
return obj;
|
48679
48719
|
},
|
48680
48720
|
create(base) {
|
48681
|
-
return
|
48721
|
+
return EthCallContext.fromPartial(base ?? {});
|
48682
48722
|
},
|
48683
48723
|
fromPartial(object2) {
|
48684
|
-
const message =
|
48724
|
+
const message = createBaseEthCallContext();
|
48685
48725
|
message.chainId = object2.chainId ?? "";
|
48686
48726
|
message.address = object2.address ?? "";
|
48687
|
-
message.
|
48688
|
-
message.signature = object2.signature ?? "";
|
48689
|
-
message.args = object2.args?.map((e) => e) || [];
|
48727
|
+
message.blockTag = object2.blockTag ?? "";
|
48690
48728
|
return message;
|
48691
48729
|
}
|
48692
48730
|
};
|
@@ -59488,6 +59526,13 @@ function errorString(e) {
|
|
59488
59526
|
return e.message + "\n" + e.stack;
|
59489
59527
|
}
|
59490
59528
|
var USER_PROCESSOR = "user_processor";
|
59529
|
+
function makeEthCallKey(param) {
|
59530
|
+
if (!param.context) {
|
59531
|
+
throw new Error("null context for eth call");
|
59532
|
+
}
|
59533
|
+
const { chainId, address, blockTag } = param.context;
|
59534
|
+
return `${chainId}|${address}|${blockTag}|${param.calldata}`;
|
59535
|
+
}
|
59491
59536
|
|
59492
59537
|
// src/endpoints.ts
|
59493
59538
|
var _Endpoints = class {
|
@@ -78383,6 +78428,7 @@ var ProcessorServiceImpl = class {
|
|
78383
78428
|
// private processorConfig: ProcessConfigResponse
|
78384
78429
|
loader;
|
78385
78430
|
shutdownHandler;
|
78431
|
+
preprocessedEthCalls;
|
78386
78432
|
constructor(loader, shutdownHandler) {
|
78387
78433
|
this.loader = loader;
|
78388
78434
|
this.shutdownHandler = shutdownHandler;
|
@@ -78443,7 +78489,7 @@ var ProcessorServiceImpl = class {
|
|
78443
78489
|
};
|
78444
78490
|
}
|
78445
78491
|
async preprocessBindings(bindings, dbContext, options) {
|
78446
|
-
console.
|
78492
|
+
console.debug(`preprocessBindings start, bindings: ${bindings.length}`);
|
78447
78493
|
const promises = [];
|
78448
78494
|
for (const binding of bindings) {
|
78449
78495
|
promises.push(this.preprocessBinding(binding, dbContext, options));
|
@@ -78454,7 +78500,7 @@ var ProcessorServiceImpl = class {
|
|
78454
78500
|
} catch (e) {
|
78455
78501
|
throw e;
|
78456
78502
|
}
|
78457
|
-
console.
|
78503
|
+
console.debug(
|
78458
78504
|
"ethCallParams: ",
|
78459
78505
|
preprocessResults.map((r) => r.ethCallParams)
|
78460
78506
|
);
|
@@ -78462,10 +78508,11 @@ var ProcessorServiceImpl = class {
|
|
78462
78508
|
const providers2 = /* @__PURE__ */ new Map();
|
78463
78509
|
for (const result of preprocessResults) {
|
78464
78510
|
for (const param of result.ethCallParams) {
|
78465
|
-
|
78466
|
-
|
78511
|
+
const { chainId, address, blockTag } = param.context;
|
78512
|
+
if (!providers2.has(chainId)) {
|
78513
|
+
providers2.set(chainId, getProvider2(chainId));
|
78467
78514
|
}
|
78468
|
-
const key =
|
78515
|
+
const key = [chainId, address, blockTag].join("|");
|
78469
78516
|
if (!groupedRequests.has(key)) {
|
78470
78517
|
groupedRequests.set(key, []);
|
78471
78518
|
}
|
@@ -78475,15 +78522,15 @@ var ProcessorServiceImpl = class {
|
|
78475
78522
|
const start = Date.now();
|
78476
78523
|
const callPromises = [];
|
78477
78524
|
for (const params of groupedRequests.values()) {
|
78478
|
-
|
78525
|
+
const { chainId, address, blockTag } = params[0].context;
|
78526
|
+
console.log(`chain: ${chainId}, address: ${address}, blockTag: ${blockTag}, totalCalls: ${params.length}`);
|
78479
78527
|
for (const param of params) {
|
78480
|
-
const frag = new Interface([param.signature]);
|
78481
|
-
const calldata = frag.encodeFunctionData(param.function, param.args);
|
78482
78528
|
callPromises.push(
|
78483
|
-
providers2.get(
|
78484
|
-
to:
|
78485
|
-
data: calldata
|
78486
|
-
|
78529
|
+
providers2.get(chainId).call({
|
78530
|
+
to: address,
|
78531
|
+
data: param.calldata,
|
78532
|
+
blockTag
|
78533
|
+
}).then((result) => [makeEthCallKey(param), result])
|
78487
78534
|
);
|
78488
78535
|
}
|
78489
78536
|
}
|
@@ -78563,11 +78610,9 @@ var ProcessorServiceImpl = class {
|
|
78563
78610
|
}).catch((e) => {
|
78564
78611
|
console.debug(e);
|
78565
78612
|
dbContext.error(request.processId, e);
|
78566
|
-
process_binding_error.add(1);
|
78567
78613
|
}).finally(() => {
|
78568
78614
|
const cost = Date.now() - start;
|
78569
78615
|
console.debug("preprocessBinding", request.processId, " took", cost, "ms");
|
78570
|
-
process_binding_time.add(cost);
|
78571
78616
|
contexts.delete(request.processId);
|
78572
78617
|
});
|
78573
78618
|
}
|
@@ -78672,6 +78717,7 @@ export {
|
|
78672
78717
|
mergeProcessResults,
|
78673
78718
|
errorString,
|
78674
78719
|
USER_PROCESSOR,
|
78720
|
+
makeEthCallKey,
|
78675
78721
|
Endpoints,
|
78676
78722
|
require_lib,
|
78677
78723
|
require_lodash,
|
package/lib/index.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import * as _sentio_protos from '@sentio/protos';
|
2
|
-
import { DeepPartial as DeepPartial$1, ProcessStreamResponse, DBResponse, DBRequest_DBUpsert, DBRequest, HandlerType, ProcessConfigResponse, StartRequest, DataBinding, PreparedData, ProcessResult, PreprocessResult, ProcessorServiceImplementation, ProcessConfigRequest, Empty, ProcessBindingsRequest, ProcessBindingResponse, ProcessStreamRequest, PreprocessStreamRequest, PreprocessStreamResponse } from '@sentio/protos';
|
2
|
+
import { DeepPartial as DeepPartial$1, ProcessStreamResponse, DBResponse, DBRequest_DBUpsert, DBRequest, HandlerType, ProcessConfigResponse, StartRequest, DataBinding, PreparedData, ProcessResult, PreprocessResult, EthCallParam, ProcessorServiceImplementation, ProcessConfigRequest, Empty, ProcessBindingsRequest, ProcessBindingResponse, ProcessStreamRequest, PreprocessStreamRequest, PreprocessStreamResponse } from '@sentio/protos';
|
3
3
|
import { Subject } from 'rxjs';
|
4
4
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
5
5
|
import { Required } from 'utility-types';
|
@@ -85,6 +85,7 @@ declare abstract class ListStateStorage<T> extends StateStorage<T[]> {
|
|
85
85
|
declare function mergeProcessResults(results: ProcessResult[]): Required<ProcessResult, 'states'>;
|
86
86
|
declare function errorString(e: Error): string;
|
87
87
|
declare const USER_PROCESSOR = "user_processor";
|
88
|
+
declare function makeEthCallKey(param: EthCallParam): string;
|
88
89
|
|
89
90
|
declare class Endpoints {
|
90
91
|
static INSTANCE: Endpoints;
|
@@ -106,13 +107,14 @@ declare class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
106
107
|
unhandled: Error;
|
107
108
|
private readonly loader;
|
108
109
|
private readonly shutdownHandler?;
|
110
|
+
private readonly preprocessedEthCalls;
|
109
111
|
constructor(loader: () => Promise<any>, shutdownHandler?: () => void);
|
110
112
|
getConfig(request: ProcessConfigRequest, context: CallContext): Promise<ProcessConfigResponse>;
|
111
113
|
start(request: StartRequest, context: CallContext): Promise<Empty>;
|
112
114
|
stop(request: Empty, context: CallContext): Promise<Empty>;
|
113
115
|
processBindings(request: ProcessBindingsRequest, options?: CallContext): Promise<ProcessBindingResponse>;
|
114
116
|
preprocessBindings(bindings: DataBinding[], dbContext?: StoreContext, options?: CallContext): Promise<{
|
115
|
-
[
|
117
|
+
[ethCallKey: string]: string;
|
116
118
|
}>;
|
117
119
|
preprocessBinding(request: DataBinding, dbContext?: StoreContext, options?: CallContext): Promise<PreprocessResult>;
|
118
120
|
processBinding(request: DataBinding, preparedData: PreparedData | undefined, options?: CallContext): Promise<ProcessResult>;
|
@@ -366,4 +368,4 @@ interface GlobalConfig {
|
|
366
368
|
}
|
367
369
|
declare const GLOBAL_CONFIG: GlobalConfig;
|
368
370
|
|
369
|
-
export { ChainConfig, Endpoints, GLOBAL_CONFIG, GlobalConfig, ListStateStorage, MapStateStorage, Plugin, PluginManager, ProcessorServiceImpl, State, StateStorage, StoreContext, USER_PROCESSOR, errorString, mergeProcessResults, timeoutError };
|
371
|
+
export { ChainConfig, Endpoints, GLOBAL_CONFIG, GlobalConfig, ListStateStorage, MapStateStorage, Plugin, PluginManager, ProcessorServiceImpl, State, StateStorage, StoreContext, USER_PROCESSOR, errorString, makeEthCallKey, mergeProcessResults, timeoutError };
|
package/lib/index.js
CHANGED
@@ -9,9 +9,10 @@ import {
|
|
9
9
|
USER_PROCESSOR,
|
10
10
|
__publicField,
|
11
11
|
errorString,
|
12
|
+
makeEthCallKey,
|
12
13
|
mergeProcessResults,
|
13
14
|
timeoutError
|
14
|
-
} from "./chunk-
|
15
|
+
} from "./chunk-FFU5RYDX.js";
|
15
16
|
|
16
17
|
// src/state.ts
|
17
18
|
var _State = class {
|
@@ -87,6 +88,7 @@ export {
|
|
87
88
|
StoreContext,
|
88
89
|
USER_PROCESSOR,
|
89
90
|
errorString,
|
91
|
+
makeEthCallKey,
|
90
92
|
mergeProcessResults,
|
91
93
|
timeoutError
|
92
94
|
};
|
package/lib/processor-runner.js
CHANGED
package/package.json
CHANGED
@@ -3,7 +3,7 @@ import Long from "long";
|
|
3
3
|
import type { CallContext, CallOptions } from "nice-grpc-common";
|
4
4
|
import _m0 from "protobufjs/minimal.js";
|
5
5
|
import { Empty } from "../../google/protobuf/empty.js";
|
6
|
-
import { ListValue, Struct
|
6
|
+
import { ListValue, Struct } from "../../google/protobuf/struct.js";
|
7
7
|
import { Timestamp } from "../../google/protobuf/timestamp.js";
|
8
8
|
import { BigInteger, CoinID, RichStruct, RichStructList, RichValueList } from "../../service/common/protos/common.js";
|
9
9
|
|
@@ -1069,11 +1069,14 @@ export interface ProcessResult {
|
|
1069
1069
|
}
|
1070
1070
|
|
1071
1071
|
export interface EthCallParam {
|
1072
|
+
context: EthCallContext | undefined;
|
1073
|
+
calldata: string;
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
export interface EthCallContext {
|
1072
1077
|
chainId: string;
|
1073
1078
|
address: string;
|
1074
|
-
|
1075
|
-
signature: string;
|
1076
|
-
args: any[];
|
1079
|
+
blockTag: string;
|
1077
1080
|
}
|
1078
1081
|
|
1079
1082
|
export interface PreprocessResult {
|
@@ -1081,12 +1084,12 @@ export interface PreprocessResult {
|
|
1081
1084
|
}
|
1082
1085
|
|
1083
1086
|
export interface PreparedData {
|
1084
|
-
ethCallResults: { [key: string]:
|
1087
|
+
ethCallResults: { [key: string]: string };
|
1085
1088
|
}
|
1086
1089
|
|
1087
1090
|
export interface PreparedData_EthCallResultsEntry {
|
1088
1091
|
key: string;
|
1089
|
-
value:
|
1092
|
+
value: string;
|
1090
1093
|
}
|
1091
1094
|
|
1092
1095
|
export interface RecordMetaData {
|
@@ -9337,25 +9340,16 @@ export const ProcessResult = {
|
|
9337
9340
|
};
|
9338
9341
|
|
9339
9342
|
function createBaseEthCallParam(): EthCallParam {
|
9340
|
-
return {
|
9343
|
+
return { context: undefined, calldata: "" };
|
9341
9344
|
}
|
9342
9345
|
|
9343
9346
|
export const EthCallParam = {
|
9344
9347
|
encode(message: EthCallParam, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
9345
|
-
if (message.
|
9346
|
-
writer.uint32(10).
|
9348
|
+
if (message.context !== undefined) {
|
9349
|
+
EthCallContext.encode(message.context, writer.uint32(10).fork()).ldelim();
|
9347
9350
|
}
|
9348
|
-
if (message.
|
9349
|
-
writer.uint32(18).string(message.
|
9350
|
-
}
|
9351
|
-
if (message.function !== "") {
|
9352
|
-
writer.uint32(26).string(message.function);
|
9353
|
-
}
|
9354
|
-
if (message.signature !== "") {
|
9355
|
-
writer.uint32(34).string(message.signature);
|
9356
|
-
}
|
9357
|
-
for (const v of message.args) {
|
9358
|
-
Value.encode(Value.wrap(v!), writer.uint32(42).fork()).ldelim();
|
9351
|
+
if (message.calldata !== "") {
|
9352
|
+
writer.uint32(18).string(message.calldata);
|
9359
9353
|
}
|
9360
9354
|
return writer;
|
9361
9355
|
},
|
@@ -9372,35 +9366,100 @@ export const EthCallParam = {
|
|
9372
9366
|
break;
|
9373
9367
|
}
|
9374
9368
|
|
9375
|
-
message.
|
9369
|
+
message.context = EthCallContext.decode(reader, reader.uint32());
|
9376
9370
|
continue;
|
9377
9371
|
case 2:
|
9378
9372
|
if (tag !== 18) {
|
9379
9373
|
break;
|
9380
9374
|
}
|
9381
9375
|
|
9382
|
-
message.
|
9376
|
+
message.calldata = reader.string();
|
9383
9377
|
continue;
|
9384
|
-
|
9385
|
-
|
9378
|
+
}
|
9379
|
+
if ((tag & 7) === 4 || tag === 0) {
|
9380
|
+
break;
|
9381
|
+
}
|
9382
|
+
reader.skipType(tag & 7);
|
9383
|
+
}
|
9384
|
+
return message;
|
9385
|
+
},
|
9386
|
+
|
9387
|
+
fromJSON(object: any): EthCallParam {
|
9388
|
+
return {
|
9389
|
+
context: isSet(object.context) ? EthCallContext.fromJSON(object.context) : undefined,
|
9390
|
+
calldata: isSet(object.calldata) ? globalThis.String(object.calldata) : "",
|
9391
|
+
};
|
9392
|
+
},
|
9393
|
+
|
9394
|
+
toJSON(message: EthCallParam): unknown {
|
9395
|
+
const obj: any = {};
|
9396
|
+
if (message.context !== undefined) {
|
9397
|
+
obj.context = EthCallContext.toJSON(message.context);
|
9398
|
+
}
|
9399
|
+
if (message.calldata !== "") {
|
9400
|
+
obj.calldata = message.calldata;
|
9401
|
+
}
|
9402
|
+
return obj;
|
9403
|
+
},
|
9404
|
+
|
9405
|
+
create(base?: DeepPartial<EthCallParam>): EthCallParam {
|
9406
|
+
return EthCallParam.fromPartial(base ?? {});
|
9407
|
+
},
|
9408
|
+
fromPartial(object: DeepPartial<EthCallParam>): EthCallParam {
|
9409
|
+
const message = createBaseEthCallParam();
|
9410
|
+
message.context = (object.context !== undefined && object.context !== null)
|
9411
|
+
? EthCallContext.fromPartial(object.context)
|
9412
|
+
: undefined;
|
9413
|
+
message.calldata = object.calldata ?? "";
|
9414
|
+
return message;
|
9415
|
+
},
|
9416
|
+
};
|
9417
|
+
|
9418
|
+
function createBaseEthCallContext(): EthCallContext {
|
9419
|
+
return { chainId: "", address: "", blockTag: "" };
|
9420
|
+
}
|
9421
|
+
|
9422
|
+
export const EthCallContext = {
|
9423
|
+
encode(message: EthCallContext, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
9424
|
+
if (message.chainId !== "") {
|
9425
|
+
writer.uint32(10).string(message.chainId);
|
9426
|
+
}
|
9427
|
+
if (message.address !== "") {
|
9428
|
+
writer.uint32(18).string(message.address);
|
9429
|
+
}
|
9430
|
+
if (message.blockTag !== "") {
|
9431
|
+
writer.uint32(26).string(message.blockTag);
|
9432
|
+
}
|
9433
|
+
return writer;
|
9434
|
+
},
|
9435
|
+
|
9436
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): EthCallContext {
|
9437
|
+
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
|
9438
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
9439
|
+
const message = createBaseEthCallContext();
|
9440
|
+
while (reader.pos < end) {
|
9441
|
+
const tag = reader.uint32();
|
9442
|
+
switch (tag >>> 3) {
|
9443
|
+
case 1:
|
9444
|
+
if (tag !== 10) {
|
9386
9445
|
break;
|
9387
9446
|
}
|
9388
9447
|
|
9389
|
-
message.
|
9448
|
+
message.chainId = reader.string();
|
9390
9449
|
continue;
|
9391
|
-
case
|
9392
|
-
if (tag !==
|
9450
|
+
case 2:
|
9451
|
+
if (tag !== 18) {
|
9393
9452
|
break;
|
9394
9453
|
}
|
9395
9454
|
|
9396
|
-
message.
|
9455
|
+
message.address = reader.string();
|
9397
9456
|
continue;
|
9398
|
-
case
|
9399
|
-
if (tag !==
|
9457
|
+
case 3:
|
9458
|
+
if (tag !== 26) {
|
9400
9459
|
break;
|
9401
9460
|
}
|
9402
9461
|
|
9403
|
-
message.
|
9462
|
+
message.blockTag = reader.string();
|
9404
9463
|
continue;
|
9405
9464
|
}
|
9406
9465
|
if ((tag & 7) === 4 || tag === 0) {
|
@@ -9411,17 +9470,15 @@ export const EthCallParam = {
|
|
9411
9470
|
return message;
|
9412
9471
|
},
|
9413
9472
|
|
9414
|
-
fromJSON(object: any):
|
9473
|
+
fromJSON(object: any): EthCallContext {
|
9415
9474
|
return {
|
9416
9475
|
chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "",
|
9417
9476
|
address: isSet(object.address) ? globalThis.String(object.address) : "",
|
9418
|
-
|
9419
|
-
signature: isSet(object.signature) ? globalThis.String(object.signature) : "",
|
9420
|
-
args: globalThis.Array.isArray(object?.args) ? [...object.args] : [],
|
9477
|
+
blockTag: isSet(object.blockTag) ? globalThis.String(object.blockTag) : "",
|
9421
9478
|
};
|
9422
9479
|
},
|
9423
9480
|
|
9424
|
-
toJSON(message:
|
9481
|
+
toJSON(message: EthCallContext): unknown {
|
9425
9482
|
const obj: any = {};
|
9426
9483
|
if (message.chainId !== "") {
|
9427
9484
|
obj.chainId = message.chainId;
|
@@ -9429,28 +9486,20 @@ export const EthCallParam = {
|
|
9429
9486
|
if (message.address !== "") {
|
9430
9487
|
obj.address = message.address;
|
9431
9488
|
}
|
9432
|
-
if (message.
|
9433
|
-
obj.
|
9434
|
-
}
|
9435
|
-
if (message.signature !== "") {
|
9436
|
-
obj.signature = message.signature;
|
9437
|
-
}
|
9438
|
-
if (message.args?.length) {
|
9439
|
-
obj.args = message.args;
|
9489
|
+
if (message.blockTag !== "") {
|
9490
|
+
obj.blockTag = message.blockTag;
|
9440
9491
|
}
|
9441
9492
|
return obj;
|
9442
9493
|
},
|
9443
9494
|
|
9444
|
-
create(base?: DeepPartial<
|
9445
|
-
return
|
9495
|
+
create(base?: DeepPartial<EthCallContext>): EthCallContext {
|
9496
|
+
return EthCallContext.fromPartial(base ?? {});
|
9446
9497
|
},
|
9447
|
-
fromPartial(object: DeepPartial<
|
9448
|
-
const message =
|
9498
|
+
fromPartial(object: DeepPartial<EthCallContext>): EthCallContext {
|
9499
|
+
const message = createBaseEthCallContext();
|
9449
9500
|
message.chainId = object.chainId ?? "";
|
9450
9501
|
message.address = object.address ?? "";
|
9451
|
-
message.
|
9452
|
-
message.signature = object.signature ?? "";
|
9453
|
-
message.args = object.args?.map((e) => e) || [];
|
9502
|
+
message.blockTag = object.blockTag ?? "";
|
9454
9503
|
return message;
|
9455
9504
|
},
|
9456
9505
|
};
|
@@ -9523,9 +9572,7 @@ function createBasePreparedData(): PreparedData {
|
|
9523
9572
|
export const PreparedData = {
|
9524
9573
|
encode(message: PreparedData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
9525
9574
|
Object.entries(message.ethCallResults).forEach(([key, value]) => {
|
9526
|
-
|
9527
|
-
PreparedData_EthCallResultsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).ldelim();
|
9528
|
-
}
|
9575
|
+
PreparedData_EthCallResultsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).ldelim();
|
9529
9576
|
});
|
9530
9577
|
return writer;
|
9531
9578
|
},
|
@@ -9559,13 +9606,10 @@ export const PreparedData = {
|
|
9559
9606
|
fromJSON(object: any): PreparedData {
|
9560
9607
|
return {
|
9561
9608
|
ethCallResults: isObject(object.ethCallResults)
|
9562
|
-
? Object.entries(object.ethCallResults).reduce<{ [key: string]:
|
9563
|
-
|
9564
|
-
|
9565
|
-
|
9566
|
-
},
|
9567
|
-
{},
|
9568
|
-
)
|
9609
|
+
? Object.entries(object.ethCallResults).reduce<{ [key: string]: string }>((acc, [key, value]) => {
|
9610
|
+
acc[key] = String(value);
|
9611
|
+
return acc;
|
9612
|
+
}, {})
|
9569
9613
|
: {},
|
9570
9614
|
};
|
9571
9615
|
},
|
@@ -9589,20 +9633,21 @@ export const PreparedData = {
|
|
9589
9633
|
},
|
9590
9634
|
fromPartial(object: DeepPartial<PreparedData>): PreparedData {
|
9591
9635
|
const message = createBasePreparedData();
|
9592
|
-
message.ethCallResults = Object.entries(object.ethCallResults ?? {}).reduce<
|
9593
|
-
|
9594
|
-
|
9595
|
-
|
9596
|
-
|
9597
|
-
|
9598
|
-
|
9599
|
-
|
9636
|
+
message.ethCallResults = Object.entries(object.ethCallResults ?? {}).reduce<{ [key: string]: string }>(
|
9637
|
+
(acc, [key, value]) => {
|
9638
|
+
if (value !== undefined) {
|
9639
|
+
acc[key] = globalThis.String(value);
|
9640
|
+
}
|
9641
|
+
return acc;
|
9642
|
+
},
|
9643
|
+
{},
|
9644
|
+
);
|
9600
9645
|
return message;
|
9601
9646
|
},
|
9602
9647
|
};
|
9603
9648
|
|
9604
9649
|
function createBasePreparedData_EthCallResultsEntry(): PreparedData_EthCallResultsEntry {
|
9605
|
-
return { key: "", value:
|
9650
|
+
return { key: "", value: "" };
|
9606
9651
|
}
|
9607
9652
|
|
9608
9653
|
export const PreparedData_EthCallResultsEntry = {
|
@@ -9610,8 +9655,8 @@ export const PreparedData_EthCallResultsEntry = {
|
|
9610
9655
|
if (message.key !== "") {
|
9611
9656
|
writer.uint32(10).string(message.key);
|
9612
9657
|
}
|
9613
|
-
if (message.value !==
|
9614
|
-
|
9658
|
+
if (message.value !== "") {
|
9659
|
+
writer.uint32(18).string(message.value);
|
9615
9660
|
}
|
9616
9661
|
return writer;
|
9617
9662
|
},
|
@@ -9635,7 +9680,7 @@ export const PreparedData_EthCallResultsEntry = {
|
|
9635
9680
|
break;
|
9636
9681
|
}
|
9637
9682
|
|
9638
|
-
message.value =
|
9683
|
+
message.value = reader.string();
|
9639
9684
|
continue;
|
9640
9685
|
}
|
9641
9686
|
if ((tag & 7) === 4 || tag === 0) {
|
@@ -9649,7 +9694,7 @@ export const PreparedData_EthCallResultsEntry = {
|
|
9649
9694
|
fromJSON(object: any): PreparedData_EthCallResultsEntry {
|
9650
9695
|
return {
|
9651
9696
|
key: isSet(object.key) ? globalThis.String(object.key) : "",
|
9652
|
-
value:
|
9697
|
+
value: isSet(object.value) ? globalThis.String(object.value) : "",
|
9653
9698
|
};
|
9654
9699
|
},
|
9655
9700
|
|
@@ -9658,7 +9703,7 @@ export const PreparedData_EthCallResultsEntry = {
|
|
9658
9703
|
if (message.key !== "") {
|
9659
9704
|
obj.key = message.key;
|
9660
9705
|
}
|
9661
|
-
if (message.value !==
|
9706
|
+
if (message.value !== "") {
|
9662
9707
|
obj.value = message.value;
|
9663
9708
|
}
|
9664
9709
|
return obj;
|
@@ -9670,7 +9715,7 @@ export const PreparedData_EthCallResultsEntry = {
|
|
9670
9715
|
fromPartial(object: DeepPartial<PreparedData_EthCallResultsEntry>): PreparedData_EthCallResultsEntry {
|
9671
9716
|
const message = createBasePreparedData_EthCallResultsEntry();
|
9672
9717
|
message.key = object.key ?? "";
|
9673
|
-
message.value = object.value ??
|
9718
|
+
message.value = object.value ?? "";
|
9674
9719
|
return message;
|
9675
9720
|
},
|
9676
9721
|
};
|
package/src/service.ts
CHANGED
@@ -25,7 +25,7 @@ import {
|
|
25
25
|
} from '@sentio/protos'
|
26
26
|
|
27
27
|
import { PluginManager } from './plugin.js'
|
28
|
-
import { errorString, mergeProcessResults } from './utils.js'
|
28
|
+
import { errorString, makeEthCallKey, mergeProcessResults } from './utils.js'
|
29
29
|
import { freezeGlobalConfig, GLOBAL_CONFIG } from './global-config.js'
|
30
30
|
|
31
31
|
import { StoreContext } from './db-context.js'
|
@@ -33,7 +33,7 @@ import { Subject } from 'rxjs'
|
|
33
33
|
import { metrics } from '@opentelemetry/api'
|
34
34
|
import { getProvider } from './provider.js'
|
35
35
|
import { EthChainId } from '@sentio/chain'
|
36
|
-
import { Provider
|
36
|
+
import { Provider } from 'ethers'
|
37
37
|
|
38
38
|
const meter = metrics.getMeter('processor_service')
|
39
39
|
const process_binding_count = meter.createCounter('process_binding_count')
|
@@ -54,6 +54,8 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
54
54
|
|
55
55
|
private readonly shutdownHandler?: () => void
|
56
56
|
|
57
|
+
private readonly preprocessedEthCalls: { [calldata: string]: any[] }
|
58
|
+
|
57
59
|
constructor(loader: () => Promise<any>, shutdownHandler?: () => void) {
|
58
60
|
this.loader = loader
|
59
61
|
this.shutdownHandler = shutdownHandler
|
@@ -159,8 +161,8 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
159
161
|
bindings: DataBinding[],
|
160
162
|
dbContext?: StoreContext,
|
161
163
|
options?: CallContext
|
162
|
-
): Promise<{ [
|
163
|
-
console.
|
164
|
+
): Promise<{ [ethCallKey: string]: string }> {
|
165
|
+
console.debug(`preprocessBindings start, bindings: ${bindings.length}`)
|
164
166
|
const promises = []
|
165
167
|
for (const binding of bindings) {
|
166
168
|
promises.push(this.preprocessBinding(binding, dbContext, options))
|
@@ -171,7 +173,7 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
171
173
|
} catch (e) {
|
172
174
|
throw e
|
173
175
|
}
|
174
|
-
console.
|
176
|
+
console.debug(
|
175
177
|
'ethCallParams: ',
|
176
178
|
preprocessResults.map((r) => r.ethCallParams)
|
177
179
|
)
|
@@ -179,10 +181,11 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
179
181
|
const providers = new Map<string, Provider>()
|
180
182
|
for (const result of preprocessResults) {
|
181
183
|
for (const param of result.ethCallParams) {
|
182
|
-
|
183
|
-
|
184
|
+
const { chainId, address, blockTag } = param.context!
|
185
|
+
if (!providers.has(chainId)) {
|
186
|
+
providers.set(chainId, getProvider(chainId as EthChainId))
|
184
187
|
}
|
185
|
-
const key =
|
188
|
+
const key = [chainId, address, blockTag].join('|')
|
186
189
|
if (!groupedRequests.has(key)) {
|
187
190
|
groupedRequests.set(key, [])
|
188
191
|
}
|
@@ -193,18 +196,19 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
193
196
|
const start = Date.now()
|
194
197
|
const callPromises = []
|
195
198
|
for (const params of groupedRequests.values()) {
|
196
|
-
|
199
|
+
const { chainId, address, blockTag } = params[0].context!
|
200
|
+
console.log(`chain: ${chainId}, address: ${address}, blockTag: ${blockTag}, totalCalls: ${params.length}`)
|
201
|
+
// TODO multicall
|
197
202
|
for (const param of params) {
|
198
|
-
const frag = new Interface([param.signature])
|
199
|
-
const calldata = frag.encodeFunctionData(param.function, param.args)
|
200
203
|
callPromises.push(
|
201
204
|
providers
|
202
|
-
.get(
|
205
|
+
.get(chainId)!
|
203
206
|
.call({
|
204
|
-
to:
|
205
|
-
data: calldata
|
207
|
+
to: address,
|
208
|
+
data: param.calldata,
|
209
|
+
blockTag
|
206
210
|
})
|
207
|
-
.then((
|
211
|
+
.then((result) => [makeEthCallKey(param), result])
|
208
212
|
)
|
209
213
|
}
|
210
214
|
}
|
@@ -305,12 +309,10 @@ export class ProcessorServiceImpl implements ProcessorServiceImplementation {
|
|
305
309
|
.catch((e) => {
|
306
310
|
console.debug(e)
|
307
311
|
dbContext.error(request.processId, e)
|
308
|
-
process_binding_error.add(1)
|
309
312
|
})
|
310
313
|
.finally(() => {
|
311
314
|
const cost = Date.now() - start
|
312
315
|
console.debug('preprocessBinding', request.processId, ' took', cost, 'ms')
|
313
|
-
process_binding_time.add(cost)
|
314
316
|
contexts.delete(request.processId)
|
315
317
|
})
|
316
318
|
}
|
package/src/utils.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { ProcessResult } from '@sentio/protos'
|
1
|
+
import { EthCallParam, ProcessResult } from '@sentio/protos'
|
2
2
|
|
3
3
|
// TODO better handling this, because old proto doesn't have this
|
4
4
|
import { StateResult, ProcessResult as ProcessResultFull } from './gen/processor/protos/processor.js'
|
@@ -8,7 +8,7 @@ import { Required } from 'utility-types'
|
|
8
8
|
export function mergeProcessResults(results: ProcessResult[]): Required<ProcessResult, 'states'> {
|
9
9
|
const res = {
|
10
10
|
...ProcessResultFull.create(),
|
11
|
-
states: StateResult.create()
|
11
|
+
states: StateResult.create()
|
12
12
|
}
|
13
13
|
|
14
14
|
for (const r of results) {
|
@@ -17,7 +17,7 @@ export function mergeProcessResults(results: ProcessResult[]): Required<ProcessR
|
|
17
17
|
res.events = res.events.concat(r.events)
|
18
18
|
res.exports = res.exports.concat(r.exports)
|
19
19
|
res.states = {
|
20
|
-
configUpdated: res.states?.configUpdated || r.states?.configUpdated || false
|
20
|
+
configUpdated: res.states?.configUpdated || r.states?.configUpdated || false
|
21
21
|
}
|
22
22
|
}
|
23
23
|
return res
|
@@ -28,3 +28,11 @@ export function errorString(e: Error): string {
|
|
28
28
|
}
|
29
29
|
|
30
30
|
export const USER_PROCESSOR = 'user_processor'
|
31
|
+
|
32
|
+
export function makeEthCallKey(param: EthCallParam) {
|
33
|
+
if (!param.context) {
|
34
|
+
throw new Error('null context for eth call')
|
35
|
+
}
|
36
|
+
const { chainId, address, blockTag } = param.context
|
37
|
+
return `${chainId}|${address}|${blockTag}|${param.calldata}`
|
38
|
+
}
|