sol-dbg 0.0.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/LICENSE +201 -0
- package/README.md +105 -0
- package/dist/artifacts/helpers.d.ts +14 -0
- package/dist/artifacts/helpers.d.ts.map +1 -0
- package/dist/artifacts/helpers.js +111 -0
- package/dist/artifacts/helpers.js.map +1 -0
- package/dist/artifacts/index.d.ts +3 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +19 -0
- package/dist/artifacts/index.js.map +1 -0
- package/dist/artifacts/solc.d.ts +44 -0
- package/dist/artifacts/solc.d.ts.map +1 -0
- package/dist/artifacts/solc.js +3 -0
- package/dist/artifacts/solc.js.map +1 -0
- package/dist/debug/abi.d.ts +30 -0
- package/dist/debug/abi.d.ts.map +1 -0
- package/dist/debug/abi.js +183 -0
- package/dist/debug/abi.js.map +1 -0
- package/dist/debug/artifact_manager.d.ts +68 -0
- package/dist/debug/artifact_manager.d.ts.map +1 -0
- package/dist/debug/artifact_manager.js +182 -0
- package/dist/debug/artifact_manager.js.map +1 -0
- package/dist/debug/decoding/calldata.d.ts +6 -0
- package/dist/debug/decoding/calldata.d.ts.map +1 -0
- package/dist/debug/decoding/calldata.js +228 -0
- package/dist/debug/decoding/calldata.js.map +1 -0
- package/dist/debug/decoding/general.d.ts +9 -0
- package/dist/debug/decoding/general.d.ts.map +1 -0
- package/dist/debug/decoding/general.js +114 -0
- package/dist/debug/decoding/general.js.map +1 -0
- package/dist/debug/decoding/index.d.ts +6 -0
- package/dist/debug/decoding/index.d.ts.map +1 -0
- package/dist/debug/decoding/index.js +22 -0
- package/dist/debug/decoding/index.js.map +1 -0
- package/dist/debug/decoding/memory.d.ts +4 -0
- package/dist/debug/decoding/memory.d.ts.map +1 -0
- package/dist/debug/decoding/memory.js +216 -0
- package/dist/debug/decoding/memory.js.map +1 -0
- package/dist/debug/decoding/stack.d.ts +9 -0
- package/dist/debug/decoding/stack.d.ts.map +1 -0
- package/dist/debug/decoding/stack.js +85 -0
- package/dist/debug/decoding/stack.js.map +1 -0
- package/dist/debug/decoding/storage.d.ts +4 -0
- package/dist/debug/decoding/storage.d.ts.map +1 -0
- package/dist/debug/decoding/storage.js +333 -0
- package/dist/debug/decoding/storage.js.map +1 -0
- package/dist/debug/index.d.ts +7 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +23 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/debug/opcodes.d.ts +302 -0
- package/dist/debug/opcodes.d.ts.map +1 -0
- package/dist/debug/opcodes.js +2909 -0
- package/dist/debug/opcodes.js.map +1 -0
- package/dist/debug/sol_debugger.d.ts +247 -0
- package/dist/debug/sol_debugger.d.ts.map +1 -0
- package/dist/debug/sol_debugger.js +443 -0
- package/dist/debug/sol_debugger.js.map +1 -0
- package/dist/debug/types.d.ts +33 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/types.js +3 -0
- package/dist/debug/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/immutable_map.d.ts +13 -0
- package/dist/utils/immutable_map.d.ts.map +1 -0
- package/dist/utils/immutable_map.js +56 -0
- package/dist/utils/immutable_map.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/misc.d.ts +48 -0
- package/dist/utils/misc.d.ts.map +1 -0
- package/dist/utils/misc.js +221 -0
- package/dist/utils/misc.js.map +1 -0
- package/dist/utils/srcmap.d.ts +8 -0
- package/dist/utils/srcmap.d.ts.map +1 -0
- package/dist/utils/srcmap.js +28 -0
- package/dist/utils/srcmap.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SolTxDebugger = exports.getContractInfo = exports.lastExternalFrame = exports.DataLocationKind = exports.FrameKind = void 0;
|
|
7
|
+
const vm_1 = __importDefault(require("@ethereumjs/vm"));
|
|
8
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
9
|
+
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
10
|
+
const __1 = require("..");
|
|
11
|
+
const artifacts_1 = require("../artifacts");
|
|
12
|
+
const abi_1 = require("./abi");
|
|
13
|
+
const artifact_manager_1 = require("./artifact_manager");
|
|
14
|
+
const decoding_1 = require("./decoding");
|
|
15
|
+
const opcodes_1 = require("./opcodes");
|
|
16
|
+
var FrameKind;
|
|
17
|
+
(function (FrameKind) {
|
|
18
|
+
FrameKind["Call"] = "call";
|
|
19
|
+
FrameKind["Creation"] = "creation";
|
|
20
|
+
FrameKind["InternalCall"] = "internal_call";
|
|
21
|
+
})(FrameKind = exports.FrameKind || (exports.FrameKind = {}));
|
|
22
|
+
var DataLocationKind;
|
|
23
|
+
(function (DataLocationKind) {
|
|
24
|
+
DataLocationKind["Stack"] = "stack";
|
|
25
|
+
DataLocationKind["Memory"] = "memory";
|
|
26
|
+
DataLocationKind["Storage"] = "storage";
|
|
27
|
+
DataLocationKind["CallData"] = "calldata";
|
|
28
|
+
})(DataLocationKind = exports.DataLocationKind || (exports.DataLocationKind = {}));
|
|
29
|
+
// Helper functions
|
|
30
|
+
/**
|
|
31
|
+
* Give a stack or a stack frame, find the last **external** stack frame under it (include itself).
|
|
32
|
+
*/
|
|
33
|
+
function lastExternalFrame(arg) {
|
|
34
|
+
const frame = arg instanceof Array ? arg[arg.length - 1] : arg;
|
|
35
|
+
return frame.kind === FrameKind.InternalCall ? frame.nearestExtFrame : frame;
|
|
36
|
+
}
|
|
37
|
+
exports.lastExternalFrame = lastExternalFrame;
|
|
38
|
+
function getContractInfo(arg) {
|
|
39
|
+
const frame = lastExternalFrame(arg);
|
|
40
|
+
return frame.info;
|
|
41
|
+
}
|
|
42
|
+
exports.getContractInfo = getContractInfo;
|
|
43
|
+
async function getStorage(manager, addr) {
|
|
44
|
+
const rawStorage = await manager.dumpStorage(addr);
|
|
45
|
+
const storageEntries = [];
|
|
46
|
+
for (const [keyStr, valStr] of Object.entries(rawStorage)) {
|
|
47
|
+
const valBuf = (0, __1.padStart)(ethereumjs_util_1.rlp.decode(Buffer.from(valStr, "hex")), 32, 0);
|
|
48
|
+
storageEntries.push([BigInt("0x" + keyStr), valBuf]);
|
|
49
|
+
}
|
|
50
|
+
return __1.ImmMap.fromEntries(storageEntries);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* `SolTxDebugger` is the main debugger class. It contains a VM and a
|
|
54
|
+
* corresponding Web3 provider that can be used to run transactions on that VM.
|
|
55
|
+
*
|
|
56
|
+
* Once a particular transaction `tx` has been run against the vm, you can call
|
|
57
|
+
* `debugger.loadTx(tx)` to debug that transaction.
|
|
58
|
+
*
|
|
59
|
+
* `loadTx(tx)` walks over every step of the tx and computes the following information for it:
|
|
60
|
+
*
|
|
61
|
+
* 1. What is the currently deployed contract in which we are executing?
|
|
62
|
+
* 2. Did the `ArtifactManager` have debugging info for this contract? (src map? ast?)
|
|
63
|
+
* 3. If we have source map compute the corresponding src tripple for this instruction
|
|
64
|
+
* 4. If we have an ast, see if the src tripple of this instruction matches any node in the AST
|
|
65
|
+
* 5. If this is a LOGN instruction, extract the event payload and topics
|
|
66
|
+
* 6. Maintain a stack trace, containing all external and internal calls for
|
|
67
|
+
* this step. Note that we can compute internal stack frames only for contracts
|
|
68
|
+
* with debug info.
|
|
69
|
+
*
|
|
70
|
+
* All the above information is held for each step in the `DbgState` struct.
|
|
71
|
+
*/
|
|
72
|
+
class SolTxDebugger {
|
|
73
|
+
constructor(artifactManager) {
|
|
74
|
+
this.artifactManager = artifactManager;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Given the VM state of a trace step adjust the stack trace accordingly. This handles the following cases:
|
|
78
|
+
*
|
|
79
|
+
* - op is CREATE or CREATE2 - push a new external frame for the creation context of the contract
|
|
80
|
+
* - op is CALL/CALLCODE/DELEGATECALL/STATICCALL - push a new external frame for the callee context
|
|
81
|
+
* - stack depth decreased and previous instruction was RETURN, REVERT or was in an error state - pop external frames from the stack
|
|
82
|
+
* - 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
|
|
83
|
+
* - return from internal call - TODO
|
|
84
|
+
*/
|
|
85
|
+
async adjustStackFrame(stack, state, trace, code, codeHash) {
|
|
86
|
+
const lastExtFrame = lastExternalFrame(stack);
|
|
87
|
+
// First instruction - nothing to do
|
|
88
|
+
if (trace.length === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const lastStep = trace[trace.length - 1];
|
|
92
|
+
const lastOp = lastStep.op;
|
|
93
|
+
// Case 1: Change in external call depth - contract creation, external call, external call return or revert
|
|
94
|
+
if (lastStep.depth !== state.depth) {
|
|
95
|
+
const lastStackTop = lastStep.evmStack.length - 1;
|
|
96
|
+
if (state.depth > lastStep.depth) {
|
|
97
|
+
(0, solc_typed_ast_1.assert)((0, opcodes_1.increasesDepth)(lastOp), `Unexpected depth increase on op ${lastOp.mnemonic}`);
|
|
98
|
+
if ((0, opcodes_1.createsContract)(lastOp)) {
|
|
99
|
+
// Contract creation call
|
|
100
|
+
const off = Number(lastStep.evmStack[lastStackTop - 1]);
|
|
101
|
+
const size = Number(lastStep.evmStack[lastStackTop - 2]);
|
|
102
|
+
const creationBytecode = lastStep.memory.slice(off, off + size);
|
|
103
|
+
const curFrame = await this.makeCreationFrame(lastExtFrame.address.toString(), creationBytecode, trace.length);
|
|
104
|
+
stack.push(curFrame);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// External call
|
|
108
|
+
const argStackOff = lastOp.opcode === opcodes_1.OPCODES.CALL || lastOp.opcode === opcodes_1.OPCODES.CALLCODE
|
|
109
|
+
? 3
|
|
110
|
+
: 2;
|
|
111
|
+
const argSizeStackOff = argStackOff + 1;
|
|
112
|
+
const argOff = Number(lastStep.evmStack[lastStackTop - argStackOff]);
|
|
113
|
+
const argSize = Number(lastStep.evmStack[lastStackTop - argSizeStackOff]);
|
|
114
|
+
const receiver = (0, __1.wordToAddress)(lastStep.evmStack[lastStackTop - 1]);
|
|
115
|
+
const msgData = lastStep.memory.slice(argOff, argOff + argSize);
|
|
116
|
+
const newFrame = await this.makeCallFrame(lastExtFrame.address.toString(), receiver, msgData, code, codeHash, trace.length);
|
|
117
|
+
stack.push(newFrame);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// External return or exception
|
|
122
|
+
let nFramesPopped = lastStep.depth - state.depth;
|
|
123
|
+
// Pop as many external frames as neccessary to match the decrease in
|
|
124
|
+
// depth reported by web3. We need the loop since we don't count the internal frames as decreasing depth
|
|
125
|
+
while (nFramesPopped > 0 && stack.length > 0) {
|
|
126
|
+
const topFrame = stack[stack.length - 1];
|
|
127
|
+
if (topFrame.kind === FrameKind.Creation || topFrame.kind === FrameKind.Call) {
|
|
128
|
+
nFramesPopped--;
|
|
129
|
+
}
|
|
130
|
+
stack.pop();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Case 2: No change in external depth - check if there is an internal call or return happening
|
|
136
|
+
const curExtFrame = lastExternalFrame(stack);
|
|
137
|
+
const [src, ast] = this.decodeSourceLoc(state.pc, curExtFrame);
|
|
138
|
+
// If there is no debug info for the current contract nothing we can do
|
|
139
|
+
if (src === undefined) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Jumping into an internal function call
|
|
143
|
+
if (state.op.mnemonic === "JUMPDEST" &&
|
|
144
|
+
lastStep.op.mnemonic === "JUMP" &&
|
|
145
|
+
lastStep.src &&
|
|
146
|
+
lastStep.src.jump === "i") {
|
|
147
|
+
let args;
|
|
148
|
+
if (ast instanceof solc_typed_ast_1.FunctionDefinition ||
|
|
149
|
+
(ast instanceof solc_typed_ast_1.VariableDeclaration && ast.stateVariable)) {
|
|
150
|
+
args = this.decodeFunArgs(ast, state.evmStack);
|
|
151
|
+
}
|
|
152
|
+
const newFrame = {
|
|
153
|
+
kind: FrameKind.InternalCall,
|
|
154
|
+
nearestExtFrame: lastExtFrame,
|
|
155
|
+
callee: ast,
|
|
156
|
+
offset: state.pc,
|
|
157
|
+
startStep: trace.length,
|
|
158
|
+
arguments: args
|
|
159
|
+
};
|
|
160
|
+
stack.push(newFrame);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Returning from an internal function call
|
|
164
|
+
if (state.op.mnemonic === "JUMP" && src.jump === "o") {
|
|
165
|
+
const topFrame = stack[stack.length - 1];
|
|
166
|
+
(0, solc_typed_ast_1.assert)(topFrame.kind === FrameKind.InternalCall, `Mismatched internal return from frame `, topFrame.kind);
|
|
167
|
+
stack.pop();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the executing code for the current step. There are 3 cases:
|
|
172
|
+
*
|
|
173
|
+
* 1. We just entered the creation of a new code (last step was
|
|
174
|
+
* CREATE/CREATE2 and depth changed). The code is whatever the memory blob
|
|
175
|
+
* passed to the last op was
|
|
176
|
+
* 2. This is the first step or the `codeAddress` changed between this and the last
|
|
177
|
+
* steps - obtain the code from the `vm.stateManager` using `codeAddress`.
|
|
178
|
+
* 3. Otherwise code is the same in the last step
|
|
179
|
+
* @param vm - current VM
|
|
180
|
+
* @param vmState - current (partial) state in the trace (for which we are computing code)
|
|
181
|
+
* @param trace - trace up to the current state
|
|
182
|
+
*/
|
|
183
|
+
async getCodeAndMdHash(vm, step, trace) {
|
|
184
|
+
const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
|
|
185
|
+
let code;
|
|
186
|
+
let codeMdHash;
|
|
187
|
+
if (lastStep !== undefined && (0, opcodes_1.createsContract)(lastStep.op)) {
|
|
188
|
+
const lastStackTop = lastStep.evmStack.length - 1;
|
|
189
|
+
const off = Number(lastStep.evmStack[lastStackTop - 1]);
|
|
190
|
+
const size = Number(lastStep.evmStack[lastStackTop - 2]);
|
|
191
|
+
code = lastStep.memory.slice(off, off + size);
|
|
192
|
+
codeMdHash = (0, artifacts_1.getCreationCodeHash)(code);
|
|
193
|
+
}
|
|
194
|
+
else if (lastStep === undefined || !lastStep.codeAddress.equals(step.codeAddress)) {
|
|
195
|
+
code = await vm.stateManager.getContractCode(step.codeAddress);
|
|
196
|
+
codeMdHash = (0, artifacts_1.getCodeHash)(code);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
code = lastStep.code;
|
|
200
|
+
codeMdHash = lastStep.codeMdHash;
|
|
201
|
+
}
|
|
202
|
+
return [code, codeMdHash];
|
|
203
|
+
}
|
|
204
|
+
async processRawTraceStep(vm, step, trace, stack) {
|
|
205
|
+
const evmStack = step.stack.map((word) => Buffer.from(word.toArray("be", 32)));
|
|
206
|
+
const lastStep = trace.length > 0 ? trace[trace.length - 1] : undefined;
|
|
207
|
+
let memory;
|
|
208
|
+
if (lastStep === undefined || (0, opcodes_1.changesMemory)(lastStep.op)) {
|
|
209
|
+
memory = Buffer.from(step.memory);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
memory = lastStep.memory;
|
|
213
|
+
}
|
|
214
|
+
const op = (0, opcodes_1.getOpInfo)(step.opcode.name);
|
|
215
|
+
let storage;
|
|
216
|
+
if (lastStep === undefined || lastStep.op.opcode === opcodes_1.OPCODES.SSTORE) {
|
|
217
|
+
storage = await getStorage(step.stateManager, step.address);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
storage = lastStep.storage;
|
|
221
|
+
}
|
|
222
|
+
const gasCost = BigInt(step.opcode.fee);
|
|
223
|
+
const dynamicGasCost = step.opcode.dynamicFee === undefined ? gasCost : (0, __1.bnToBigInt)(step.opcode.dynamicFee);
|
|
224
|
+
// First translate the basic VM state
|
|
225
|
+
const vmState = {
|
|
226
|
+
evmStack,
|
|
227
|
+
memory,
|
|
228
|
+
storage,
|
|
229
|
+
op,
|
|
230
|
+
pc: step.pc,
|
|
231
|
+
gasCost,
|
|
232
|
+
dynamicGasCost,
|
|
233
|
+
gas: (0, __1.bnToBigInt)(step.gasLeft),
|
|
234
|
+
depth: step.depth + 1,
|
|
235
|
+
address: step.address,
|
|
236
|
+
codeAddress: step.codeAddress
|
|
237
|
+
};
|
|
238
|
+
const [code, codeMdHash] = await this.getCodeAndMdHash(vm, vmState, trace);
|
|
239
|
+
await this.adjustStackFrame(stack, vmState, trace, code, codeMdHash);
|
|
240
|
+
const curExtFrame = lastExternalFrame(stack);
|
|
241
|
+
let src;
|
|
242
|
+
let astNode;
|
|
243
|
+
try {
|
|
244
|
+
[src, astNode] = this.decodeSourceLoc(step.pc, curExtFrame);
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
// Nothing to do
|
|
248
|
+
}
|
|
249
|
+
let emittedEvent = undefined;
|
|
250
|
+
// Finally check if an event is being emitted for this step
|
|
251
|
+
if (step.opcode.name.startsWith("LOG")) {
|
|
252
|
+
const off = Number(evmStack[evmStack.length - 1]);
|
|
253
|
+
const size = Number(evmStack[evmStack.length - 2]);
|
|
254
|
+
const nTopics = step.opcode.name[3] - "0";
|
|
255
|
+
const payload = memory.slice(off, off + size);
|
|
256
|
+
emittedEvent = {
|
|
257
|
+
payload,
|
|
258
|
+
topics: evmStack
|
|
259
|
+
.slice(evmStack.length - 2 - nTopics, evmStack.length - 2)
|
|
260
|
+
.reverse()
|
|
261
|
+
.map(__1.bigEndianBufToBigint)
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...vmState,
|
|
266
|
+
code,
|
|
267
|
+
codeMdHash,
|
|
268
|
+
stack: [...stack],
|
|
269
|
+
src,
|
|
270
|
+
astNode,
|
|
271
|
+
emittedEvent,
|
|
272
|
+
contractInfo: curExtFrame.info
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
async debugTx(tx, block, stateManager) {
|
|
276
|
+
const vm = new vm_1.default({ stateManager });
|
|
277
|
+
const sender = tx.getSenderAddress().toString();
|
|
278
|
+
const receiver = tx.to === undefined ? __1.ZERO_ADDRESS_STRING : tx.to.toString();
|
|
279
|
+
const isCreation = receiver === __1.ZERO_ADDRESS_STRING;
|
|
280
|
+
const stack = [];
|
|
281
|
+
let curFrame;
|
|
282
|
+
if (isCreation) {
|
|
283
|
+
curFrame = await this.makeCreationFrame(sender, tx.data, 0);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const code = await vm.stateManager.getContractCode(tx.to);
|
|
287
|
+
const codeHash = (0, artifacts_1.getCodeHash)(code);
|
|
288
|
+
curFrame = await this.makeCallFrame(sender, tx.to, tx.data, code, codeHash, 0);
|
|
289
|
+
}
|
|
290
|
+
stack.push(curFrame);
|
|
291
|
+
const trace = [];
|
|
292
|
+
vm.on("step", async (step, next) => {
|
|
293
|
+
const curStep = await this.processRawTraceStep(vm, step, trace, stack);
|
|
294
|
+
trace.push(curStep);
|
|
295
|
+
next();
|
|
296
|
+
});
|
|
297
|
+
const txRes = await vm.runTx({
|
|
298
|
+
tx,
|
|
299
|
+
block,
|
|
300
|
+
skipBalance: true,
|
|
301
|
+
skipNonce: true,
|
|
302
|
+
skipBlockGasLimitValidation: true
|
|
303
|
+
});
|
|
304
|
+
return [trace, txRes];
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Build a `CreationFrame` from the given `sender` address, `data` `Buffer`(msg.data) and the current trace step number.
|
|
308
|
+
*/
|
|
309
|
+
async makeCreationFrame(sender, data, step) {
|
|
310
|
+
const contractInfo = await this.artifactManager.getContractFromCreationBytecode(data);
|
|
311
|
+
let args;
|
|
312
|
+
const callee = contractInfo && contractInfo.ast ? contractInfo.ast.vConstructor : undefined;
|
|
313
|
+
if (contractInfo && callee instanceof solc_typed_ast_1.FunctionDefinition) {
|
|
314
|
+
// TODO: Try and find the arguments inside the creation code and decode them
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
kind: FrameKind.Creation,
|
|
318
|
+
sender,
|
|
319
|
+
msgData: data,
|
|
320
|
+
creationCode: data,
|
|
321
|
+
info: contractInfo,
|
|
322
|
+
callee,
|
|
323
|
+
address: __1.ZERO_ADDRESS,
|
|
324
|
+
startStep: step,
|
|
325
|
+
arguments: args
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Build a `CallFrame` from the given `sender` address, `receiver` address, `data` `Buffer`, (msg.data) and the current trace step number.
|
|
330
|
+
*/
|
|
331
|
+
async makeCallFrame(sender, receiver, data, receiverCode, codeHash, step) {
|
|
332
|
+
const contractInfo = codeHash === undefined
|
|
333
|
+
? codeHash
|
|
334
|
+
: this.artifactManager.getContractFromMDHash(codeHash);
|
|
335
|
+
const selector = data.slice(0, 4).toString("hex");
|
|
336
|
+
let callee;
|
|
337
|
+
let args;
|
|
338
|
+
if (contractInfo && contractInfo.ast) {
|
|
339
|
+
const contract = contractInfo.ast;
|
|
340
|
+
const abiVersion = contractInfo.artifact.abiEncoderVersion;
|
|
341
|
+
const matchingFuns = contract.vFunctions.filter((fun) => (0, __1.getFunctionSelector)(fun) === selector);
|
|
342
|
+
if (matchingFuns.length === 1) {
|
|
343
|
+
callee = matchingFuns[0];
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const matchingGetters = contract.vStateVariables.filter((vDef) => {
|
|
347
|
+
try {
|
|
348
|
+
return (vDef.visibility === solc_typed_ast_1.StateVariableVisibility.Public &&
|
|
349
|
+
vDef.getterCanonicalSignatureHash(abiVersion) === selector);
|
|
350
|
+
}
|
|
351
|
+
catch (e) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
if (matchingGetters.length === 1) {
|
|
356
|
+
callee = matchingGetters[0];
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (callee !== undefined) {
|
|
360
|
+
try {
|
|
361
|
+
args = (0, abi_1.decodeMsgData)(callee, data, DataLocationKind.CallData, abiVersion);
|
|
362
|
+
}
|
|
363
|
+
catch (e) {
|
|
364
|
+
args = undefined;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
kind: FrameKind.Call,
|
|
370
|
+
sender,
|
|
371
|
+
msgData: data,
|
|
372
|
+
receiver: receiver.toString(),
|
|
373
|
+
code: receiverCode,
|
|
374
|
+
info: contractInfo,
|
|
375
|
+
callee,
|
|
376
|
+
address: receiver,
|
|
377
|
+
startStep: step,
|
|
378
|
+
arguments: args
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Helper function to get the source information for the instruction at a given `instrOffset`,
|
|
383
|
+
* in the context of the external call `ctx`.
|
|
384
|
+
*
|
|
385
|
+
* There are several cases this handles:
|
|
386
|
+
*
|
|
387
|
+
* 1. If there is no debug info for the contract executing in `ctx` return undefined
|
|
388
|
+
* 2. If there is debug info, but no AST return only the decoded bytecode sourcemap entry
|
|
389
|
+
* 3. If there is both debug info and an AST return the decoded source location and any AST nodes that match this location
|
|
390
|
+
*/
|
|
391
|
+
decodeSourceLoc(instrOffset, ctx) {
|
|
392
|
+
if (!ctx.info) {
|
|
393
|
+
return [undefined, undefined];
|
|
394
|
+
}
|
|
395
|
+
const bytecodeInfo = ctx.kind === FrameKind.Creation ? ctx.info.bytecode : ctx.info.deployedBytecode;
|
|
396
|
+
const src = (0, artifact_manager_1.getOffsetSrc)(instrOffset, bytecodeInfo);
|
|
397
|
+
const astNode = ctx.info.artifact.srcMap.get(`${src.start}:${src.length}:${src.sourceIndex}`);
|
|
398
|
+
return [src, astNode];
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* WIP: TODO document
|
|
402
|
+
* TODO: Rename - this function doesn't do any actual decoding - just building up DataView for the arguments
|
|
403
|
+
* of a function
|
|
404
|
+
*/
|
|
405
|
+
decodeFunArgs(callee, stack) {
|
|
406
|
+
const res = [];
|
|
407
|
+
let formals;
|
|
408
|
+
try {
|
|
409
|
+
formals =
|
|
410
|
+
callee instanceof solc_typed_ast_1.FunctionDefinition
|
|
411
|
+
? callee.vParameters.vParameters.map((argDef) => [
|
|
412
|
+
argDef.name,
|
|
413
|
+
(0, solc_typed_ast_1.variableDeclarationToTypeNode)(argDef)
|
|
414
|
+
])
|
|
415
|
+
: callee.getterArgsAndReturn()[0].map((typ, i) => [`ARG_${i}`, typ]);
|
|
416
|
+
}
|
|
417
|
+
catch (e) {
|
|
418
|
+
// `variableDeclarationToTypeNode` may fail when referencing structs/contracts that are defined
|
|
419
|
+
// in SourceUnits that are missing
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
let offsetFromTop = -1;
|
|
423
|
+
for (let i = formals.length - 1; i >= 0; i--) {
|
|
424
|
+
const [name, typ] = formals[i];
|
|
425
|
+
const stackSize = (0, decoding_1.isCalldataType2Slots)(typ) ? 2 : 1;
|
|
426
|
+
offsetFromTop += stackSize;
|
|
427
|
+
(0, solc_typed_ast_1.assert)(offsetFromTop <= stack.length, `Stack underflow when trying to decode arguments of {0}`, callee, `Expected ${formals.length} entries but stack is only ${stack.length} deep`);
|
|
428
|
+
res.unshift([
|
|
429
|
+
name,
|
|
430
|
+
{
|
|
431
|
+
type: typ,
|
|
432
|
+
loc: {
|
|
433
|
+
kind: DataLocationKind.Stack,
|
|
434
|
+
offsetFromTop
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
]);
|
|
438
|
+
}
|
|
439
|
+
return res;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
exports.SolTxDebugger = SolTxDebugger;
|
|
443
|
+
//# sourceMappingURL=sol_debugger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sol_debugger.js","sourceRoot":"","sources":["../../src/debug/sol_debugger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FunctionDefinition } from "solc-typed-ast";
|
|
2
|
+
import { HexString, UnprefixedHexString } from "../artifacts";
|
|
3
|
+
import { ContractInfo } from "./artifact_manager";
|
|
4
|
+
export interface DeployedContractInfo {
|
|
5
|
+
address: HexString;
|
|
6
|
+
code: UnprefixedHexString;
|
|
7
|
+
info?: ContractInfo;
|
|
8
|
+
}
|
|
9
|
+
export interface UnknownLocation {
|
|
10
|
+
contract: DeployedContractInfo | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface SolLocation {
|
|
13
|
+
contract: DeployedContractInfo | undefined;
|
|
14
|
+
start: number;
|
|
15
|
+
length: number;
|
|
16
|
+
jump: "o" | "i" | "-";
|
|
17
|
+
file: number;
|
|
18
|
+
}
|
|
19
|
+
export declare type DecodedSolValue = {
|
|
20
|
+
value: any;
|
|
21
|
+
type: string;
|
|
22
|
+
};
|
|
23
|
+
export interface StackFrame {
|
|
24
|
+
fun: FunctionDefinition;
|
|
25
|
+
argumentsAtStart: {
|
|
26
|
+
[argName: string]: DecodedSolValue;
|
|
27
|
+
};
|
|
28
|
+
argsAndLocals: {
|
|
29
|
+
[varName: string]: DecodedSolValue;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare type StackTrace = StackFrame[];
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,oBAAY,eAAe,GAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,kBAAkB,CAAC;IACxB,gBAAgB,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAC;IACzD,aAAa,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAC;CACzD;AAED,oBAAY,UAAU,GAAG,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -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("./artifacts"), exports);
|
|
18
|
+
__exportStar(require("./debug"), exports);
|
|
19
|
+
__exportStar(require("./utils"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,0CAAwB;AACxB,0CAAwB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ImmMap<KeyT, ValT> {
|
|
2
|
+
private innerM;
|
|
3
|
+
private _next;
|
|
4
|
+
static fromEntries<K, V>(arg: Iterable<[K, V]>): ImmMap<K, V>;
|
|
5
|
+
static fromImmMap<K, V>(arg: ImmMap<K, V>): ImmMap<K, V>;
|
|
6
|
+
private constructor();
|
|
7
|
+
get(key: KeyT): ValT | undefined;
|
|
8
|
+
set(key: KeyT, val: ValT): this;
|
|
9
|
+
setMany(entries: Iterable<[KeyT, ValT]>): this;
|
|
10
|
+
private collectMap;
|
|
11
|
+
entries(): Iterable<[KeyT, ValT]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=immutable_map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immutable_map.d.ts","sourceRoot":"","sources":["../../src/utils/immutable_map.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM,CAAC,IAAI,EAAE,IAAI;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAmB;IAEhC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAU7D,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAIxD,OAAO;IAKP,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS;IAkBhC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI;IAQ/B,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;IAU9C,OAAO,CAAC,UAAU;IAUlB,OAAO,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;CAGpC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImmMap = void 0;
|
|
4
|
+
class ImmMap {
|
|
5
|
+
constructor(next = undefined) {
|
|
6
|
+
this.innerM = new Map();
|
|
7
|
+
this._next = next;
|
|
8
|
+
}
|
|
9
|
+
static fromEntries(arg) {
|
|
10
|
+
const res = new ImmMap(undefined);
|
|
11
|
+
for (const [k, v] of arg) {
|
|
12
|
+
res.innerM.set(k, v);
|
|
13
|
+
}
|
|
14
|
+
return res;
|
|
15
|
+
}
|
|
16
|
+
static fromImmMap(arg) {
|
|
17
|
+
return new ImmMap(arg);
|
|
18
|
+
}
|
|
19
|
+
get(key) {
|
|
20
|
+
if (this.innerM.has(key)) {
|
|
21
|
+
return this.innerM.get(key);
|
|
22
|
+
}
|
|
23
|
+
if (this._next === undefined) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const resInNext = this._next.get(key);
|
|
27
|
+
if (resInNext !== undefined) {
|
|
28
|
+
this.innerM.set(key, resInNext);
|
|
29
|
+
}
|
|
30
|
+
return resInNext;
|
|
31
|
+
}
|
|
32
|
+
set(key, val) {
|
|
33
|
+
const newMap = new ImmMap(this);
|
|
34
|
+
newMap.innerM.set(key, val);
|
|
35
|
+
return newMap;
|
|
36
|
+
}
|
|
37
|
+
setMany(entries) {
|
|
38
|
+
const newMap = new ImmMap(this);
|
|
39
|
+
for (const [key, val] of entries) {
|
|
40
|
+
newMap.innerM.set(key, val);
|
|
41
|
+
}
|
|
42
|
+
return newMap;
|
|
43
|
+
}
|
|
44
|
+
collectMap() {
|
|
45
|
+
const res = this._next ? this._next.collectMap() : new Map();
|
|
46
|
+
for (const [key, val] of this.innerM) {
|
|
47
|
+
res.set(key, val);
|
|
48
|
+
}
|
|
49
|
+
return res;
|
|
50
|
+
}
|
|
51
|
+
entries() {
|
|
52
|
+
return this.collectMap();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ImmMap = ImmMap;
|
|
56
|
+
//# sourceMappingURL=immutable_map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immutable_map.js","sourceRoot":"","sources":["../../src/utils/immutable_map.ts"],"names":[],"mappings":";;;AAAA,MAAa,MAAM;IAkBf,YAAoB,OAAY,SAAS;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAjBD,MAAM,CAAC,WAAW,CAAO,GAAqB;QAC1C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAO,SAAS,CAAC,CAAC;QAExC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE;YACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACxB;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,MAAM,CAAC,UAAU,CAAO,GAAiB;QACrC,OAAO,IAAI,MAAM,CAAO,GAAG,CAAC,CAAC;IACjC,CAAC;IAOD,GAAG,CAAC,GAAS;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAC/B;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;YAC1B,OAAO,SAAS,CAAC;SACpB;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,SAAS,KAAK,SAAS,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SACnC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAS,EAAE,GAAS;QACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAa,IAAI,CAAC,CAAC;QAE5C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE5B,OAAO,MAAc,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,OAA+B;QACnC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAa,IAAI,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAC/B;QAED,OAAO,MAAc,CAAC;IAC1B,CAAC;IAEO,UAAU;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QAE7D,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YAClC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SACrB;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;CACJ;AAxED,wBAwEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,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("./misc"), exports);
|
|
18
|
+
__exportStar(require("./srcmap"), exports);
|
|
19
|
+
__exportStar(require("./immutable_map"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|