sol-dbg 0.4.2 → 0.6.1
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/dist/debug/decoding/general.d.ts +2 -1
- package/dist/debug/decoding/general.d.ts.map +1 -1
- package/dist/debug/decoding/general.js +8 -7
- package/dist/debug/decoding/general.js.map +1 -1
- package/dist/debug/decoding/storage.d.ts +6 -3
- package/dist/debug/decoding/storage.d.ts.map +1 -1
- package/dist/debug/decoding/storage.js +73 -13
- package/dist/debug/decoding/storage.js.map +1 -1
- package/dist/debug/foundry_cheatcodes.d.ts +2 -1
- package/dist/debug/foundry_cheatcodes.d.ts.map +1 -1
- package/dist/debug/foundry_cheatcodes.js +4 -0
- package/dist/debug/foundry_cheatcodes.js.map +1 -1
- package/dist/debug/index.d.ts +2 -1
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/debug/index.js +2 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/layout.d.ts +9 -0
- package/dist/debug/layout.d.ts.map +1 -0
- package/dist/debug/layout.js +80 -0
- package/dist/debug/layout.js.map +1 -0
- package/dist/debug/tracers/base_tracer.d.ts +33 -0
- package/dist/debug/tracers/base_tracer.d.ts.map +1 -0
- package/dist/debug/tracers/base_tracer.js +118 -0
- package/dist/debug/tracers/base_tracer.js.map +1 -0
- package/dist/debug/tracers/index.d.ts +5 -0
- package/dist/debug/tracers/index.d.ts.map +1 -0
- package/dist/debug/tracers/index.js +21 -0
- package/dist/debug/tracers/index.js.map +1 -0
- package/dist/debug/tracers/sol_debugger.d.ts +9 -0
- package/dist/debug/tracers/sol_debugger.d.ts.map +1 -0
- package/dist/debug/tracers/sol_debugger.js +22 -0
- package/dist/debug/tracers/sol_debugger.js.map +1 -0
- package/dist/debug/tracers/support_tracer.d.ts +15 -0
- package/dist/debug/tracers/support_tracer.d.ts.map +1 -0
- package/dist/debug/tracers/support_tracer.js +22 -0
- package/dist/debug/tracers/support_tracer.js.map +1 -0
- package/dist/debug/tracers/transformers/basic_info.d.ts +25 -0
- package/dist/debug/tracers/transformers/basic_info.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/basic_info.js +54 -0
- package/dist/debug/tracers/transformers/basic_info.js.map +1 -0
- package/dist/debug/tracers/transformers/contract_lifetime.d.ts +21 -0
- package/dist/debug/tracers/transformers/contract_lifetime.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/contract_lifetime.js +70 -0
- package/dist/debug/tracers/transformers/contract_lifetime.js.map +1 -0
- package/dist/debug/tracers/transformers/events.d.ts +12 -0
- package/dist/debug/tracers/transformers/events.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/events.js +30 -0
- package/dist/debug/tracers/transformers/events.js.map +1 -0
- package/dist/debug/tracers/transformers/ext_stack.d.ts +17 -0
- package/dist/debug/tracers/transformers/ext_stack.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/ext_stack.js +200 -0
- package/dist/debug/tracers/transformers/ext_stack.js.map +1 -0
- package/dist/debug/tracers/transformers/index.d.ts +12 -0
- package/dist/debug/tracers/transformers/index.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/index.js +25 -0
- package/dist/debug/tracers/transformers/index.js.map +1 -0
- package/dist/debug/tracers/transformers/int_stack.d.ts +13 -0
- package/dist/debug/tracers/transformers/int_stack.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/int_stack.js +139 -0
- package/dist/debug/tracers/transformers/int_stack.js.map +1 -0
- package/dist/debug/tracers/transformers/keccak256_invert.d.ts +29 -0
- package/dist/debug/tracers/transformers/keccak256_invert.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/keccak256_invert.js +65 -0
- package/dist/debug/tracers/transformers/keccak256_invert.js.map +1 -0
- package/dist/debug/tracers/transformers/op.d.ts +11 -0
- package/dist/debug/tracers/transformers/op.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/op.js +11 -0
- package/dist/debug/tracers/transformers/op.js.map +1 -0
- package/dist/debug/tracers/transformers/source.d.ts +26 -0
- package/dist/debug/tracers/transformers/source.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/source.js +38 -0
- package/dist/debug/tracers/transformers/source.js.map +1 -0
- package/dist/debug/types.d.ts +3 -6
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/types.js +8 -0
- package/dist/debug/types.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/map.d.ts +5 -0
- package/dist/utils/map.d.ts.map +1 -0
- package/dist/utils/map.js +12 -0
- package/dist/utils/map.js.map +1 -0
- package/dist/utils/pp.d.ts +4 -2
- package/dist/utils/pp.d.ts.map +1 -1
- package/dist/utils/pp.js +22 -10
- package/dist/utils/pp.js.map +1 -1
- package/dist/utils/set.d.ts +9 -0
- package/dist/utils/set.d.ts.map +1 -0
- package/dist/utils/set.js +21 -0
- package/dist/utils/set.js.map +1 -0
- package/dist/utils/test_runner.d.ts +22 -10
- package/dist/utils/test_runner.d.ts.map +1 -1
- package/dist/utils/test_runner.js +73 -33
- package/dist/utils/test_runner.js.map +1 -1
- package/package.json +1 -1
- package/dist/debug/sol_debugger.d.ts +0 -107
- package/dist/debug/sol_debugger.d.ts.map +0 -1
- package/dist/debug/sol_debugger.js +0 -521
- package/dist/debug/sol_debugger.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Block } from "@ethereumjs/block";
|
|
2
|
+
import { EVMStateManagerInterface } from "@ethereumjs/common";
|
|
3
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
4
|
+
import { TypedTransaction } from "@ethereumjs/tx";
|
|
5
|
+
import { RunTxResult, VM } from "@ethereumjs/vm";
|
|
6
|
+
import { IArtifactManager } from "../artifact_manager";
|
|
7
|
+
export interface TracerOpts {
|
|
8
|
+
strict?: boolean;
|
|
9
|
+
foundryCheatcodes?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface FoundryTxResult extends RunTxResult {
|
|
12
|
+
failCalled: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare abstract class BaseSolTxTracer<State> {
|
|
15
|
+
artifactManager: IArtifactManager;
|
|
16
|
+
protected readonly strict: boolean;
|
|
17
|
+
protected readonly foundryCheatcodes: boolean;
|
|
18
|
+
constructor(artifactManager: IArtifactManager, opts?: TracerOpts);
|
|
19
|
+
private static getEVM;
|
|
20
|
+
/**
|
|
21
|
+
* Releases references to the EVM stored inside VM from the
|
|
22
|
+
* `interpRunListeners` map. This avoids memory leaks when repeatedly
|
|
23
|
+
* calling the debugger on different transactions. Should be called once
|
|
24
|
+
* for every vm created by `SolTxDebugger.createVm` after its done being
|
|
25
|
+
* used.
|
|
26
|
+
*/
|
|
27
|
+
static releaseVM(vm: VM): void;
|
|
28
|
+
static createVm(stateManager: EVMStateManagerInterface | undefined, foundryCheatcodes: boolean): Promise<VM>;
|
|
29
|
+
abstract processRawTraceStep(vm: VM, step: InterpreterStep, trace: State[], tx: TypedTransaction): Promise<State>;
|
|
30
|
+
debugTx(tx: TypedTransaction, block: Block | undefined, // TODO: Make block required and add to processRawTraceStep
|
|
31
|
+
stateBefore: EVMStateManagerInterface): Promise<[State[], FoundryTxResult, EVMStateManagerInterface]>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=base_tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base_tracer.d.ts","sourceRoot":"","sources":["../../../src/debug/tracers/base_tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAiB,wBAAwB,EAAY,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAwB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAUvD,MAAM,WAAW,UAAU;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD,UAAU,EAAE,OAAO,CAAC;CACvB;AAQD,8BAAsB,eAAe,CAAC,KAAK;IACvC,eAAe,EAAG,gBAAgB,CAAC;IACnC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACnC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;gBAElC,eAAe,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,UAAU;mBAgB3C,MAAM;IA8B3B;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;WAUjB,QAAQ,CACjB,YAAY,EAAE,wBAAwB,GAAG,SAAS,EAClD,iBAAiB,EAAE,OAAO,GAC3B,OAAO,CAAC,EAAE,CAAC;IA0Bd,QAAQ,CAAC,mBAAmB,CACxB,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,KAAK,EAAE,EACd,EAAE,EAAE,gBAAgB,GACrB,OAAO,CAAC,KAAK,CAAC;IAEX,OAAO,CACT,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,2DAA2D;IACrF,WAAW,EAAE,wBAAwB,GACtC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;CAyCnE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseSolTxTracer = void 0;
|
|
4
|
+
const blockchain_1 = require("@ethereumjs/blockchain");
|
|
5
|
+
const common_1 = require("@ethereumjs/common");
|
|
6
|
+
const evm_1 = require("@ethereumjs/evm");
|
|
7
|
+
const statemanager_1 = require("@ethereumjs/statemanager");
|
|
8
|
+
const vm_1 = require("@ethereumjs/vm");
|
|
9
|
+
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
10
|
+
const foundry_cheatcodes_1 = require("../foundry_cheatcodes");
|
|
11
|
+
const opcode_interposing_1 = require("../opcode_interposing");
|
|
12
|
+
/**
|
|
13
|
+
* Private map tracking VM-to-EVM mapping, used when releasing EVMs from the
|
|
14
|
+
* global listener map for foundry cheatcodes.
|
|
15
|
+
*/
|
|
16
|
+
const vmToEVMMap = new Map();
|
|
17
|
+
class BaseSolTxTracer {
|
|
18
|
+
constructor(artifactManager, opts) {
|
|
19
|
+
this.artifactManager = artifactManager;
|
|
20
|
+
this.strict = true;
|
|
21
|
+
this.foundryCheatcodes = false;
|
|
22
|
+
if (opts) {
|
|
23
|
+
this.strict = opts.strict !== undefined ? opts.strict : this.strict;
|
|
24
|
+
this.foundryCheatcodes =
|
|
25
|
+
opts.foundryCheatcodes !== undefined
|
|
26
|
+
? opts.foundryCheatcodes
|
|
27
|
+
: this.foundryCheatcodes;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static async getEVM(opts, foundryCheatcodes) {
|
|
31
|
+
const tmpEvm = await evm_1.EVM.create(opts);
|
|
32
|
+
if (!foundryCheatcodes) {
|
|
33
|
+
return tmpEvm;
|
|
34
|
+
}
|
|
35
|
+
const opcodes = (0, evm_1.getOpcodesForHF)(tmpEvm.common);
|
|
36
|
+
const [precompile, foundryCtx] = (0, foundry_cheatcodes_1.makeFoundryCheatcodePrecompile)();
|
|
37
|
+
const optsCopy = {
|
|
38
|
+
...opts,
|
|
39
|
+
customOpcodes: [
|
|
40
|
+
...(opts.customOpcodes ? opts.customOpcodes : []),
|
|
41
|
+
...(0, opcode_interposing_1.foundryInterposedOps)(opcodes, foundryCtx)
|
|
42
|
+
],
|
|
43
|
+
customPrecompiles: [
|
|
44
|
+
...(opts.customPrecompiles ? opts.customPrecompiles : []),
|
|
45
|
+
{
|
|
46
|
+
address: foundry_cheatcodes_1.FoundryCheatcodesAddress,
|
|
47
|
+
function: precompile
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
const res = await evm_1.EVM.create(optsCopy);
|
|
52
|
+
foundry_cheatcodes_1.foundryCtxMap.set(res, foundryCtx);
|
|
53
|
+
return res;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Releases references to the EVM stored inside VM from the
|
|
57
|
+
* `interpRunListeners` map. This avoids memory leaks when repeatedly
|
|
58
|
+
* calling the debugger on different transactions. Should be called once
|
|
59
|
+
* for every vm created by `SolTxDebugger.createVm` after its done being
|
|
60
|
+
* used.
|
|
61
|
+
*/
|
|
62
|
+
static releaseVM(vm) {
|
|
63
|
+
const evm = vmToEVMMap.get(vm);
|
|
64
|
+
if (evm) {
|
|
65
|
+
foundry_cheatcodes_1.foundryCtxMap.delete(evm);
|
|
66
|
+
}
|
|
67
|
+
vmToEVMMap.delete(vm);
|
|
68
|
+
}
|
|
69
|
+
static async createVm(stateManager, foundryCheatcodes) {
|
|
70
|
+
const common = new common_1.Common({ chain: common_1.Chain.Mainnet, hardfork: common_1.Hardfork.Shanghai });
|
|
71
|
+
const blockchain = await blockchain_1.Blockchain.create({ common });
|
|
72
|
+
if (!stateManager) {
|
|
73
|
+
stateManager = new statemanager_1.DefaultStateManager();
|
|
74
|
+
}
|
|
75
|
+
const evm = await BaseSolTxTracer.getEVM({ common, blockchain, stateManager, allowUnlimitedContractSize: true }, foundryCheatcodes);
|
|
76
|
+
const vm = await vm_1.VM.create({
|
|
77
|
+
common,
|
|
78
|
+
blockchain,
|
|
79
|
+
stateManager,
|
|
80
|
+
evm,
|
|
81
|
+
activatePrecompiles: true
|
|
82
|
+
});
|
|
83
|
+
vmToEVMMap.set(vm, evm);
|
|
84
|
+
return vm;
|
|
85
|
+
}
|
|
86
|
+
async debugTx(tx, block, // TODO: Make block required and add to processRawTraceStep
|
|
87
|
+
stateBefore) {
|
|
88
|
+
const vm = await BaseSolTxTracer.createVm(stateBefore.shallowCopy(true), this.foundryCheatcodes);
|
|
89
|
+
const trace = [];
|
|
90
|
+
(0, solc_typed_ast_1.assert)(vm.evm.events !== undefined, "Unable to access EVM events at this point");
|
|
91
|
+
vm.evm.events.on("step", async (step, next) => {
|
|
92
|
+
const curStep = await this.processRawTraceStep(vm, step, trace, tx);
|
|
93
|
+
trace.push(curStep);
|
|
94
|
+
next();
|
|
95
|
+
});
|
|
96
|
+
const txRes = await vm.runTx({
|
|
97
|
+
tx,
|
|
98
|
+
block,
|
|
99
|
+
skipBalance: true,
|
|
100
|
+
skipNonce: true,
|
|
101
|
+
skipBlockGasLimitValidation: true
|
|
102
|
+
});
|
|
103
|
+
const foundryCtx = (0, foundry_cheatcodes_1.getFoundryCtx)(vm.evm);
|
|
104
|
+
const foundryFailCalled = foundryCtx !== undefined ? foundryCtx.failCalled : false;
|
|
105
|
+
const stateAfter = vm.stateManager;
|
|
106
|
+
BaseSolTxTracer.releaseVM(vm);
|
|
107
|
+
return [
|
|
108
|
+
trace,
|
|
109
|
+
{
|
|
110
|
+
...txRes,
|
|
111
|
+
failCalled: foundryFailCalled
|
|
112
|
+
},
|
|
113
|
+
stateAfter
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.BaseSolTxTracer = BaseSolTxTracer;
|
|
118
|
+
//# sourceMappingURL=base_tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base_tracer.js","sourceRoot":"","sources":["../../../src/debug/tracers/base_tracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/debug/tracers/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./base_tracer"), exports);
|
|
18
|
+
__exportStar(require("./sol_debugger"), exports);
|
|
19
|
+
__exportStar(require("./support_tracer"), exports);
|
|
20
|
+
__exportStar(require("./transformers"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/debug/tracers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,iDAA+B;AAC/B,mDAAiC;AACjC,iDAA+B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { TypedTransaction } from "@ethereumjs/tx";
|
|
3
|
+
import { VM } from "@ethereumjs/vm";
|
|
4
|
+
import { StepState } from "../types";
|
|
5
|
+
import { BaseSolTxTracer } from "./base_tracer";
|
|
6
|
+
export declare class SolTxDebugger extends BaseSolTxTracer<StepState> {
|
|
7
|
+
processRawTraceStep(vm: VM, step: InterpreterStep, trace: StepState[], tx: TypedTransaction): Promise<StepState>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=sol_debugger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sol_debugger.d.ts","sourceRoot":"","sources":["../../../src/debug/tracers/sol_debugger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,qBAAa,aAAc,SAAQ,eAAe,CAAC,SAAS,CAAC;IACnD,mBAAmB,CACrB,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,EAAE,EAAE,gBAAgB,GACrB,OAAO,CAAC,SAAS,CAAC;CAyBxB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolTxDebugger = void 0;
|
|
4
|
+
const base_tracer_1 = require("./base_tracer");
|
|
5
|
+
const transformers_1 = require("./transformers");
|
|
6
|
+
const events_1 = require("./transformers/events");
|
|
7
|
+
const ext_stack_1 = require("./transformers/ext_stack");
|
|
8
|
+
const int_stack_1 = require("./transformers/int_stack");
|
|
9
|
+
const source_1 = require("./transformers/source");
|
|
10
|
+
class SolTxDebugger extends base_tracer_1.BaseSolTxTracer {
|
|
11
|
+
async processRawTraceStep(vm, step, trace, tx) {
|
|
12
|
+
const opInfo = (0, transformers_1.addOpInfo)(vm, step, {});
|
|
13
|
+
const basicInfo = await (0, transformers_1.addBasicInfo)(vm, step, opInfo, trace);
|
|
14
|
+
const extFrameInfo = await (0, ext_stack_1.addExternalFrame)(vm, step, basicInfo, trace, this.artifactManager, tx);
|
|
15
|
+
const source = await (0, source_1.addSource)(vm, step, extFrameInfo);
|
|
16
|
+
const intStack = await (0, int_stack_1.addInternalFrame)(vm, step, source, trace, this.artifactManager, this.strict);
|
|
17
|
+
const events = await (0, events_1.addEventInfo)(vm, step, intStack);
|
|
18
|
+
return events;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.SolTxDebugger = SolTxDebugger;
|
|
22
|
+
//# sourceMappingURL=sol_debugger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sol_debugger.js","sourceRoot":"","sources":["../../../src/debug/tracers/sol_debugger.ts"],"names":[],"mappings":";;;AAIA,+CAAgD;AAChD,iDAAyD;AACzD,kDAAqD;AACrD,wDAA4D;AAC5D,wDAA4D;AAC5D,kDAAkD;AAElD,MAAa,aAAc,SAAQ,6BAA0B;IACzD,KAAK,CAAC,mBAAmB,CACrB,EAAM,EACN,IAAqB,EACrB,KAAkB,EAClB,EAAoB;QAEpB,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,IAAA,2BAAY,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,IAAA,4BAAgB,EACvC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,KAAK,EACL,IAAI,CAAC,eAAe,EACpB,EAAE,CACL,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAS,EAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAA,4BAAgB,EACnC,EAAE,EACF,IAAI,EACJ,MAAM,EACN,KAAK,EACL,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,MAAM,CACd,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAY,EAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEtD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AA/BD,sCA+BC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { TypedTransaction } from "@ethereumjs/tx";
|
|
3
|
+
import { VM } from "@ethereumjs/vm";
|
|
4
|
+
import { BaseSolTxTracer } from "./base_tracer";
|
|
5
|
+
import { BasicStepInfo, ContractLifeTimeInfo, ExternalFrameInfo, Keccak256InvertInfo } from "./transformers";
|
|
6
|
+
export type SupportTracerStepInfo = BasicStepInfo & ExternalFrameInfo & ContractLifeTimeInfo & Keccak256InvertInfo;
|
|
7
|
+
/**
|
|
8
|
+
* This tracer computes contract lifetime information and keccak256 pre-images for a TX.
|
|
9
|
+
* The information it collects supports the debugging for the main SolTxDebugger tracer.
|
|
10
|
+
* It is more-light weight and is ran by the TestRunner for all TXs, even if we are not going to debug them.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SupportTracer extends BaseSolTxTracer<SupportTracerStepInfo> {
|
|
13
|
+
processRawTraceStep(vm: VM, step: InterpreterStep, trace: SupportTracerStepInfo[], tx: TypedTransaction): Promise<SupportTracerStepInfo>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=support_tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"support_tracer.d.ts","sourceRoot":"","sources":["../../../src/debug/tracers/support_tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAMH,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAC7C,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,CAAC;AACxB;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,eAAe,CAAC,qBAAqB,CAAC;IAC/D,mBAAmB,CACrB,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,qBAAqB,EAAE,EAC9B,EAAE,EAAE,gBAAgB,GACrB,OAAO,CAAC,qBAAqB,CAAC;CAgBpC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SupportTracer = void 0;
|
|
4
|
+
const base_tracer_1 = require("./base_tracer");
|
|
5
|
+
const transformers_1 = require("./transformers");
|
|
6
|
+
/**
|
|
7
|
+
* This tracer computes contract lifetime information and keccak256 pre-images for a TX.
|
|
8
|
+
* The information it collects supports the debugging for the main SolTxDebugger tracer.
|
|
9
|
+
* It is more-light weight and is ran by the TestRunner for all TXs, even if we are not going to debug them.
|
|
10
|
+
*/
|
|
11
|
+
class SupportTracer extends base_tracer_1.BaseSolTxTracer {
|
|
12
|
+
async processRawTraceStep(vm, step, trace, tx) {
|
|
13
|
+
const opInfo = (0, transformers_1.addOpInfo)(vm, step, {});
|
|
14
|
+
const basicInfo = await (0, transformers_1.addBasicInfo)(vm, step, opInfo, trace);
|
|
15
|
+
const extFrameInfo = await (0, transformers_1.addExternalFrame)(vm, step, basicInfo, trace, this.artifactManager, tx);
|
|
16
|
+
const contracLifetimeInfo = (0, transformers_1.addContractLifetimeInfo)(vm, step, extFrameInfo, trace);
|
|
17
|
+
const keccakInfo = (0, transformers_1.addKeccakInvertInfo)(vm, step, contracLifetimeInfo, trace);
|
|
18
|
+
return keccakInfo;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.SupportTracer = SupportTracer;
|
|
22
|
+
//# sourceMappingURL=support_tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"support_tracer.js","sourceRoot":"","sources":["../../../src/debug/tracers/support_tracer.ts"],"names":[],"mappings":";;;AAGA,+CAAgD;AAChD,iDAUwB;AAMxB;;;;GAIG;AACH,MAAa,aAAc,SAAQ,6BAAsC;IACrE,KAAK,CAAC,mBAAmB,CACrB,EAAM,EACN,IAAqB,EACrB,KAA8B,EAC9B,EAAoB;QAEpB,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,IAAA,2BAAY,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,IAAA,+BAAgB,EACvC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,KAAK,EACL,IAAI,CAAC,eAAe,EACpB,EAAE,CACL,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAA,sCAAuB,EAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACnF,MAAM,UAAU,GAAG,IAAA,kCAAmB,EAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAE7E,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ;AAtBD,sCAsBC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EVMStateManagerInterface } from "@ethereumjs/common";
|
|
2
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
3
|
+
import { Address } from "@ethereumjs/util";
|
|
4
|
+
import { VM } from "@ethereumjs/vm";
|
|
5
|
+
import { EVMOpInfo } from "../../opcodes";
|
|
6
|
+
import { Memory, Stack, Storage } from "../../types";
|
|
7
|
+
import { OpInfo } from "./op";
|
|
8
|
+
export declare function getStorage(manager: EVMStateManagerInterface, addr: Address): Promise<Storage>;
|
|
9
|
+
export interface BasicStepInfo {
|
|
10
|
+
evmStack: Stack;
|
|
11
|
+
memory: Memory;
|
|
12
|
+
storage: Storage;
|
|
13
|
+
op: EVMOpInfo;
|
|
14
|
+
pc: number;
|
|
15
|
+
gasCost: bigint;
|
|
16
|
+
dynamicGasCost: bigint;
|
|
17
|
+
gas: bigint;
|
|
18
|
+
depth: number;
|
|
19
|
+
address: Address;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Adds cleaner typed version of the low-level debugging information
|
|
23
|
+
*/
|
|
24
|
+
export declare function addBasicInfo<T extends object & OpInfo>(vm: VM, step: InterpreterStep, state: T, trace: Array<T & BasicStepInfo>): Promise<T & BasicStepInfo>;
|
|
25
|
+
//# sourceMappingURL=basic_info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic_info.d.ts","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/basic_info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,OAAO,EAAiB,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAIpC,OAAO,EAAE,SAAS,EAA0B,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,wBAAsB,UAAU,CAC5B,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACxD,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,aAAa,CAAC,GAChC,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAiC5B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStorage = getStorage;
|
|
4
|
+
exports.addBasicInfo = addBasicInfo;
|
|
5
|
+
const rlp_1 = require("@ethereumjs/rlp");
|
|
6
|
+
const util_1 = require("@ethereumjs/util");
|
|
7
|
+
const utils_1 = require("ethereum-cryptography/utils");
|
|
8
|
+
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
9
|
+
const utils_2 = require("../../../utils");
|
|
10
|
+
const opcodes_1 = require("../../opcodes");
|
|
11
|
+
async function getStorage(manager, addr) {
|
|
12
|
+
const rawStorage = await manager.dumpStorage(addr);
|
|
13
|
+
const storageEntries = [];
|
|
14
|
+
for (const [keyStr, valStr] of Object.entries(rawStorage)) {
|
|
15
|
+
const decoded = rlp_1.RLP.decode((0, utils_1.hexToBytes)(valStr));
|
|
16
|
+
(0, solc_typed_ast_1.assert)(decoded instanceof Uint8Array, "");
|
|
17
|
+
const valBuf = (0, util_1.setLengthLeft)(decoded, 32);
|
|
18
|
+
storageEntries.push([BigInt(keyStr), valBuf]);
|
|
19
|
+
}
|
|
20
|
+
return utils_2.ImmMap.fromEntries(storageEntries);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Adds cleaner typed version of the low-level debugging information
|
|
24
|
+
*/
|
|
25
|
+
async function addBasicInfo(vm, step, state, trace) {
|
|
26
|
+
const evmStack = step.stack.map((word) => (0, utils_2.bigIntToBuf)(word, 32, "big"));
|
|
27
|
+
const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
|
|
28
|
+
const memory = lastStep === undefined || (0, opcodes_1.changesMemory)(lastStep.op)
|
|
29
|
+
? new Uint8Array(step.memory)
|
|
30
|
+
: lastStep.memory;
|
|
31
|
+
let storage;
|
|
32
|
+
if (lastStep === undefined || lastStep.op.opcode === opcodes_1.OPCODES.SSTORE) {
|
|
33
|
+
/** @todo the way we use getStorage we dont take advantage of ImmMap! This is inefficient */
|
|
34
|
+
storage = await getStorage(vm.stateManager, step.address);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
storage = lastStep.storage;
|
|
38
|
+
}
|
|
39
|
+
const gasCost = BigInt(step.opcode.fee);
|
|
40
|
+
const dynamicGasCost = step.opcode.dynamicFee === undefined ? gasCost : step.opcode.dynamicFee;
|
|
41
|
+
return {
|
|
42
|
+
evmStack,
|
|
43
|
+
memory,
|
|
44
|
+
storage,
|
|
45
|
+
...state,
|
|
46
|
+
pc: step.pc,
|
|
47
|
+
gasCost,
|
|
48
|
+
dynamicGasCost,
|
|
49
|
+
gas: step.gasLeft,
|
|
50
|
+
depth: step.depth + 1,
|
|
51
|
+
address: step.address
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=basic_info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic_info.js","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/basic_info.ts"],"names":[],"mappings":";;AAYA,gCAgBC;AAkBD,oCAsCC;AAlFD,yCAAsC;AACtC,2CAA0D;AAE1D,uDAAyD;AACzD,mDAAwC;AACxC,0CAAqD;AACrD,2CAAkE;AAI3D,KAAK,UAAU,UAAU,CAC5B,OAAiC,EACjC,IAAa;IAEb,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,cAAc,GAAgC,EAAE,CAAC;IAEvD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,SAAG,CAAC,MAAM,CAAC,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAA,uBAAM,EAAC,OAAO,YAAY,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAA,oBAAa,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE1C,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,cAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AAC9C,CAAC;AAeD;;GAEG;AACI,KAAK,UAAU,YAAY,CAC9B,EAAM,EACN,IAAqB,EACrB,KAAQ,EACR,KAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mBAAW,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExE,MAAM,MAAM,GACR,QAAQ,KAAK,SAAS,IAAI,IAAA,uBAAa,EAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE1B,IAAI,OAAgB,CAAC;IAErB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,EAAE,CAAC,MAAM,KAAK,iBAAO,CAAC,MAAM,EAAE,CAAC;QAClE,4FAA4F;QAC5F,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACJ,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAE/F,OAAO;QACH,QAAQ;QACR,MAAM;QACN,OAAO;QACP,GAAG,KAAK;QACR,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,OAAO;QACP,cAAc;QACd,GAAG,EAAE,IAAI,CAAC,OAAO;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACxB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { Address } from "@ethereumjs/util";
|
|
3
|
+
import { RunTxResult, VM } from "@ethereumjs/vm";
|
|
4
|
+
import { BasicStepInfo } from "./basic_info";
|
|
5
|
+
import { ExternalFrameInfo } from "./ext_stack";
|
|
6
|
+
export interface ContractLifeTimeInfo {
|
|
7
|
+
contractCreated?: Address;
|
|
8
|
+
contractKilled?: Address;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Given a trace of contract creation/deletion event compute a gen/kill set summary for the trace.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getContractGenKillSet(trace: ContractLifeTimeInfo[], res?: RunTxResult): [Set<string>, Set<string>];
|
|
14
|
+
/**
|
|
15
|
+
* Track contract creation/initialization/destruction. A contract is considered:
|
|
16
|
+
*
|
|
17
|
+
* 1. Created after its constructor returns successfully
|
|
18
|
+
* 2. Destroyed when SELFDESTRUCT is executed
|
|
19
|
+
*/
|
|
20
|
+
export declare function addContractLifetimeInfo<T extends object & BasicStepInfo & ExternalFrameInfo>(vm: VM, step: InterpreterStep, state: T, trace: Array<T & ContractLifeTimeInfo>): T & ContractLifeTimeInfo;
|
|
21
|
+
//# sourceMappingURL=contract_lifetime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract_lifetime.d.ts","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/contract_lifetime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,oBAAoB,EAAE,EAC7B,GAAG,CAAC,EAAE,WAAW,GAClB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAgC5B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,GAAG,iBAAiB,EACxF,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,oBAAoB,CAAC,GACvC,CAAC,GAAG,oBAAoB,CA8B1B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getContractGenKillSet = getContractGenKillSet;
|
|
4
|
+
exports.addContractLifetimeInfo = addContractLifetimeInfo;
|
|
5
|
+
const opcodes_1 = require("../../opcodes");
|
|
6
|
+
const types_1 = require("../../types");
|
|
7
|
+
const ext_stack_1 = require("./ext_stack");
|
|
8
|
+
/**
|
|
9
|
+
* Given a trace of contract creation/deletion event compute a gen/kill set summary for the trace.
|
|
10
|
+
*/
|
|
11
|
+
function getContractGenKillSet(trace, res) {
|
|
12
|
+
// Need to account for an entire transaction creating a contract potentially.
|
|
13
|
+
const [gen, kill] = trace.reduce(([gen, kill], info) => {
|
|
14
|
+
if (info.contractCreated) {
|
|
15
|
+
const strAddr = info.contractCreated.toString();
|
|
16
|
+
if (kill.has(strAddr)) {
|
|
17
|
+
kill.delete(strAddr);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
gen.add(info.contractCreated.toString());
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (info.contractKilled) {
|
|
24
|
+
const strAddr = info.contractKilled.toString();
|
|
25
|
+
if (gen.has(strAddr)) {
|
|
26
|
+
gen.delete(strAddr);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
kill.add(strAddr);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return [gen, kill];
|
|
33
|
+
}, [new Set(), new Set()]);
|
|
34
|
+
if (res && res.createdAddress !== undefined) {
|
|
35
|
+
gen.add(res.createdAddress.toString());
|
|
36
|
+
}
|
|
37
|
+
return [gen, kill];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Track contract creation/initialization/destruction. A contract is considered:
|
|
41
|
+
*
|
|
42
|
+
* 1. Created after its constructor returns successfully
|
|
43
|
+
* 2. Destroyed when SELFDESTRUCT is executed
|
|
44
|
+
*/
|
|
45
|
+
function addContractLifetimeInfo(vm, step, state, trace) {
|
|
46
|
+
// Case 1. Self-destruct
|
|
47
|
+
if (state.op.opcode === opcodes_1.OPCODES.SELFDESTRUCT) {
|
|
48
|
+
return {
|
|
49
|
+
contractKilled: state.address,
|
|
50
|
+
...state
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (trace.length === 0) {
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
// Case 2: We return from a
|
|
57
|
+
const lastStep = trace[trace.length - 1];
|
|
58
|
+
const lastStepFrame = (0, ext_stack_1.topExtFrame)(lastStep.stack);
|
|
59
|
+
// Successful return from a creation frame
|
|
60
|
+
if (lastStep.depth === state.depth + 1 &&
|
|
61
|
+
lastStepFrame.kind === types_1.FrameKind.Creation &&
|
|
62
|
+
lastStep.op.opcode === opcodes_1.OPCODES.RETURN) {
|
|
63
|
+
return {
|
|
64
|
+
contractCreated: lastStep.address,
|
|
65
|
+
...state
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=contract_lifetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract_lifetime.js","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/contract_lifetime.ts"],"names":[],"mappings":";;AAgBA,sDAmCC;AAQD,0DAmCC;AA3FD,2CAAwC;AACxC,uCAAwC;AAExC,2CAA6D;AAO7D;;GAEG;AACH,SAAgB,qBAAqB,CACjC,KAA6B,EAC7B,GAAiB;IAEjB,6EAA6E;IAC7E,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAC5B,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAEhD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC/C,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CACzB,CAAC;IAEF,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CACnC,EAAM,EACN,IAAqB,EACrB,KAAQ,EACR,KAAsC;IAEtC,wBAAwB;IACxB,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,iBAAO,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO;YACH,cAAc,EAAE,KAAK,CAAC,OAAO;YAC7B,GAAG,KAAK;SACX,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,IAAA,uBAAW,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,0CAA0C;IAC1C,IACI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;QAClC,aAAa,CAAC,IAAI,KAAK,iBAAS,CAAC,QAAQ;QACzC,QAAQ,CAAC,EAAE,CAAC,MAAM,KAAK,iBAAO,CAAC,MAAM,EACvC,CAAC;QACC,OAAO;YACH,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,GAAG,KAAK;SACX,CAAC;IACN,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { VM } from "@ethereumjs/vm";
|
|
3
|
+
import { EventDesc } from "../../types";
|
|
4
|
+
import { BasicStepInfo } from "./basic_info";
|
|
5
|
+
export interface EventInfo {
|
|
6
|
+
emittedEvent: EventDesc | undefined;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Adds source info for each step (if available)
|
|
10
|
+
*/
|
|
11
|
+
export declare function addEventInfo<T extends object & BasicStepInfo>(vm: VM, step: InterpreterStep, state: T): Promise<T & EventInfo>;
|
|
12
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,SAAS;IACtB,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,EAC/D,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,CAAC,GACT,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAyBxB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addEventInfo = addEventInfo;
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
/**
|
|
6
|
+
* Adds source info for each step (if available)
|
|
7
|
+
*/
|
|
8
|
+
async function addEventInfo(vm, step, state) {
|
|
9
|
+
let emittedEvent = undefined;
|
|
10
|
+
// Finally check if an event is being emitted for this step
|
|
11
|
+
if (step.opcode.name.startsWith("LOG")) {
|
|
12
|
+
const stack = state.evmStack;
|
|
13
|
+
const off = (0, utils_1.bigEndianBufToNumber)(stack[stack.length - 1]);
|
|
14
|
+
const size = (0, utils_1.bigEndianBufToNumber)(stack[stack.length - 2]);
|
|
15
|
+
const nTopics = step.opcode.name[3] - "0";
|
|
16
|
+
const payload = state.memory.slice(off, off + size);
|
|
17
|
+
emittedEvent = {
|
|
18
|
+
payload,
|
|
19
|
+
topics: stack
|
|
20
|
+
.slice(stack.length - 2 - nTopics, stack.length - 2)
|
|
21
|
+
.reverse()
|
|
22
|
+
.map(utils_1.bigEndianBufToBigint)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
emittedEvent,
|
|
27
|
+
...state
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/events.ts"],"names":[],"mappings":";;AAaA,oCA6BC;AAxCD,0CAA4E;AAQ5E;;GAEG;AACI,KAAK,UAAU,YAAY,CAC9B,EAAM,EACN,IAAqB,EACrB,KAAQ;IAER,IAAI,YAAY,GAA0B,SAAS,CAAC;IAEpD,2DAA2D;IAC3D,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAA,4BAAoB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAA,4BAAoB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAS,GAAI,GAAW,CAAC;QAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAEpD,YAAY,GAAG;YACX,OAAO;YACP,MAAM,EAAE,KAAK;iBACR,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;iBACnD,OAAO,EAAE;iBACT,GAAG,CAAC,4BAAoB,CAAC;SACjC,CAAC;IACN,CAAC;IAED,OAAO;QACH,YAAY;QACZ,GAAG,KAAK;KACX,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { TypedTransaction } from "@ethereumjs/tx";
|
|
3
|
+
import { VM } from "@ethereumjs/vm";
|
|
4
|
+
import { ContractInfo, IArtifactManager } from "../../artifact_manager";
|
|
5
|
+
import { ExternalFrame, Frame } from "../../types";
|
|
6
|
+
import { BasicStepInfo } from "./basic_info";
|
|
7
|
+
export interface ExternalFrameInfo {
|
|
8
|
+
stack: ExternalFrame[];
|
|
9
|
+
}
|
|
10
|
+
export declare function topExtFrame(arg: ExternalFrame[] | ExternalFrameInfo | Frame): ExternalFrame;
|
|
11
|
+
export declare function getContractInfo(step: ExternalFrameInfo): ContractInfo | undefined;
|
|
12
|
+
export declare function getCode(step: ExternalFrameInfo): Uint8Array;
|
|
13
|
+
/**
|
|
14
|
+
* Adds external frame info for each step
|
|
15
|
+
*/
|
|
16
|
+
export declare function addExternalFrame<T extends object & BasicStepInfo>(vm: VM, step: InterpreterStep, state: T, trace: Array<T & ExternalFrameInfo>, artifactManager: IArtifactManager, tx: TypedTransaction): Promise<T & ExternalFrameInfo>;
|
|
17
|
+
//# sourceMappingURL=ext_stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ext_stack.d.ts","sourceRoot":"","sources":["../../../../src/debug/tracers/transformers/ext_stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAUpC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAKH,aAAa,EACb,KAAK,EAGR,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,iBAAiB,GAAG,KAAK,GAAG,aAAa,CAW3F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAEjF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAE3D;AAmJD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,EACnE,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,iBAAiB,CAAC,EACnC,eAAe,EAAE,gBAAgB,EACjC,EAAE,EAAE,gBAAgB,GACrB,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC,CA8GhC"}
|