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
18 changes: 9 additions & 9 deletions crates/core/src/background_tasks/automatic_top_up_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,10 @@ impl AutomaticTopUpTask {
Ok(balance) => {
if balance < token_config.min_balance {
info!(
"Address {} ERC-20 balance ({}) is below minimum ({}) for token {}, needs top-up",
"Relayer {} ERC-20 balance ({}) is below minimum ({}) for token {}, needs top-up",
address,
format_token_amount(&balance),
format_token_amount(&token_config.min_balance),
format_token_amount(&balance, token_config.decimals),
format_token_amount(&token_config.min_balance, token_config.decimals),
token_config.address
);
addresses_needing_top_up.push(*address);
Expand Down Expand Up @@ -410,7 +410,7 @@ impl AutomaticTopUpTask {
info!(
"Topped up address {} with {} tokens ({}). Transaction: {}",
address,
format_token_amount(&token_config.top_up_amount),
format_token_amount(&token_config.top_up_amount, token_config.decimals),
token_config.address,
tx_hash
);
Expand Down Expand Up @@ -769,7 +769,7 @@ impl AutomaticTopUpTask {
info!(
"From address {} has ERC-20 token balance: {} for token {}",
from_address,
format_token_amount(&balance),
format_token_amount(&balance, token_config.decimals),
token_config.address
);

Expand All @@ -780,16 +780,16 @@ impl AutomaticTopUpTask {
info!(
"From address {} requires {} tokens for token {}",
from_address,
format_token_amount(&min_required_balance),
format_token_amount(&min_required_balance, token_config.decimals),
token_config.address
);

if balance < min_required_balance {
warn!(
"From address {} token balance ({}) is insufficient for top-up transaction. Required: {} for token {}",
from_address,
format_token_amount(&balance),
format_token_amount(&min_required_balance),
format_token_amount(&balance, token_config.decimals),
format_token_amount(&min_required_balance, token_config.decimals),
token_config.address
);
return Ok(false);
Expand Down Expand Up @@ -838,7 +838,7 @@ impl AutomaticTopUpTask {
"Sending ERC-20 top-up transaction: {} -> {} ({} tokens of {}){}",
from_address,
relayer_address,
format_token_amount(&token_config.top_up_amount),
format_token_amount(&token_config.top_up_amount, token_config.decimals),
token_config.address,
if config.via_safe() { " via Safe" } else { "" }
);
Expand Down
24 changes: 11 additions & 13 deletions crates/core/src/shared/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,24 @@ pub fn convert_blob_strings_to_blobs(
}

pub fn format_wei_to_eth(wei: &U256) -> String {
let eth_divisor = U256::from(10u64.pow(18));
let whole_eth = wei / eth_divisor;
let remainder = wei % eth_divisor;
format_token_amount(wei, 18)
}

/// Formats a token amount to a human-readable string.
pub fn format_token_amount(amount: &U256, decimals: u8) -> String {
let unit_divisor = U256::from(10u64.pow(decimals.into()));
let whole_part = amount / unit_divisor;
let remainder = amount % unit_divisor;

if remainder.is_zero() {
format!("{}", whole_eth)
format!("{}", whole_part)
} else {
let decimal_str = format!("{:018}", remainder);
let decimal_str = format!("{:0width$}", remainder, width = decimals as usize);
let decimal_trimmed = decimal_str.trim_end_matches('0');
format!("{}.{}", whole_eth, decimal_trimmed)
format!("{}.{}", whole_part, decimal_trimmed)
}
}

/// Formats a token amount to a human-readable string.
pub fn format_token_amount(amount: &U256) -> String {
// For now, use the same formatting as ETH (18 decimals)
// This can be enhanced to support different token decimals
format_wei_to_eth(amount)
}

pub async fn get_chain_id(provider_url: &str) -> Result<ChainId, String> {
let provider = create_retry_client(provider_url)
.await
Expand Down
23 changes: 5 additions & 18 deletions crates/core/src/yaml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use crate::gas::{
TenderlyGasProviderSetupConfig,
};
use crate::network::{ChainId, Network};
use crate::shared::utils::format_token_amount;
use crate::transaction::types::TransactionSpeed;
use crate::{rrelayer_error, shared::common_types::EvmAddress};

Expand Down Expand Up @@ -692,11 +693,11 @@ impl Serialize for NativeTokenConfig {
let mut state = serializer.serialize_struct("NativeTokenConfig", 4)?;
state.serialize_field(
"min_balance",
&serialize_amount_with_decimals(&self.min_balance, self.decimals),
&format_token_amount(&self.min_balance, self.decimals),
)?;
state.serialize_field(
"top_up_amount",
&serialize_amount_with_decimals(&self.top_up_amount, self.decimals),
&format_token_amount(&self.top_up_amount, self.decimals),
)?;
state.serialize_field("decimals", &self.decimals)?;
state.end()
Expand Down Expand Up @@ -747,11 +748,11 @@ impl Serialize for Erc20TokenConfig {
state.serialize_field("address", &self.address)?;
state.serialize_field(
"min_balance",
&serialize_amount_with_decimals(&self.min_balance, self.decimals),
&format_token_amount(&self.min_balance, self.decimals),
)?;
state.serialize_field(
"top_up_amount",
&serialize_amount_with_decimals(&self.top_up_amount, self.decimals),
&format_token_amount(&self.top_up_amount, self.decimals),
)?;
state.serialize_field("decimals", &self.decimals)?;
state.end()
Expand Down Expand Up @@ -823,20 +824,6 @@ fn default_decimals() -> u8 {
18
}

fn serialize_amount_with_decimals(amount: &U256, decimals: u8) -> String {
let divisor = U256::from(10u64.pow(decimals as u32));
let whole_part = amount / divisor;
let remainder = amount % divisor;

if remainder.is_zero() {
format!("{}", whole_part)
} else {
let decimal_str = format!("{:0width$}", remainder, width = decimals as usize);
let decimal_trimmed = decimal_str.trim_end_matches('0');
format!("{}.{}", whole_part, decimal_trimmed)
}
}

#[derive(Debug, Clone)]
pub enum AllOrNetworks {
All,
Expand Down
8 changes: 3 additions & 5 deletions crates/sdk/src/api/http.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use base64::{Engine as _, engine::general_purpose};
use reqwest::{
Client,
header::{AUTHORIZATION, CONTENT_TYPE, HeaderMap, HeaderValue},
header::{AUTHORIZATION, CONTENT_TYPE, HeaderMap, HeaderName, HeaderValue},
};
use serde::{Serialize, de::DeserializeOwned};

Expand Down Expand Up @@ -40,10 +40,8 @@ impl HttpClient {
);
}
AuthConfig::ApiKey { api_key } => {
headers.insert(
AUTHORIZATION,
HeaderValue::from_str(&format!("Bearer {}", api_key)).unwrap(),
);
let header_name = HeaderName::from_static("x-rrelayer-api-key");
headers.insert(header_name, HeaderValue::from_str(api_key).unwrap());
}
}

Expand Down
3 changes: 3 additions & 0 deletions documentation/rrelayer/docs/pages/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@

### Bug fixes

- fix: use correct serialization function for ERC20 tokens in topup flow
- fix: Rust SDK now passes API key in `x-rrelayer-api-key` header instead of `Authorization` header

---

### Breaking changes
Expand Down
Loading