#![allow(missing_docs)]
use super::{byte::*, TypeEip1559, TypeEip2930, TypeEip4844, TypeLegacy};
use alloc::vec::Vec;
use codec::{Decode, Encode};
use derive_more::{From, TryInto};
pub use ethereum_types::*;
use scale_info::TypeInfo;
use serde::{Deserialize, Deserializer, Serialize};
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct InputOrData {
#[serde(skip_serializing_if = "Option::is_none")]
input: Option<Bytes>,
#[serde(skip_serializing_if = "Option::is_none")]
data: Option<Bytes>,
}
impl From<Bytes> for InputOrData {
fn from(value: Bytes) -> Self {
InputOrData { input: Some(value), data: None }
}
}
impl From<Vec<u8>> for InputOrData {
fn from(value: Vec<u8>) -> Self {
InputOrData { input: Some(Bytes(value)), data: None }
}
}
impl InputOrData {
pub fn to_bytes(self) -> Bytes {
match self {
InputOrData { input: Some(input), data: _ } => input,
InputOrData { input: None, data: Some(data) } => data,
_ => Default::default(),
}
}
pub fn to_vec(self) -> Vec<u8> {
self.to_bytes().0
}
}
fn deserialize_input_or_data<'d, D: Deserializer<'d>>(d: D) -> Result<InputOrData, D::Error> {
let value = InputOrData::deserialize(d)?;
match &value {
InputOrData { input: Some(input), data: Some(data) } if input != data =>
Err(serde::de::Error::custom("Both \"data\" and \"input\" are set and not equal. Please use \"input\" to pass transaction call data")),
_ => Ok(value),
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Block {
#[serde(rename = "baseFeePerGas", skip_serializing_if = "Option::is_none")]
pub base_fee_per_gas: Option<U256>,
#[serde(rename = "blobGasUsed", skip_serializing_if = "Option::is_none")]
pub blob_gas_used: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub difficulty: Option<U256>,
#[serde(rename = "excessBlobGas", skip_serializing_if = "Option::is_none")]
pub excess_blob_gas: Option<U256>,
#[serde(rename = "extraData")]
pub extra_data: Bytes,
#[serde(rename = "gasLimit")]
pub gas_limit: U256,
#[serde(rename = "gasUsed")]
pub gas_used: U256,
pub hash: H256,
#[serde(rename = "logsBloom")]
pub logs_bloom: Bytes256,
pub miner: Address,
#[serde(rename = "mixHash")]
pub mix_hash: H256,
pub nonce: Bytes8,
pub number: U256,
#[serde(rename = "parentBeaconBlockRoot", skip_serializing_if = "Option::is_none")]
pub parent_beacon_block_root: Option<H256>,
#[serde(rename = "parentHash")]
pub parent_hash: H256,
#[serde(rename = "receiptsRoot")]
pub receipts_root: H256,
#[serde(rename = "sha3Uncles")]
pub sha_3_uncles: H256,
pub size: U256,
#[serde(rename = "stateRoot")]
pub state_root: H256,
pub timestamp: U256,
#[serde(rename = "totalDifficulty", skip_serializing_if = "Option::is_none")]
pub total_difficulty: Option<U256>,
pub transactions: HashesOrTransactionInfos,
#[serde(rename = "transactionsRoot")]
pub transactions_root: H256,
pub uncles: Vec<H256>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub withdrawals: Vec<Withdrawal>,
#[serde(rename = "withdrawalsRoot", skip_serializing_if = "Option::is_none")]
pub withdrawals_root: Option<H256>,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum BlockNumberOrTag {
U256(U256),
BlockTag(BlockTag),
}
impl Default for BlockNumberOrTag {
fn default() -> Self {
BlockNumberOrTag::BlockTag(Default::default())
}
}
#[derive(Debug, Clone, Encode, Decode, TypeInfo, Serialize, From, TryInto, Eq, PartialEq)]
#[serde(untagged)]
pub enum BlockNumberOrTagOrHash {
U256(U256),
BlockTag(BlockTag),
H256(H256),
}
impl Default for BlockNumberOrTagOrHash {
fn default() -> Self {
BlockNumberOrTagOrHash::BlockTag(Default::default())
}
}
impl<'a> serde::Deserialize<'a> for BlockNumberOrTagOrHash {
fn deserialize<D>(de: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'a>,
{
#[derive(Deserialize)]
#[serde(untagged)]
pub enum BlockNumberOrTagOrHashWithAlias {
BlockTag(BlockTag),
U256(U256),
BlockNumber {
#[serde(rename = "blockNumber")]
block_number: U256,
},
H256(H256),
BlockHash {
#[serde(rename = "blockHash")]
block_hash: H256,
},
}
let r = BlockNumberOrTagOrHashWithAlias::deserialize(de)?;
Ok(match r {
BlockNumberOrTagOrHashWithAlias::BlockTag(val) => BlockNumberOrTagOrHash::BlockTag(val),
BlockNumberOrTagOrHashWithAlias::U256(val) |
BlockNumberOrTagOrHashWithAlias::BlockNumber { block_number: val } =>
BlockNumberOrTagOrHash::U256(val),
BlockNumberOrTagOrHashWithAlias::H256(val) |
BlockNumberOrTagOrHashWithAlias::BlockHash { block_hash: val } =>
BlockNumberOrTagOrHash::H256(val),
})
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Filter {
pub address: Option<AddressOrAddresses>,
#[serde(rename = "fromBlock", skip_serializing_if = "Option::is_none")]
pub from_block: Option<BlockNumberOrTag>,
#[serde(rename = "toBlock", skip_serializing_if = "Option::is_none")]
pub to_block: Option<BlockNumberOrTag>,
#[serde(rename = "blockHash", skip_serializing_if = "Option::is_none")]
pub block_hash: Option<H256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub topics: Option<FilterTopics>,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum FilterResults {
Hashes(Vec<H256>),
Logs(Vec<Log>),
}
impl Default for FilterResults {
fn default() -> Self {
FilterResults::Hashes(Default::default())
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct GenericTransaction {
#[serde(rename = "accessList", skip_serializing_if = "Option::is_none")]
pub access_list: Option<AccessList>,
#[serde(rename = "blobVersionedHashes", default, skip_serializing_if = "Vec::is_empty")]
pub blob_versioned_hashes: Vec<H256>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub blobs: Vec<Bytes>,
#[serde(rename = "chainId", skip_serializing_if = "Option::is_none")]
pub chain_id: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas: Option<U256>,
#[serde(rename = "gasPrice", skip_serializing_if = "Option::is_none")]
pub gas_price: Option<U256>,
#[serde(flatten, deserialize_with = "deserialize_input_or_data")]
pub input: InputOrData,
#[serde(rename = "maxFeePerBlobGas", skip_serializing_if = "Option::is_none")]
pub max_fee_per_blob_gas: Option<U256>,
#[serde(rename = "maxFeePerGas", skip_serializing_if = "Option::is_none")]
pub max_fee_per_gas: Option<U256>,
#[serde(rename = "maxPriorityFeePerGas", skip_serializing_if = "Option::is_none")]
pub max_priority_fee_per_gas: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<U256>,
pub to: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<Byte>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<U256>,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct ReceiptInfo {
#[serde(rename = "blobGasPrice", skip_serializing_if = "Option::is_none")]
pub blob_gas_price: Option<U256>,
#[serde(rename = "blobGasUsed", skip_serializing_if = "Option::is_none")]
pub blob_gas_used: Option<U256>,
#[serde(rename = "blockHash")]
pub block_hash: H256,
#[serde(rename = "blockNumber")]
pub block_number: U256,
#[serde(rename = "contractAddress")]
pub contract_address: Option<Address>,
#[serde(rename = "cumulativeGasUsed")]
pub cumulative_gas_used: U256,
#[serde(rename = "effectiveGasPrice")]
pub effective_gas_price: U256,
pub from: Address,
#[serde(rename = "gasUsed")]
pub gas_used: U256,
pub logs: Vec<Log>,
#[serde(rename = "logsBloom")]
pub logs_bloom: Bytes256,
#[serde(skip_serializing_if = "Option::is_none")]
pub root: Option<H256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<U256>,
pub to: Option<Address>,
#[serde(rename = "transactionHash")]
pub transaction_hash: H256,
#[serde(rename = "transactionIndex")]
pub transaction_index: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<Byte>,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum SyncingStatus {
SyncingProgress(SyncingProgress),
Bool(bool),
}
impl Default for SyncingStatus {
fn default() -> Self {
SyncingStatus::SyncingProgress(Default::default())
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct TransactionInfo {
#[serde(rename = "blockHash")]
pub block_hash: H256,
#[serde(rename = "blockNumber")]
pub block_number: U256,
pub from: Address,
pub hash: H256,
#[serde(rename = "transactionIndex")]
pub transaction_index: U256,
#[serde(flatten)]
pub transaction_signed: TransactionSigned,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum TransactionUnsigned {
Transaction4844Unsigned(Transaction4844Unsigned),
Transaction1559Unsigned(Transaction1559Unsigned),
Transaction2930Unsigned(Transaction2930Unsigned),
TransactionLegacyUnsigned(TransactionLegacyUnsigned),
}
impl Default for TransactionUnsigned {
fn default() -> Self {
TransactionUnsigned::TransactionLegacyUnsigned(Default::default())
}
}
pub type AccessList = Vec<AccessListEntry>;
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum AddressOrAddresses {
Address(Address),
Addresses(Addresses),
}
impl Default for AddressOrAddresses {
fn default() -> Self {
AddressOrAddresses::Address(Default::default())
}
}
pub type Addresses = Vec<Address>;
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub enum BlockTag {
#[serde(rename = "earliest")]
Earliest,
#[serde(rename = "finalized")]
Finalized,
#[serde(rename = "safe")]
Safe,
#[serde(rename = "latest")]
#[default]
Latest,
#[serde(rename = "pending")]
Pending,
}
pub type FilterTopics = Vec<FilterTopic>;
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum HashesOrTransactionInfos {
Hashes(Vec<H256>),
TransactionInfos(Vec<TransactionInfo>),
}
impl Default for HashesOrTransactionInfos {
fn default() -> Self {
HashesOrTransactionInfos::Hashes(Default::default())
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Log {
pub address: Address,
#[serde(rename = "blockHash")]
pub block_hash: H256,
#[serde(rename = "blockNumber")]
pub block_number: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Bytes>,
#[serde(rename = "logIndex")]
pub log_index: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub removed: Option<bool>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub topics: Vec<H256>,
#[serde(rename = "transactionHash")]
pub transaction_hash: H256,
#[serde(rename = "transactionIndex")]
pub transaction_index: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct SyncingProgress {
#[serde(rename = "currentBlock", skip_serializing_if = "Option::is_none")]
pub current_block: Option<U256>,
#[serde(rename = "highestBlock", skip_serializing_if = "Option::is_none")]
pub highest_block: Option<U256>,
#[serde(rename = "startingBlock", skip_serializing_if = "Option::is_none")]
pub starting_block: Option<U256>,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction1559Unsigned {
#[serde(rename = "accessList")]
pub access_list: AccessList,
#[serde(rename = "chainId")]
pub chain_id: U256,
pub gas: U256,
#[serde(rename = "gasPrice")]
pub gas_price: U256,
pub input: Bytes,
#[serde(rename = "maxFeePerGas")]
pub max_fee_per_gas: U256,
#[serde(rename = "maxPriorityFeePerGas")]
pub max_priority_fee_per_gas: U256,
pub nonce: U256,
pub to: Option<Address>,
pub r#type: TypeEip1559,
pub value: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction2930Unsigned {
#[serde(rename = "accessList")]
pub access_list: AccessList,
#[serde(rename = "chainId")]
pub chain_id: U256,
pub gas: U256,
#[serde(rename = "gasPrice")]
pub gas_price: U256,
pub input: Bytes,
pub nonce: U256,
pub to: Option<Address>,
pub r#type: TypeEip2930,
pub value: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction4844Unsigned {
#[serde(rename = "accessList")]
pub access_list: AccessList,
#[serde(rename = "blobVersionedHashes")]
pub blob_versioned_hashes: Vec<H256>,
#[serde(rename = "chainId")]
pub chain_id: U256,
pub gas: U256,
pub input: Bytes,
#[serde(rename = "maxFeePerBlobGas")]
pub max_fee_per_blob_gas: U256,
#[serde(rename = "maxFeePerGas")]
pub max_fee_per_gas: U256,
#[serde(rename = "maxPriorityFeePerGas")]
pub max_priority_fee_per_gas: U256,
pub nonce: U256,
pub to: Address,
pub r#type: TypeEip4844,
pub value: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct TransactionLegacyUnsigned {
#[serde(rename = "chainId", skip_serializing_if = "Option::is_none")]
pub chain_id: Option<U256>,
pub gas: U256,
#[serde(rename = "gasPrice")]
pub gas_price: U256,
pub input: Bytes,
pub nonce: U256,
pub to: Option<Address>,
pub r#type: TypeLegacy,
pub value: U256,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum TransactionSigned {
Transaction4844Signed(Transaction4844Signed),
Transaction1559Signed(Transaction1559Signed),
Transaction2930Signed(Transaction2930Signed),
TransactionLegacySigned(TransactionLegacySigned),
}
impl Default for TransactionSigned {
fn default() -> Self {
TransactionSigned::TransactionLegacySigned(Default::default())
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Withdrawal {
pub address: Address,
pub amount: U256,
pub index: U256,
#[serde(rename = "validatorIndex")]
pub validator_index: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct AccessListEntry {
pub address: Address,
#[serde(rename = "storageKeys")]
pub storage_keys: Vec<H256>,
}
#[derive(
Debug, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, From, TryInto, Eq, PartialEq,
)]
#[serde(untagged)]
pub enum FilterTopic {
Single(H256),
Multiple(Vec<H256>),
}
impl Default for FilterTopic {
fn default() -> Self {
FilterTopic::Single(Default::default())
}
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction1559Signed {
#[serde(flatten)]
pub transaction_1559_unsigned: Transaction1559Unsigned,
pub r: U256,
pub s: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub v: Option<U256>,
#[serde(rename = "yParity")]
pub y_parity: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction2930Signed {
#[serde(flatten)]
pub transaction_2930_unsigned: Transaction2930Unsigned,
pub r: U256,
pub s: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub v: Option<U256>,
#[serde(rename = "yParity")]
pub y_parity: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct Transaction4844Signed {
#[serde(flatten)]
pub transaction_4844_unsigned: Transaction4844Unsigned,
pub r: U256,
pub s: U256,
#[serde(rename = "yParity")]
pub y_parity: U256,
}
#[derive(
Debug, Default, Clone, Encode, Decode, TypeInfo, Serialize, Deserialize, Eq, PartialEq,
)]
pub struct TransactionLegacySigned {
#[serde(flatten)]
pub transaction_legacy_unsigned: TransactionLegacyUnsigned,
pub r: U256,
pub s: U256,
pub v: U256,
}