sol-dbg 0.4.1 → 0.5.0

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 (66) hide show
  1. package/dist/debug/abi.d.ts.map +1 -1
  2. package/dist/debug/abi.js +11 -2
  3. package/dist/debug/abi.js.map +1 -1
  4. package/dist/debug/decoding/general.d.ts.map +1 -1
  5. package/dist/debug/decoding/general.js +3 -2
  6. package/dist/debug/decoding/general.js.map +1 -1
  7. package/dist/debug/index.d.ts +1 -1
  8. package/dist/debug/index.d.ts.map +1 -1
  9. package/dist/debug/index.js +1 -1
  10. package/dist/debug/index.js.map +1 -1
  11. package/dist/debug/tracers/base_tracer.d.ts +30 -0
  12. package/dist/debug/tracers/base_tracer.d.ts.map +1 -0
  13. package/dist/debug/tracers/base_tracer.js +108 -0
  14. package/dist/debug/tracers/base_tracer.js.map +1 -0
  15. package/dist/debug/tracers/index.d.ts +4 -0
  16. package/dist/debug/tracers/index.d.ts.map +1 -0
  17. package/dist/debug/tracers/index.js +20 -0
  18. package/dist/debug/tracers/index.js.map +1 -0
  19. package/dist/debug/tracers/sol_debugger.d.ts +9 -0
  20. package/dist/debug/tracers/sol_debugger.d.ts.map +1 -0
  21. package/dist/debug/tracers/sol_debugger.js +22 -0
  22. package/dist/debug/tracers/sol_debugger.js.map +1 -0
  23. package/dist/debug/tracers/transformers/basic_info.d.ts +23 -0
  24. package/dist/debug/tracers/transformers/basic_info.d.ts.map +1 -0
  25. package/dist/debug/tracers/transformers/basic_info.js +52 -0
  26. package/dist/debug/tracers/transformers/basic_info.js.map +1 -0
  27. package/dist/debug/tracers/transformers/events.d.ts +12 -0
  28. package/dist/debug/tracers/transformers/events.d.ts.map +1 -0
  29. package/dist/debug/tracers/transformers/events.js +30 -0
  30. package/dist/debug/tracers/transformers/events.js.map +1 -0
  31. package/dist/debug/tracers/transformers/ext_stack.d.ts +17 -0
  32. package/dist/debug/tracers/transformers/ext_stack.d.ts.map +1 -0
  33. package/dist/debug/tracers/transformers/ext_stack.js +200 -0
  34. package/dist/debug/tracers/transformers/ext_stack.js.map +1 -0
  35. package/dist/debug/tracers/transformers/index.d.ts +10 -0
  36. package/dist/debug/tracers/transformers/index.d.ts.map +1 -0
  37. package/dist/debug/tracers/transformers/index.js +23 -0
  38. package/dist/debug/tracers/transformers/index.js.map +1 -0
  39. package/dist/debug/tracers/transformers/int_stack.d.ts +13 -0
  40. package/dist/debug/tracers/transformers/int_stack.d.ts.map +1 -0
  41. package/dist/debug/tracers/transformers/int_stack.js +139 -0
  42. package/dist/debug/tracers/transformers/int_stack.js.map +1 -0
  43. package/dist/debug/tracers/transformers/op.d.ts +11 -0
  44. package/dist/debug/tracers/transformers/op.d.ts.map +1 -0
  45. package/dist/debug/tracers/transformers/op.js +11 -0
  46. package/dist/debug/tracers/transformers/op.js.map +1 -0
  47. package/dist/debug/tracers/transformers/source.d.ts +26 -0
  48. package/dist/debug/tracers/transformers/source.d.ts.map +1 -0
  49. package/dist/debug/tracers/transformers/source.js +38 -0
  50. package/dist/debug/tracers/transformers/source.js.map +1 -0
  51. package/dist/debug/types.d.ts +9 -14
  52. package/dist/debug/types.d.ts.map +1 -1
  53. package/dist/debug/types.js +8 -0
  54. package/dist/debug/types.js.map +1 -1
  55. package/dist/utils/pp.d.ts +3 -2
  56. package/dist/utils/pp.d.ts.map +1 -1
  57. package/dist/utils/pp.js +26 -11
  58. package/dist/utils/pp.js.map +1 -1
  59. package/dist/utils/test_runner.d.ts.map +1 -1
  60. package/dist/utils/test_runner.js +1 -2
  61. package/dist/utils/test_runner.js.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/debug/sol_debugger.d.ts +0 -113
  64. package/dist/debug/sol_debugger.d.ts.map +0 -1
  65. package/dist/debug/sol_debugger.js +0 -548
  66. package/dist/debug/sol_debugger.js.map +0 -1
@@ -1,548 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SolTxDebugger = void 0;
4
- exports.lastExternalFrame = lastExternalFrame;
5
- exports.getContractInfo = getContractInfo;
6
- const blockchain_1 = require("@ethereumjs/blockchain");
7
- const common_1 = require("@ethereumjs/common");
8
- const evm_1 = require("@ethereumjs/evm");
9
- const rlp_1 = require("@ethereumjs/rlp");
10
- const statemanager_1 = require("@ethereumjs/statemanager");
11
- const util_1 = require("@ethereumjs/util");
12
- const vm_1 = require("@ethereumjs/vm");
13
- const utils_1 = require("ethereum-cryptography/utils");
14
- const solc_typed_ast_1 = require("solc-typed-ast");
15
- const __1 = require("..");
16
- const artifacts_1 = require("../artifacts");
17
- const utils_2 = require("../utils");
18
- const abi_1 = require("./abi");
19
- const artifact_manager_1 = require("./artifact_manager");
20
- const decoding_1 = require("./decoding");
21
- const foundry_cheatcodes_1 = require("./foundry_cheatcodes");
22
- const opcode_interposing_1 = require("./opcode_interposing");
23
- const opcodes_1 = require("./opcodes");
24
- const types_1 = require("./types");
25
- // Helper functions
26
- /**
27
- * Give a stack or a stack frame, find the last **external** stack frame under it (include itself).
28
- */
29
- function lastExternalFrame(arg) {
30
- const frame = arg instanceof Array ? arg[arg.length - 1] : arg;
31
- return frame.kind === types_1.FrameKind.InternalCall ? frame.nearestExtFrame : frame;
32
- }
33
- function getContractInfo(arg) {
34
- const frame = lastExternalFrame(arg);
35
- return frame.info;
36
- }
37
- async function getStorage(manager, addr) {
38
- const rawStorage = await manager.dumpStorage(addr);
39
- const storageEntries = [];
40
- for (const [keyStr, valStr] of Object.entries(rawStorage)) {
41
- const decoded = rlp_1.RLP.decode((0, utils_1.hexToBytes)(valStr));
42
- (0, solc_typed_ast_1.assert)(decoded instanceof Uint8Array, "");
43
- const valBuf = (0, util_1.setLengthLeft)(decoded, 32);
44
- storageEntries.push([BigInt(keyStr), valBuf]);
45
- }
46
- return __1.ImmMap.fromEntries(storageEntries);
47
- }
48
- /**
49
- * Private map tracking VM-to-EVM mapping, used when releasing EVMs from the
50
- * global listener map for foundry cheatcodes.
51
- */
52
- const vmToEVMMap = new Map();
53
- /**
54
- * `SolTxDebugger` is the main debugger class. It contains a VM and a
55
- * corresponding Web3 provider that can be used to run transactions on that VM.
56
- *
57
- * Once a particular transaction `tx` has been run against the vm, you can call
58
- * `debugger.loadTx(tx)` to debug that transaction.
59
- *
60
- * `loadTx(tx)` walks over every step of the tx and computes the following information for it:
61
- *
62
- * 1. What is the currently deployed contract in which we are executing?
63
- * 2. Did the `ArtifactManager` have debugging info for this contract? (src map? ast?)
64
- * 3. If we have source map compute the corresponding src tripple for this instruction
65
- * 4. If we have an ast, see if the src tripple of this instruction matches any node in the AST
66
- * 5. If this is a LOGN instruction, extract the event payload and topics
67
- * 6. Maintain a stack trace, containing all external and internal calls for
68
- * this step. Note that we can compute internal stack frames only for contracts
69
- * with debug info.
70
- *
71
- * All the above information is held for each step in the `DbgState` struct.
72
- */
73
- class SolTxDebugger {
74
- constructor(artifactManager, opts) {
75
- this.artifactManager = artifactManager;
76
- this.strict = true;
77
- this.foundryCheatcodes = false;
78
- if (opts) {
79
- this.strict = opts.strict !== undefined ? opts.strict : this.strict;
80
- this.foundryCheatcodes =
81
- opts.foundryCheatcodes !== undefined
82
- ? opts.foundryCheatcodes
83
- : this.foundryCheatcodes;
84
- }
85
- }
86
- /**
87
- * Given the VM state of a trace step adjust the stack trace accordingly. This handles the following cases:
88
- *
89
- * - op is CREATE or CREATE2 - push a new external frame for the creation context of the contract
90
- * - op is CALL/CALLCODE/DELEGATECALL/STATICCALL - push a new external frame for the callee context
91
- * - stack depth decreased and previous instruction was RETURN, REVERT or was in an error state - pop external frames from the stack
92
- * - internal call - previous op is JUMPDEST and the source map of the current op is the begining of a new function - push a new internal call frame
93
- * - return from internal call - TODO
94
- */
95
- async adjustStackFrame(stack, state, trace, code, codeHash) {
96
- const lastExtFrame = lastExternalFrame(stack);
97
- // First instruction - nothing to do
98
- if (trace.length === 0) {
99
- return;
100
- }
101
- const lastStep = trace[trace.length - 1];
102
- const lastOp = lastStep.op;
103
- // Case 1: Change in external call depth - contract creation, external call, external call return or revert
104
- if (lastStep.depth !== state.depth) {
105
- const lastStackTop = lastStep.evmStack.length - 1;
106
- if (state.depth > lastStep.depth) {
107
- (0, solc_typed_ast_1.assert)((0, opcodes_1.increasesDepth)(lastOp), `Unexpected depth increase on op ${lastOp.mnemonic}`);
108
- if ((0, opcodes_1.createsContract)(lastOp)) {
109
- // Contract creation call
110
- const off = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - 1]);
111
- const size = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - 2]);
112
- const creationBytecode = lastStep.memory.slice(off, off + size);
113
- const curFrame = await this.makeCreationFrame(lastExtFrame.address.toString(), creationBytecode, trace.length);
114
- stack.push(curFrame);
115
- }
116
- else {
117
- // External call
118
- const argStackOff = lastOp.opcode === opcodes_1.OPCODES.CALL || lastOp.opcode === opcodes_1.OPCODES.CALLCODE
119
- ? 3
120
- : 2;
121
- const argSizeStackOff = argStackOff + 1;
122
- const argOff = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - argStackOff]);
123
- const argSize = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - argSizeStackOff]);
124
- const receiver = (0, __1.wordToAddress)(lastStep.evmStack[lastStackTop - 1]);
125
- const msgData = lastStep.memory.slice(argOff, argOff + argSize);
126
- const newFrame = await this.makeCallFrame(lastExtFrame.address.toString(), receiver, msgData, code, codeHash, trace.length);
127
- stack.push(newFrame);
128
- }
129
- }
130
- else {
131
- // External return or exception
132
- let nFramesPopped = lastStep.depth - state.depth;
133
- // Pop as many external frames as neccessary to match the decrease in
134
- // depth reported by web3. We need the loop since we don't count the internal frames as decreasing depth
135
- while (nFramesPopped > 0 && stack.length > 0) {
136
- const topFrame = stack[stack.length - 1];
137
- if (topFrame.kind === types_1.FrameKind.Creation || topFrame.kind === types_1.FrameKind.Call) {
138
- nFramesPopped--;
139
- }
140
- stack.pop();
141
- }
142
- }
143
- return;
144
- }
145
- // Case 2: No change in external depth - check if there is an internal call or return happening
146
- const curExtFrame = lastExternalFrame(stack);
147
- const [src, ast] = this.decodeSourceLoc(state.pc, curExtFrame);
148
- // If there is no debug info for the current contract nothing we can do
149
- if (src === undefined) {
150
- return;
151
- }
152
- // There are 2 ways to enter an internal function:
153
- let enteringInternalFun = false;
154
- // 1. Jumping into an internal function (the previous instruction is a JUMP with source map jump index i)
155
- if (state.op.mnemonic === "JUMPDEST" &&
156
- lastStep.op.mnemonic === "JUMP" &&
157
- lastStep.src &&
158
- lastStep.src.jump === "i") {
159
- enteringInternalFun = true;
160
- }
161
- // 2. Fall-through (the previous instruction is literally the pervious instruction in the contract body,
162
- // AND the current JUMPDEST corresponds to a whole function, AND the pervious instructions' callee is different
163
- // from the current instruction's function.
164
- if (!enteringInternalFun &&
165
- state.op.mnemonic === "JUMPDEST" &&
166
- (ast instanceof solc_typed_ast_1.FunctionDefinition ||
167
- (ast instanceof solc_typed_ast_1.VariableDeclaration && ast.stateVariable)) &&
168
- lastStep.stack[lastStep.stack.length - 1].callee !== ast) {
169
- enteringInternalFun = true;
170
- }
171
- if (enteringInternalFun) {
172
- let args;
173
- if (ast instanceof solc_typed_ast_1.FunctionDefinition ||
174
- (ast instanceof solc_typed_ast_1.VariableDeclaration && ast.stateVariable)) {
175
- (0, solc_typed_ast_1.assert)(curExtFrame.info !== undefined, ``);
176
- args = this.decodeFunArgs(ast, state.evmStack, curExtFrame.info);
177
- }
178
- const newFrame = {
179
- kind: types_1.FrameKind.InternalCall,
180
- nearestExtFrame: lastExtFrame,
181
- callee: ast,
182
- offset: state.pc,
183
- startStep: trace.length,
184
- arguments: args
185
- };
186
- stack.push(newFrame);
187
- return;
188
- }
189
- // Returning from an internal function call
190
- if (state.op.mnemonic === "JUMP" && src.jump === "o") {
191
- const topFrame = stack[stack.length - 1];
192
- if (this.strict) {
193
- (0, solc_typed_ast_1.assert)(topFrame.kind === types_1.FrameKind.InternalCall, `Mismatched internal return from frame `, topFrame.kind);
194
- stack.pop();
195
- }
196
- else {
197
- if (topFrame.kind === types_1.FrameKind.InternalCall) {
198
- stack.pop();
199
- }
200
- // @todo log an error somewhere
201
- }
202
- }
203
- }
204
- /**
205
- * Get the executing code for the current step. There are 3 cases:
206
- *
207
- * 1. We just entered the creation of a new code (last step was
208
- * CREATE/CREATE2 and depth changed). The code is whatever the memory blob
209
- * passed to the last op was
210
- * 2. This is the first step or the `codeAddress` changed between this and the last
211
- * steps - obtain the code from the `vm.stateManager` using `codeAddress`.
212
- * 3. Otherwise code is the same in the last step
213
- * @param vm - current VM
214
- * @param vmState - current (partial) state in the trace (for which we are computing code)
215
- * @param trace - trace up to the current state
216
- */
217
- async getCodeAndMdHash(vm, step, trace) {
218
- const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
219
- let code;
220
- let codeMdHash;
221
- const getCodeAddress = (s) => s.codeAddress !== undefined ? s.codeAddress : s.address;
222
- // Case 1: First step in the trace
223
- if (lastStep === undefined) {
224
- const code = await vm.stateManager.getContractCode(getCodeAddress(step));
225
- const codeMdHash = (0, artifacts_1.getCodeHash)(code);
226
- return [code, codeMdHash];
227
- }
228
- // Case 2: Just entering a constructor from another contract
229
- if ((0, opcodes_1.createsContract)(lastStep.op)) {
230
- const lastStackTop = lastStep.evmStack.length - 1;
231
- const off = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - 1]);
232
- const size = (0, utils_2.bigEndianBufToNumber)(lastStep.evmStack[lastStackTop - 2]);
233
- const code = lastStep.memory.slice(off, off + size);
234
- const codeMdHash = (0, artifacts_1.getCreationCodeHash)(code);
235
- return [code, codeMdHash];
236
- }
237
- // Case 3: The code changed - either we are in a different contract or a delegate call context
238
- if (!getCodeAddress(lastStep).equals(getCodeAddress(step))) {
239
- // Case 3: We are changing the code address
240
- code = await vm.stateManager.getContractCode(getCodeAddress(step));
241
- codeMdHash = (0, artifacts_1.getCodeHash)(code);
242
- return [code, codeMdHash];
243
- }
244
- // Case 4: We are still in the same contract
245
- code = lastStep.code;
246
- codeMdHash = lastStep.codeMdHash;
247
- return [code, codeMdHash];
248
- }
249
- async processRawTraceStep(vm, stateManager, step, trace, stack) {
250
- const evmStack = step.stack.map((word) => (0, utils_2.bigIntToBuf)(word, 32, "big"));
251
- const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
252
- const memory = lastStep === undefined || (0, opcodes_1.changesMemory)(lastStep.op)
253
- ? new Uint8Array(step.memory)
254
- : lastStep.memory;
255
- const op = (0, opcodes_1.getOpInfo)(step.opcode.name);
256
- let storage;
257
- if (lastStep === undefined || lastStep.op.opcode === opcodes_1.OPCODES.SSTORE) {
258
- storage = await getStorage(stateManager, step.address);
259
- }
260
- else {
261
- storage = lastStep.storage;
262
- }
263
- const gasCost = BigInt(step.opcode.fee);
264
- const dynamicGasCost = step.opcode.dynamicFee === undefined ? gasCost : step.opcode.dynamicFee;
265
- // First translate the basic VM state
266
- const vmState = {
267
- evmStack,
268
- memory,
269
- storage,
270
- op,
271
- pc: step.pc,
272
- gasCost,
273
- dynamicGasCost,
274
- gas: step.gasLeft,
275
- depth: step.depth + 1, // Match geth's depth starting at 1
276
- address: step.address,
277
- codeAddress: step.codeAddress
278
- };
279
- const [code, codeMdHash] = await this.getCodeAndMdHash(vm, vmState, trace);
280
- await this.adjustStackFrame(stack, vmState, trace, code, codeMdHash);
281
- const curExtFrame = lastExternalFrame(stack);
282
- let src;
283
- let astNode;
284
- try {
285
- [src, astNode] = this.decodeSourceLoc(step.pc, curExtFrame);
286
- }
287
- catch (e) {
288
- // Nothing to do
289
- }
290
- let emittedEvent = undefined;
291
- // Finally check if an event is being emitted for this step
292
- if (step.opcode.name.startsWith("LOG")) {
293
- const off = (0, utils_2.bigEndianBufToNumber)(evmStack[evmStack.length - 1]);
294
- const size = (0, utils_2.bigEndianBufToNumber)(evmStack[evmStack.length - 2]);
295
- const nTopics = step.opcode.name[3] - "0";
296
- const payload = memory.slice(off, off + size);
297
- emittedEvent = {
298
- payload,
299
- topics: evmStack
300
- .slice(evmStack.length - 2 - nTopics, evmStack.length - 2)
301
- .reverse()
302
- .map(__1.bigEndianBufToBigint)
303
- };
304
- }
305
- return {
306
- ...vmState,
307
- code,
308
- codeMdHash,
309
- stack: [...stack],
310
- src,
311
- astNode,
312
- emittedEvent,
313
- contractInfo: curExtFrame.info
314
- };
315
- }
316
- static async getEVM(opts, foundryCheatcodes) {
317
- const tmpEvm = await evm_1.EVM.create(opts);
318
- if (!foundryCheatcodes) {
319
- return tmpEvm;
320
- }
321
- const opcodes = (0, evm_1.getOpcodesForHF)(tmpEvm.common);
322
- const [precompile, foundryCtx] = (0, foundry_cheatcodes_1.makeFoundryCheatcodePrecompile)();
323
- const optsCopy = {
324
- ...opts,
325
- customOpcodes: [
326
- ...(opts.customOpcodes ? opts.customOpcodes : []),
327
- ...(0, opcode_interposing_1.foundryInterposedOps)(opcodes, foundryCtx)
328
- ],
329
- customPrecompiles: [
330
- ...(opts.customPrecompiles ? opts.customPrecompiles : []),
331
- {
332
- address: foundry_cheatcodes_1.FoundryCheatcodesAddress,
333
- function: precompile
334
- }
335
- ]
336
- };
337
- const res = await evm_1.EVM.create(optsCopy);
338
- foundry_cheatcodes_1.foundryCtxMap.set(res, foundryCtx);
339
- return res;
340
- }
341
- /**
342
- * Releases references to the EVM stored inside VM from the
343
- * `interpRunListeners` map. This avoids memory leaks when repeatedly
344
- * calling the debugger on different transactions. Should be called once
345
- * for every vm created by `SolTxDebugger.createVm` after its done being
346
- * used.
347
- */
348
- static releaseVM(vm) {
349
- const evm = vmToEVMMap.get(vm);
350
- if (evm) {
351
- foundry_cheatcodes_1.foundryCtxMap.delete(evm);
352
- }
353
- vmToEVMMap.delete(vm);
354
- }
355
- static async createVm(stateManager, foundryCheatcodes) {
356
- const common = new common_1.Common({ chain: common_1.Chain.Mainnet, hardfork: common_1.Hardfork.Shanghai });
357
- const blockchain = await blockchain_1.Blockchain.create({ common });
358
- if (!stateManager) {
359
- stateManager = new statemanager_1.DefaultStateManager();
360
- }
361
- const evm = await SolTxDebugger.getEVM({ common, blockchain, stateManager, allowUnlimitedContractSize: true }, foundryCheatcodes);
362
- const vm = await vm_1.VM.create({
363
- common,
364
- blockchain,
365
- stateManager,
366
- evm,
367
- activatePrecompiles: true
368
- });
369
- vmToEVMMap.set(vm, evm);
370
- return vm;
371
- }
372
- async debugTx(tx, block, stateManager) {
373
- const vm = await SolTxDebugger.createVm(stateManager.shallowCopy(true), this.foundryCheatcodes);
374
- const sender = tx.getSenderAddress().toString();
375
- const receiver = tx.to === undefined ? __1.ZERO_ADDRESS_STRING : tx.to.toString();
376
- const isCreation = receiver === __1.ZERO_ADDRESS_STRING;
377
- const stack = [];
378
- let curFrame;
379
- if (isCreation) {
380
- curFrame = await this.makeCreationFrame(sender, tx.data, 0);
381
- }
382
- else {
383
- (0, solc_typed_ast_1.assert)(tx.to !== undefined, 'Expected "to" of tx {0} to be defined, got undefined instead', (0, utils_1.bytesToHex)(tx.hash()));
384
- const code = await vm.stateManager.getContractCode(tx.to);
385
- /// @todo remove - arbitrary restriction, only good for debugging
386
- (0, solc_typed_ast_1.assert)(code.length > 0, "Missing code for address {0}", tx.to.toString());
387
- const codeHash = (0, artifacts_1.getCodeHash)(code);
388
- curFrame = await this.makeCallFrame(sender, tx.to, tx.data, code, codeHash, 0);
389
- }
390
- stack.push(curFrame);
391
- const trace = [];
392
- (0, solc_typed_ast_1.assert)(vm.evm.events !== undefined, "Unable to access EVM events at this point");
393
- vm.evm.events.on("step", async (step, next) => {
394
- const curStep = await this.processRawTraceStep(vm, vm.stateManager, step, trace, stack);
395
- trace.push(curStep);
396
- next();
397
- });
398
- const txRes = await vm.runTx({
399
- tx,
400
- block,
401
- skipBalance: true,
402
- skipNonce: true,
403
- skipBlockGasLimitValidation: true
404
- });
405
- SolTxDebugger.releaseVM(vm);
406
- return [trace, txRes];
407
- }
408
- /**
409
- * Build a `CreationFrame` from the given `sender` address, `data` `Uint8Array`(msg.data) and the current trace step number.
410
- */
411
- async makeCreationFrame(sender, data, step) {
412
- const contractInfo = await this.artifactManager.getContractFromCreationBytecode(data);
413
- let args;
414
- const callee = contractInfo && contractInfo.ast ? contractInfo.ast.vConstructor : undefined;
415
- if (contractInfo && callee instanceof solc_typed_ast_1.FunctionDefinition) {
416
- // TODO: Try and find the arguments inside the creation code and decode them
417
- }
418
- return {
419
- kind: types_1.FrameKind.Creation,
420
- sender,
421
- msgData: data,
422
- creationCode: data,
423
- info: contractInfo,
424
- callee,
425
- address: __1.ZERO_ADDRESS,
426
- startStep: step,
427
- arguments: args
428
- };
429
- }
430
- /**
431
- * Given a contract info and a function selector find the (potentially inherited) entry point (function or public var getter).
432
- * @param info
433
- * @param selector
434
- * @returns
435
- */
436
- findEntryPoint(info, selector) {
437
- if (info.ast === undefined) {
438
- return undefined;
439
- }
440
- const contract = info.ast;
441
- const infer = this.artifactManager.infer(info.artifact.compilerVersion);
442
- return (0, abi_1.findMethodBySelector)(selector, contract, infer);
443
- }
444
- /**
445
- * Build a `CallFrame` from the given `sender` address, `receiver` address, `data` `Uint8Array`, (msg.data) and the current trace step number.
446
- */
447
- async makeCallFrame(sender, receiver, data, receiverCode, codeHash, step) {
448
- const contractInfo = codeHash === undefined
449
- ? codeHash
450
- : this.artifactManager.getContractFromMDHash(codeHash);
451
- const selector = (0, utils_1.bytesToHex)(data.slice(0, 4));
452
- let callee;
453
- let args;
454
- if (contractInfo && contractInfo.ast) {
455
- const abiVersion = contractInfo.artifact.abiEncoderVersion;
456
- const infer = this.artifactManager.infer(contractInfo.artifact.compilerVersion);
457
- callee = this.findEntryPoint(contractInfo, selector);
458
- if (callee !== undefined) {
459
- try {
460
- args = (0, abi_1.buildMsgDataViews)(callee, data, types_1.DataLocationKind.CallData, infer, abiVersion);
461
- }
462
- catch (e) {
463
- args = undefined;
464
- }
465
- }
466
- }
467
- return {
468
- kind: types_1.FrameKind.Call,
469
- sender,
470
- msgData: data,
471
- receiver: receiver.toString(),
472
- code: receiverCode,
473
- info: contractInfo,
474
- callee,
475
- address: receiver,
476
- startStep: step,
477
- arguments: args
478
- };
479
- }
480
- /**
481
- * Helper function to get the source information for the instruction at a given `instrOffset`,
482
- * in the context of the external call `ctx`.
483
- *
484
- * There are several cases this handles:
485
- *
486
- * 1. If there is no debug info for the contract executing in `ctx` return undefined
487
- * 2. If there is debug info, but no AST return only the decoded bytecode sourcemap entry
488
- * 3. If there is both debug info and an AST return the decoded source location and any AST nodes that match this location
489
- */
490
- decodeSourceLoc(instrOffset, ctx) {
491
- if (!ctx.info) {
492
- return [undefined, undefined];
493
- }
494
- const bytecodeInfo = ctx.kind === types_1.FrameKind.Creation ? ctx.info.bytecode : ctx.info.deployedBytecode;
495
- const src = (0, artifact_manager_1.getOffsetSrc)(instrOffset, bytecodeInfo);
496
- const astNode = ctx.info.artifact.srcMap.get(`${src.start}:${src.length}:${src.sourceIndex}`);
497
- return [src, astNode];
498
- }
499
- /**
500
- * WIP: TODO document
501
- * TODO: Rename - this function doesn't do any actual decoding - just building up DataView for the arguments
502
- * of a function
503
- */
504
- decodeFunArgs(callee, stack, contractInfo) {
505
- const res = [];
506
- let formals;
507
- const infer = this.artifactManager.infer(contractInfo.artifact.compilerVersion);
508
- try {
509
- formals =
510
- callee instanceof solc_typed_ast_1.FunctionDefinition
511
- ? callee.vParameters.vParameters.map((argDef) => [
512
- argDef.name,
513
- infer.variableDeclarationToTypeNode(argDef)
514
- ])
515
- : infer
516
- .getterArgsAndReturn(callee)[0]
517
- .map((typ, i) => [`ARG_${i}`, typ]);
518
- }
519
- catch (e) {
520
- // `variableDeclarationToTypeNode` may fail when referencing structs/contracts that are defined
521
- // in SourceUnits that are missing
522
- return undefined;
523
- }
524
- let offsetFromTop = -1;
525
- for (let i = formals.length - 1; i >= 0; i--) {
526
- const [name, typ] = formals[i];
527
- const stackSize = (0, decoding_1.isCalldataType2Slots)(typ) ? 2 : 1;
528
- offsetFromTop += stackSize;
529
- if (offsetFromTop > stack.length) {
530
- // Stack underflow. Could be due to optimized code?
531
- return undefined;
532
- }
533
- res.unshift([
534
- name,
535
- {
536
- type: typ,
537
- loc: {
538
- kind: types_1.DataLocationKind.Stack,
539
- offsetFromTop
540
- }
541
- }
542
- ]);
543
- }
544
- return res;
545
- }
546
- }
547
- exports.SolTxDebugger = SolTxDebugger;
548
- //# sourceMappingURL=sol_debugger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sol_debugger.js","sourceRoot":"","sources":["../../src/debug/sol_debugger.ts"],"names":[],"mappings":"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"}