-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12 from alloy-rs/matt/add-network-crates
feat: add OP network
- Loading branch information
Showing
12 changed files
with
317 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[package] | ||
name = "op-alloy-network" | ||
description = "Optimism blockchain RPC behavior abstraction" | ||
|
||
version.workspace = true | ||
edition.workspace = true | ||
rust-version.workspace = true | ||
authors.workspace = true | ||
license.workspace = true | ||
homepage.workspace = true | ||
repository.workspace = true | ||
exclude.workspace = true | ||
|
||
[lints] | ||
workspace = true | ||
|
||
[dependencies] | ||
op-alloy-consensus = { workspace = true, features = ["serde"] } | ||
op-alloy-rpc-types.workspace = true | ||
|
||
alloy-consensus.workspace = true | ||
alloy-network.workspace = true | ||
alloy-primitives.workspace = true | ||
alloy-rpc-types-eth.workspace = true | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# op-alloy-network | ||
|
||
Optimism blockchain RPC behavior abstraction. | ||
|
||
This crate contains a simple abstraction of the RPC behavior of an | ||
Op-stack blockchain. It is intended to be used by the Alloy client to | ||
provide a consistent interface to the rest of the library, regardless of | ||
changes the underlying blockchain makes to the RPC interface. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
#![doc = include_str!("../README.md")] | ||
#![doc( | ||
html_logo_url = "https://raw.githubusercontent.com/alloy-rs/core/main/assets/alloy.jpg", | ||
html_favicon_url = "https://raw.githubusercontent.com/alloy-rs/core/main/assets/favicon.ico" | ||
)] | ||
#![cfg_attr(not(test), warn(unused_crate_dependencies))] | ||
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] | ||
|
||
use alloy_consensus::{BlobTransactionSidecar, TxType}; | ||
pub use alloy_network::*; | ||
use alloy_primitives::{Address, Bytes, ChainId, TxKind, U256}; | ||
use alloy_rpc_types_eth::AccessList; | ||
|
||
/// Types for an Op-stack network. | ||
#[derive(Clone, Copy, Debug)] | ||
pub struct Optimism { | ||
_private: (), | ||
} | ||
|
||
impl Network for Optimism { | ||
type TxType = TxType; | ||
|
||
type TxEnvelope = alloy_consensus::TxEnvelope; | ||
|
||
type UnsignedTx = alloy_consensus::TypedTransaction; | ||
|
||
type ReceiptEnvelope = op_alloy_consensus::OpReceiptEnvelope; | ||
|
||
type Header = alloy_consensus::Header; | ||
|
||
type TransactionRequest = alloy_rpc_types_eth::transaction::TransactionRequest; | ||
|
||
type TransactionResponse = alloy_rpc_types_eth::Transaction; | ||
|
||
type ReceiptResponse = op_alloy_rpc_types::OpTransactionReceipt; | ||
|
||
type HeaderResponse = alloy_rpc_types_eth::Header; | ||
} | ||
|
||
impl TransactionBuilder<Optimism> for alloy_rpc_types_eth::transaction::TransactionRequest { | ||
fn chain_id(&self) -> Option<ChainId> { | ||
self.chain_id | ||
} | ||
|
||
fn set_chain_id(&mut self, chain_id: ChainId) { | ||
self.chain_id = Some(chain_id); | ||
} | ||
|
||
fn nonce(&self) -> Option<u64> { | ||
self.nonce | ||
} | ||
|
||
fn set_nonce(&mut self, nonce: u64) { | ||
self.nonce = Some(nonce); | ||
} | ||
|
||
fn input(&self) -> Option<&Bytes> { | ||
self.input.input() | ||
} | ||
|
||
fn set_input<T: Into<Bytes>>(&mut self, input: T) { | ||
self.input.input = Some(input.into()); | ||
} | ||
|
||
fn from(&self) -> Option<Address> { | ||
self.from | ||
} | ||
|
||
fn set_from(&mut self, from: Address) { | ||
self.from = Some(from); | ||
} | ||
|
||
fn kind(&self) -> Option<TxKind> { | ||
self.to | ||
} | ||
|
||
fn clear_kind(&mut self) { | ||
self.to = None; | ||
} | ||
|
||
fn set_kind(&mut self, kind: TxKind) { | ||
self.to = Some(kind); | ||
} | ||
|
||
fn value(&self) -> Option<U256> { | ||
self.value | ||
} | ||
|
||
fn set_value(&mut self, value: U256) { | ||
self.value = Some(value) | ||
} | ||
|
||
fn gas_price(&self) -> Option<u128> { | ||
self.gas_price | ||
} | ||
|
||
fn set_gas_price(&mut self, gas_price: u128) { | ||
self.gas_price = Some(gas_price); | ||
} | ||
|
||
fn max_fee_per_gas(&self) -> Option<u128> { | ||
self.max_fee_per_gas | ||
} | ||
|
||
fn set_max_fee_per_gas(&mut self, max_fee_per_gas: u128) { | ||
self.max_fee_per_gas = Some(max_fee_per_gas); | ||
} | ||
|
||
fn max_priority_fee_per_gas(&self) -> Option<u128> { | ||
self.max_priority_fee_per_gas | ||
} | ||
|
||
fn set_max_priority_fee_per_gas(&mut self, max_priority_fee_per_gas: u128) { | ||
self.max_priority_fee_per_gas = Some(max_priority_fee_per_gas); | ||
} | ||
|
||
fn max_fee_per_blob_gas(&self) -> Option<u128> { | ||
self.max_fee_per_blob_gas | ||
} | ||
|
||
fn set_max_fee_per_blob_gas(&mut self, max_fee_per_blob_gas: u128) { | ||
self.max_fee_per_blob_gas = Some(max_fee_per_blob_gas) | ||
} | ||
|
||
fn gas_limit(&self) -> Option<u128> { | ||
self.gas | ||
} | ||
|
||
fn set_gas_limit(&mut self, gas_limit: u128) { | ||
self.gas = Some(gas_limit); | ||
} | ||
|
||
fn access_list(&self) -> Option<&AccessList> { | ||
self.access_list.as_ref() | ||
} | ||
|
||
fn set_access_list(&mut self, access_list: AccessList) { | ||
self.access_list = Some(access_list); | ||
} | ||
|
||
fn blob_sidecar(&self) -> Option<&BlobTransactionSidecar> { | ||
self.sidecar.as_ref() | ||
} | ||
|
||
fn set_blob_sidecar(&mut self, sidecar: BlobTransactionSidecar) { | ||
TransactionBuilder::<Ethereum>::set_blob_sidecar(self, sidecar) | ||
} | ||
|
||
fn complete_type(&self, ty: TxType) -> Result<(), Vec<&'static str>> { | ||
TransactionBuilder::<Ethereum>::complete_type(self, ty) | ||
} | ||
|
||
fn can_submit(&self) -> bool { | ||
TransactionBuilder::<Ethereum>::can_submit(self) | ||
} | ||
|
||
fn can_build(&self) -> bool { | ||
TransactionBuilder::<Ethereum>::can_build(self) | ||
} | ||
|
||
#[doc(alias = "output_transaction_type")] | ||
fn output_tx_type(&self) -> TxType { | ||
self.preferred_type() | ||
} | ||
|
||
#[doc(alias = "output_transaction_type_checked")] | ||
fn output_tx_type_checked(&self) -> Option<TxType> { | ||
self.buildable_type() | ||
} | ||
|
||
fn prep_for_submission(&mut self) { | ||
self.transaction_type = Some(self.preferred_type() as u8); | ||
self.trim_conflicting_keys(); | ||
self.populate_blob_hashes(); | ||
} | ||
|
||
fn build_unsigned(self) -> BuildResult<alloy_consensus::TypedTransaction, Optimism> { | ||
if let Err((tx_type, missing)) = self.missing_keys() { | ||
return Err(TransactionBuilderError::InvalidTransactionRequest(tx_type, missing) | ||
.into_unbuilt(self)); | ||
} | ||
Ok(self.build_typed_tx().expect("checked by missing_keys")) | ||
} | ||
|
||
async fn build<W: NetworkWallet<Optimism>>( | ||
self, | ||
wallet: &W, | ||
) -> Result<<Optimism as Network>::TxEnvelope, TransactionBuilderError<Optimism>> { | ||
Ok(wallet.sign_request(self).await?) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.