Skip to content

Commit

Permalink
chore: add support for other fields in call/txrequest (#112)
Browse files Browse the repository at this point in the history
  • Loading branch information
Evalir authored Jan 15, 2024
1 parent 5ed60f8 commit ea8d88a
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 5 deletions.
30 changes: 27 additions & 3 deletions crates/rpc-types/src/eth/call.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::{AccessList, BlockId, BlockOverrides};
use alloy_primitives::{Address, Bytes, B256, U256, U64, U8};
use crate::{other::OtherFields, AccessList, BlockId, BlockOverrides};
use alloy_primitives::{Address, Bytes, B256, U128, U256, U64, U8};
use serde::{Deserialize, Deserializer, Serialize, Serializer};

/// Bundle of transactions
Expand Down Expand Up @@ -98,7 +98,7 @@ impl<'de> Deserialize<'de> for TransactionIndex {
}

/// Call request for `eth_call` and adjacent methods.
#[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Hash)]
#[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CallRequest {
/// From
Expand Down Expand Up @@ -133,6 +133,30 @@ pub struct CallRequest {
/// EIP-2718 type
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub transaction_type: Option<U8>,
/// Support for arbitrary additional fields.
#[serde(flatten)]
pub other: OtherFields,
}

/// Optimism specific transaction fields
#[derive(Debug, Copy, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct OptimismTransactionFields {
/// Hash that uniquely identifies the source of the deposit.
#[serde(rename = "sourceHash", skip_serializing_if = "Option::is_none")]
pub source_hash: Option<B256>,
/// The ETH value to mint on L2
#[serde(rename = "mint", skip_serializing_if = "Option::is_none")]
pub mint: Option<U128>,
/// Field indicating whether the transaction is a system transaction, and therefore
/// exempt from the L2 gas limit.
#[serde(rename = "isSystemTx", skip_serializing_if = "Option::is_none")]
pub is_system_tx: Option<bool>,
}

impl From<OptimismTransactionFields> for OtherFields {
fn from(value: OptimismTransactionFields) -> Self {
serde_json::to_value(value).unwrap().try_into().unwrap()
}
}

impl CallRequest {
Expand Down
28 changes: 26 additions & 2 deletions crates/rpc-types/src/eth/transaction/request.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Alloy basic Transaction Request type.
use crate::eth::transaction::AccessList;
use alloy_primitives::{Address, Bytes, U128, U256, U64, U8};
use crate::{eth::transaction::AccessList, other::OtherFields};
use alloy_primitives::{Address, Bytes, B256, U128, U256, U64, U8};
use serde::{Deserialize, Serialize};

/// Represents _all_ transaction requests received from RPC
Expand Down Expand Up @@ -36,6 +36,30 @@ pub struct TransactionRequest {
/// EIP-2718 type
#[serde(rename = "type")]
pub transaction_type: Option<U8>,
/// Support for arbitrary additional fields.
#[serde(flatten)]
pub other: OtherFields,
}

/// Optimism specific transaction fields
#[derive(Debug, Copy, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct OptimismTransactionFields {
/// Hash that uniquely identifies the source of the deposit.
#[serde(rename = "sourceHash", skip_serializing_if = "Option::is_none")]
pub source_hash: Option<B256>,
/// The ETH value to mint on L2
#[serde(rename = "mint", skip_serializing_if = "Option::is_none")]
pub mint: Option<U128>,
/// Field indicating whether the transaction is a system transaction, and therefore
/// exempt from the L2 gas limit.
#[serde(rename = "isSystemTx", skip_serializing_if = "Option::is_none")]
pub is_system_tx: Option<bool>,
}

impl From<OptimismTransactionFields> for OtherFields {
fn from(value: OptimismTransactionFields) -> Self {
serde_json::to_value(value).unwrap().try_into().unwrap()
}
}

// == impl TransactionRequest ==
Expand Down

0 comments on commit ea8d88a

Please sign in to comment.