Skip to content

Commit 9a913b8

Browse files
authored
fix(relayer): resync nonce only on errors (#504)
* fix(relayer): resync nonce only on errors * chore: bumped version * chore: do not resync if batch is empty * refactor: resync only evm nonce * chore: keep same var name * feat: resync polygon nonce * chore: cleanup * refactor: use `is_evm_chain` instead * fix: use fast nonce for initiating fast transfer
1 parent ba48655 commit 9a913b8

File tree

5 files changed

+46
-20
lines changed

5 files changed

+46
-20
lines changed

omni-relayer/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

omni-relayer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "omni-relayer"
3-
version = "0.5.5"
3+
version = "0.5.6"
44
edition = "2024"
55
resolver = "2"
66
repository = "https://github.com/Near-One/omni-bridge"

omni-relayer/src/utils/nonce.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ impl EvmNonceManagers {
202202
if let Some(bnb) = self.bnb.as_ref() {
203203
bnb.resync_nonce().await?;
204204
}
205+
if let Some(pol) = self.pol.as_ref() {
206+
pol.resync_nonce().await?;
207+
}
205208

206209
Ok(())
207210
}

omni-relayer/src/workers/mod.rs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
use std::sync::Arc;
1+
use std::sync::{
2+
Arc,
3+
atomic::{AtomicBool, Ordering},
4+
};
25

3-
use anyhow::Result;
6+
use anyhow::{Context, Result};
47
use bridge_indexer_types::documents_types::DepositMsg;
58
use futures::future::join_all;
69
use rust_decimal::MathematicalOps;
@@ -151,6 +154,20 @@ pub async fn process_events(
151154
.near_bridge_client()
152155
.and_then(near_bridge_client::NearBridgeClient::account_id)?;
153156

157+
near_omni_nonce
158+
.resync_nonce()
159+
.await
160+
.context("Failed to resync near nonce")?;
161+
162+
if let Some(near_fast_nonce) = near_fast_nonce.clone() {
163+
near_fast_nonce
164+
.resync_nonce()
165+
.await
166+
.context("Failed to resync near fast nonce")?;
167+
}
168+
169+
let is_evm_nonce_resync_needed = Arc::new(AtomicBool::new(true));
170+
154171
loop {
155172
let mut redis_connection_manager_clone = redis_connection_manager.clone();
156173

@@ -176,18 +193,13 @@ pub async fn process_events(
176193
continue;
177194
}
178195

179-
if let Err(err) = near_omni_nonce.resync_nonce().await {
180-
warn!("Failed to resync near nonce: {err:?}");
181-
}
182-
183-
if let Some(near_fast_nonce) = near_fast_nonce.clone() {
184-
if let Err(err) = near_fast_nonce.resync_nonce().await {
185-
warn!("Failed to resync near fast nonce: {err:?}");
196+
if is_evm_nonce_resync_needed.load(Ordering::Relaxed) {
197+
if let Err(err) = evm_nonces.resync_nonces().await {
198+
warn!("Failed to resync evm nonces: {err:?}");
199+
continue;
186200
}
187-
}
188201

189-
if let Err(err) = evm_nonces.resync_nonces().await {
190-
warn!("Failed to resync evm nonces: {err:?}");
202+
is_evm_nonce_resync_needed.store(false, Ordering::Relaxed);
191203
}
192204

193205
let current_timestamp = chrono::Utc::now().timestamp();
@@ -552,13 +564,16 @@ pub async fn process_events(
552564
let config = config.clone();
553565
let mut redis_connection_manager = redis_connection_manager.clone();
554566
let fast_connector = fast_connector.clone();
555-
let near_omni_nonce = near_omni_nonce.clone();
567+
let Some(near_fast_nonce) = near_fast_nonce.clone() else {
568+
warn!("Fast transfer event found but near fast nonce manager is not configured");
569+
continue;
570+
};
556571

557572
async move {
558573
match near::initiate_fast_transfer(
559574
fast_connector,
560575
transfer,
561-
near_omni_nonce,
576+
near_fast_nonce,
562577
)
563578
.await
564579
{
@@ -599,6 +614,7 @@ pub async fn process_events(
599614
let omni_connector = omni_connector.clone();
600615
let signer = signer.clone();
601616
let evm_nonces = evm_nonces.clone();
617+
let is_evm_nonce_resync_needed = is_evm_nonce_resync_needed.clone();
602618

603619
async move {
604620
match near::process_sign_transfer_event(
@@ -611,7 +627,11 @@ pub async fn process_events(
611627
)
612628
.await
613629
{
614-
Ok(EventAction::Retry) => {}
630+
Ok(EventAction::Retry) => {
631+
if message_payload.recipient.get_chain().is_evm_chain() {
632+
is_evm_nonce_resync_needed.store(true, Ordering::Relaxed);
633+
}
634+
}
615635
Ok(EventAction::Remove) => {
616636
utils::redis::remove_event(
617637
&config,
@@ -630,6 +650,9 @@ pub async fn process_events(
630650
.await;
631651
}
632652
Err(err) => {
653+
if message_payload.recipient.get_chain().is_evm_chain() {
654+
is_evm_nonce_resync_needed.store(true, Ordering::Relaxed);
655+
}
633656
warn!("{err:?}");
634657
utils::redis::remove_event(
635658
&config,

omni-relayer/src/workers/near.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ pub async fn process_unverified_transfer_event(
600600
pub async fn initiate_fast_transfer(
601601
fast_connector: Arc<OmniConnector>,
602602
transfer: Transfer,
603-
near_omni_nonce: Arc<utils::nonce::NonceManager>,
603+
near_fast_nonce: Arc<utils::nonce::NonceManager>,
604604
) -> Result<EventAction> {
605605
let Ok(near_bridge_client) = fast_connector.near_bridge_client() else {
606606
anyhow::bail!("Near bridge client is not configured");
@@ -690,7 +690,7 @@ pub async fn initiate_fast_transfer(
690690
}
691691

692692
let mut nonce = Some(
693-
near_omni_nonce
693+
near_fast_nonce
694694
.reserve_nonce()
695695
.await
696696
.context("Failed to reserve nonce for near transaction")?,
@@ -717,7 +717,7 @@ pub async fn initiate_fast_transfer(
717717
{
718718
Ok(true) => {
719719
nonce = Some(
720-
near_omni_nonce
720+
near_fast_nonce
721721
.reserve_nonce()
722722
.await
723723
.context("Failed to reserve nonce for near transaction")?,

0 commit comments

Comments
 (0)