Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
471 changes: 298 additions & 173 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ dotenvy = "0.15"
thiserror = "2"
async-trait = "0.1"
actix-rt = "2.0.0"
alloy = { version = "0.9", features = ["full"] }
alloy = { version = "1.0.24", features = ["full"] }
serde_json = "1"
json-patch = "4.0"
strum = { version = "0.27", default-features = false, features = ["derive"] }
Expand Down
53 changes: 29 additions & 24 deletions src/domain/transaction/evm/status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
//! It includes methods for checking transaction status, determining when to resubmit
//! or replace transactions with NOOPs, and updating transaction status in the repository.

use alloy::network::ReceiptResponse;
use chrono::{DateTime, Duration, Utc};
use eyre::Result;
use log::info;
Expand Down Expand Up @@ -59,7 +60,7 @@ where
let receipt_result = self.provider().get_transaction_receipt(tx_hash).await?;

if let Some(receipt) = receipt_result {
if !receipt.status() {
if !receipt.inner.status() {
return Ok(TransactionStatus::Failed);
}
let last_block_number = self.provider().get_block_number().await?;
Expand Down Expand Up @@ -386,7 +387,7 @@ mod tests {
models::{
evm::Speed, EvmTransactionData, NetworkConfigData, NetworkRepoModel,
NetworkTransactionData, NetworkType, RelayerEvmPolicy, RelayerNetworkPolicy,
RelayerRepoModel, TransactionRepoModel, TransactionStatus, U256,
RelayerRepoModel, TransactionReceipt, TransactionRepoModel, TransactionStatus, U256,
},
repositories::{
MockNetworkRepository, MockRelayerRepository, MockTransactionCounterTrait,
Expand All @@ -395,9 +396,9 @@ mod tests {
services::{MockEvmProviderTrait, MockSigner},
};
use alloy::{
consensus::{Eip658Value, Receipt, ReceiptEnvelope, ReceiptWithBloom},
consensus::{Eip658Value, Receipt, ReceiptWithBloom},
network::AnyReceiptEnvelope,
primitives::{b256, Address, BlockHash, Bloom, TxHash},
rpc::types::TransactionReceipt,
};
use chrono::{Duration, Utc};
use std::sync::Arc;
Expand Down Expand Up @@ -590,27 +591,31 @@ mod tests {
let from_address = Address::from([0x11; 20]);

TransactionReceipt {
// A default, minimal "Legacy" receipt envelope
inner: ReceiptEnvelope::Legacy(ReceiptWithBloom {
receipt: Receipt {
status: Eip658Value::Eip658(status), // determines success/fail
cumulative_gas_used: 0,
logs: vec![],
inner: alloy::rpc::types::TransactionReceipt {
inner: AnyReceiptEnvelope {
inner: ReceiptWithBloom {
receipt: Receipt {
status: Eip658Value::Eip658(status), // determines success/fail
cumulative_gas_used: 0,
logs: vec![],
},
logs_bloom: Bloom::ZERO,
},
r#type: 0, // Legacy transaction type
},
logs_bloom: Bloom::ZERO,
}),
transaction_hash: tx_hash,
transaction_index: Some(0),
block_hash: block_number.map(|_| block_hash), // only set if mined
block_number,
gas_used: 21000,
effective_gas_price: 1000,
blob_gas_used: None,
blob_gas_price: None,
from: from_address,
to: None,
contract_address: None,
authorization_list: None,
transaction_hash: tx_hash,
transaction_index: Some(0),
block_hash: block_number.map(|_| block_hash), // only set if mined
block_number,
gas_used: 21000,
effective_gas_price: 1000,
blob_gas_used: None,
blob_gas_price: None,
from: from_address,
to: None,
contract_address: None,
},
other: Default::default(),
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/models/rpc/evm/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use alloy::network::{AnyRpcBlock, AnyTransactionReceipt};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;

Expand All @@ -20,3 +21,6 @@ pub enum EvmRpcRequest {
params: serde_json::Value,
},
}

pub type BlockResponse = AnyRpcBlock;
pub type TransactionReceipt = AnyTransactionReceipt;
32 changes: 10 additions & 22 deletions src/services/gas/evm_gas_price.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,12 @@ impl<P: EvmProviderTrait> EvmGasPriceServiceTrait for EvmGasPriceService<P> {

#[cfg(test)]
mod tests {
use alloy::rpc::types::FeeHistory;
use alloy::{
network::AnyRpcBlock,
rpc::types::{Block, FeeHistory},
};

use crate::services::provider::evm::MockEvmProviderTrait;
use alloy::rpc::types::{Block as BlockResponse, Header};

use super::*;

Expand Down Expand Up @@ -438,16 +440,9 @@ mod tests {
.times(1)
.returning(move || {
Box::pin(async move {
Ok(BlockResponse {
header: Header {
inner: alloy::consensus::Header {
base_fee_per_gas: Some(expected_base_fee as u64),
..Default::default()
},
..Default::default()
},
..Default::default()
})
let mut block: Block = Block::default();
block.header.base_fee_per_gas = Some(expected_base_fee as u64);
Ok(AnyRpcBlock::from(block))
})
});

Expand All @@ -474,16 +469,9 @@ mod tests {
.times(1)
.returning(move || {
Box::pin(async move {
Ok(BlockResponse {
header: Header {
inner: alloy::consensus::Header {
base_fee_per_gas: Some(base_fee as u64),
..Default::default()
},
..Default::default()
},
..Default::default()
})
let mut block: Block = Block::default();
block.header.base_fee_per_gas = Some(base_fee as u64);
Ok(AnyRpcBlock::from(block))
})
});

Expand Down
52 changes: 35 additions & 17 deletions src/services/provider/evm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,37 @@
use std::time::Duration;

use alloy::{
network::AnyNetwork,
primitives::{Bytes, TxKind, Uint},
providers::{Provider, ProviderBuilder, RootProvider},
providers::{
fillers::{BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller},
Identity, Provider, ProviderBuilder, RootProvider,
},
rpc::{
client::ClientBuilder,
types::{
Block as BlockResponse, BlockNumberOrTag, BlockTransactionsKind, FeeHistory,
TransactionInput, TransactionReceipt, TransactionRequest,
},
types::{BlockNumberOrTag, FeeHistory, TransactionInput, TransactionRequest},
},
transports::http::{Client, Http},
transports::http::Http,
};

type EvmProviderType = FillProvider<
JoinFill<
Identity,
JoinFill<GasFiller, JoinFill<BlobGasFiller, JoinFill<NonceFiller, ChainIdFiller>>>,
>,
RootProvider<AnyNetwork>,
AnyNetwork,
>;
use async_trait::async_trait;
use eyre::Result;
use reqwest::ClientBuilder as ReqwestClientBuilder;
use serde_json;

use super::rpc_selector::RpcSelector;
use super::{retry_rpc_call, RetryConfig};
use crate::models::{EvmTransactionData, RpcConfig, TransactionError, U256};
use crate::models::{
BlockResponse, EvmTransactionData, RpcConfig, TransactionError, TransactionReceipt, U256,
};

#[cfg(test)]
use mockall::automock;
Expand Down Expand Up @@ -207,7 +219,7 @@ impl EvmProvider {
}

/// Initialize a provider for a given URL
fn initialize_provider(&self, url: &str) -> Result<RootProvider<Http<Client>>, ProviderError> {
fn initialize_provider(&self, url: &str) -> Result<EvmProviderType, ProviderError> {
let rpc_url = url.parse().map_err(|e| {
ProviderError::NetworkConfiguration(format!("Invalid URL format: {}", e))
})?;
Expand All @@ -223,7 +235,9 @@ impl EvmProvider {
let is_local = transport.guess_local();
let client = ClientBuilder::default().transport(transport, is_local);

let provider = ProviderBuilder::new().on_client(client);
let provider = ProviderBuilder::new()
.network::<AnyNetwork>()
.connect_client(client);

Ok(provider)
}
Expand All @@ -237,7 +251,7 @@ impl EvmProvider {
operation: F,
) -> Result<T, ProviderError>
where
F: Fn(RootProvider<Http<Client>>) -> Fut,
F: Fn(EvmProviderType) -> Fut,
Fut: std::future::Future<Output = Result<T, ProviderError>>,
{
// Classify which errors should be retried
Expand Down Expand Up @@ -304,7 +318,7 @@ impl EvmProviderTrait for EvmProvider {
let tx_req = transaction_request.clone();
async move {
provider
.estimate_gas(&tx_req)
.estimate_gas(tx_req.into())
.await
.map_err(ProviderError::from)
}
Expand All @@ -325,7 +339,7 @@ impl EvmProviderTrait for EvmProvider {
let tx_req = tx.clone();
async move {
provider
.send_transaction(tx_req)
.send_transaction(tx_req.into())
.await
.map_err(ProviderError::from)
}
Expand Down Expand Up @@ -396,7 +410,7 @@ impl EvmProviderTrait for EvmProvider {
let block_result = self
.retry_rpc_call("get_block_by_number", |provider| async move {
provider
.get_block_by_number(BlockNumberOrTag::Latest, BlockTransactionsKind::Hashes)
.get_block_by_number(BlockNumberOrTag::Latest)
.await
.map_err(ProviderError::from)
})
Expand All @@ -414,7 +428,7 @@ impl EvmProviderTrait for EvmProvider {
) -> Result<Option<TransactionReceipt>, ProviderError> {
let parsed_tx_hash = tx_hash
.parse::<alloy::primitives::TxHash>()
.map_err(|e| ProviderError::InvalidAddress(e.to_string()))?;
.map_err(|e| ProviderError::Other(format!("Invalid transaction hash: {}", e)))?;

self.retry_rpc_call("get_transaction_receipt", move |provider| async move {
provider
Expand All @@ -428,7 +442,12 @@ impl EvmProviderTrait for EvmProvider {
async fn call_contract(&self, tx: &TransactionRequest) -> Result<Bytes, ProviderError> {
self.retry_rpc_call("call_contract", move |provider| {
let tx_req = tx.clone();
async move { provider.call(&tx_req).await.map_err(ProviderError::from) }
async move {
provider
.call(tx_req.into())
.await
.map_err(ProviderError::from)
}
})
.await
}
Expand All @@ -439,7 +458,6 @@ impl EvmProviderTrait for EvmProvider {
params: serde_json::Value,
) -> Result<serde_json::Value, ProviderError> {
self.retry_rpc_call("raw_request_dyn", move |provider| {
let method_clone = method.to_string();
let params_clone = params.clone();
async move {
// Convert params to RawValue and use Cow for method
Expand All @@ -448,7 +466,7 @@ impl EvmProviderTrait for EvmProvider {
})?;

let result = provider
.raw_request_dyn(std::borrow::Cow::Owned(method_clone), &params_raw)
.raw_request_dyn(std::borrow::Cow::Owned(method.to_string()), &params_raw)
.await
.map_err(ProviderError::from)?;

Expand Down
6 changes: 3 additions & 3 deletions src/services/signer/evm/aws_kms_signer.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use alloy::{
consensus::{SignableTransaction, TxEip1559, TxLegacy},
primitives::{eip191_hash_message, utils::eip191_message, PrimitiveSignature},
primitives::{eip191_hash_message, utils::eip191_message, Signature},
};
use async_trait::async_trait;

Expand Down Expand Up @@ -71,7 +71,7 @@ impl<T: AwsKmsEvmService> Signer for AwsKmsSigner<T> {
}

// Construct primitive signature
let signature = PrimitiveSignature::from_raw(&signed_bytes)
let signature = Signature::from_raw(&signed_bytes)
.map_err(|e| SignerError::ConversionError(e.to_string()))?;

// Extract signature array bytes
Expand Down Expand Up @@ -113,7 +113,7 @@ impl<T: AwsKmsEvmService> Signer for AwsKmsSigner<T> {
)));
}

let signature = PrimitiveSignature::from_raw(&signed_bytes)
let signature = Signature::from_raw(&signed_bytes)
.map_err(|e| SignerError::ConversionError(e.to_string()))?;

let signature_bytes = signature.as_bytes();
Expand Down
6 changes: 3 additions & 3 deletions src/services/signer/evm/google_cloud_kms_signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

use alloy::{
consensus::{SignableTransaction, TxEip1559, TxLegacy},
primitives::{eip191_hash_message, utils::eip191_message, PrimitiveSignature},
primitives::{eip191_hash_message, utils::eip191_message, Signature},
};
use async_trait::async_trait;

Expand Down Expand Up @@ -63,7 +63,7 @@ impl Signer for GoogleCloudKmsSigner {
)));
}

let signature = PrimitiveSignature::from_raw(&signed_bytes)
let signature = Signature::from_raw(&signed_bytes)
.map_err(|e| SignerError::ConversionError(e.to_string()))?;

let mut signature_bytes = signature.as_bytes();
Expand Down Expand Up @@ -100,7 +100,7 @@ impl Signer for GoogleCloudKmsSigner {
)));
}

let signature = PrimitiveSignature::from_raw(&signed_bytes)
let signature = Signature::from_raw(&signed_bytes)
.map_err(|e| SignerError::ConversionError(e.to_string()))?;

let signature_bytes = signature.as_bytes();
Expand Down
Loading