Skip to content

Commit 6a4d9f5

Browse files
committed
fix testcase
Signed-off-by: jsvisa <delweng@gmail.com>
1 parent 4b11c95 commit 6a4d9f5

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

tests/it/geth.rs

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,130 @@ fn test_geth_jstracer_revert() {
443443

444444
// reverted operation
445445
assert!(result["error"].as_bool().unwrap());
446+
}
447+
448+
#[test]
449+
#[cfg(feature = "js-tracer")]
450+
fn test_geth_jstracer_op_gascost() {
451+
/*
452+
pragma solidity ^0.8.13;
453+
454+
contract Foo {
455+
event Log(address indexed addr, uint256 value);
456+
457+
function foo() external {
458+
emit Log(msg.sender, 0);
459+
}
460+
461+
function bar() external {
462+
emit Log(msg.sender, 0);
463+
require(false, "barbarbar");
464+
}
465+
}
466+
*/
467+
468+
let code = hex!("608060405261023e806100115f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063c298557814610038578063febb0f7e14610042575b5f80fd5b61004061004c565b005b61004a61009c565b005b3373ffffffffffffffffffffffffffffffffffffffff167ff950957d2407bed19dc99b718b46b4ce6090c05589006dfb86fd22c34865b23e5f6040516100929190610177565b60405180910390a2565b3373ffffffffffffffffffffffffffffffffffffffff167ff950957d2407bed19dc99b718b46b4ce6090c05589006dfb86fd22c34865b23e5f6040516100e29190610177565b60405180910390a25f61012a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610121906101ea565b60405180910390fd5b565b5f819050919050565b5f819050919050565b5f819050919050565b5f61016161015c6101578461012c565b61013e565b610135565b9050919050565b61017181610147565b82525050565b5f60208201905061018a5f830184610168565b92915050565b5f82825260208201905092915050565b7f62617262617262617200000000000000000000000000000000000000000000005f82015250565b5f6101d4600983610190565b91506101df826101a0565b602082019050919050565b5f6020820190508181035f830152610201816101c8565b905091905056fea2646970667358221220e058dc2c4bd629d62405850cc8e08e6bfad0eea187260784445dfe8f3ee0bea564736f6c634300081a0033");
469+
let deployer = Address::ZERO;
470+
471+
let mut db = CacheDB::new(EmptyDB::default());
472+
473+
let cfg = CfgEnvWithHandlerCfg::new(CfgEnv::default(), HandlerCfg::new(SpecId::CANCUN));
474+
475+
let env = EnvWithHandlerCfg::new_with_cfg_env(
476+
cfg.clone(),
477+
BlockEnv::default(),
478+
TxEnv {
479+
caller: deployer,
480+
gas_limit: 1000000,
481+
transact_to: TransactTo::Create,
482+
data: code.into(),
483+
..Default::default()
484+
},
485+
);
486+
487+
let mut insp = TracingInspector::new(TracingInspectorConfig::default_geth());
488+
489+
// Create contract
490+
let (res, _) = inspect(&mut db, env, &mut insp).unwrap();
491+
let addr = match res.result {
492+
ExecutionResult::Success { output, .. } => match output {
493+
Output::Create(_, addr) => addr.unwrap(),
494+
_ => panic!("Create failed"),
495+
},
496+
_ => panic!("Execution failed: {:?}", res.result),
497+
};
498+
db.commit(res.state);
499+
500+
let code = r#"
501+
{
502+
data: [],
503+
memoryInstructions: { "MSTORE": "W", "MSTORE8": "B", "MLOAD": "R" },
504+
fault: function (_) {},
505+
step: function (log) {
506+
let op = log.op.toString();
507+
let instructions = this.memoryInstructions;
508+
if (Object.keys(instructions).includes(op)) {
509+
this.data.push({
510+
op: instructions[op],
511+
depth: log.getDepth(),
512+
offset: log.stack.peek(0),
513+
gasCost: log.getCost(),
514+
memorySize: log.memory.length(),
515+
});
516+
}
517+
},
518+
result: function (ctx, _) { return { error: !!ctx.error, data: this.data }; }
519+
}
520+
"#;
521+
522+
// test with normal operation
523+
let env = EnvWithHandlerCfg::new_with_cfg_env(
524+
cfg.clone(),
525+
BlockEnv::default(),
526+
TxEnv {
527+
caller: deployer,
528+
gas_limit: 1000000,
529+
transact_to: TransactTo::Call(addr),
530+
data: hex!("c2985578").into(), // call foo
531+
..Default::default()
532+
},
533+
);
534+
let mut insp = JsInspector::new(code.to_string(), serde_json::Value::Null).unwrap();
535+
let (res, _) = inspect(&mut db, env.clone(), &mut insp).unwrap();
536+
assert!(res.result.is_success());
537+
538+
let result = insp.json_result(res, &env, &db).unwrap();
539+
540+
assert!(!result["error"].as_bool().unwrap());
541+
assert_eq!(
542+
result["data"],
543+
serde_json::json!([
544+
{ "op": "W", "depth": 1, "offset": "64", "gasCost": 12, "memorySize": 0 },
545+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 96 },
546+
{ "op": "W", "depth": 1, "offset": "128", "gasCost": 9, "memorySize": 96 },
547+
{ "op": "R", "depth": 1, "offset": "64", "gasCost": 3, "memorySize": 160 }
548+
])
549+
);
550+
551+
// test with reverted operation
552+
let env = EnvWithHandlerCfg::new_with_cfg_env(
553+
cfg,
554+
BlockEnv::default(),
555+
TxEnv {
556+
caller: deployer,
557+
gas_limit: 1000000,
558+
transact_to: TransactTo::Call(addr),
559+
data: hex!("febb0f7e").into(), // call bar
560+
..Default::default()
561+
},
562+
);
563+
let mut insp = JsInspector::new(code.to_string(), serde_json::Value::Null).unwrap();
564+
let (res, _) = inspect(&mut db, env.clone(), &mut insp).unwrap();
565+
assert!(!res.result.is_success());
566+
567+
let result = insp.json_result(res, &env, &db).unwrap();
568+
569+
assert!(result["error"].as_bool().unwrap());
446570
assert_eq!(
447571
result["data"],
448572
serde_json::json!([

0 commit comments

Comments
 (0)