From 58c3ced146cae5a9c0c6befa419e540c30d137d3 Mon Sep 17 00:00:00 2001 From: han0110 Date: Fri, 9 Dec 2022 11:09:26 +0800 Subject: [PATCH] fix: propagate value of caller when `DELEGATECALL` --- bus-mapping/src/circuit_input_builder/call.rs | 5 +++++ bus-mapping/src/circuit_input_builder/input_state_ref.rs | 2 +- bus-mapping/src/evm/opcodes/callop.rs | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/bus-mapping/src/circuit_input_builder/call.rs b/bus-mapping/src/circuit_input_builder/call.rs index b0e3b52773..6e92839445 100644 --- a/bus-mapping/src/circuit_input_builder/call.rs +++ b/bus-mapping/src/circuit_input_builder/call.rs @@ -101,6 +101,11 @@ impl Call { pub fn is_create(&self) -> bool { self.kind.is_create() } + + /// This call is call with op DELEGATECALL + pub fn is_delegatecall(&self) -> bool { + matches!(self.kind, CallKind::DelegateCall) + } } /// Context of a [`Call`]. diff --git a/bus-mapping/src/circuit_input_builder/input_state_ref.rs b/bus-mapping/src/circuit_input_builder/input_state_ref.rs index 6fb41bf800..2071897846 100644 --- a/bus-mapping/src/circuit_input_builder/input_state_ref.rs +++ b/bus-mapping/src/circuit_input_builder/input_state_ref.rs @@ -595,7 +595,7 @@ impl<'a> CircuitInputStateRef<'a> { step.stack.nth_last(2)?, ), CallKind::CallCode => (caller.address, caller.address, step.stack.nth_last(2)?), - CallKind::DelegateCall => (caller.caller_address, caller.address, Word::zero()), + CallKind::DelegateCall => (caller.caller_address, caller.address, caller.value), CallKind::StaticCall => ( caller.address, step.stack.nth_last(1)?.to_address(), diff --git a/bus-mapping/src/evm/opcodes/callop.rs b/bus-mapping/src/evm/opcodes/callop.rs index 68a7ba8db9..44686202c0 100644 --- a/bus-mapping/src/evm/opcodes/callop.rs +++ b/bus-mapping/src/evm/opcodes/callop.rs @@ -155,7 +155,7 @@ impl Opcode for CallOpcode { .max() .unwrap(); - let has_value = !call.value.is_zero(); + let has_value = !call.value.is_zero() && !call.is_delegatecall(); let memory_expansion_gas_cost = memory_expansion_gas_cost(curr_memory_word_size, next_memory_word_size); let gas_cost = if is_warm {