use riglr_core::{provider::ApplicationContext, signer::SignerContext, ToolError};
use riglr_macros::tool;
use std::sync::Arc;
use tracing::{debug, info};
pub(crate) async fn get_block_number_with_context(
chain_id: Option<u64>,
app_context: &ApplicationContext,
) -> Result<u64, ToolError> {
let resolved_chain_id = if let Some(id) = chain_id {
debug!("Using explicit chain_id: {}", id);
id
} else if let Ok(signer) = SignerContext::current_as_evm().await {
let id = signer.chain_id();
debug!("Using chain_id from EVM SignerContext: {}", id);
id
} else {
debug!("No explicit chain_id or EVM signer context, defaulting to Ethereum mainnet (1)");
1 };
debug!(
"Getting current block number for chain_id: {}",
resolved_chain_id
);
let provider = app_context
.get_extension::<Arc<dyn alloy::providers::Provider>>()
.ok_or_else(|| ToolError::permanent_string("Provider not found in context".to_string()))?;
let block_number = provider
.get_block_number()
.await
.map_err(|e| ToolError::retriable_string(format!("Failed to get block number: {}", e)))?;
info!("Current block number: {}", block_number);
Ok(block_number)
}
#[tool]
pub async fn get_block_number(
chain_id: Option<u64>,
context: &riglr_core::provider::ApplicationContext,
) -> Result<u64, ToolError> {
get_block_number_with_context(chain_id, context).await
}
pub(crate) async fn get_gas_price_with_context(
chain_id: Option<u64>,
app_context: &ApplicationContext,
) -> Result<String, ToolError> {
let resolved_chain_id = if let Some(id) = chain_id {
debug!("Using explicit chain_id: {}", id);
id
} else if let Ok(signer) = SignerContext::current_as_evm().await {
let id = signer.chain_id();
debug!("Using chain_id from EVM SignerContext: {}", id);
id
} else {
debug!("No explicit chain_id or EVM signer context, defaulting to Ethereum mainnet (1)");
1 };
debug!(
"Getting current gas price for chain_id: {}",
resolved_chain_id
);
let provider = app_context
.get_extension::<Arc<dyn alloy::providers::Provider>>()
.ok_or_else(|| ToolError::permanent_string("Provider not found in context".to_string()))?;
let gas_price = provider
.get_gas_price()
.await
.map_err(|e| ToolError::retriable_string(format!("Failed to get gas price: {}", e)))?;
let gas_price_gwei = gas_price.to_string().parse::<f64>().unwrap_or(0.0) / 1e9;
let formatted_price = format!("{:.2} Gwei", gas_price_gwei);
info!("Current gas price: {}", formatted_price);
Ok(formatted_price)
}
#[tool]
pub async fn get_gas_price(
chain_id: Option<u64>,
context: &riglr_core::provider::ApplicationContext,
) -> Result<String, ToolError> {
get_gas_price_with_context(chain_id, context).await
}