From e1750be3dc19192ed92e901ce5f862c17ae5032c Mon Sep 17 00:00:00 2001 From: Keyne Date: Mon, 13 Jan 2025 16:32:48 +0000 Subject: [PATCH] add ethereum utils (#32) --- Cargo.toml | 24 ++++++------ src/utils/ethereum.rs | 90 +++++++++++++++++++++++++++++++++++++++++++ src/utils/mod.rs | 1 + 3 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 src/utils/ethereum.rs diff --git a/Cargo.toml b/Cargo.toml index e3a1b1c..81a3748 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,20 +1,22 @@ [package] -name = "localic-utils" +name = "localic-utils" version = "0.1.0" edition = "2021" [dependencies] -localic-std = { git = "https://github.com/strangelove-ventures/interchaintest", branch = "main" } -cosmwasm-std = "1.5.5" -serde = { version = "1.0.204", features = ["derive"] } -serde_json = "1.0.120" -thiserror = "1.0.61" +localic-std = { git = "https://github.com/strangelove-ventures/interchaintest", branch = "main" } +cosmwasm-std = "1.5.5" +serde = { version = "1.0.204", features = ["derive"] } +serde_json = "1.0.120" +thiserror = "1.0.61" derive_builder = "0.20.0" -log = "0.4.22" -astroport = "5.1.0" -reqwest = { version = "0.11.20", features = ["rustls-tls"] } -sha2 = "0.10.8" +log = "0.4.22" +astroport = "5.1.0" +reqwest = { version = "0.11.20", features = ["rustls-tls"] } +sha2 = "0.10.8" +alloy = { version = "0.9.2", features = ["full"] } +tokio = "1.40.0" [dev-dependencies] env_logger = "0.11.3" -hex = "0.4.3" +hex = "0.4.3" diff --git a/src/utils/ethereum.rs b/src/utils/ethereum.rs new file mode 100644 index 0000000..411f6db --- /dev/null +++ b/src/utils/ethereum.rs @@ -0,0 +1,90 @@ +use alloy::{ + consensus::Account, + network::Ethereum, + primitives::{Address, TxHash, U256}, + providers::{ + fillers::{BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller}, + Identity, Provider, ProviderBuilder, RootProvider, + }, + rpc::types::{Transaction, TransactionReceipt, TransactionRequest}, + transports::http::{reqwest::Url, Client, Http}, +}; +use std::error::Error; +use tokio::runtime::Runtime; + +// Define the individual fillers in a nested structure +type BaseFillChain = JoinFill; +type WithBlobGas = JoinFill; +type WithGas = JoinFill; +type AllFillers = JoinFill; + +/// Helper client to interact with Ethereum in a synchronous way. +pub struct EthClient { + pub provider: FillProvider>, Http, Ethereum>, + pub rt: Runtime, +} + +impl EthClient { + pub fn new(url: &str) -> Result> { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build()?; + + let url = Url::parse(url)?; + let provider = ProviderBuilder::new() + // Adds the `ChainIdFiller`, `GasFiller` and the `NonceFiller` layers. + // This is the recommended way to set up the provider. + .with_recommended_fillers() + .on_http(url); + + Ok(Self { provider, rt }) + } + + pub fn get_block_number(&self) -> Result> { + let number = self.rt.block_on(self.provider.get_block_number())?; + Ok(number) + } + + pub fn get_balance(&self, address: Address) -> Result> { + let balance = self + .rt + .block_on(async { self.provider.get_balance(address).await })?; + Ok(balance) + } + + pub fn get_accounts_addresses(&self) -> Result, Box> { + let accounts = self + .rt + .block_on(async { self.provider.get_accounts().await })?; + Ok(accounts) + } + + pub fn get_account(&self, address: Address) -> Result> { + let account = self + .rt + .block_on(async { self.provider.get_account(address).await })?; + Ok(account) + } + + pub fn send_transaction( + &self, + tx: TransactionRequest, + ) -> Result> { + self.rt.block_on(async { + let tx_hash = self.provider.send_transaction(tx).await?; + let receipt = tx_hash.get_receipt().await?; + + Ok(receipt) + }) + } + + pub fn get_transaction_by_hash( + &self, + tx_hash: TxHash, + ) -> Result, Box> { + let tx = self + .rt + .block_on(async { self.provider.get_transaction_by_hash(tx_hash).await })?; + Ok(tx) + } +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index fb6ae13..a71637f 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,3 +1,4 @@ +pub mod ethereum; pub mod fs; pub mod queries; pub mod setup;