helios/client/src/client.rs

110 lines
3.5 KiB
Rust
Raw Normal View History

2022-08-27 00:05:12 +00:00
use std::sync::Arc;
2022-08-21 13:13:56 +00:00
use ethers::prelude::{Address, U256};
use eyre::Result;
2022-08-29 20:54:58 +00:00
use config::Config;
2022-08-29 17:31:17 +00:00
use consensus::types::Header;
use consensus::ConsensusClient;
use execution::evm::Evm;
use execution::ExecutionClient;
2022-08-21 13:13:56 +00:00
pub struct Client {
consensus: ConsensusClient,
execution: ExecutionClient,
2022-08-27 00:05:12 +00:00
config: Arc<Config>,
2022-08-21 13:13:56 +00:00
}
impl Client {
2022-08-27 00:05:12 +00:00
pub async fn new(config: Arc<Config>) -> Result<Self> {
let consensus_rpc = &config.general.consensus_rpc;
let checkpoint_hash = &config.general.checkpoint;
let execution_rpc = &config.general.execution_rpc;
let consensus =
ConsensusClient::new(consensus_rpc, checkpoint_hash, config.clone()).await?;
2022-08-21 13:13:56 +00:00
let execution = ExecutionClient::new(execution_rpc);
Ok(Client {
consensus,
execution,
2022-08-27 00:05:12 +00:00
config,
2022-08-21 13:13:56 +00:00
})
}
pub async fn sync(&mut self) -> Result<()> {
self.consensus.sync().await
}
2022-08-31 00:31:58 +00:00
pub async fn advance(&mut self) -> Result<()> {
self.consensus.advance().await
}
2022-08-26 01:18:47 +00:00
pub async fn call(&self, to: &Address, calldata: &Vec<u8>, value: U256) -> Result<Vec<u8>> {
2022-08-24 01:33:48 +00:00
let payload = self.consensus.get_execution_payload().await?;
let mut evm = Evm::new(self.execution.clone(), payload);
evm.call(to, calldata, value)
}
2022-08-27 20:43:27 +00:00
pub async fn estimate_gas(&self, to: &Address, calldata: &Vec<u8>, value: U256) -> Result<u64> {
let payload = self.consensus.get_execution_payload().await?;
let mut evm = Evm::new(self.execution.clone(), payload);
evm.estimate_gas(to, calldata, value)
}
2022-08-26 01:18:47 +00:00
pub async fn get_balance(&self, address: &Address) -> Result<U256> {
2022-08-21 13:13:56 +00:00
let payload = self.consensus.get_execution_payload().await?;
2022-08-21 21:51:11 +00:00
let account = self.execution.get_account(&address, None, &payload).await?;
2022-08-21 13:13:56 +00:00
Ok(account.balance)
}
2022-08-26 01:18:47 +00:00
pub async fn get_nonce(&self, address: &Address) -> Result<U256> {
2022-08-21 13:13:56 +00:00
let payload = self.consensus.get_execution_payload().await?;
2022-08-21 21:51:11 +00:00
let account = self.execution.get_account(&address, None, &payload).await?;
2022-08-21 13:13:56 +00:00
Ok(account.nonce)
}
2022-08-26 01:18:47 +00:00
pub async fn get_code(&self, address: &Address) -> Result<Vec<u8>> {
2022-08-21 16:59:47 +00:00
let payload = self.consensus.get_execution_payload().await?;
self.execution.get_code(&address, &payload).await
}
2022-08-26 01:18:47 +00:00
pub async fn get_storage_at(&self, address: &Address, slot: U256) -> Result<U256> {
2022-08-21 21:51:11 +00:00
let payload = self.consensus.get_execution_payload().await?;
let account = self
.execution
.get_account(address, Some(&[slot]), &payload)
.await?;
let value = account.slots.get(&slot);
match value {
Some(value) => Ok(*value),
None => Err(eyre::eyre!("Slot Not Found")),
}
}
2022-08-29 15:59:02 +00:00
pub async fn get_gas_price(&self) -> Result<U256> {
let payload = self.consensus.get_execution_payload().await?;
let base_fee = U256::from_little_endian(&payload.base_fee_per_gas.to_bytes_le());
let tip = U256::from(10_u64.pow(9));
Ok(base_fee + tip)
}
pub async fn get_priority_fee(&self) -> Result<U256> {
let tip = U256::from(10_u64.pow(9));
Ok(tip)
}
2022-08-29 16:06:50 +00:00
pub async fn get_block_number(&self) -> Result<u64> {
let payload = self.consensus.get_execution_payload().await?;
Ok(payload.block_number)
}
2022-08-27 00:05:12 +00:00
pub fn chain_id(&self) -> u64 {
self.config.general.chain_id
}
2022-08-21 13:13:56 +00:00
pub fn get_header(&self) -> &Header {
self.consensus.get_head()
}
}