helios/execution/src/rpc.rs

51 lines
1.5 KiB
Rust
Raw Normal View History

2022-08-21 21:51:11 +00:00
use ethers::abi::AbiEncode;
use ethers::prelude::{Address, U256};
2022-08-21 15:21:50 +00:00
use eyre::Result;
2022-08-21 16:59:47 +00:00
use jsonrpsee::{
core::client::ClientT,
http_client::{HttpClient, HttpClientBuilder},
rpc_params,
};
2022-08-29 17:31:17 +00:00
use common::utils::{address_to_hex_string, hex_str_to_bytes, u64_to_hex_string};
2022-08-21 15:21:50 +00:00
use super::types::Proof;
2022-08-24 01:33:48 +00:00
#[derive(Clone)]
2022-08-21 16:27:19 +00:00
pub struct Rpc {
2022-08-21 15:21:50 +00:00
rpc: String,
}
2022-08-21 16:27:19 +00:00
impl Rpc {
2022-08-21 15:21:50 +00:00
pub fn new(rpc: &str) -> Self {
2022-08-21 16:59:47 +00:00
Rpc {
rpc: rpc.to_string(),
}
2022-08-21 15:21:50 +00:00
}
2022-08-21 21:51:11 +00:00
pub async fn get_proof(&self, address: &Address, slots: &[U256], block: u64) -> Result<Proof> {
2022-08-21 16:59:47 +00:00
let client = self.client()?;
let block_hex = u64_to_hex_string(block);
let addr_hex = address_to_hex_string(address);
2022-08-21 21:51:11 +00:00
let slots = slots
.iter()
.map(|slot| slot.encode_hex())
.collect::<Vec<String>>();
let params = rpc_params!(addr_hex, slots.as_slice(), block_hex);
2022-08-21 15:21:50 +00:00
Ok(client.request("eth_getProof", params).await?)
}
2022-08-21 16:59:47 +00:00
pub async fn get_code(&self, address: &Address, block: u64) -> Result<Vec<u8>> {
let client = self.client()?;
let block_hex = u64_to_hex_string(block);
let addr_hex = address_to_hex_string(address);
let params = rpc_params!(addr_hex, block_hex);
let code: String = client.request("eth_getCode", params).await?;
hex_str_to_bytes(&code)
}
fn client(&self) -> Result<HttpClient> {
Ok(HttpClientBuilder::default().build(&self.rpc)?)
}
}