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
60 changes: 22 additions & 38 deletions mm2src/coins/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ pub use ethcore_transaction::{SignedTransaction as SignedEthTx, TxType};
use ethereum_types::{Address, H160, H256, U256};
use ethkey::{public_to_address, sign, verify_address, KeyPair, Public, Signature};
use futures::compat::Future01CompatExt;
use futures::future::{join, join_all, select_ok, try_join_all, Either, FutureExt, TryFutureExt};
use futures::future::{join, join_all, select_ok, try_join_all, FutureExt, TryFutureExt};
use futures01::Future;
use http::Uri;
use kdf_walletconnect::{WalletConnectCtx, WalletConnectOps};
Expand Down Expand Up @@ -159,9 +159,6 @@ use v2_activation::{build_address_and_priv_key_policy, EthActivationV2Error};
mod eth_withdraw;
use eth_withdraw::{EthWithdraw, InitEthWithdraw, StandardEthWithdraw};

mod nonce;
use nonce::ParityNonce;

pub mod fee_estimation;
use fee_estimation::eip1559::{block_native::BlocknativeGasApiCaller, infura::InfuraGasApiCaller,
simple::FeePerGasSimpleEstimator, FeePerGasEstimated, GasApiConfig, GasApiProvider};
Expand Down Expand Up @@ -908,9 +905,10 @@ pub struct EthCoinImpl {
}

#[derive(Clone, Debug)]
pub struct Web3Instance {
web3: Web3<Web3Transport>,
is_parity: bool,
pub struct Web3Instance(Web3<Web3Transport>);

impl AsRef<Web3<Web3Transport>> for Web3Instance {
fn as_ref(&self) -> &Web3<Web3Transport> { &self.0 }
}

/// Information about a token that follows the ERC20 protocol on an EVM-based network.
Expand Down Expand Up @@ -2826,7 +2824,7 @@ async fn sign_and_send_transaction_with_keypair(

let futures = web3_instances_with_latest_nonce
.into_iter()
.map(|web3_instance| web3_instance.web3.eth().send_raw_transaction(bytes.clone()));
.map(|web3_instance| web3_instance.as_ref().eth().send_raw_transaction(bytes.clone()));
try_tx_s!(select_ok(futures).await.map_err(|e| ERRL!("{}", e)), signed);

info!(target: "sign-and-send", "wait_for_tx_appears_on_rpc…");
Expand Down Expand Up @@ -3017,18 +3015,18 @@ impl RpcCommonOps for EthCoin {

// try to find first live client
for (i, client) in clients.clone().into_iter().enumerate() {
if let Web3Transport::Websocket(socket_transport) = &client.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = client.as_ref().transport() {
socket_transport.maybe_spawn_connection_loop(self.clone());
};

if !client.web3.transport().is_last_request_failed() {
if !client.as_ref().transport().is_last_request_failed() {
// Bring the live client to the front of rpc_clients
clients.rotate_left(i);
return Ok(client);
}

match client
.web3
.as_ref()
.web3()
.client_version()
.timeout(ETH_RPC_REQUEST_TIMEOUT)
Expand All @@ -3042,7 +3040,7 @@ impl RpcCommonOps for EthCoin {
Ok(Err(rpc_error)) => {
debug!("Could not get client version on: {:?}. Error: {}", &client, rpc_error);

if let Web3Transport::Websocket(socket_transport) = client.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = client.as_ref().transport() {
socket_transport.stop_connection_loop().await;
};
},
Expand All @@ -3052,7 +3050,7 @@ impl RpcCommonOps for EthCoin {
&client, timeout_error
);

if let Web3Transport::Websocket(socket_transport) = client.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = client.as_ref().transport() {
socket_transport.stop_connection_loop().await;
};
},
Expand All @@ -3067,7 +3065,7 @@ impl RpcCommonOps for EthCoin {

impl EthCoin {
pub(crate) async fn web3(&self) -> Result<Web3<Web3Transport>, Web3RpcError> {
self.get_live_client().await.map(|t| t.web3)
self.get_live_client().await.map(|t| t.0)
}

/// Gets `SenderRefunded` events from etomic swap smart contract since `from_block`
Expand Down Expand Up @@ -5720,22 +5718,19 @@ impl EthCoin {
let (futures, web3_instances): (Vec<_>, Vec<_>) = web3_instances
.iter()
.map(|instance| {
if let Web3Transport::Websocket(socket_transport) = instance.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = instance.as_ref().transport() {
socket_transport.maybe_spawn_temporary_connection_loop(
self.clone(),
Instant::now() + TMP_SOCKET_DURATION,
);
};

if instance.is_parity {
let parity: ParityNonce<_> = instance.web3.api();
(Either::Left(parity.parity_next_nonce(addr)), instance.clone())
} else {
(
Either::Right(instance.web3.eth().transaction_count(addr, Some(BlockNumber::Pending))),
instance.clone(),
)
}
let nonce = instance
.as_ref()
.eth()
.transaction_count(addr, Some(BlockNumber::Pending));

(nonce, instance.clone())
})
.unzip();

Expand Down Expand Up @@ -6570,19 +6565,8 @@ pub async fn eth_coin_from_conf_and_request(
};

let web3 = Web3::new(transport);
let version = match web3.web3().client_version().await {
Ok(v) => v,
Err(e) => {
error!("Couldn't get client version for url {}: {}", url, e);

continue;
},
};

web3_instances.push(Web3Instance {
web3,
is_parity: version.contains("Parity") || version.contains("parity"),
})
web3_instances.push(Web3Instance(web3))
}

if web3_instances.is_empty() {
Expand All @@ -6599,10 +6583,10 @@ pub async fn eth_coin_from_conf_and_request(
let decimals = match conf["decimals"].as_u64() {
None | Some(0) => try_s!(
get_token_decimals(
&web3_instances
web3_instances
.first()
.expect("web3_instances can't be empty in ETH activation")
.web3,
.as_ref(),
token_addr
)
.await
Expand Down
6 changes: 3 additions & 3 deletions mm2src/coins/eth/eth_rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ impl EthCoin {

let mut error = web3::Error::Unreachable;
for (i, client) in clients.clone().into_iter().enumerate() {
let execute_fut = match client.web3.transport() {
let execute_fut = match client.as_ref().transport() {
Web3Transport::Http(http) => http.execute(method, params.clone()),
Web3Transport::Websocket(socket) => {
socket.maybe_spawn_connection_loop(self.clone());
Expand All @@ -40,14 +40,14 @@ impl EthCoin {
debug!("Request on '{method}' failed. Error: {err}");
error = err;

if let Web3Transport::Websocket(socket_transport) = client.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = client.as_ref().transport() {
socket_transport.stop_connection_loop().await;
};
},
Err(timeout_error) => {
debug!("Timeout exceed for '{method}' request. Error: {timeout_error}",);

if let Web3Transport::Websocket(socket_transport) = client.web3.transport() {
if let Web3Transport::Websocket(socket_transport) = client.as_ref().transport() {
socket_transport.stop_connection_loop().await;
};
},
Expand Down
2 changes: 1 addition & 1 deletion mm2src/coins/eth/for_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub(crate) fn eth_coin_from_keypair(
};
let transport = Web3Transport::new_http(node);
let web3 = Web3::new(transport);
web3_instances.push(Web3Instance { web3, is_parity: false });
web3_instances.push(Web3Instance(web3));
}
drop_mutability!(web3_instances);

Expand Down
29 changes: 0 additions & 29 deletions mm2src/coins/eth/nonce.rs

This file was deleted.

14 changes: 2 additions & 12 deletions mm2src/coins/eth/v2_activation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -875,18 +875,8 @@ async fn build_web3_instances(

let transport = create_transport(ctx, &uri, &eth_node, &event_handlers)?;
let web3 = Web3::new(transport);
let version = match web3.web3().client_version().await {
Ok(v) => v,
Err(e) => {
error!("Couldn't get client version for url {}: {}", eth_node.url, e);
continue;
},
};

web3_instances.push(Web3Instance {
web3,
is_parity: version.contains("Parity") || version.contains("parity"),
});
web3_instances.push(Web3Instance(web3));
}

if web3_instances.is_empty() {
Expand Down Expand Up @@ -981,7 +971,7 @@ async fn build_metamask_transport(

// MetaMask doesn't use Parity nodes. So `MetamaskTransport` doesn't support `parity_nextNonce` RPC.
// An example of the `web3_clientVersion` RPC - `MetaMask/v10.22.1`.
let web3_instances = vec![Web3Instance { web3, is_parity: false }];
let web3_instances = vec![Web3Instance(web3)];

Ok(web3_instances)
}
Expand Down
Loading