diff --git a/.github/workflows/tests-evm.yml b/.github/workflows/tests-evm.yml index 58b5d1f320ec2..0628398df7741 100644 --- a/.github/workflows/tests-evm.yml +++ b/.github/workflows/tests-evm.yml @@ -125,7 +125,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: paritytech/evm-test-suite - ref: 9359438a13e8ab68f73320724f8783e170ecc193 + ref: f3a2e98620adfc233166728230247d479a159e76 path: evm-test-suite - uses: denoland/setup-deno@v2 diff --git a/prdoc/pr_10510.prdoc b/prdoc/pr_10510.prdoc new file mode 100644 index 0000000000000..1266f690679f5 --- /dev/null +++ b/prdoc/pr_10510.prdoc @@ -0,0 +1,9 @@ +title: '[pallet-revive] fix delegate_call_contract in evm-test-suites' +doc: +- audience: Runtime Dev + description: evm-test-suite was not correctly executing delegate_call_contract causing + pallet-revive to silently reject the delegatecall. After evm-test-suite was fixed + we found that the trace for delegate calls is incorrect. This fixes it. +crates: +- name: pallet-revive + bump: patch diff --git a/substrate/frame/revive/src/evm/tracing/call_tracing.rs b/substrate/frame/revive/src/evm/tracing/call_tracing.rs index d26f0c9581124..0b5df032d3c8c 100644 --- a/substrate/frame/revive/src/evm/tracing/call_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/call_tracing.rs @@ -87,7 +87,7 @@ impl Gas> Tracing &mut self, from: H160, to: H160, - is_delegate_call: bool, + delegate_call: Option, is_read_only: bool, value: U256, input: &[u8], @@ -117,7 +117,7 @@ impl Gas> Tracing None => { let call_type = if is_read_only { CallType::StaticCall - } else if is_delegate_call { + } else if delegate_call.is_some() { CallType::DelegateCall } else { CallType::Call diff --git a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs index 80fd61e6d3d6d..0c19f69d6098e 100644 --- a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs @@ -254,23 +254,25 @@ where &mut self, from: H160, to: H160, - is_delegate_call: bool, + delegate_call: Option, _is_read_only: bool, _value: U256, _input: &[u8], _gas: Weight, ) { - if is_delegate_call { + if let Some(delegate_call) = delegate_call { self.calls.push(self.current_addr()); + self.read_account(delegate_call); } else { self.calls.push(to); + self.read_account(from); } if self.create_code.take().is_some() { self.created_addrs.insert(to); + } else { + self.read_account(to); } - self.read_account(from); - self.read_account(to); } fn exit_child_span_with_error(&mut self, _error: crate::DispatchError, _gas_used: Weight) { diff --git a/substrate/frame/revive/src/exec.rs b/substrate/frame/revive/src/exec.rs index dc0f298f2a25b..7e2d872668a1c 100644 --- a/substrate/frame/revive/src/exec.rs +++ b/substrate/frame/revive/src/exec.rs @@ -603,7 +603,7 @@ struct Frame { /// This structure is used to represent the arguments in a delegate call frame in order to /// distinguish who delegated the call and where it was delegated to. -#[derive(Clone)] +#[derive(Clone, RuntimeDebugNoBound)] pub struct DelegateInfo { /// The caller of the contract. pub caller: Origin, @@ -816,7 +816,7 @@ where t.enter_child_span( origin.account_id().map(T::AddressMapper::to_address).unwrap_or_default(), T::AddressMapper::to_address(&dest), - false, + None, false, value, &input_data, @@ -1181,7 +1181,7 @@ where tracer.enter_child_span( self.caller().account_id().map(T::AddressMapper::to_address).unwrap_or_default(), T::AddressMapper::to_address(&frame.account_id), - frame.delegate.is_some(), + frame.delegate.as_ref().map(|delegate| delegate.callee), frame.read_only, frame.value_transferred, &input_data, @@ -2041,7 +2041,7 @@ where t.enter_child_span( T::AddressMapper::to_address(self.account_id()), T::AddressMapper::to_address(&dest), - false, + None, is_read_only, value, &input_data, diff --git a/substrate/frame/revive/src/tracing.rs b/substrate/frame/revive/src/tracing.rs index cbb400c5504e9..ae115d0e21555 100644 --- a/substrate/frame/revive/src/tracing.rs +++ b/substrate/frame/revive/src/tracing.rs @@ -50,7 +50,7 @@ pub trait Tracing { &mut self, _from: H160, _to: H160, - _is_delegate_call: bool, + _delegate_call: Option, _is_read_only: bool, _value: U256, _input: &[u8],