fix: handle access list gas requirements (#54)
This commit is contained in:
parent
4a347e3b2c
commit
1196c0181d
|
@ -36,7 +36,7 @@ impl<R: Rpc> Evm<R> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn call(&mut self, opts: &CallOpts) -> Result<Vec<u8>> {
|
pub fn call(&mut self, opts: &CallOpts) -> Result<Vec<u8>> {
|
||||||
let account_map = self.batch_fetch_accounts(opts);
|
let account_map = self.batch_fetch_accounts(opts)?;
|
||||||
self.evm.db.as_mut().unwrap().set_accounts(account_map);
|
self.evm.db.as_mut().unwrap().set_accounts(account_map);
|
||||||
|
|
||||||
self.evm.env = self.get_env(opts);
|
self.evm.env = self.get_env(opts);
|
||||||
|
@ -54,7 +54,7 @@ impl<R: Rpc> Evm<R> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn estimate_gas(&mut self, opts: &CallOpts) -> Result<u64> {
|
pub fn estimate_gas(&mut self, opts: &CallOpts) -> Result<u64> {
|
||||||
let account_map = self.batch_fetch_accounts(opts);
|
let account_map = self.batch_fetch_accounts(opts)?;
|
||||||
self.evm.db.as_mut().unwrap().set_accounts(account_map);
|
self.evm.db.as_mut().unwrap().set_accounts(account_map);
|
||||||
|
|
||||||
self.evm.env = self.get_env(opts);
|
self.evm.env = self.get_env(opts);
|
||||||
|
@ -68,7 +68,7 @@ impl<R: Rpc> Evm<R> {
|
||||||
Ok(gas_scaled)
|
Ok(gas_scaled)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn batch_fetch_accounts(&self, opts: &CallOpts) -> HashMap<Address, Account> {
|
fn batch_fetch_accounts(&self, opts: &CallOpts) -> Result<HashMap<Address, Account>> {
|
||||||
let db = self.evm.db.as_ref().unwrap();
|
let db = self.evm.db.as_ref().unwrap();
|
||||||
let rpc = db.execution.rpc.clone();
|
let rpc = db.execution.rpc.clone();
|
||||||
let payload = db.payload.clone();
|
let payload = db.payload.clone();
|
||||||
|
@ -124,7 +124,7 @@ impl<R: Rpc> Evm<R> {
|
||||||
Ok::<_, eyre::Error>(accounts)
|
Ok::<_, eyre::Error>(accounts)
|
||||||
});
|
});
|
||||||
|
|
||||||
let accounts = handle.join().unwrap().unwrap();
|
let accounts = handle.join().unwrap()?;
|
||||||
let mut account_map = HashMap::new();
|
let mut account_map = HashMap::new();
|
||||||
accounts.iter().for_each(|account| {
|
accounts.iter().for_each(|account| {
|
||||||
let addr = account.0;
|
let addr = account.0;
|
||||||
|
@ -132,7 +132,7 @@ impl<R: Rpc> Evm<R> {
|
||||||
account_map.insert(addr, account);
|
account_map.insert(addr, account);
|
||||||
});
|
});
|
||||||
|
|
||||||
account_map
|
Ok(account_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_env(&self, opts: &CallOpts) -> Env {
|
fn get_env(&self, opts: &CallOpts) -> Env {
|
||||||
|
|
|
@ -58,18 +58,19 @@ impl Rpc for HttpRpc {
|
||||||
async fn create_access_list(&self, opts: &CallOpts, block: u64) -> Result<AccessList> {
|
async fn create_access_list(&self, opts: &CallOpts, block: u64) -> Result<AccessList> {
|
||||||
let block = Some(BlockId::from(block));
|
let block = Some(BlockId::from(block));
|
||||||
|
|
||||||
let mut tx = Eip1559TransactionRequest::new();
|
let mut raw_tx = Eip1559TransactionRequest::new();
|
||||||
tx.to = Some(opts.to.into());
|
raw_tx.to = Some(opts.to.into());
|
||||||
tx.from = opts.from;
|
raw_tx.from = opts.from;
|
||||||
tx.value = opts.value;
|
raw_tx.value = opts.value;
|
||||||
// TODO: better way to set gas limit
|
raw_tx.gas = Some(opts.gas.unwrap_or(U256::from(100_000_000)));
|
||||||
tx.gas = Some(U256::from(10_000_000));
|
raw_tx.max_fee_per_gas = Some(U256::zero());
|
||||||
tx.data = opts
|
raw_tx.max_priority_fee_per_gas = Some(U256::zero());
|
||||||
|
raw_tx.data = opts
|
||||||
.data
|
.data
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|data| Bytes::from(data.as_slice().to_owned()));
|
.map(|data| Bytes::from(data.as_slice().to_owned()));
|
||||||
|
|
||||||
let tx = TypedTransaction::Eip1559(tx);
|
let tx = TypedTransaction::Eip1559(raw_tx);
|
||||||
let list = self.provider.create_access_list(&tx, block).await?;
|
let list = self.provider.create_access_list(&tx, block).await?;
|
||||||
|
|
||||||
Ok(list.access_list)
|
Ok(list.access_list)
|
||||||
|
|
|
@ -2,7 +2,6 @@ use std::collections::BTreeMap;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use ethers::types::{Address, H256, U256};
|
use ethers::types::{Address, H256, U256};
|
||||||
use ethers::utils::keccak256;
|
|
||||||
use ssz_rs::{List, Vector};
|
use ssz_rs::{List, Vector};
|
||||||
|
|
||||||
use common::utils::hex_str_to_bytes;
|
use common::utils::hex_str_to_bytes;
|
||||||
|
|
Loading…
Reference in New Issue