sol-dbg 0.5.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug/decoding/general.d.ts +2 -1
- package/dist/debug/decoding/general.d.ts.map +1 -1
- package/dist/debug/decoding/general.js +5 -5
- 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 +1 -0
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/debug/index.js +1 -0
- 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 +4 -1
- package/dist/debug/tracers/base_tracer.d.ts.map +1 -1
- package/dist/debug/tracers/base_tracer.js +13 -3
- package/dist/debug/tracers/base_tracer.js.map +1 -1
- package/dist/debug/tracers/index.d.ts +1 -0
- package/dist/debug/tracers/index.d.ts.map +1 -1
- package/dist/debug/tracers/index.js +1 -0
- package/dist/debug/tracers/index.js.map +1 -1
- 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 +2 -0
- package/dist/debug/tracers/transformers/basic_info.d.ts.map +1 -1
- package/dist/debug/tracers/transformers/basic_info.js +2 -0
- package/dist/debug/tracers/transformers/basic_info.js.map +1 -1
- 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/index.d.ts +2 -0
- package/dist/debug/tracers/transformers/index.d.ts.map +1 -1
- package/dist/debug/tracers/transformers/index.js +2 -0
- package/dist/debug/tracers/transformers/index.js.map +1 -1
- 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/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -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 +2 -1
- package/dist/utils/pp.d.ts.map +1 -1
- package/dist/utils/pp.js +2 -2
- 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/dist/utils/trace.d.ts +18 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +87 -0
- package/dist/utils/trace.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Block } from "@ethereumjs/block";
|
|
2
|
-
import { EVMStateManagerInterface } from "@ethereumjs/common";
|
|
2
|
+
import { Common, EVMStateManagerInterface } from "@ethereumjs/common";
|
|
3
3
|
import { TypedTransaction } from "@ethereumjs/tx";
|
|
4
|
-
import {
|
|
4
|
+
import { PrefixedHexString } from "@ethereumjs/util";
|
|
5
5
|
import { HexString } from "../artifacts";
|
|
6
|
+
import { ContractSolidityState, FoundryTxResult, IArtifactManager, KeccakPreimageMap } from "../debug";
|
|
6
7
|
export interface BaseTestStep {
|
|
7
8
|
address: HexString;
|
|
8
9
|
gasLimit: HexString;
|
|
@@ -62,30 +63,41 @@ export interface TestStep extends BaseTestStep {
|
|
|
62
63
|
errorStack?: string[];
|
|
63
64
|
errorString?: string;
|
|
64
65
|
errorPathPrefix?: string;
|
|
66
|
+
layoutBefore?: ContractSolidityState;
|
|
65
67
|
}
|
|
66
68
|
export interface TestCase extends BaseTestCase {
|
|
67
69
|
steps: TestStep[];
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
|
-
* Helper class to
|
|
72
|
+
* Helper class to run a set of TX and record info to allow debuggin any of the TXs independently. This includes:
|
|
73
|
+
*
|
|
74
|
+
* 1. The TX data for each
|
|
75
|
+
* 2. The Block info for each TX
|
|
76
|
+
* 3. The State of the world before each TX
|
|
77
|
+
* 4. The result of the TX
|
|
78
|
+
* 5. The set of contracts before each TX
|
|
79
|
+
* 6. The set of keccak256 (result, preimage) pairs computed by the TX (useful for computing Solidity-level maps)
|
|
71
80
|
*/
|
|
72
81
|
export declare class VMTestRunner {
|
|
73
|
-
private
|
|
82
|
+
private _foundryCheatcodes;
|
|
83
|
+
private tracer;
|
|
74
84
|
private _txs;
|
|
75
85
|
private _txToBlock;
|
|
76
86
|
private _results;
|
|
77
87
|
private _stateRootBeforeTx;
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
private _contractsBeforeTx;
|
|
89
|
+
private _keccakPreimagesBeforeTx;
|
|
90
|
+
constructor(artifactManager: IArtifactManager, _foundryCheatcodes?: boolean);
|
|
80
91
|
runTestCase(testCaseJSON: BaseTestCase): Promise<void>;
|
|
81
92
|
private setupInitialState;
|
|
82
|
-
harveyStepToTransaction(step: BaseTestStep): Promise<TypedTransaction>;
|
|
83
|
-
harveyStepToBlock(step: BaseTestStep): Block;
|
|
84
|
-
private _runTxInt;
|
|
93
|
+
harveyStepToTransaction(step: BaseTestStep, stateManager: EVMStateManagerInterface, common: Common): Promise<TypedTransaction>;
|
|
94
|
+
harveyStepToBlock(step: BaseTestStep, common: Common): Block;
|
|
85
95
|
get txs(): TypedTransaction[];
|
|
86
|
-
get results():
|
|
96
|
+
get results(): FoundryTxResult[];
|
|
87
97
|
getStateBeforeTx(tx: TypedTransaction): EVMStateManagerInterface;
|
|
88
98
|
getBlock(tx: TypedTransaction): Block;
|
|
99
|
+
getContractsBefore(tx: TypedTransaction): Set<PrefixedHexString>;
|
|
100
|
+
getKeccakPreimagesBefore(tx: TypedTransaction): KeccakPreimageMap;
|
|
89
101
|
}
|
|
90
102
|
export {};
|
|
91
103
|
//# sourceMappingURL=test_runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_runner.d.ts","sourceRoot":"","sources":["../../src/utils/test_runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAY,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"test_runner.d.ts","sourceRoot":"","sources":["../../src/utils/test_runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,10 @@ const common_1 = require("@ethereumjs/common");
|
|
|
6
6
|
const util_1 = require("@ethereumjs/util");
|
|
7
7
|
const utils_1 = require("ethereum-cryptography/utils");
|
|
8
8
|
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
9
|
+
const debug_1 = require("../debug");
|
|
10
|
+
const map_1 = require("./map");
|
|
9
11
|
const misc_1 = require("./misc");
|
|
12
|
+
const set_1 = require("./set");
|
|
10
13
|
var ResultKind;
|
|
11
14
|
(function (ResultKind) {
|
|
12
15
|
ResultKind["ContractCreated"] = "contract_created";
|
|
@@ -16,30 +19,66 @@ var ResultKind;
|
|
|
16
19
|
ResultKind["FoundryFail"] = "foundry_fail";
|
|
17
20
|
})(ResultKind || (exports.ResultKind = ResultKind = {}));
|
|
18
21
|
/**
|
|
19
|
-
* Helper class to
|
|
22
|
+
* Helper class to run a set of TX and record info to allow debuggin any of the TXs independently. This includes:
|
|
23
|
+
*
|
|
24
|
+
* 1. The TX data for each
|
|
25
|
+
* 2. The Block info for each TX
|
|
26
|
+
* 3. The State of the world before each TX
|
|
27
|
+
* 4. The result of the TX
|
|
28
|
+
* 5. The set of contracts before each TX
|
|
29
|
+
* 6. The set of keccak256 (result, preimage) pairs computed by the TX (useful for computing Solidity-level maps)
|
|
20
30
|
*/
|
|
21
31
|
class VMTestRunner {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
constructor(vm) {
|
|
32
|
+
constructor(artifactManager, _foundryCheatcodes = true) {
|
|
33
|
+
this._foundryCheatcodes = _foundryCheatcodes;
|
|
26
34
|
this._stateRootBeforeTx = new Map();
|
|
27
|
-
this.
|
|
35
|
+
this._contractsBeforeTx = new Map();
|
|
36
|
+
this._keccakPreimagesBeforeTx = new Map();
|
|
37
|
+
this.tracer = new debug_1.SupportTracer(artifactManager, {
|
|
38
|
+
strict: true,
|
|
39
|
+
foundryCheatcodes: this._foundryCheatcodes
|
|
40
|
+
});
|
|
28
41
|
this._txs = [];
|
|
29
42
|
this._results = [];
|
|
30
43
|
this._txToBlock = new Map();
|
|
31
44
|
}
|
|
32
45
|
async runTestCase(testCaseJSON) {
|
|
33
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Dummy VM used just to get a StateManager and a Common instance. The actual VM used for execution is created inside
|
|
48
|
+
* SupportTracer. (@todo this is kinda ugly... oh well)
|
|
49
|
+
*/
|
|
50
|
+
const dummyVM = await debug_1.BaseSolTxTracer.createVm(undefined, this._foundryCheatcodes);
|
|
51
|
+
let stateManager = dummyVM.stateManager.shallowCopy();
|
|
52
|
+
const common = dummyVM.common.copy();
|
|
53
|
+
debug_1.BaseSolTxTracer.releaseVM(dummyVM);
|
|
54
|
+
const contractsBefore = await this.setupInitialState(testCaseJSON.initialState, stateManager);
|
|
55
|
+
const keccakPreimages = new Map();
|
|
34
56
|
for (let i = 0; i < testCaseJSON.steps.length; i++) {
|
|
35
|
-
const tx = await this.harveyStepToTransaction(testCaseJSON.steps[i]);
|
|
36
|
-
const block = this.harveyStepToBlock(testCaseJSON.steps[i]);
|
|
37
|
-
const
|
|
57
|
+
const tx = await this.harveyStepToTransaction(testCaseJSON.steps[i], stateManager, common);
|
|
58
|
+
const block = this.harveyStepToBlock(testCaseJSON.steps[i], common);
|
|
59
|
+
const txHash = (0, utils_1.bytesToHex)(tx.hash());
|
|
60
|
+
// Store the sets before the TX
|
|
61
|
+
this._txs.push(tx);
|
|
62
|
+
this._stateRootBeforeTx.set(txHash, stateManager);
|
|
63
|
+
this._txToBlock.set(txHash, block);
|
|
64
|
+
this._contractsBeforeTx.set(txHash, new Set(contractsBefore));
|
|
65
|
+
this._keccakPreimagesBeforeTx.set(txHash, new Map(keccakPreimages));
|
|
66
|
+
const [trace, res, stateAfter] = await this.tracer.debugTx(tx, block, stateManager);
|
|
67
|
+
await stateManager.flush();
|
|
68
|
+
// Update the set of live contracts
|
|
69
|
+
const [gen, kill] = (0, debug_1.getContractGenKillSet)(trace, res);
|
|
70
|
+
(0, set_1.set_add)(contractsBefore, gen);
|
|
71
|
+
(0, set_1.set_subtract)(contractsBefore, kill);
|
|
72
|
+
const txKeccakPreimages = (0, debug_1.getKeccakPreimages)(trace);
|
|
73
|
+
(0, map_1.map_add)(keccakPreimages, txKeccakPreimages);
|
|
74
|
+
// Update the keccak map
|
|
75
|
+
// Add results
|
|
38
76
|
this._results.push(res);
|
|
77
|
+
stateManager = stateAfter;
|
|
39
78
|
}
|
|
40
79
|
}
|
|
41
|
-
async setupInitialState(initialState) {
|
|
42
|
-
const
|
|
80
|
+
async setupInitialState(initialState, state) {
|
|
81
|
+
const initialContracts = new Set();
|
|
43
82
|
await state.checkpoint();
|
|
44
83
|
for (const addressStr of Object.keys(initialState.accounts)) {
|
|
45
84
|
const { nonce, balance, code, storage } = initialState.accounts[addressStr];
|
|
@@ -55,13 +94,17 @@ class VMTestRunner {
|
|
|
55
94
|
await state.putContractStorage(address, keyBuf, valBuf);
|
|
56
95
|
}
|
|
57
96
|
await state.putContractCode(address, codeBuf);
|
|
97
|
+
if (codeBuf.length > 0) {
|
|
98
|
+
initialContracts.add(address.toString());
|
|
99
|
+
}
|
|
58
100
|
}
|
|
59
101
|
await state.commit();
|
|
60
102
|
await state.flush();
|
|
103
|
+
return initialContracts;
|
|
61
104
|
}
|
|
62
|
-
async harveyStepToTransaction(step) {
|
|
105
|
+
async harveyStepToTransaction(step, stateManager, common) {
|
|
63
106
|
const senderAddress = util_1.Address.fromString(step.origin);
|
|
64
|
-
const senderAccount = await
|
|
107
|
+
const senderAccount = await stateManager.getAccount(senderAddress);
|
|
65
108
|
const senderNonce = senderAccount !== undefined ? senderAccount.nonce : 0;
|
|
66
109
|
const txData = {
|
|
67
110
|
value: step.value,
|
|
@@ -73,36 +116,21 @@ class VMTestRunner {
|
|
|
73
116
|
if (step.address !== misc_1.ZERO_ADDRESS_STRING) {
|
|
74
117
|
txData.to = step.address;
|
|
75
118
|
}
|
|
76
|
-
return (0, misc_1.makeFakeTransaction)(txData, step.origin,
|
|
119
|
+
return (0, misc_1.makeFakeTransaction)(txData, step.origin, common);
|
|
77
120
|
}
|
|
78
|
-
harveyStepToBlock(step) {
|
|
121
|
+
harveyStepToBlock(step, common) {
|
|
79
122
|
return block_1.Block.fromBlockData({
|
|
80
123
|
header: {
|
|
81
124
|
coinbase: step.origin,
|
|
82
|
-
difficulty:
|
|
125
|
+
difficulty: common.hardfork() === common_1.Hardfork.Shanghai ? 0 : step.blockDifficulty,
|
|
83
126
|
gasLimit: step.blockGasLimit,
|
|
84
127
|
number: step.blockNumber,
|
|
85
128
|
timestamp: step.blockTime
|
|
86
129
|
}
|
|
87
130
|
}, {
|
|
88
|
-
common:
|
|
131
|
+
common: common
|
|
89
132
|
});
|
|
90
133
|
}
|
|
91
|
-
async _runTxInt(tx, block) {
|
|
92
|
-
const txHash = (0, utils_1.bytesToHex)(tx.hash());
|
|
93
|
-
this._txs.push(tx);
|
|
94
|
-
this._stateRootBeforeTx.set(txHash, this.vm.stateManager.shallowCopy(true));
|
|
95
|
-
this._txToBlock.set(txHash, block);
|
|
96
|
-
const res = this.vm.runTx({
|
|
97
|
-
tx,
|
|
98
|
-
block,
|
|
99
|
-
skipBalance: true,
|
|
100
|
-
skipNonce: true,
|
|
101
|
-
skipBlockGasLimitValidation: true
|
|
102
|
-
});
|
|
103
|
-
await this.vm.stateManager.flush();
|
|
104
|
-
return res;
|
|
105
|
-
}
|
|
106
134
|
get txs() {
|
|
107
135
|
return this._txs;
|
|
108
136
|
}
|
|
@@ -121,6 +149,18 @@ class VMTestRunner {
|
|
|
121
149
|
(0, solc_typed_ast_1.assert)(res !== undefined, `Unable to find block for tx ${txHash}`);
|
|
122
150
|
return res;
|
|
123
151
|
}
|
|
152
|
+
getContractsBefore(tx) {
|
|
153
|
+
const txHash = (0, utils_1.bytesToHex)(tx.hash());
|
|
154
|
+
const res = this._contractsBeforeTx.get(txHash);
|
|
155
|
+
(0, solc_typed_ast_1.assert)(res !== undefined, `Unable to find contracts for tx ${txHash}`);
|
|
156
|
+
return res;
|
|
157
|
+
}
|
|
158
|
+
getKeccakPreimagesBefore(tx) {
|
|
159
|
+
const txHash = (0, utils_1.bytesToHex)(tx.hash());
|
|
160
|
+
const res = this._keccakPreimagesBeforeTx.get(txHash);
|
|
161
|
+
(0, solc_typed_ast_1.assert)(res !== undefined, `Unable to find keccak preimages for tx ${txHash}`);
|
|
162
|
+
return res;
|
|
163
|
+
}
|
|
124
164
|
}
|
|
125
165
|
exports.VMTestRunner = VMTestRunner;
|
|
126
166
|
//# sourceMappingURL=test_runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_runner.js","sourceRoot":"","sources":["../../src/utils/test_runner.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAC1C,+
|
|
1
|
+
{"version":3,"file":"test_runner.js","sourceRoot":"","sources":["../../src/utils/test_runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StepState } from "../debug";
|
|
2
|
+
/**
|
|
3
|
+
* Find the last step in the non-internal code, before trace step i
|
|
4
|
+
*/
|
|
5
|
+
export declare function findLastNonInternalStepBeforeStepI(trace: StepState[], i: number): StepState | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Find the last step in the non-internal code, that leads to the first revert
|
|
8
|
+
*/
|
|
9
|
+
export declare function findLastNonInternalStepBeforeRevert(trace: StepState[]): StepState | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Find the last step in the non-internal code, that leads to the last revert
|
|
12
|
+
*/
|
|
13
|
+
export declare function findLastNonInternalStepBeforeLastRevert(trace: StepState[]): StepState | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Find the last step before calling the foundry cheatcode fail()
|
|
16
|
+
*/
|
|
17
|
+
export declare function findFirstCallToFail(trace: StepState[]): StepState | undefined;
|
|
18
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/utils/trace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC;;GAEG;AACH,wBAAgB,kCAAkC,CAC9C,KAAK,EAAE,SAAS,EAAE,EAClB,CAAC,EAAE,MAAM,GACV,SAAS,GAAG,SAAS,CAcvB;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,CAc7F;AAED;;GAEG;AACH,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,CAcjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,CAmC7E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findLastNonInternalStepBeforeStepI = findLastNonInternalStepBeforeStepI;
|
|
4
|
+
exports.findLastNonInternalStepBeforeRevert = findLastNonInternalStepBeforeRevert;
|
|
5
|
+
exports.findLastNonInternalStepBeforeLastRevert = findLastNonInternalStepBeforeLastRevert;
|
|
6
|
+
exports.findFirstCallToFail = findFirstCallToFail;
|
|
7
|
+
const utils_1 = require("ethereum-cryptography/utils");
|
|
8
|
+
const solc_typed_ast_1 = require("solc-typed-ast");
|
|
9
|
+
const foundry_cheatcodes_1 = require("../debug/foundry_cheatcodes");
|
|
10
|
+
const misc_1 = require("./misc");
|
|
11
|
+
const pp_1 = require("./pp");
|
|
12
|
+
/**
|
|
13
|
+
* Find the last step in the non-internal code, before trace step i
|
|
14
|
+
*/
|
|
15
|
+
function findLastNonInternalStepBeforeStepI(trace, i) {
|
|
16
|
+
const stack = (0, pp_1.flattenStack)(trace[i].stack);
|
|
17
|
+
for (let j = stack.length - 1; j >= 0; j--) {
|
|
18
|
+
if (stack[j].callee instanceof solc_typed_ast_1.FunctionDefinition) {
|
|
19
|
+
if (j === stack.length - 1) {
|
|
20
|
+
return trace[i];
|
|
21
|
+
}
|
|
22
|
+
return trace[stack[j + 1].startStep - 1];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Find the last step in the non-internal code, that leads to the first revert
|
|
29
|
+
*/
|
|
30
|
+
function findLastNonInternalStepBeforeRevert(trace) {
|
|
31
|
+
let i = 0;
|
|
32
|
+
for (; i < trace.length; i++) {
|
|
33
|
+
if (trace[i].op.opcode === 0xfd) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (i === trace.length) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return findLastNonInternalStepBeforeStepI(trace, i);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Find the last step in the non-internal code, that leads to the last revert
|
|
44
|
+
*/
|
|
45
|
+
function findLastNonInternalStepBeforeLastRevert(trace) {
|
|
46
|
+
let i = trace.length - 1;
|
|
47
|
+
for (; i >= 0; i--) {
|
|
48
|
+
if (trace[i].op.opcode === 0xfd) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (i < 0) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return findLastNonInternalStepBeforeStepI(trace, i);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Find the last step before calling the foundry cheatcode fail()
|
|
59
|
+
*/
|
|
60
|
+
function findFirstCallToFail(trace) {
|
|
61
|
+
let i = 0;
|
|
62
|
+
for (; i < trace.length; i++) {
|
|
63
|
+
// Look for CALL to FoundryCheatcodesAddress with the FAIL_SELECTOR
|
|
64
|
+
if (trace[i].op.mnemonic === "CALL") {
|
|
65
|
+
const stackLen = trace[i].evmStack.length;
|
|
66
|
+
const addr = (0, misc_1.wordToAddress)(trace[i].evmStack[stackLen - 2]);
|
|
67
|
+
if (!addr.equals(foundry_cheatcodes_1.FoundryCheatcodesAddress)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const argOffset = (0, misc_1.bigEndianBufToNumber)(trace[i].evmStack[stackLen - 4]);
|
|
71
|
+
const argSize = (0, misc_1.bigEndianBufToNumber)(trace[i].evmStack[stackLen - 5]);
|
|
72
|
+
if (argSize < 4) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const msgData = (0, utils_1.bytesToHex)(trace[i].memory.slice(argOffset, argOffset + argSize));
|
|
76
|
+
if (msgData === foundry_cheatcodes_1.FAIL_MSG_DATA) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (i === trace.length) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
//console.error(`Error step: ${i}`);
|
|
85
|
+
return trace[i];
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/utils/trace.ts"],"names":[],"mappings":"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"}
|