#![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))]
pub use alloy_network::*;
use alloy_consensus::TxType;
use alloy_primitives::{Address, Bytes, ChainId, TxKind, U256};
use alloy_rpc_types_eth::AccessList;
use op_alloy_consensus::OpTxType;
#[derive(Clone, Copy, Debug)]
pub struct Optimism {
_private: (),
}
impl Network for Optimism {
type TxType = OpTxType;
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 = op_alloy_rpc_types::Transaction;
type ReceiptResponse = op_alloy_rpc_types::OpTransactionReceipt;
type HeaderResponse = alloy_rpc_types_eth::Header;
type BlockResponse =
alloy_rpc_types_eth::Block<Self::TransactionResponse, Self::HeaderResponse>;
}
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 gas_limit(&self) -> Option<u64> {
self.gas
}
fn set_gas_limit(&mut self, gas_limit: u64) {
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 complete_type(&self, ty: OpTxType) -> Result<(), Vec<&'static str>> {
match ty {
OpTxType::Deposit => Err(vec!["not implemented for deposit tx"]),
_ => {
let ty = TxType::try_from(ty as u8).unwrap();
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) -> OpTxType {
OpTxType::try_from(self.preferred_type() as u8).unwrap()
}
#[doc(alias = "output_transaction_type_checked")]
fn output_tx_type_checked(&self) -> Option<OpTxType> {
self.buildable_type().map(|tx_ty| OpTxType::try_from(tx_ty as u8).unwrap())
}
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() {
let tx_type = OpTxType::try_from(tx_type as u8).unwrap();
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?)
}
}