Skip to content

Commit a7381c3

Browse files
committed
fix: 🐛 manage API v6 case in Eth::call
1 parent 9b022f3 commit a7381c3

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

client/rpc/src/eth/execute.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,81 @@ where
305305
};
306306

307307
Ok(Bytes(value))
308+
} else if api_version == 6 {
309+
// Pectra - authorization list support (EIP-7702)
310+
let access_list = access_list
311+
.unwrap_or_default()
312+
.into_iter()
313+
.map(|item| (item.address, item.storage_keys))
314+
.collect::<Vec<(sp_core::H160, Vec<H256>)>>();
315+
316+
let authorization_list = authorization_list
317+
.unwrap_or_default()
318+
.iter()
319+
.map(|d| {
320+
(
321+
U256::from(d.chain_id),
322+
d.address,
323+
d.nonce,
324+
d.authorizing_address(),
325+
)
326+
})
327+
.collect::<Vec<(U256, sp_core::H160, U256, sp_core::H160)>>();
328+
329+
let encoded_params = Encode::encode(&(
330+
&from.unwrap_or_default(),
331+
&to,
332+
&data,
333+
&value.unwrap_or_default(),
334+
&gas_limit,
335+
&max_fee_per_gas,
336+
&max_priority_fee_per_gas,
337+
&nonce,
338+
&false,
339+
&Some(access_list),
340+
&Some(authorization_list),
341+
));
342+
let overlayed_changes = self.create_overrides_overlay(
343+
substrate_hash,
344+
api_version,
345+
state_overrides,
346+
)?;
347+
348+
// Enable proof size recording
349+
let recorder: sp_trie::recorder::Recorder<HashingFor<B>> = Default::default();
350+
let ext = sp_trie::proof_size_extension::ProofSizeExt::new(recorder.clone());
351+
let mut exts = Extensions::new();
352+
exts.register(ext);
353+
354+
let params = CallApiAtParams {
355+
at: substrate_hash,
356+
function: "EthereumRuntimeRPCApi_call",
357+
arguments: encoded_params,
358+
overlayed_changes: &RefCell::new(overlayed_changes),
359+
call_context: CallContext::Offchain,
360+
recorder: &Some(recorder),
361+
extensions: &RefCell::new(exts),
362+
};
363+
364+
let info =
365+
self.client
366+
.call_api_at(params)
367+
.and_then(|r| {
368+
Result::map_err(
369+
<Result<ExecutionInfoV2::<Vec<u8>>, DispatchError> as Decode>::decode(&mut &r[..]),
370+
|error| sp_api::ApiError::FailedToDecodeReturnValue {
371+
function: "EthereumRuntimeRPCApi_call",
372+
error,
373+
raw: r
374+
},
375+
)
376+
})
377+
.map_err(|err| internal_err(format!("runtime error: {err}")))?
378+
.map_err(|err| internal_err(format!("execution fatal: {err:?}")))?;
379+
380+
error_on_execution_failure(&info.exit_reason, &info.value)?;
381+
382+
Ok(Bytes(info.value))
308383
} else {
309384
Err(internal_err("failed to retrieve Runtime Api version"))
310385
}

0 commit comments

Comments
 (0)