2022-09-22 19:40:06 +00:00
|
|
|
use std::{collections::HashMap, fmt};
|
2022-08-21 21:51:11 +00:00
|
|
|
|
2022-10-27 17:46:32 +00:00
|
|
|
use ethers::{
|
|
|
|
prelude::{Address, H256, U256},
|
|
|
|
types::Transaction,
|
|
|
|
};
|
2022-08-21 16:59:47 +00:00
|
|
|
use eyre::Result;
|
2022-10-27 17:46:32 +00:00
|
|
|
use serde::{ser::SerializeSeq, Deserialize, Serialize};
|
2022-08-21 15:21:50 +00:00
|
|
|
|
2022-09-06 17:57:47 +00:00
|
|
|
use common::utils::u64_to_hex_string;
|
2022-08-21 21:51:11 +00:00
|
|
|
|
2022-09-22 19:40:06 +00:00
|
|
|
#[derive(Default, Debug, Clone)]
|
2022-08-21 21:51:11 +00:00
|
|
|
pub struct Account {
|
|
|
|
pub balance: U256,
|
2022-09-06 17:57:47 +00:00
|
|
|
pub nonce: u64,
|
2022-08-21 21:51:11 +00:00
|
|
|
pub code_hash: H256,
|
2022-09-22 19:40:06 +00:00
|
|
|
pub code: Vec<u8>,
|
2022-08-21 21:51:11 +00:00
|
|
|
pub storage_hash: H256,
|
2022-09-06 17:57:47 +00:00
|
|
|
pub slots: HashMap<H256, U256>,
|
2022-08-21 15:21:50 +00:00
|
|
|
}
|
|
|
|
|
2022-08-31 21:40:44 +00:00
|
|
|
#[derive(Deserialize, Serialize, Debug)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
pub struct ExecutionBlock {
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub number: u64,
|
|
|
|
pub base_fee_per_gas: U256,
|
|
|
|
pub difficulty: U256,
|
|
|
|
#[serde(serialize_with = "serialize_bytes")]
|
|
|
|
pub extra_data: Vec<u8>,
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub gas_limit: u64,
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub gas_used: u64,
|
|
|
|
pub hash: H256,
|
|
|
|
#[serde(serialize_with = "serialize_bytes")]
|
|
|
|
pub logs_bloom: Vec<u8>,
|
|
|
|
pub miner: Address,
|
|
|
|
pub mix_hash: H256,
|
|
|
|
pub nonce: String,
|
|
|
|
pub parent_hash: H256,
|
|
|
|
pub receipts_root: H256,
|
|
|
|
pub sha3_uncles: H256,
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub size: u64,
|
|
|
|
pub state_root: H256,
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub timestamp: u64,
|
|
|
|
#[serde(serialize_with = "serialize_u64_string")]
|
|
|
|
pub total_difficulty: u64,
|
2022-10-27 17:46:32 +00:00
|
|
|
#[serde(serialize_with = "serialize_transactions")]
|
|
|
|
pub transactions: Transactions,
|
2022-08-31 21:40:44 +00:00
|
|
|
pub transactions_root: H256,
|
|
|
|
pub uncles: Vec<H256>,
|
|
|
|
}
|
|
|
|
|
2022-10-27 17:46:32 +00:00
|
|
|
#[derive(Deserialize, Serialize, Debug)]
|
|
|
|
pub enum Transactions {
|
|
|
|
Hashes(Vec<H256>),
|
|
|
|
Full(Vec<Transaction>),
|
|
|
|
}
|
|
|
|
|
2022-09-22 19:40:06 +00:00
|
|
|
#[derive(Deserialize, Serialize)]
|
2022-09-02 19:29:51 +00:00
|
|
|
#[serde(rename_all = "camelCase")]
|
2022-09-01 19:58:45 +00:00
|
|
|
pub struct CallOpts {
|
|
|
|
pub from: Option<Address>,
|
|
|
|
pub to: Address,
|
|
|
|
pub gas: Option<U256>,
|
2022-09-02 19:29:51 +00:00
|
|
|
pub gas_price: Option<U256>,
|
2022-09-01 19:58:45 +00:00
|
|
|
pub value: Option<U256>,
|
|
|
|
#[serde(default, deserialize_with = "bytes_deserialize")]
|
|
|
|
pub data: Option<Vec<u8>>,
|
|
|
|
}
|
|
|
|
|
2022-09-22 19:40:06 +00:00
|
|
|
impl fmt::Debug for CallOpts {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
f.debug_struct("CallOpts")
|
|
|
|
.field("from", &self.from)
|
|
|
|
.field("to", &self.to)
|
|
|
|
.field("value", &self.value)
|
|
|
|
.field("data", &hex::encode(&self.data.clone().unwrap_or_default()))
|
|
|
|
.finish()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-01 19:58:45 +00:00
|
|
|
fn bytes_deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
|
|
|
|
where
|
|
|
|
D: serde::Deserializer<'de>,
|
|
|
|
{
|
|
|
|
let bytes: Option<String> = serde::Deserialize::deserialize(deserializer)?;
|
|
|
|
match bytes {
|
|
|
|
Some(bytes) => {
|
|
|
|
let bytes = hex::decode(bytes.strip_prefix("0x").unwrap()).unwrap();
|
|
|
|
Ok(Some(bytes.to_vec()))
|
|
|
|
}
|
|
|
|
None => Ok(None),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-31 21:40:44 +00:00
|
|
|
fn serialize_bytes<S>(bytes: &Vec<u8>, s: S) -> Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
S: serde::Serializer,
|
|
|
|
{
|
|
|
|
let bytes_str = format!("0x{}", hex::encode(bytes));
|
|
|
|
s.serialize_str(&bytes_str)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize_u64_string<S>(x: &u64, s: S) -> Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
S: serde::Serializer,
|
|
|
|
{
|
|
|
|
let num_string = u64_to_hex_string(*x);
|
|
|
|
s.serialize_str(&num_string)
|
|
|
|
}
|
2022-10-27 17:46:32 +00:00
|
|
|
|
|
|
|
fn serialize_transactions<S>(txs: &Transactions, s: S) -> Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
S: serde::Serializer,
|
|
|
|
{
|
|
|
|
match txs {
|
|
|
|
Transactions::Hashes(hashes) => {
|
|
|
|
let mut seq = s.serialize_seq(Some(hashes.len()))?;
|
|
|
|
for hash in hashes {
|
|
|
|
seq.serialize_element(&hash)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
seq.end()
|
|
|
|
}
|
|
|
|
Transactions::Full(txs) => {
|
|
|
|
let mut seq = s.serialize_seq(Some(txs.len()))?;
|
|
|
|
for tx in txs {
|
|
|
|
seq.serialize_element(&tx)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
seq.end()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|