@pimlico/alto 0.0.0-staging.20240606T115633 → 0.0.2
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/LICENSE +674 -0
- package/lib/executor/executor.js +6 -0
- package/lib/executor/executor.js.map +1 -1
- package/lib/executor/executorManager.js +1 -0
- package/lib/executor/executorManager.js.map +1 -1
- package/lib/executor/utils.js +3 -1
- package/lib/executor/utils.js.map +1 -1
- package/lib/types/mempool.d.ts +2 -1
- package/package.json +10 -11
- package/esm/cli/alto.d.ts +0 -6
- package/esm/cli/alto.js +0 -92
- package/esm/cli/alto.js.map +0 -1
- package/esm/cli/config/bundler.d.ts +0 -391
- package/esm/cli/config/bundler.js +0 -132
- package/esm/cli/config/bundler.js.map +0 -1
- package/esm/cli/config/index.d.ts +0 -3
- package/esm/cli/config/index.js +0 -3
- package/esm/cli/config/index.js.map +0 -1
- package/esm/cli/config/options.d.ts +0 -11
- package/esm/cli/config/options.js +0 -336
- package/esm/cli/config/options.js.map +0 -1
- package/esm/cli/customTransport.d.ts +0 -14
- package/esm/cli/customTransport.js +0 -53
- package/esm/cli/customTransport.js.map +0 -1
- package/esm/cli/handler.d.ts +0 -3
- package/esm/cli/handler.js +0 -116
- package/esm/cli/handler.js.map +0 -1
- package/esm/cli/index.d.ts +0 -4
- package/esm/cli/index.js +0 -4
- package/esm/cli/index.js.map +0 -1
- package/esm/cli/instrumentation.d.ts +0 -2
- package/esm/cli/instrumentation.js +0 -39
- package/esm/cli/instrumentation.js.map +0 -1
- package/esm/cli/setupServer.d.ts +0 -17
- package/esm/cli/setupServer.js +0 -155
- package/esm/cli/setupServer.js.map +0 -1
- package/esm/cli/util.d.ts +0 -22
- package/esm/cli/util.js +0 -30
- package/esm/cli/util.js.map +0 -1
- package/esm/executor/executor.d.ts +0 -54
- package/esm/executor/executor.js +0 -637
- package/esm/executor/executor.js.map +0 -1
- package/esm/executor/executorManager.d.ts +0 -34
- package/esm/executor/executorManager.js +0 -401
- package/esm/executor/executorManager.js.map +0 -1
- package/esm/executor/index.d.ts +0 -5
- package/esm/executor/index.js +0 -5
- package/esm/executor/index.js.map +0 -1
- package/esm/executor/senderManager.d.ts +0 -17
- package/esm/executor/senderManager.js +0 -160
- package/esm/executor/senderManager.js.map +0 -1
- package/esm/executor/test/utils.d.ts +0 -13
- package/esm/executor/test/utils.js +0 -75
- package/esm/executor/test/utils.js.map +0 -1
- package/esm/executor/utils.d.ts +0 -32
- package/esm/executor/utils.js +0 -239
- package/esm/executor/utils.js.map +0 -1
- package/esm/index.d.ts +0 -2
- package/esm/index.js +0 -2
- package/esm/index.js.map +0 -1
- package/esm/mempool/index.d.ts +0 -5
- package/esm/mempool/index.js +0 -5
- package/esm/mempool/index.js.map +0 -1
- package/esm/mempool/mempool.d.ts +0 -64
- package/esm/mempool/mempool.js +0 -489
- package/esm/mempool/mempool.js.map +0 -1
- package/esm/mempool/monitoring.d.ts +0 -10
- package/esm/mempool/monitoring.js +0 -34
- package/esm/mempool/monitoring.js.map +0 -1
- package/esm/mempool/nullMempool.d.ts +0 -15
- package/esm/mempool/nullMempool.js +0 -36
- package/esm/mempool/nullMempool.js.map +0 -1
- package/esm/mempool/reputationManager.d.ts +0 -115
- package/esm/mempool/reputationManager.js +0 -397
- package/esm/mempool/reputationManager.js.map +0 -1
- package/esm/mempool/store.d.ts +0 -22
- package/esm/mempool/store.js +0 -123
- package/esm/mempool/store.js.map +0 -1
- package/esm/rpc/EntryPointSimulationsV07.d.ts +0 -58
- package/esm/rpc/EntryPointSimulationsV07.js +0 -407
- package/esm/rpc/EntryPointSimulationsV07.js.map +0 -1
- package/esm/rpc/ExecuteSimulator.d.ts +0 -37
- package/esm/rpc/ExecuteSimulator.js +0 -48
- package/esm/rpc/ExecuteSimulator.js.map +0 -1
- package/esm/rpc/gasEstimation.d.ts +0 -17
- package/esm/rpc/gasEstimation.js +0 -410
- package/esm/rpc/gasEstimation.js.map +0 -1
- package/esm/rpc/index.d.ts +0 -5
- package/esm/rpc/index.js +0 -5
- package/esm/rpc/index.js.map +0 -1
- package/esm/rpc/nonceQueuer.d.ts +0 -25
- package/esm/rpc/nonceQueuer.js +0 -135
- package/esm/rpc/nonceQueuer.js.map +0 -1
- package/esm/rpc/rpcHandler.d.ts +0 -64
- package/esm/rpc/rpcHandler.js +0 -727
- package/esm/rpc/rpcHandler.js.map +0 -1
- package/esm/rpc/server.d.ts +0 -31
- package/esm/rpc/server.js +0 -239
- package/esm/rpc/server.js.map +0 -1
- package/esm/rpc/validation/BundlerCollectorTracerV06.d.ts +0 -102
- package/esm/rpc/validation/BundlerCollectorTracerV06.js +0 -255
- package/esm/rpc/validation/BundlerCollectorTracerV06.js.map +0 -1
- package/esm/rpc/validation/BundlerCollectorTracerV07.d.ts +0 -102
- package/esm/rpc/validation/BundlerCollectorTracerV07.js +0 -254
- package/esm/rpc/validation/BundlerCollectorTracerV07.js.map +0 -1
- package/esm/rpc/validation/SafeValidator.d.ts +0 -35
- package/esm/rpc/validation/SafeValidator.js +0 -487
- package/esm/rpc/validation/SafeValidator.js.map +0 -1
- package/esm/rpc/validation/TracerResultParserV06.d.ts +0 -13
- package/esm/rpc/validation/TracerResultParserV06.js +0 -578
- package/esm/rpc/validation/TracerResultParserV06.js.map +0 -1
- package/esm/rpc/validation/TracerResultParserV07.d.ts +0 -33
- package/esm/rpc/validation/TracerResultParserV07.js +0 -557
- package/esm/rpc/validation/TracerResultParserV07.js.map +0 -1
- package/esm/rpc/validation/UnsafeValidator.d.ts +0 -63
- package/esm/rpc/validation/UnsafeValidator.js +0 -257
- package/esm/rpc/validation/UnsafeValidator.js.map +0 -1
- package/esm/rpc/validation/index.d.ts +0 -3
- package/esm/rpc/validation/index.js +0 -3
- package/esm/rpc/validation/index.js.map +0 -1
- package/esm/rpc/validation/tracer.d.ts +0 -122
- package/esm/rpc/validation/tracer.js +0 -82
- package/esm/rpc/validation/tracer.js.map +0 -1
- package/esm/types/contracts/BundleBulker.d.ts +0 -120
- package/esm/types/contracts/BundleBulker.js +0 -157
- package/esm/types/contracts/BundleBulker.js.map +0 -1
- package/esm/types/contracts/CallEngine.d.ts +0 -28
- package/esm/types/contracts/CallEngine.js +0 -37
- package/esm/types/contracts/CallEngine.js.map +0 -1
- package/esm/types/contracts/CodeHashGetter.d.ts +0 -37
- package/esm/types/contracts/CodeHashGetter.js +0 -45
- package/esm/types/contracts/CodeHashGetter.js.map +0 -1
- package/esm/types/contracts/EntryPoint.d.ts +0 -1789
- package/esm/types/contracts/EntryPoint.js +0 -2304
- package/esm/types/contracts/EntryPoint.js.map +0 -1
- package/esm/types/contracts/EntryPointSimulations.d.ts +0 -153
- package/esm/types/contracts/EntryPointSimulations.js +0 -15
- package/esm/types/contracts/EntryPointSimulations.js.map +0 -1
- package/esm/types/contracts/IOpInflator.d.ts +0 -61
- package/esm/types/contracts/IOpInflator.js +0 -80
- package/esm/types/contracts/IOpInflator.js.map +0 -1
- package/esm/types/contracts/IPaymaster.d.ts +0 -3
- package/esm/types/contracts/IPaymaster.js +0 -117
- package/esm/types/contracts/IPaymaster.js.map +0 -1
- package/esm/types/contracts/Inflator.d.ts +0 -65
- package/esm/types/contracts/Inflator.js +0 -84
- package/esm/types/contracts/Inflator.js.map +0 -1
- package/esm/types/contracts/PerOpInflator.d.ts +0 -176
- package/esm/types/contracts/PerOpInflator.js +0 -229
- package/esm/types/contracts/PerOpInflator.js.map +0 -1
- package/esm/types/contracts/PimlicoEntryPointSimulations.d.ts +0 -23
- package/esm/types/contracts/PimlicoEntryPointSimulations.js +0 -33
- package/esm/types/contracts/PimlicoEntryPointSimulations.js.map +0 -1
- package/esm/types/contracts/SenderCreator.d.ts +0 -4
- package/esm/types/contracts/SenderCreator.js +0 -23
- package/esm/types/contracts/SenderCreator.js.map +0 -1
- package/esm/types/contracts/SimpleAccountFactory.d.ts +0 -57
- package/esm/types/contracts/SimpleAccountFactory.js +0 -76
- package/esm/types/contracts/SimpleAccountFactory.js.map +0 -1
- package/esm/types/contracts/TestOpcodesAccount.d.ts +0 -4
- package/esm/types/contracts/TestOpcodesAccount.js +0 -281
- package/esm/types/contracts/TestOpcodesAccount.js.map +0 -1
- package/esm/types/contracts/TestOpcodesAccountFactory.d.ts +0 -4
- package/esm/types/contracts/TestOpcodesAccountFactory.js +0 -23
- package/esm/types/contracts/TestOpcodesAccountFactory.js.map +0 -1
- package/esm/types/contracts/TestStorageAccount.d.ts +0 -4
- package/esm/types/contracts/TestStorageAccount.js +0 -313
- package/esm/types/contracts/TestStorageAccount.js.map +0 -1
- package/esm/types/contracts/index.d.ts +0 -17
- package/esm/types/contracts/index.js +0 -17
- package/esm/types/contracts/index.js.map +0 -1
- package/esm/types/gasPrice.d.ts +0 -110
- package/esm/types/gasPrice.js +0 -52
- package/esm/types/gasPrice.js.map +0 -1
- package/esm/types/index.d.ts +0 -11
- package/esm/types/index.js +0 -11
- package/esm/types/index.js.map +0 -1
- package/esm/types/interfaces.d.ts +0 -26
- package/esm/types/interfaces.js +0 -2
- package/esm/types/interfaces.js.map +0 -1
- package/esm/types/mempool.d.ts +0 -78
- package/esm/types/mempool.js +0 -16
- package/esm/types/mempool.js.map +0 -1
- package/esm/types/schemas.d.ts +0 -4791
- package/esm/types/schemas.js +0 -497
- package/esm/types/schemas.js.map +0 -1
- package/esm/types/test/validationTestErrors.d.ts +0 -3
- package/esm/types/test/validationTestErrors.js +0 -229
- package/esm/types/test/validationTestErrors.js.map +0 -1
- package/esm/types/utils.d.ts +0 -24
- package/esm/types/utils.js +0 -30
- package/esm/types/utils.js.map +0 -1
- package/esm/types/validation.d.ts +0 -14327
- package/esm/types/validation.js +0 -304
- package/esm/types/validation.js.map +0 -1
- package/esm/utils/bigInt.d.ts +0 -3
- package/esm/utils/bigInt.js +0 -9
- package/esm/utils/bigInt.js.map +0 -1
- package/esm/utils/compressionHandler.d.ts +0 -11
- package/esm/utils/compressionHandler.js +0 -39
- package/esm/utils/compressionHandler.js.map +0 -1
- package/esm/utils/gasPriceManager.d.ts +0 -34
- package/esm/utils/gasPriceManager.js +0 -338
- package/esm/utils/gasPriceManager.js.map +0 -1
- package/esm/utils/helpers.d.ts +0 -4
- package/esm/utils/helpers.js +0 -13
- package/esm/utils/helpers.js.map +0 -1
- package/esm/utils/index.d.ts +0 -11
- package/esm/utils/index.js +0 -10
- package/esm/utils/index.js.map +0 -1
- package/esm/utils/logger.d.ts +0 -6
- package/esm/utils/logger.js +0 -76
- package/esm/utils/logger.js.map +0 -1
- package/esm/utils/metrics.d.ts +0 -22
- package/esm/utils/metrics.js +0 -150
- package/esm/utils/metrics.js.map +0 -1
- package/esm/utils/rpc-reply.d.ts +0 -17
- package/esm/utils/rpc-reply.js +0 -41
- package/esm/utils/rpc-reply.js.map +0 -1
- package/esm/utils/test.d.ts +0 -17
- package/esm/utils/test.js +0 -130
- package/esm/utils/test.js.map +0 -1
- package/esm/utils/userop.d.ts +0 -49
- package/esm/utils/userop.js +0 -408
- package/esm/utils/userop.js.map +0 -1
- package/esm/utils/validation.d.ts +0 -65
- package/esm/utils/validation.js +0 -461
- package/esm/utils/validation.js.map +0 -1
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
// javascript code of tracer function
|
|
2
|
-
// NOTE: we process this locally for hardhat, but send to geth for remote tracing.
|
|
3
|
-
// should NOT "require" anything, or use logs.
|
|
4
|
-
// see LogTrace for valid types (but alas, this one must be javascript, not typescript).
|
|
5
|
-
/**
|
|
6
|
-
* tracer to collect data for opcode banning.
|
|
7
|
-
* this method is passed as the "tracer" for eth_traceCall (note, the function itself)
|
|
8
|
-
*
|
|
9
|
-
* returned data:
|
|
10
|
-
* numberLevels: opcodes and memory access, split on execution of "number" opcode.
|
|
11
|
-
* keccak: input data of keccak opcode.
|
|
12
|
-
* calls: for each call, an array of [type, from, to, value]
|
|
13
|
-
* slots: accessed slots (on any address)
|
|
14
|
-
*/
|
|
15
|
-
export function bundlerCollectorTracer() {
|
|
16
|
-
return {
|
|
17
|
-
callsFromEntryPoint: [],
|
|
18
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
19
|
-
currentLevel: null,
|
|
20
|
-
keccak: [],
|
|
21
|
-
calls: [],
|
|
22
|
-
logs: [],
|
|
23
|
-
debug: [],
|
|
24
|
-
lastOp: "",
|
|
25
|
-
lastThreeOpcodes: [],
|
|
26
|
-
// event sent after all validations are done: keccak("BeforeExecution()")
|
|
27
|
-
stopCollectingTopic: "bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972",
|
|
28
|
-
stopCollecting: false,
|
|
29
|
-
topLevelCallCounter: 0,
|
|
30
|
-
fault(log, _db) {
|
|
31
|
-
this.debug.push(JSON.stringify({
|
|
32
|
-
type: "fault",
|
|
33
|
-
depth: log.getDepth(),
|
|
34
|
-
gas: log.getGas(),
|
|
35
|
-
cost: log.getCost(),
|
|
36
|
-
err: log.getError()
|
|
37
|
-
}));
|
|
38
|
-
},
|
|
39
|
-
result(_ctx, _db) {
|
|
40
|
-
return {
|
|
41
|
-
callsFromEntryPoint: this.callsFromEntryPoint,
|
|
42
|
-
keccak: this.keccak,
|
|
43
|
-
logs: this.logs,
|
|
44
|
-
calls: this.calls,
|
|
45
|
-
debug: this.debug // for internal debugging.
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
enter(frame) {
|
|
49
|
-
if (this.stopCollecting) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
this.calls.push({
|
|
53
|
-
type: frame.getType(),
|
|
54
|
-
from: toHex(frame.getFrom()),
|
|
55
|
-
to: toHex(frame.getTo()),
|
|
56
|
-
method: toHex(frame.getInput()).slice(0, 10),
|
|
57
|
-
gas: frame.getGas(),
|
|
58
|
-
value: frame.getValue()
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
exit(frame) {
|
|
62
|
-
if (this.stopCollecting) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this.calls.push({
|
|
66
|
-
type: frame.getError() != null ? "REVERT" : "RETURN",
|
|
67
|
-
gasUsed: frame.getGasUsed(),
|
|
68
|
-
data: toHex(frame.getOutput()).slice(0, 4000)
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
// increment the "key" in the list. if the key is not defined yet, then set it to "1"
|
|
72
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
73
|
-
countSlot(list, key) {
|
|
74
|
-
if (list[key]) {
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
list[key] += 1;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
list[key] = 1;
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
83
|
-
step(log, db) {
|
|
84
|
-
if (this.stopCollecting) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const opcode = log.op.toString();
|
|
88
|
-
const stackSize = log.stack.length();
|
|
89
|
-
const stackTop3 = [];
|
|
90
|
-
for (let i = 0; i < 3 && i < stackSize; i++) {
|
|
91
|
-
stackTop3.push(log.stack.peek(i));
|
|
92
|
-
}
|
|
93
|
-
this.lastThreeOpcodes.push({ opcode, stackTop3 });
|
|
94
|
-
if (this.lastThreeOpcodes.length > 3) {
|
|
95
|
-
this.lastThreeOpcodes.shift();
|
|
96
|
-
}
|
|
97
|
-
if (log.getGas() < log.getCost() ||
|
|
98
|
-
// special rule for SSTORE with gas metering
|
|
99
|
-
(opcode === "SSTORE" && log.getGas() < 2300)) {
|
|
100
|
-
this.currentLevel.oog = true;
|
|
101
|
-
}
|
|
102
|
-
if (opcode === "REVERT" || opcode === "RETURN") {
|
|
103
|
-
if (log.getDepth() === 1) {
|
|
104
|
-
// exit() is not called on top-level return/revent, so we reconstruct it
|
|
105
|
-
// from opcode
|
|
106
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
107
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
108
|
-
const data = toHex(log.memory.slice(ofs, ofs + len)).slice(0, 4000);
|
|
109
|
-
// this.debug.push(opcode + ' ' + data)
|
|
110
|
-
this.calls.push({
|
|
111
|
-
type: opcode,
|
|
112
|
-
gasUsed: 0,
|
|
113
|
-
data
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
// NOTE: flushing all history after RETURN
|
|
117
|
-
this.lastThreeOpcodes = [];
|
|
118
|
-
}
|
|
119
|
-
if (log.getDepth() === 1) {
|
|
120
|
-
if (opcode === "CALL" || opcode === "STATICCALL") {
|
|
121
|
-
// stack.peek(0) - gas
|
|
122
|
-
const addr = toAddress(log.stack.peek(1).toString(16));
|
|
123
|
-
const topLevelTargetAddress = toHex(addr);
|
|
124
|
-
// stack.peek(2) - value
|
|
125
|
-
const ofs = Number.parseInt(log.stack.peek(3).toString());
|
|
126
|
-
// stack.peek(4) - len
|
|
127
|
-
const topLevelMethodSig = toHex(log.memory.slice(ofs, ofs + 4));
|
|
128
|
-
this.currentLevel = this.callsFromEntryPoint[this.topLevelCallCounter] = {
|
|
129
|
-
topLevelMethodSig,
|
|
130
|
-
topLevelTargetAddress,
|
|
131
|
-
access: {},
|
|
132
|
-
opcodes: {},
|
|
133
|
-
extCodeAccessInfo: {},
|
|
134
|
-
contractSize: {}
|
|
135
|
-
};
|
|
136
|
-
this.topLevelCallCounter++;
|
|
137
|
-
}
|
|
138
|
-
else if (opcode === "LOG1") {
|
|
139
|
-
// ignore log data ofs, len
|
|
140
|
-
const topic = log.stack.peek(2).toString(16);
|
|
141
|
-
if (topic === this.stopCollectingTopic) {
|
|
142
|
-
this.stopCollecting = true;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
this.lastOp = "";
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const lastOpInfo = this.lastThreeOpcodes[this.lastThreeOpcodes.length - 2];
|
|
149
|
-
// store all addresses touched by EXTCODE* opcodes
|
|
150
|
-
if (lastOpInfo &&
|
|
151
|
-
lastOpInfo.opcode &&
|
|
152
|
-
lastOpInfo.opcode.match(/^(EXT.*)$/) != null) {
|
|
153
|
-
const addr = toAddress(lastOpInfo.stackTop3[0].toString(16));
|
|
154
|
-
const addrHex = toHex(addr);
|
|
155
|
-
// [OP-051]
|
|
156
|
-
if (!(this.lastThreeOpcodes[0].opcode.match(/\w+/) !== null &&
|
|
157
|
-
this.lastThreeOpcodes[1].opcode === "EXTCODESIZE" &&
|
|
158
|
-
this.lastThreeOpcodes[2].opcode === "ISZERO")) {
|
|
159
|
-
this.currentLevel.extCodeAccessInfo[addrHex] = opcode;
|
|
160
|
-
}
|
|
161
|
-
// this.debug.push({
|
|
162
|
-
// last3opcodes: JSON.stringify(this.lastThreeOpcodes.map(x => x.opcode)),
|
|
163
|
-
// extCodeAccessInfo: this.currentLevel.extCodeAccessInfo
|
|
164
|
-
// })
|
|
165
|
-
}
|
|
166
|
-
// not using 'isPrecompiled' to only allow the ones defined by the ERC-4337 as stateless precompiles
|
|
167
|
-
// [OP-062]
|
|
168
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
169
|
-
const isAllowedPrecompiled = (address) => {
|
|
170
|
-
const addrHex = toHex(address);
|
|
171
|
-
const addressInt = Number.parseInt(addrHex);
|
|
172
|
-
// this.debug.push(`isPrecompiled address=${addrHex} addressInt=${addressInt}`)
|
|
173
|
-
return addressInt > 0 && addressInt < 10;
|
|
174
|
-
};
|
|
175
|
-
// [OP-041]
|
|
176
|
-
if (opcode.match(/^(EXT.*|CALL|CALLCODE|DELEGATECALL|STATICCALL)$/) != null) {
|
|
177
|
-
const idx = opcode.startsWith("EXT") ? 0 : 1;
|
|
178
|
-
const addr = toAddress(log.stack.peek(idx).toString(16));
|
|
179
|
-
const addrHex = toHex(addr);
|
|
180
|
-
// this.debug.push('op=' + opcode + ' last=' + this.lastOp + ' stacksize=' + log.stack.length() + ' addr=' + addrHex)
|
|
181
|
-
if (this.currentLevel.contractSize[addrHex] == null &&
|
|
182
|
-
!isAllowedPrecompiled(addr)) {
|
|
183
|
-
this.currentLevel.contractSize[addrHex] = {
|
|
184
|
-
contractSize: db.getCode(addr).length,
|
|
185
|
-
opcode
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
// [OP-012]
|
|
190
|
-
if (this.lastOp === "GAS" && !opcode.includes("CALL")) {
|
|
191
|
-
// count "GAS" opcode only if not followed by "CALL"
|
|
192
|
-
this.countSlot(this.currentLevel.opcodes, "GAS");
|
|
193
|
-
}
|
|
194
|
-
if (opcode !== "GAS") {
|
|
195
|
-
// ignore "unimportant" opcodes:
|
|
196
|
-
if (opcode.match(/^(DUP\d+|PUSH\d+|SWAP\d+|POP|ADD|SUB|MUL|DIV|EQ|LTE?|S?GTE?|SLT|SH[LR]|AND|OR|NOT|ISZERO)$/) == null) {
|
|
197
|
-
this.countSlot(this.currentLevel.opcodes, opcode);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
this.lastOp = opcode;
|
|
201
|
-
if (opcode === "SLOAD" || opcode === "SSTORE") {
|
|
202
|
-
const slot = toWord(log.stack.peek(0).toString(16));
|
|
203
|
-
const slotHex = toHex(slot);
|
|
204
|
-
const addr = log.contract.getAddress();
|
|
205
|
-
const addrHex = toHex(addr);
|
|
206
|
-
let access = this.currentLevel.access[addrHex];
|
|
207
|
-
if (access == null) {
|
|
208
|
-
access = {
|
|
209
|
-
reads: {},
|
|
210
|
-
writes: {}
|
|
211
|
-
};
|
|
212
|
-
this.currentLevel.access[addrHex] = access;
|
|
213
|
-
}
|
|
214
|
-
if (opcode === "SLOAD") {
|
|
215
|
-
// read slot values before this UserOp was created
|
|
216
|
-
// (so saving it if it was written before the first read)
|
|
217
|
-
if (access.reads[slotHex] == null &&
|
|
218
|
-
access.writes[slotHex] == null) {
|
|
219
|
-
access.reads[slotHex] = toHex(db.getState(addr, slot));
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
this.countSlot(access.writes, slotHex);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
if (opcode === "KECCAK256") {
|
|
227
|
-
// collect keccak on 64-byte blocks
|
|
228
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
229
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
230
|
-
// currently, solidity uses only 2-word (6-byte) for a key. this might change..
|
|
231
|
-
// still, no need to return too much
|
|
232
|
-
if (len > 20 && len < 512) {
|
|
233
|
-
// if (len === 64) {
|
|
234
|
-
this.keccak.push(toHex(log.memory.slice(ofs, ofs + len)));
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
else if (opcode.startsWith("LOG")) {
|
|
238
|
-
const count = Number.parseInt(opcode.substring(3));
|
|
239
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
240
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
241
|
-
const topics = [];
|
|
242
|
-
for (let i = 0; i < count; i++) {
|
|
243
|
-
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
244
|
-
topics.push("0x" + log.stack.peek(2 + i).toString(16));
|
|
245
|
-
}
|
|
246
|
-
const data = toHex(log.memory.slice(ofs, ofs + len));
|
|
247
|
-
this.logs.push({
|
|
248
|
-
topics,
|
|
249
|
-
data
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
//# sourceMappingURL=BundlerCollectorTracerV06.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BundlerCollectorTracerV06.js","sourceRoot":"","sources":["../../../rpc/validation/BundlerCollectorTracerV06.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import type { Address, Hex } from "viem";
|
|
2
|
-
import type { LogTracer } from "./tracer.js";
|
|
3
|
-
/**
|
|
4
|
-
* return type of our BundlerCollectorTracer.
|
|
5
|
-
* collect access and opcodes, split into "levels" based on NUMBER opcode
|
|
6
|
-
* keccak, calls and logs are collected globally, since the levels are unimportant for them.
|
|
7
|
-
*/
|
|
8
|
-
export interface BundlerTracerResult {
|
|
9
|
-
/**
|
|
10
|
-
* storage and opcode info, collected on top-level calls from EntryPoint
|
|
11
|
-
*/
|
|
12
|
-
callsFromEntryPoint: TopLevelCallInfo[];
|
|
13
|
-
/**
|
|
14
|
-
* values passed into KECCAK opcode
|
|
15
|
-
*/
|
|
16
|
-
keccak: Hex[];
|
|
17
|
-
calls: Array<ExitInfo | MethodInfo>;
|
|
18
|
-
logs: LogInfo[];
|
|
19
|
-
debug: any[];
|
|
20
|
-
}
|
|
21
|
-
export interface MethodInfo {
|
|
22
|
-
type: string;
|
|
23
|
-
from: Address;
|
|
24
|
-
to: Address;
|
|
25
|
-
method: string;
|
|
26
|
-
value: bigint;
|
|
27
|
-
gas: number;
|
|
28
|
-
}
|
|
29
|
-
export interface ExitInfo {
|
|
30
|
-
type: "REVERT" | "RETURN";
|
|
31
|
-
gasUsed: number;
|
|
32
|
-
data: Hex;
|
|
33
|
-
}
|
|
34
|
-
export interface TopLevelCallInfo {
|
|
35
|
-
topLevelMethodSig: Hex;
|
|
36
|
-
topLevelTargetAddress: Address;
|
|
37
|
-
opcodes: {
|
|
38
|
-
[opcode: string]: number;
|
|
39
|
-
};
|
|
40
|
-
access: {
|
|
41
|
-
[address: string]: AccessInfo;
|
|
42
|
-
};
|
|
43
|
-
contractSize: {
|
|
44
|
-
[addr: string]: ContractSizeInfo;
|
|
45
|
-
};
|
|
46
|
-
extCodeAccessInfo: {
|
|
47
|
-
[addr: string]: string;
|
|
48
|
-
};
|
|
49
|
-
oog?: boolean;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* It is illegal to access contracts with no code in validation even if it gets deployed later.
|
|
53
|
-
* This means we need to store the {@link contractSize} of accessed addresses at the time of access.
|
|
54
|
-
*/
|
|
55
|
-
export interface ContractSizeInfo {
|
|
56
|
-
opcode: string;
|
|
57
|
-
contractSize: number;
|
|
58
|
-
}
|
|
59
|
-
export interface AccessInfo {
|
|
60
|
-
reads: {
|
|
61
|
-
[slot: string]: string;
|
|
62
|
-
};
|
|
63
|
-
writes: {
|
|
64
|
-
[slot: string]: number;
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
export interface LogInfo {
|
|
68
|
-
topics: string[];
|
|
69
|
-
data: string;
|
|
70
|
-
}
|
|
71
|
-
interface RelevantStepData {
|
|
72
|
-
opcode: string;
|
|
73
|
-
stackTop3: any[];
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* type-safe local storage of our collector. contains all return-value properties.
|
|
77
|
-
* (also defines all "trace-local" variables and functions)
|
|
78
|
-
*/
|
|
79
|
-
interface BundlerCollectorTracer extends LogTracer, BundlerTracerResult {
|
|
80
|
-
lastOp: string;
|
|
81
|
-
lastThreeOpcodes: RelevantStepData[];
|
|
82
|
-
stopCollectingTopic: string;
|
|
83
|
-
stopCollecting: boolean;
|
|
84
|
-
currentLevel: TopLevelCallInfo;
|
|
85
|
-
topLevelCallCounter: number;
|
|
86
|
-
countSlot: (list: {
|
|
87
|
-
[key: string]: number | undefined;
|
|
88
|
-
}, key: any) => void;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* tracer to collect data for opcode banning.
|
|
92
|
-
* this method is passed as the "tracer" for eth_traceCall (note, the function itself)
|
|
93
|
-
*
|
|
94
|
-
* returned data:
|
|
95
|
-
* numberLevels: opcodes and memory access, split on execution of "number" opcode.
|
|
96
|
-
* keccak: input data of keccak opcode.
|
|
97
|
-
* calls: for each call, an array of [type, from, to, value]
|
|
98
|
-
* slots: accessed slots (on any address)
|
|
99
|
-
*/
|
|
100
|
-
export declare function bundlerCollectorTracer(): BundlerCollectorTracer;
|
|
101
|
-
export {};
|
|
102
|
-
//# sourceMappingURL=BundlerCollectorTracerV07.d.ts.map
|
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
// javascript code of tracer function
|
|
2
|
-
// NOTE: we process this locally for hardhat, but send to geth for remote tracing.
|
|
3
|
-
// should NOT "require" anything, or use logs.
|
|
4
|
-
// see LogTrace for valid types (but alas, this one must be javascript, not typescript).
|
|
5
|
-
/**
|
|
6
|
-
* tracer to collect data for opcode banning.
|
|
7
|
-
* this method is passed as the "tracer" for eth_traceCall (note, the function itself)
|
|
8
|
-
*
|
|
9
|
-
* returned data:
|
|
10
|
-
* numberLevels: opcodes and memory access, split on execution of "number" opcode.
|
|
11
|
-
* keccak: input data of keccak opcode.
|
|
12
|
-
* calls: for each call, an array of [type, from, to, value]
|
|
13
|
-
* slots: accessed slots (on any address)
|
|
14
|
-
*/
|
|
15
|
-
export function bundlerCollectorTracer() {
|
|
16
|
-
return {
|
|
17
|
-
callsFromEntryPoint: [],
|
|
18
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
19
|
-
currentLevel: null,
|
|
20
|
-
keccak: [],
|
|
21
|
-
calls: [],
|
|
22
|
-
logs: [],
|
|
23
|
-
debug: [],
|
|
24
|
-
lastOp: "",
|
|
25
|
-
lastThreeOpcodes: [],
|
|
26
|
-
// event sent after all validations are done: keccak("BeforeExecution()")
|
|
27
|
-
stopCollectingTopic: "bb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972",
|
|
28
|
-
stopCollecting: false,
|
|
29
|
-
topLevelCallCounter: 0,
|
|
30
|
-
fault(log, _db) {
|
|
31
|
-
this.debug.push(JSON.stringify({
|
|
32
|
-
type: "fault",
|
|
33
|
-
depth: log.getDepth(),
|
|
34
|
-
gas: log.getGas(),
|
|
35
|
-
cost: log.getCost(),
|
|
36
|
-
err: log.getError()
|
|
37
|
-
}));
|
|
38
|
-
},
|
|
39
|
-
result(_ctx, _db) {
|
|
40
|
-
return {
|
|
41
|
-
callsFromEntryPoint: this.callsFromEntryPoint,
|
|
42
|
-
keccak: this.keccak,
|
|
43
|
-
logs: this.logs,
|
|
44
|
-
calls: this.calls,
|
|
45
|
-
debug: this.debug // for internal debugging.
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
enter(frame) {
|
|
49
|
-
if (this.stopCollecting) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
this.calls.push({
|
|
53
|
-
type: frame.getType(),
|
|
54
|
-
from: toHex(frame.getFrom()),
|
|
55
|
-
to: toHex(frame.getTo()),
|
|
56
|
-
method: toHex(frame.getInput()).slice(0, 10),
|
|
57
|
-
gas: frame.getGas(),
|
|
58
|
-
value: frame.getValue()
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
exit(frame) {
|
|
62
|
-
if (this.stopCollecting) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this.calls.push({
|
|
66
|
-
type: frame.getError() != null ? "REVERT" : "RETURN",
|
|
67
|
-
gasUsed: frame.getGasUsed(),
|
|
68
|
-
data: toHex(frame.getOutput()).slice(0, 4000)
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
// increment the "key" in the list. if the key is not defined yet, then set it to "1"
|
|
72
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
73
|
-
countSlot(list, key) {
|
|
74
|
-
if (list[key]) {
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
list[key] += 1;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
list[key] = 1;
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
83
|
-
step(log, db) {
|
|
84
|
-
if (log.getDepth() < 3) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (this.stopCollecting) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const opcode = log.op.toString();
|
|
91
|
-
const stackSize = log.stack.length();
|
|
92
|
-
const stackTop3 = [];
|
|
93
|
-
for (let i = 0; i < 3 && i < stackSize; i++) {
|
|
94
|
-
stackTop3.push(log.stack.peek(i));
|
|
95
|
-
}
|
|
96
|
-
this.lastThreeOpcodes.push({ opcode, stackTop3 });
|
|
97
|
-
if (this.lastThreeOpcodes.length > 3) {
|
|
98
|
-
this.lastThreeOpcodes.shift();
|
|
99
|
-
}
|
|
100
|
-
if (log.getGas() < log.getCost() ||
|
|
101
|
-
// special rule for SSTORE with gas metering
|
|
102
|
-
(opcode === "SSTORE" && log.getGas() < 2300)) {
|
|
103
|
-
this.currentLevel.oog = true;
|
|
104
|
-
}
|
|
105
|
-
if (opcode === "REVERT" || opcode === "RETURN") {
|
|
106
|
-
if (log.getDepth() === 3) {
|
|
107
|
-
// exit() is not called on top-level return/revent, so we reconstruct it
|
|
108
|
-
// from opcode
|
|
109
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
110
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
111
|
-
const data = toHex(log.memory.slice(ofs, ofs + len)).slice(0, 4000);
|
|
112
|
-
// this.debug.push(opcode + ' ' + data)
|
|
113
|
-
this.calls.push({
|
|
114
|
-
type: opcode,
|
|
115
|
-
gasUsed: 0,
|
|
116
|
-
data
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
// NOTE: flushing all history after RETURN
|
|
120
|
-
this.lastThreeOpcodes = [];
|
|
121
|
-
}
|
|
122
|
-
if (log.getDepth() === 3) {
|
|
123
|
-
if (opcode === "CALL" || opcode === "STATICCALL") {
|
|
124
|
-
// stack.peek(0) - gas
|
|
125
|
-
const addr = toAddress(log.stack.peek(1).toString(16));
|
|
126
|
-
const topLevelTargetAddress = toHex(addr);
|
|
127
|
-
// stack.peek(2) - value
|
|
128
|
-
const ofs = Number.parseInt(log.stack.peek(3).toString());
|
|
129
|
-
// stack.peek(4) - len
|
|
130
|
-
const topLevelMethodSig = toHex(log.memory.slice(ofs, ofs + 4));
|
|
131
|
-
this.currentLevel = this.callsFromEntryPoint[this.topLevelCallCounter] = {
|
|
132
|
-
topLevelMethodSig,
|
|
133
|
-
topLevelTargetAddress,
|
|
134
|
-
access: {},
|
|
135
|
-
opcodes: {},
|
|
136
|
-
extCodeAccessInfo: {},
|
|
137
|
-
contractSize: {}
|
|
138
|
-
};
|
|
139
|
-
this.topLevelCallCounter++;
|
|
140
|
-
}
|
|
141
|
-
else if (opcode === "LOG1") {
|
|
142
|
-
// ignore log data ofs, len
|
|
143
|
-
const topic = log.stack.peek(2).toString(16);
|
|
144
|
-
if (topic === this.stopCollectingTopic) {
|
|
145
|
-
this.stopCollecting = true;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
this.lastOp = "";
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const lastOpInfo = this.lastThreeOpcodes[this.lastThreeOpcodes.length - 2];
|
|
152
|
-
// store all addresses touched by EXTCODE* opcodes
|
|
153
|
-
if (lastOpInfo &&
|
|
154
|
-
lastOpInfo.opcode &&
|
|
155
|
-
lastOpInfo.opcode.match(/^(EXT.*)$/) != null) {
|
|
156
|
-
const addr = toAddress(lastOpInfo.stackTop3[0].toString(16));
|
|
157
|
-
const addrHex = toHex(addr);
|
|
158
|
-
// [OP-051]
|
|
159
|
-
if (!(this.lastThreeOpcodes[0].opcode.match(/\w+/) !== null &&
|
|
160
|
-
this.lastThreeOpcodes[1].opcode === "EXTCODESIZE" &&
|
|
161
|
-
this.lastThreeOpcodes[2].opcode === "ISZERO")) {
|
|
162
|
-
this.currentLevel.extCodeAccessInfo[addrHex] = opcode;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
// not using 'isPrecompiled' to only allow the ones defined by the ERC-4337 as stateless precompiles
|
|
166
|
-
// [OP-062]
|
|
167
|
-
// biome-ignore lint/suspicious/noExplicitAny: it's a generic type
|
|
168
|
-
const isAllowedPrecompiled = (address) => {
|
|
169
|
-
const addrHex = toHex(address);
|
|
170
|
-
const addressInt = Number.parseInt(addrHex);
|
|
171
|
-
// this.debug.push(`isPrecompiled address=${addrHex} addressInt=${addressInt}`)
|
|
172
|
-
return addressInt > 0 && addressInt < 10;
|
|
173
|
-
};
|
|
174
|
-
// [OP-041]
|
|
175
|
-
if (opcode.match(/^(EXT.*|CALL|CALLCODE|DELEGATECALL|STATICCALL)$/) != null) {
|
|
176
|
-
const idx = opcode.startsWith("EXT") ? 0 : 1;
|
|
177
|
-
const addr = toAddress(log.stack.peek(idx).toString(16));
|
|
178
|
-
const addrHex = toHex(addr);
|
|
179
|
-
// this.debug.push('op=' + opcode + ' last=' + this.lastOp + ' stacksize=' + log.stack.length() + ' addr=' + addrHex)
|
|
180
|
-
if (this.currentLevel.contractSize[addrHex] == null &&
|
|
181
|
-
!isAllowedPrecompiled(addr)) {
|
|
182
|
-
this.currentLevel.contractSize[addrHex] = {
|
|
183
|
-
contractSize: db.getCode(addr).length,
|
|
184
|
-
opcode
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// [OP-012]
|
|
189
|
-
if (this.lastOp === "GAS" && !opcode.includes("CALL")) {
|
|
190
|
-
// count "GAS" opcode only if not followed by "CALL"
|
|
191
|
-
this.countSlot(this.currentLevel.opcodes, "GAS");
|
|
192
|
-
}
|
|
193
|
-
if (opcode !== "GAS") {
|
|
194
|
-
// ignore "unimportant" opcodes:
|
|
195
|
-
if (opcode.match(/^(DUP\d+|PUSH\d+|SWAP\d+|POP|ADD|SUB|MUL|DIV|EQ|LTE?|S?GTE?|SLT|SH[LR]|AND|OR|NOT|ISZERO)$/) == null) {
|
|
196
|
-
this.countSlot(this.currentLevel.opcodes, opcode);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
this.lastOp = opcode;
|
|
200
|
-
if (opcode === "SLOAD" || opcode === "SSTORE") {
|
|
201
|
-
const slot = toWord(log.stack.peek(0).toString(16));
|
|
202
|
-
const slotHex = toHex(slot);
|
|
203
|
-
const addr = log.contract.getAddress();
|
|
204
|
-
const addrHex = toHex(addr);
|
|
205
|
-
let access = this.currentLevel.access[addrHex];
|
|
206
|
-
if (access == null) {
|
|
207
|
-
access = {
|
|
208
|
-
reads: {},
|
|
209
|
-
writes: {}
|
|
210
|
-
};
|
|
211
|
-
this.currentLevel.access[addrHex] = access;
|
|
212
|
-
}
|
|
213
|
-
if (opcode === "SLOAD") {
|
|
214
|
-
// read slot values before this UserOp was created
|
|
215
|
-
// (so saving it if it was written before the first read)
|
|
216
|
-
if (access.reads[slotHex] == null &&
|
|
217
|
-
access.writes[slotHex] == null) {
|
|
218
|
-
access.reads[slotHex] = toHex(db.getState(addr, slot));
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
this.countSlot(access.writes, slotHex);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
if (opcode === "KECCAK256") {
|
|
226
|
-
// collect keccak on 64-byte blocks
|
|
227
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
228
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
229
|
-
// currently, solidity uses only 2-word (6-byte) for a key. this might change..
|
|
230
|
-
// still, no need to return too much
|
|
231
|
-
if (len > 20 && len < 512) {
|
|
232
|
-
// if (len === 64) {
|
|
233
|
-
this.keccak.push(toHex(log.memory.slice(ofs, ofs + len)));
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
else if (opcode.startsWith("LOG")) {
|
|
237
|
-
const count = Number.parseInt(opcode.substring(3));
|
|
238
|
-
const ofs = Number.parseInt(log.stack.peek(0).toString());
|
|
239
|
-
const len = Number.parseInt(log.stack.peek(1).toString());
|
|
240
|
-
const topics = [];
|
|
241
|
-
for (let i = 0; i < count; i++) {
|
|
242
|
-
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
243
|
-
topics.push(`0x${log.stack.peek(2 + i).toString(16)}`);
|
|
244
|
-
}
|
|
245
|
-
const data = toHex(log.memory.slice(ofs, ofs + len));
|
|
246
|
-
this.logs.push({
|
|
247
|
-
topics,
|
|
248
|
-
data
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
//# sourceMappingURL=BundlerCollectorTracerV07.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BundlerCollectorTracerV07.js","sourceRoot":"","sources":["../../../rpc/validation/BundlerCollectorTracerV07.ts"],"names":[],"mappings":"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"}
|