sol-dbg 0.4.2 → 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.
- package/dist/debug/decoding/general.d.ts.map +1 -1
- package/dist/debug/decoding/general.js +3 -2
- package/dist/debug/decoding/general.js.map +1 -1
- package/dist/debug/index.d.ts +1 -1
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/debug/index.js +1 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/tracers/base_tracer.d.ts +30 -0
- package/dist/debug/tracers/base_tracer.d.ts.map +1 -0
- package/dist/debug/tracers/base_tracer.js +108 -0
- package/dist/debug/tracers/base_tracer.js.map +1 -0
- package/dist/debug/tracers/index.d.ts +4 -0
- package/dist/debug/tracers/index.d.ts.map +1 -0
- package/dist/debug/tracers/index.js +20 -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/transformers/basic_info.d.ts +23 -0
- package/dist/debug/tracers/transformers/basic_info.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/basic_info.js +52 -0
- package/dist/debug/tracers/transformers/basic_info.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 +10 -0
- package/dist/debug/tracers/transformers/index.d.ts.map +1 -0
- package/dist/debug/tracers/transformers/index.js +23 -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/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/pp.d.ts +3 -2
- package/dist/utils/pp.d.ts.map +1 -1
- package/dist/utils/pp.js +21 -9
- package/dist/utils/pp.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/debug/decoding/general.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/debug/decoding/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,SAAS,EAGT,QAAQ,EACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAGH,QAAQ,EAGR,SAAS,EAEZ,MAAM,IAAI,CAAC;AAoDZ,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAO3D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,CAqFnF"}
|
|
@@ -6,6 +6,7 @@ const solc_typed_ast_1 = require("solc-typed-ast");
|
|
|
6
6
|
const abi_1 = require("solc-typed-ast/dist/types/abi");
|
|
7
7
|
const __1 = require("..");
|
|
8
8
|
const __2 = require("../..");
|
|
9
|
+
const transformers_1 = require("../tracers/transformers");
|
|
9
10
|
const calldata_1 = require("./calldata");
|
|
10
11
|
const memory_1 = require("./memory");
|
|
11
12
|
const stack_1 = require("./stack");
|
|
@@ -26,7 +27,7 @@ function decodeValInt(typ, loc, state, infer) {
|
|
|
26
27
|
return res === undefined ? res : res[0];
|
|
27
28
|
}
|
|
28
29
|
if (loc.kind === __1.DataLocationKind.CallData) {
|
|
29
|
-
const lastExtFrame = (0,
|
|
30
|
+
const lastExtFrame = (0, transformers_1.topExtFrame)(state.stack);
|
|
30
31
|
let abiType;
|
|
31
32
|
try {
|
|
32
33
|
abiType = infer.toABIEncodedType(typ, abi_1.ABIEncoderVersion.V2);
|
|
@@ -69,7 +70,7 @@ function decodeValue(view, state, infer) {
|
|
|
69
70
|
const kind = solLocToDataKind(typ.location);
|
|
70
71
|
let pointedToLoc;
|
|
71
72
|
if (isCalldataType2Slots(typ)) {
|
|
72
|
-
const lastExtFrame = (0,
|
|
73
|
+
const lastExtFrame = (0, transformers_1.topExtFrame)(state.stack);
|
|
73
74
|
let abiType;
|
|
74
75
|
try {
|
|
75
76
|
abiType = infer.toABIEncodedType(typ, abi_1.ABIEncoderVersion.V2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../src/debug/decoding/general.ts"],"names":[],"mappings":";;AAqEA,oDAOC;AAMD,kCAqFC;AAvKD,mDAOwB;AACxB,uDAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../src/debug/decoding/general.ts"],"names":[],"mappings":"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"}
|
package/dist/debug/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
|
package/dist/debug/index.js
CHANGED
|
@@ -18,6 +18,6 @@ __exportStar(require("./abi"), exports);
|
|
|
18
18
|
__exportStar(require("./artifact_manager"), exports);
|
|
19
19
|
__exportStar(require("./decoding"), exports);
|
|
20
20
|
__exportStar(require("./opcodes"), exports);
|
|
21
|
-
__exportStar(require("./
|
|
21
|
+
__exportStar(require("./tracers"), exports);
|
|
22
22
|
__exportStar(require("./types"), exports);
|
|
23
23
|
//# sourceMappingURL=index.js.map
|
package/dist/debug/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,qDAAmC;AACnC,6CAA2B;AAC3B,4CAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,qDAAmC;AACnC,6CAA2B;AAC3B,4CAA0B;AAC1B,4CAA0B;AAC1B,0CAAwB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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 declare abstract class BaseSolTxTracer<State> {
|
|
12
|
+
artifactManager: IArtifactManager;
|
|
13
|
+
protected readonly strict: boolean;
|
|
14
|
+
protected readonly foundryCheatcodes: boolean;
|
|
15
|
+
constructor(artifactManager: IArtifactManager, opts?: TracerOpts);
|
|
16
|
+
private static getEVM;
|
|
17
|
+
/**
|
|
18
|
+
* Releases references to the EVM stored inside VM from the
|
|
19
|
+
* `interpRunListeners` map. This avoids memory leaks when repeatedly
|
|
20
|
+
* calling the debugger on different transactions. Should be called once
|
|
21
|
+
* for every vm created by `SolTxDebugger.createVm` after its done being
|
|
22
|
+
* used.
|
|
23
|
+
*/
|
|
24
|
+
static releaseVM(vm: VM): void;
|
|
25
|
+
static createVm(stateManager: EVMStateManagerInterface | undefined, foundryCheatcodes: boolean): Promise<VM>;
|
|
26
|
+
abstract processRawTraceStep(vm: VM, step: InterpreterStep, trace: State[], tx: TypedTransaction): Promise<State>;
|
|
27
|
+
debugTx(tx: TypedTransaction, block: Block | undefined, // TODO: Make block required and add to processRawTraceStep
|
|
28
|
+
stateManager: EVMStateManagerInterface): Promise<[State[], RunTxResult]>;
|
|
29
|
+
}
|
|
30
|
+
//# 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;AASvD,MAAM,WAAW,UAAU;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;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,YAAY,EAAE,wBAAwB,GACvC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;CA8BrC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
stateManager) {
|
|
88
|
+
const vm = await BaseSolTxTracer.createVm(stateManager.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
|
+
BaseSolTxTracer.releaseVM(vm);
|
|
104
|
+
return [trace, txRes];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.BaseSolTxTracer = BaseSolTxTracer;
|
|
108
|
+
//# 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,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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("./transformers"), exports);
|
|
20
|
+
//# 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,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,23 @@
|
|
|
1
|
+
import { InterpreterStep } from "@ethereumjs/evm";
|
|
2
|
+
import { Address } from "@ethereumjs/util";
|
|
3
|
+
import { VM } from "@ethereumjs/vm";
|
|
4
|
+
import { EVMOpInfo } from "../../opcodes";
|
|
5
|
+
import { Memory, Stack, Storage } from "../../types";
|
|
6
|
+
import { OpInfo } from "./op";
|
|
7
|
+
export interface BasicStepInfo {
|
|
8
|
+
evmStack: Stack;
|
|
9
|
+
memory: Memory;
|
|
10
|
+
storage: Storage;
|
|
11
|
+
op: EVMOpInfo;
|
|
12
|
+
pc: number;
|
|
13
|
+
gasCost: bigint;
|
|
14
|
+
dynamicGasCost: bigint;
|
|
15
|
+
gas: bigint;
|
|
16
|
+
depth: number;
|
|
17
|
+
address: Address;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Adds cleaner typed version of the low-level debugging information
|
|
21
|
+
*/
|
|
22
|
+
export declare function addBasicInfo<T extends object & OpInfo>(vm: VM, step: InterpreterStep, state: T, trace: Array<T & BasicStepInfo>): Promise<T & BasicStepInfo>;
|
|
23
|
+
//# 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":"AACA,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;AAiB9B,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,CAgC5B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addBasicInfo = addBasicInfo;
|
|
4
|
+
const rlp_1 = require("@ethereumjs/rlp");
|
|
5
|
+
const util_1 = require("@ethereumjs/util");
|
|
6
|
+
const utils_1 = require("ethereum-cryptography/utils");
|
|
7
|
+
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
8
|
+
const utils_2 = require("../../../utils");
|
|
9
|
+
const opcodes_1 = require("../../opcodes");
|
|
10
|
+
async function getStorage(manager, addr) {
|
|
11
|
+
const rawStorage = await manager.dumpStorage(addr);
|
|
12
|
+
const storageEntries = [];
|
|
13
|
+
for (const [keyStr, valStr] of Object.entries(rawStorage)) {
|
|
14
|
+
const decoded = rlp_1.RLP.decode((0, utils_1.hexToBytes)(valStr));
|
|
15
|
+
(0, solc_typed_ast_1.assert)(decoded instanceof Uint8Array, "");
|
|
16
|
+
const valBuf = (0, util_1.setLengthLeft)(decoded, 32);
|
|
17
|
+
storageEntries.push([BigInt(keyStr), valBuf]);
|
|
18
|
+
}
|
|
19
|
+
return utils_2.ImmMap.fromEntries(storageEntries);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Adds cleaner typed version of the low-level debugging information
|
|
23
|
+
*/
|
|
24
|
+
async function addBasicInfo(vm, step, state, trace) {
|
|
25
|
+
const evmStack = step.stack.map((word) => (0, utils_2.bigIntToBuf)(word, 32, "big"));
|
|
26
|
+
const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
|
|
27
|
+
const memory = lastStep === undefined || (0, opcodes_1.changesMemory)(lastStep.op)
|
|
28
|
+
? new Uint8Array(step.memory)
|
|
29
|
+
: lastStep.memory;
|
|
30
|
+
let storage;
|
|
31
|
+
if (lastStep === undefined || lastStep.op.opcode === opcodes_1.OPCODES.SSTORE) {
|
|
32
|
+
storage = await getStorage(vm.stateManager, step.address);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
storage = lastStep.storage;
|
|
36
|
+
}
|
|
37
|
+
const gasCost = BigInt(step.opcode.fee);
|
|
38
|
+
const dynamicGasCost = step.opcode.dynamicFee === undefined ? gasCost : step.opcode.dynamicFee;
|
|
39
|
+
return {
|
|
40
|
+
evmStack,
|
|
41
|
+
memory,
|
|
42
|
+
storage,
|
|
43
|
+
...state,
|
|
44
|
+
pc: step.pc,
|
|
45
|
+
gasCost,
|
|
46
|
+
dynamicGasCost,
|
|
47
|
+
gas: step.gasLeft,
|
|
48
|
+
depth: step.depth + 1,
|
|
49
|
+
address: step.address
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# 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":";;AA2CA,oCAqCC;AA9ED,yCAAsC;AACtC,2CAA0D;AAE1D,uDAAyD;AACzD,mDAAwC;AACxC,0CAAqD;AACrD,2CAAkE;AAIlE,KAAK,UAAU,UAAU,CAAC,OAAiC,EAAE,IAAa;IACtE,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,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,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"}
|