diff --git a/fortuna/config.yaml b/fortuna/config.yaml index e8689be6e4..8c42c53c64 100644 --- a/fortuna/config.yaml +++ b/fortuna/config.yaml @@ -8,3 +8,4 @@ chains: eos-evm-testnet: geth_rpc_addr: https://api.testnet.evm.eosnetwork.com/ contract_addr: 0xD42c7a708E74AD19401D907a14146F006c851Ee3 + legacy_tx: true diff --git a/fortuna/src/config.rs b/fortuna/src/config.rs index b095ef1849..73cd5dce97 100644 --- a/fortuna/src/config.rs +++ b/fortuna/src/config.rs @@ -115,4 +115,8 @@ pub struct EthereumConfig { /// Address of a Pyth Randomness contract to interact with. pub contract_addr: Address, + + /// Use the legacy transaction format (for networks without EIP 1559) + #[serde(default)] + pub legacy_tx: bool, } diff --git a/fortuna/src/ethereum.rs b/fortuna/src/ethereum.rs index 5a8fb2e48e..622380e9cb 100644 --- a/fortuna/src/ethereum.rs +++ b/fortuna/src/ethereum.rs @@ -11,7 +11,15 @@ use { EthLogDecode, }, core::types::Address, - middleware::SignerMiddleware, + middleware::{ + transformer::{ + Transformer, + TransformerError, + TransformerMiddleware, + }, + SignerMiddleware, + }, + prelude::TransactionRequest, providers::{ Http, Middleware, @@ -21,6 +29,7 @@ use { LocalWallet, Signer, }, + types::transaction::eip2718::TypedTransaction, }, sha3::{ Digest, @@ -33,9 +42,29 @@ use { // contract in the same repo. abigen!(PythRandom, "src/abi.json"); -pub type SignablePythContract = PythRandom, LocalWallet>>; +pub type SignablePythContract = PythRandom< + TransformerMiddleware, LocalWallet>, LegacyTxTransformer>, +>; pub type PythContract = PythRandom>; +/// Transformer that converts a transaction into a legacy transaction if use_legacy_tx is true. +#[derive(Clone, Debug)] +pub struct LegacyTxTransformer { + use_legacy_tx: bool, +} + +impl Transformer for LegacyTxTransformer { + fn transform(&self, tx: &mut TypedTransaction) -> Result<(), TransformerError> { + if self.use_legacy_tx { + let legacy_request: TransactionRequest = (*tx).clone().into(); + *tx = legacy_request.into(); + Ok(()) + } else { + Ok(()) + } + } +} + impl SignablePythContract { pub async fn from_config( chain_config: &EthereumConfig, @@ -44,6 +73,10 @@ impl SignablePythContract { let provider = Provider::::try_from(&chain_config.geth_rpc_addr)?; let chain_id = provider.get_chainid().await?; + let transformer = LegacyTxTransformer { + use_legacy_tx: chain_config.legacy_tx, + }; + let wallet__ = private_key .clone() .parse::()? @@ -51,7 +84,10 @@ impl SignablePythContract { Ok(PythRandom::new( chain_config.contract_addr, - Arc::new(SignerMiddleware::new(provider, wallet__)), + Arc::new(TransformerMiddleware::new( + SignerMiddleware::new(provider, wallet__), + transformer, + )), )) }