浏览代码

[fortuna] Add legacy transaction support (#1126)

* gr

* support legacy transactions

* doc
Jayant Krishnamurthy 2 年之前
父节点
当前提交
f0a077a2cf
共有 3 个文件被更改,包括 44 次插入3 次删除
  1. 1 0
      fortuna/config.yaml
  2. 4 0
      fortuna/src/config.rs
  3. 39 3
      fortuna/src/ethereum.rs

+ 1 - 0
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

+ 4 - 0
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,
 }

+ 39 - 3
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<SignerMiddleware<Provider<Http>, LocalWallet>>;
+pub type SignablePythContract = PythRandom<
+    TransformerMiddleware<SignerMiddleware<Provider<Http>, LocalWallet>, LegacyTxTransformer>,
+>;
 pub type PythContract = PythRandom<Provider<Http>>;
 
+/// 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::<Http>::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::<LocalWallet>()?
@@ -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,
+            )),
         ))
     }