Skip to content

Commit 814831d

Browse files
committed
tests(js): add test op_gascost
Signed-off-by: jsvisa <delweng@gmail.com>
1 parent 60a021d commit 814831d

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

tests/it/geth_js.rs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,98 @@ fn test_geth_jstracer_proxy_contract() {
145145
let result = insp.json_result(res, &env, &evm.db).unwrap();
146146
assert_eq!(result, json!([{"event": "Transfer", "token": proxy_addr, "caller": deployer}]));
147147
}
148+
149+
#[test]
150+
fn test_geth_jstracer_op_gascost() {
151+
/*
152+
pragma solidity ^0.8.13;
153+
contract Foo {
154+
event Log(address indexed addr, uint256 value);
155+
function foo() external {
156+
emit Log(msg.sender, 0);
157+
}
158+
function bar() external {
159+
emit Log(msg.sender, 0);
160+
require(false, "barbarbar");
161+
}
162+
}
163+
*/
164+
165+
let code = hex!("608060405261023e806100115f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063c298557814610038578063febb0f7e14610042575b5f80fd5b61004061004c565b005b61004a61009c565b005b3373ffffffffffffffffffffffffffffffffffffffff167ff950957d2407bed19dc99b718b46b4ce6090c05589006dfb86fd22c34865b23e5f6040516100929190610177565b60405180910390a2565b3373ffffffffffffffffffffffffffffffffffffffff167ff950957d2407bed19dc99b718b46b4ce6090c05589006dfb86fd22c34865b23e5f6040516100e29190610177565b60405180910390a25f61012a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610121906101ea565b60405180910390fd5b565b5f819050919050565b5f819050919050565b5f819050919050565b5f61016161015c6101578461012c565b61013e565b610135565b9050919050565b61017181610147565b82525050565b5f60208201905061018a5f830184610168565b92915050565b5f82825260208201905092915050565b7f62617262617262617200000000000000000000000000000000000000000000005f82015250565b5f6101d4600983610190565b91506101df826101a0565b602082019050919050565b5f6020820190508181035f830152610201816101c8565b905091905056fea2646970667358221220e058dc2c4bd629d62405850cc8e08e6bfad0eea187260784445dfe8f3ee0bea564736f6c634300081a0033");
166+
167+
let (addr, mut evm) = deploy_contract(code.into(), Address::ZERO, SpecId::CANCUN);
168+
169+
let code = r#"
170+
{
171+
data: [],
172+
memoryInstructions: { "MSTORE": "W", "MSTORE8": "B", "MLOAD": "R" },
173+
fault: function (_) {},
174+
step: function (log) {
175+
let op = log.op.toString();
176+
let instructions = this.memoryInstructions;
177+
if (Object.keys(instructions).includes(op)) {
178+
this.data.push({
179+
op: instructions[op],
180+
depth: log.getDepth(),
181+
offset: log.stack.peek(0),
182+
gasCost: log.getCost(),
183+
memorySize: log.memory.length(),
184+
});
185+
}
186+
},
187+
result: function (ctx, _) { return { error: !!ctx.error, data: this.data }; }
188+
}
189+
"#;
190+
191+
// test with normal operation
192+
let env = evm.env_with_tx(TxEnv {
193+
transact_to: TransactTo::Call(addr),
194+
data: hex!("c2985578").into(), // call foo
195+
..Default::default()
196+
});
197+
let mut insp = JsInspector::new(code.to_string(), serde_json::Value::Null).unwrap();
198+
let (res, _) = inspect(&mut evm.db, env.clone(), &mut insp).unwrap();
199+
assert!(res.result.is_success());
200+
201+
let result = insp.json_result(res, &env, &evm.db).unwrap();
202+
203+
assert!(!result["error"].as_bool().unwrap());
204+
assert_eq!(
205+
result["data"],
206+
serde_json::json!([
207+
{ "op": "W", "depth": 1, "offset": "64", "gasCost": 12, "memorySize": 0 },
208+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 96 },
209+
{ "op": "W", "depth": 1, "offset": "128", "gasCost": 9, "memorySize": 96 },
210+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 160 }
211+
])
212+
);
213+
214+
// test with reverted operation
215+
let env = evm.env_with_tx(TxEnv {
216+
transact_to: TransactTo::Call(addr),
217+
data: hex!("febb0f7e").into(), // call bar
218+
..Default::default()
219+
});
220+
let mut insp = JsInspector::new(code.to_string(), serde_json::Value::Null).unwrap();
221+
let (res, _) = inspect(&mut evm.db, env.clone(), &mut insp).unwrap();
222+
assert!(!res.result.is_success());
223+
224+
let result = insp.json_result(res, &env, &evm.db).unwrap();
225+
226+
assert!(result["error"].as_bool().unwrap());
227+
assert_eq!(
228+
result["data"],
229+
serde_json::json!([
230+
{ "op": "W", "depth": 1, "offset": "64", "gasCost": 12, "memorySize": 0 },
231+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 96 },
232+
{ "op": "W", "depth": 1, "offset": "128", "gasCost": 9, "memorySize": 96 },
233+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 160 },
234+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 160 },
235+
{ "op": "W", "depth": 1, "offset": "128", "gasCost": 3, "memorySize": 160 },
236+
{ "op": "W", "depth": 1, "offset": "132", "gasCost": 6, "memorySize": 160 },
237+
{ "op": "W", "depth": 1, "offset": "164", "gasCost": 6, "memorySize": 192 },
238+
{ "op": "W", "depth": 1, "offset": "196", "gasCost": 6, "memorySize": 224 },
239+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 256 }
240+
])
241+
);
242+
}

0 commit comments

Comments
 (0)