[fortuna] Add legacy transaction support (#1126)

* gr

* support legacy transactions

* doc
This commit is contained in:
Jayant Krishnamurthy 2023-10-31 12:13:12 -07:00 committed by GitHub
parent fe7984d132
commit f0a077a2cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 3 deletions

View File

@ -8,3 +8,4 @@ chains:
eos-evm-testnet:
geth_rpc_addr: https://api.testnet.evm.eosnetwork.com/
contract_addr: 0xD42c7a708E74AD19401D907a14146F006c851Ee3
legacy_tx: true

View File

@ -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,
}

View File

@ -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,
)),
))
}