From 2a217583696c79c34e57521b9b4cb7262608151b Mon Sep 17 00:00:00 2001 From: hdbg Date: Fri, 27 Mar 2026 15:32:40 +0100 Subject: [PATCH] refactor(server::evm): removed repetetive errors and error variants --- .../arbiter-server/src/actors/evm/mod.rs | 63 +++++++++--------- server/crates/arbiter-server/src/evm/mod.rs | 64 ++++++------------- 2 files changed, 47 insertions(+), 80 deletions(-) diff --git a/server/crates/arbiter-server/src/actors/evm/mod.rs b/server/crates/arbiter-server/src/actors/evm/mod.rs index c44da1a..e3a954b 100644 --- a/server/crates/arbiter-server/src/actors/evm/mod.rs +++ b/server/crates/arbiter-server/src/actors/evm/mod.rs @@ -9,12 +9,12 @@ use rand::{SeedableRng, rng, rngs::StdRng}; use crate::{ actors::keyholder::{CreateNew, Decrypt, KeyHolder}, db::{ - self, DatabasePool, + self, DatabaseError, DatabasePool, models::{self, SqliteTimestamp}, schema, }, evm::{ - self, ListGrantsError, RunKind, + self, RunKind, policies::{ FullGrant, Grant, SharedGrantSettings, SpecificGrant, SpecificMeaning, ether_transfer::EtherTransfer, token_transfers::TokenTransfer, @@ -33,11 +33,7 @@ pub enum SignTransactionError { #[error("Database error: {0}")] #[diagnostic(code(arbiter::evm::sign::database))] - Database(#[from] diesel::result::Error), - - #[error("Database pool error: {0}")] - #[diagnostic(code(arbiter::evm::sign::pool))] - Pool(#[from] db::PoolError), + Database(#[from] DatabaseError), #[error("Keyholder error: {0}")] #[diagnostic(code(arbiter::evm::sign::keyholder))] @@ -68,15 +64,7 @@ pub enum Error { #[error("Database error: {0}")] #[diagnostic(code(arbiter::evm::database))] - Database(#[from] diesel::result::Error), - - #[error("Database pool error: {0}")] - #[diagnostic(code(arbiter::evm::database_pool))] - DatabasePool(#[from] db::PoolError), - - #[error("Grant creation error: {0}")] - #[diagnostic(code(arbiter::evm::creation))] - Creation(#[from] evm::CreationError), + Database(#[from] DatabaseError), } #[derive(Actor)] @@ -116,7 +104,7 @@ impl EvmActor { .await .map_err(|_| Error::KeyholderSend)?; - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; let wallet_id = insert_into(schema::evm_wallet::table) .values(&models::NewEvmWallet { address: address.as_slice().to_vec(), @@ -124,18 +112,20 @@ impl EvmActor { }) .returning(schema::evm_wallet::id) .get_result(&mut conn) - .await?; + .await + .map_err(DatabaseError::from)?; Ok((wallet_id, address)) } #[message] pub async fn list_wallets(&self) -> Result, Error> { - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; let rows: Vec = schema::evm_wallet::table .select(models::EvmWallet::as_select()) .load(&mut conn) - .await?; + .await + .map_err(DatabaseError::from)?; Ok(rows .into_iter() @@ -151,7 +141,7 @@ impl EvmActor { &mut self, basic: SharedGrantSettings, grant: SpecificGrant, - ) -> Result { + ) -> Result { match grant { SpecificGrant::EtherTransfer(settings) => { self.engine @@ -174,22 +164,23 @@ impl EvmActor { #[message] pub async fn useragent_delete_grant(&mut self, grant_id: i32) -> Result<(), Error> { - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; diesel::update(schema::evm_basic_grant::table) .filter(schema::evm_basic_grant::id.eq(grant_id)) .set(schema::evm_basic_grant::revoked_at.eq(SqliteTimestamp::now())) .execute(&mut conn) - .await?; + .await + .map_err(DatabaseError::from)?; Ok(()) } #[message] pub async fn useragent_list_grants(&mut self) -> Result>, Error> { - match self.engine.list_all_grants().await { - Ok(grants) => Ok(grants), - Err(ListGrantsError::Database(db)) => Err(Error::Database(db)), - Err(ListGrantsError::Pool(pool)) => Err(Error::DatabasePool(pool)), - } + Ok(self + .engine + .list_all_grants() + .await + .map_err(DatabaseError::from)?) } #[message] @@ -199,13 +190,14 @@ impl EvmActor { wallet_address: Address, transaction: TxEip1559, ) -> Result { - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; let wallet = schema::evm_wallet::table .select(models::EvmWallet::as_select()) .filter(schema::evm_wallet::address.eq(wallet_address.as_slice())) .first(&mut conn) .await - .optional()? + .optional() + .map_err(DatabaseError::from)? .ok_or(SignTransactionError::WalletNotFound)?; let wallet_access = schema::evm_wallet_access::table .select(models::EvmWalletAccess::as_select()) @@ -213,7 +205,8 @@ impl EvmActor { .filter(schema::evm_wallet_access::client_id.eq(client_id)) .first(&mut conn) .await - .optional()? + .optional() + .map_err(DatabaseError::from)? .ok_or(SignTransactionError::WalletNotFound)?; drop(conn); @@ -232,13 +225,14 @@ impl EvmActor { wallet_address: Address, mut transaction: TxEip1559, ) -> Result { - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; let wallet = schema::evm_wallet::table .select(models::EvmWallet::as_select()) .filter(schema::evm_wallet::address.eq(wallet_address.as_slice())) .first(&mut conn) .await - .optional()? + .optional() + .map_err(DatabaseError::from)? .ok_or(SignTransactionError::WalletNotFound)?; let wallet_access = schema::evm_wallet_access::table .select(models::EvmWalletAccess::as_select()) @@ -246,7 +240,8 @@ impl EvmActor { .filter(schema::evm_wallet_access::client_id.eq(client_id)) .first(&mut conn) .await - .optional()? + .optional() + .map_err(DatabaseError::from)? .ok_or(SignTransactionError::WalletNotFound)?; drop(conn); diff --git a/server/crates/arbiter-server/src/evm/mod.rs b/server/crates/arbiter-server/src/evm/mod.rs index ef9bf77..54bcb1e 100644 --- a/server/crates/arbiter-server/src/evm/mod.rs +++ b/server/crates/arbiter-server/src/evm/mod.rs @@ -8,10 +8,11 @@ use alloy::{ use chrono::Utc; use diesel::{ExpressionMethods as _, QueryDsl as _, QueryResult, insert_into, sqlite::Sqlite}; use diesel_async::{AsyncConnection, RunQueryDsl}; +use tracing_subscriber::registry::Data; use crate::{ db::{ - self, + self, DatabaseError, models::{ EvmBasicGrant, EvmWalletAccess, NewEvmBasicGrant, NewEvmTransactionLog, SqliteTimestamp, }, @@ -30,12 +31,8 @@ mod utils; /// Errors that can only occur once the transaction meaning is known (during policy evaluation) #[derive(Debug, thiserror::Error, miette::Diagnostic)] pub enum PolicyError { - #[error("Database connection pool error")] - #[diagnostic(code(arbiter_server::evm::policy_error::pool))] - Pool(#[from] db::PoolError), - #[error("Database returned error")] - #[diagnostic(code(arbiter_server::evm::policy_error::database))] - Database(#[from] diesel::result::Error), + #[error("Database error")] + Error(#[from] crate::db::DatabaseError), #[error("Transaction violates policy: {0:?}")] #[diagnostic(code(arbiter_server::evm::policy_error::violation))] Violations(Vec), @@ -57,16 +54,6 @@ pub enum VetError { Evaluated(SpecificMeaning, #[source] PolicyError), } -#[derive(Debug, thiserror::Error, miette::Diagnostic)] -pub enum SignError { - #[error("Database connection pool error")] - #[diagnostic(code(arbiter_server::evm::database_error))] - Pool(#[from] db::PoolError), - #[error("Database returned error")] - #[diagnostic(code(arbiter_server::evm::database_error))] - Database(#[from] diesel::result::Error), -} - #[derive(Debug, thiserror::Error, miette::Diagnostic)] pub enum AnalyzeError { #[error("Engine doesn't support granting permissions for contract creation")] @@ -78,28 +65,6 @@ pub enum AnalyzeError { UnsupportedTransactionType, } -#[derive(Debug, thiserror::Error, miette::Diagnostic)] -pub enum CreationError { - #[error("Database connection pool error")] - #[diagnostic(code(arbiter_server::evm::creation_error::database_error))] - Pool(#[from] db::PoolError), - - #[error("Database returned error")] - #[diagnostic(code(arbiter_server::evm::creation_error::database_error))] - Database(#[from] diesel::result::Error), -} - -#[derive(Debug, thiserror::Error, miette::Diagnostic)] -pub enum ListGrantsError { - #[error("Database connection pool error")] - #[diagnostic(code(arbiter_server::evm::list_grants_error::pool))] - Pool(#[from] db::PoolError), - - #[error("Database returned error")] - #[diagnostic(code(arbiter_server::evm::list_grants_error::database))] - Database(#[from] diesel::result::Error), -} - /// Controls whether a transaction should be executed or only validated #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum RunKind { @@ -167,16 +132,22 @@ impl Engine { meaning: &P::Meaning, run_kind: RunKind, ) -> Result<(), PolicyError> { - let mut conn = self.db.get().await?; + let mut conn = self.db.get().await.map_err(DatabaseError::from)?; let grant = P::try_find_grant(&context, &mut conn) - .await? + .await + .map_err(DatabaseError::from)? .ok_or(PolicyError::NoMatchingGrant)?; let mut violations = check_shared_constraints(&context, &grant.shared, grant.shared_grant_id, &mut conn) - .await?; - violations.extend(P::evaluate(&context, meaning, &grant, &mut conn).await?); + .await + .map_err(DatabaseError::from)?; + violations.extend( + P::evaluate(&context, meaning, &grant, &mut conn) + .await + .map_err(DatabaseError::from)?, + ); if !violations.is_empty() { return Err(PolicyError::Violations(violations)); @@ -200,7 +171,8 @@ impl Engine { QueryResult::Ok(()) }) }) - .await?; + .await + .map_err(DatabaseError::from)?; } Ok(()) @@ -215,7 +187,7 @@ impl Engine { pub async fn create_grant( &self, full_grant: FullGrant, - ) -> Result { + ) -> Result { let mut conn = self.db.get().await?; let id = conn @@ -261,7 +233,7 @@ impl Engine { Ok(id) } - pub async fn list_all_grants(&self) -> Result>, ListGrantsError> { + pub async fn list_all_grants(&self) -> Result>, DatabaseError> { let mut conn = self.db.get().await?; let mut grants: Vec> = Vec::new();